a
    bg                     @   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eeeee ee eee ee ee e	dd fd	d
Z
ddddZedddZe	e	dddZee	e	dddZee	e	e	dddZee eee  dddZee eee  dddZeee d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f i |
 tjdd u r*tdtjdd u rBtdtjdd u rZtd|| _|| _|| _|| _	|pxi | _
|pi | _| 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/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/embeddings/itrex.pyr   /   s2    

zQuantizedBgeEmbeddings.__init__)r   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|st|| 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)inputsr   c                 C   s   dd l }dd | D }| j|}d|v r8|d }ndd | D d }|||d jd |d jd | j}| jdkr| 	||d	 }n| jd
kr| 
|}ntd| jr|jjj|ddd}|S )Nr   c                 S   s   g | ]}|qS r'   r'   ).0valuer'   r'   r(   
<listcomp>       z1QuantizedBgeEmbeddings._embed.<locals>.<listcomp>zlast_hidden_state:0c                 S   s   g | ]}|qS r'   r'   )r7   outr'   r'   r(   r9      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_inputoutputslast_hidden_stateZembr'   r'   r(   _embed~   s"    



zQuantizedBgeEmbeddings._embed)rJ   r   c                 C   s   | d d df S Nr   r'   )rJ   r'   r'   r(   rF      s    z#QuantizedBgeEmbeddings._cls_pooling)rJ   r=   r   c              
   C   s   zdd l }W n. ty: } ztd|W Y d }~n
d }~0 0 |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(   rE      s    z$QuantizedBgeEmbeddings._mean_pooling)textsr   c                 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|W Y d}~n
d}~0 0  fdd|D }|j|dgd }|d  j |d	< t|d	gd t}g }|D ]}| |7 }q|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   )r7   dr$   r'   r(   r9      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)textr   c                 C   s    | j r| j | }| |gd S rL   )r   rY   )r$   re   r'   r'   r(   embed_query   s    
z"QuantizedBgeEmbeddings.embed_query)__name__
__module____qualname____doc__strintr   boolr   r   r   r#   r   Zmodel_configrK   staticmethodrF   rE   r   rQ   rY   rd   rf   __classcell__r'   r'   r%   r(   r	   	   sF   )6
!r	   )importlib.utilr   r0   typingr   r   r   r   Zlangchain_core.embeddingsr   Zpydanticr   r   r	   r'   r'   r'   r(   <module>   s
   