o
    Zh                     @   sZ   d dl Zd dlZd dlmZmZmZmZ d dlm	Z	 d dl
mZmZ G dd dee	ZdS )    N)AnyDictListOptional)
Embeddings)	BaseModel
ConfigDictc                       s   e Zd ZdZdddddddddded	ed
edee dee dedee dee dee de	ddf fddZ
d+ddZedddZde	de	fddZede	de	fddZede	d e	de	fd!d"Zd#ee deee  fd$d%Zd#ee deee  fd&d'Zd(edee fd)d*Z  ZS ),QuantizedBgeEmbeddingsai  Leverage Itrex runtime to unlock the performance of compressed NLP models.

    Please ensure that you have installed intel-extension-for-transformers.

    Input:
        model_name: str = Model name.
        max_seq_len: int = The maximum sequence length for tokenization. (default 512)
        pooling_strategy: str =
            "mean" or "cls", pooling strategy for the final layer. (default "mean")
        query_instruction: Optional[str] =
            An instruction to add to the query before embedding. (default None)
        document_instruction: Optional[str] =
            An instruction to add to each document before embedding. (default None)
        padding: Optional[bool] =
            Whether to add padding during tokenization or not. (default True)
        model_kwargs: Optional[Dict] =
            Parameters to add to the model during initialization. (default {})
        encode_kwargs: Optional[Dict] =
            Parameters to add during the embedding forward pass. (default {})
        onnx_file_name: Optional[str] =
            File name of onnx optimized model which is exported by itrex.
            (default "int8-model.onnx")

    Example:
        .. code-block:: python

            from langchain_community.embeddings import QuantizedBgeEmbeddings

            model_name = "Intel/bge-small-en-v1.5-sts-int8-static-inc"
            encode_kwargs = {'normalize_embeddings': True}
            hf = QuantizedBgeEmbeddings(
                model_name,
                encode_kwargs=encode_kwargs,
                query_instruction="Represent this sentence for searching relevant passages: "
            )
    i   meanNTzint8-model.onnx)max_seq_lenpooling_strategyquery_instructiondocument_instructionpaddingmodel_kwargsencode_kwargsonnx_file_name
model_namer   r   r   r   r   r   r   r   kwargsreturnc                   s   t  jdi |
 tjdd u rtdtjdd u r!tdtjdd u r-td|| _|| _|| _|| _	|p<i | _
|pAi | _| j
dd| _| j
d	d
| _|| _|| _|	| _|   d S )NZ intel_extension_for_transformerszCould not import intel_extension_for_transformers python package. Please install it with `pip install -U intel-extension-for-transformers`.torchzUCould not import torch python package. Please install it with `pip install -U torch`.ZonnxzSCould not import onnx python package. Please install it with `pip install -U onnx`.Znormalize_embeddingsF
batch_size     )super__init__	importlibutil	find_specImportErrormodel_name_or_pathr   poolingr   r   r   get	normalizer   r   r   r   
load_model)selfr   r   r   r   r   r   r   r   r   r   	__class__r   [/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/embeddings/itrex.pyr   /   s2   

zQuantizedBgeEmbeddings.__init__c                 C   s   ddl m} ddlm} ddlm}m} || jj	| _	|| j| _
tj| j| j}tj|s:|| j| jd}|j|dd| _d S )Nr   )hf_hub_download)	AutoModel)
AutoConfigAutoTokenizer)filenameT)Zuse_embedding_runtime)Zhuggingface_hubr)   Z-intel_extension_for_transformers.transformersr*   Ztransformersr+   r,   Zfrom_pretrainedr    hidden_sizetransformer_tokenizerospathjoinr   existstransformer_model)r%   r)   r*   r+   r,   Zonnx_model_pathr   r   r(   r$   e   s&   z!QuantizedBgeEmbeddings.load_modelZallowr   )extraZprotected_namespacesinputsc                 C   s   dd l }dd | D }| j|}d|v r|d }ndd | D d }|||d jd |d jd | j}| jdkrJ| 	||d	 }n| jd
krU| 
|}ntd| jrf|jjj|ddd}|S )Nr   c                 S      g | ]}|qS r   r   ).0valuer   r   r(   
<listcomp>       z1QuantizedBgeEmbeddings._embed.<locals>.<listcomp>zlast_hidden_state:0c                 S   r7   r   r   )r8   outr   r   r(   r:      r;   Z	input_ids   r
   attention_maskclszpooling method no supported   )pdim)r   valuesr4   generateZtensorZreshapeshaper.   r!   _mean_pooling_cls_pooling
ValueErrorr#   nnZ
functional)r%   r6   r   Zengine_inputZoutputslast_hidden_stateZembr   r   r(   _embed~   s"   



zQuantizedBgeEmbeddings._embedrJ   c                 C   s   | d d df S Nr   r   )rJ   r   r   r(   rG      s   z#QuantizedBgeEmbeddings._cls_poolingr>   c              
   C   st   zdd l }W n ty } ztd|d }~ww |d|   }|| | d}|j|ddd}|| S )Nr   zCUnable to import torch, please install with `pip install -U torch`.r=   g&.>)min)r   r   Z	unsqueezeexpandsizefloatsumclamp)rJ   r>   r   eZinput_mask_expandedZsum_embeddingsZsum_maskr   r   r(   rF      s   z$QuantizedBgeEmbeddings._mean_poolingtextsc                 C   s&   | j || jd| jdd}| | S )NTpt)
max_lengthZ
truncationr   Zreturn_tensors)r/   r   r   rK   tolist)r%   rU   r6   r   r   r(   _embed_text   s   z"QuantizedBgeEmbeddings._embed_textc           	   
      s   zddl }W n ty } ztd|d}~ww  fdd|D }|j|dgd }|d  j |d	< t|d	gd t}g }|D ]	}| |7 }qE|S )
zEmbed a list of text documents using the Optimized Embedder model.

        Input:
            texts: List[str] = List of text documents to embed.
        Output:
            List[List[float]] = The embeddings of each text document.
        r   NzEUnable to import pandas, please install with `pip install -U pandas`.c                    s    g | ]} j r j | n|qS r   )r   )r8   dr%   r   r(   r:      s    z:QuantizedBgeEmbeddings.embed_documents.<locals>.<listcomp>rU   )columnsindexZbatch_index)	Zpandasr   Z	DataFrameZreset_indexr   listgroupbyapplyrY   )	r%   rU   pdrT   docsZtext_list_dfZbatchesZvectorsbatchr   r[   r(   embed_documents   s(   
z&QuantizedBgeEmbeddings.embed_documentstextc                 C   s    | j r| j | }| |gd S rL   )r   rY   )r%   re   r   r   r(   embed_query   s   
z"QuantizedBgeEmbeddings.embed_query)r   N)__name__
__module____qualname____doc__strintr   boolr   r   r   r$   r   Zmodel_configrK   staticmethodrG   rF   r   rQ   rY   rd   rf   __classcell__r   r   r&   r(   r	   	   s\    )	

6
!r	   )importlib.utilr   r0   typingr   r   r   r   Zlangchain_core.embeddingsr   Zpydanticr   r   r	   r   r   r   r(   <module>   s    