
    Ng                     h    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ee	          ZdS )    N)AnyDictListOptional)
Embeddings)	BaseModel
ConfigDictc                       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Z
d#dZ edd          Zde	de	fdZede	de	fd            Zede	de	de	fd            Zdee         deee                  fdZdee         deee                  fd Zd!edee         fd"Z x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                |    t                      j        di |
 t          j                            d          t          d          t          j                            d          t          d          t          j                            d          t          d          || _        || _        || _        || _	        |pi | _
        |pi | _        | j
                            dd          | _        | j
                            d	d
          | _        || _        || _        |	| _        |                                  d S )N 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`.onnxzSCould not import onnx python package. Please install it with `pip install -U onnx`.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__s              `/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/embeddings/itrex.pyr!   zQuantizedBgeEmbeddings.__init__/   sP    	""6""" >##$FGGOE   >##G,,4A   >##F++3@  
 #-&'*0b(.B+//0FNN,00rBB!2$8!,    c                    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          | _        d S )Nr   )hf_hub_download)	AutoModel)
AutoConfigAutoTokenizer)filenameT)use_embedding_runtime)huggingface_hubr0   -intel_extension_for_transformers.transformersr1   transformersr2   r3   from_pretrainedr&   hidden_sizetransformer_tokenizerospathjoinr   existstransformer_model)r+   r0   r1   r2   r3   onnx_model_paths         r-   r*   z!QuantizedBgeEmbeddings.load_modele   s    333333KKKKKK::::::::%55#
 

 	 &3%B%B#&
 &
" ',,t'>@STTw~~o.. 	-o'$2E  O "+!:!:4 "; "
 "
r.   allowr   )extraprotected_namespacesinputsc                    dd l }d |                                D             }| j                            |          }d|v r	|d         }n$d |                                D             d         }|                    |                              |d         j        d         |d         j        d         | j                  }| j        dk    r| 	                    ||d                   }n0| j        d	k    r| 
                    |          }nt          d
          | j        r"|j        j                            |dd          }|S )Nr   c                     g | ]}|S r   r   ).0values     r-   
<listcomp>z1QuantizedBgeEmbeddings._embed.<locals>.<listcomp>   s    ;;;%;;;r.   zlast_hidden_state:0c                     g | ]}|S r   r   )rH   outs     r-   rJ   z1QuantizedBgeEmbeddings._embed.<locals>.<listcomp>   s     A A A A A Ar.   	input_ids   r   attention_maskclszpooling method no supported   )pdim)r   valuesr@   generatetensorreshapeshaper:   r'   _mean_pooling_cls_pooling
ValueErrorr)   nn
functional)r+   rE   r   engine_inputoutputslast_hidden_stateembs          r-   _embedzQuantizedBgeEmbeddings._embed~   sN   ;;6==??;;;(11,?? G++ '(= > A A0@0@ A A A! D!LL):;;CC;%a(&*=*CA*FHX
 
 <6!!$$%6?O8PQQCC\U""##$566CC:;;;> 	A(%//qa/@@C
r.   r`   c                     | d d df         S Nr   r   )r`   s    r-   rZ   z#QuantizedBgeEmbeddings._cls_pooling   s     A&&r.   rO   c                 z   	 dd l }n"# t          $ r}t          d          |d }~ww xY w|                    d                              |                                                                           }|                    | |z  d          }|                    |                    d          d          }||z  S )Nr   zCUnable to import torch, please install with `pip install -U torch`.rN   g&.>)min)r   r%   	unsqueezeexpandsizefloatsumclamp)r`   rO   r   einput_mask_expandedsum_embeddingssum_masks          r-   rY   z$QuantizedBgeEmbeddings._mean_pooling   s    	LLLL 	 	 	U 	
 $$R((//0A0F0F0H0HIIOOQQ 	 #47J#JANN;;266q99t;DD((s    
&!&textsc                     |                      || j        d| j        d          }|                     |                                          S )NTpt)
max_length
truncationr   return_tensors)r;   r   r   rb   tolist)r+   rr   rE   s      r-   _embed_textz"QuantizedBgeEmbeddings._embed_text   sP    ++'L , 
 
 {{6""))+++r.   c                     	 ddl }n"# t          $ r}t          d          |d}~ww xY w fd|D             }|                    |dg                                          }|d          j        z  |d<   t          |                    dg          d                             t
                              }g }|D ]}|                     |          z  }|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                 6    g | ]}j         r
j         |z   n|S r   )r   )rH   dr+   s     r-   rJ   z:QuantizedBgeEmbeddings.embed_documents.<locals>.<listcomp>   s>     
 
 
 .2-FMD%))A
 
 
r.   rr   )columnsindexbatch_index)	pandasr%   	DataFramereset_indexr   listgroupbyapplyry   )	r+   rr   pdrn   docstext_list_dfbatchesvectorsbatchs	   `        r-   embed_documentsz&QuantizedBgeEmbeddings.embed_documents   s   	 	 	 	W 	
 
 
 

 
 
 ||D7)|<<HHJJ '37&;t&N]# |++]O<<WEKKDQQRR 	/ 	/Et''...GGs    
'"'textc                 \    | j         r
| j         |z   }|                     |g          d         S rd   )r   ry   )r+   r   s     r-   embed_queryz"QuantizedBgeEmbeddings.embed_query   s5    ! 	1)D0D''**r.   )r   N)__name__
__module____qualname____doc__strintr   boolr   r   r!   r*   r	   model_configrb   staticmethodrZ   rY   r   rk   ry   r   r   __classcell__)r,   s   @r-   r   r   	   s)       # #R  &+/.2'+(,(94 4 44 	4
 4 $C=4 'sm4 4 tn4  ~4 !4 4 
4 4 4 4 4 4l
 
 
 
( :  L
S S    . ' ' ' ' ' \' ) )c )c ) ) ) \),c ,tDK/@ , , , ,T#Y 4U3D    B+ +U + + + + + + + +r.   r   )importlib.utilr"   r<   typingr   r   r   r   langchain_core.embeddingsr   pydanticr   r	   r   r   r.   r-   <module>r      s        				 , , , , , , , , , , , , 0 0 0 0 0 0 * * * * * * * *M+ M+ M+ M+ M+Y
 M+ M+ M+ M+ M+r.   