
    dh                     P    S SK JrJrJrJr  S SKJr  S SKJrJ	r	   " S S\\5      r
g)    )AnyDictListOptional)
Embeddings)	BaseModel
ConfigDictc                   H  ^  \ rS rSrSr       SS\S\S\S\\   S\\   S	\S
\\	   S\\	   S\
SS4U 4S jjjrS S jr\" SSS9rS\
S\
4S jr\S\
S\
4S j5       r\S\
S\
S\
4S j5       rS\\   S\\\      4S jrS\\   S\\\      4S jrS\S\\   4S jrSrU =r$ )!QuantizedBiEncoderEmbeddings   a  Quantized bi-encoders embedding models.

Please ensure that you have installed optimum-intel and ipex.

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 {})

Example:

from langchain_community.embeddings import QuantizedBiEncoderEmbeddings

model_name = "Intel/bge-small-en-v1.5-rag-int8-static"
encode_kwargs = {'normalize_embeddings': True}
hf = QuantizedBiEncoderEmbeddings(
    model_name,
    encode_kwargs=encode_kwargs,
    query_instruction="Represent this sentence for searching relevant passages: "
)
N
model_namemax_seq_lenpooling_strategyquery_instructiondocument_instructionpaddingmodel_kwargsencode_kwargskwargsreturnc	                 R  > [         T
U ]  " S0 U	D6  Xl        X l        X0l        X`l        U=(       d    0 U l        U=(       d    0 U l        U R                  R                  SS5      U l	        U R                  R                  SS5      U l
        X@l        XPl        U R                  5         g )Nnormalize_embeddingsF
batch_size     )super__init__model_name_or_pathr   poolingr   r   r   get	normalizer   r   r   
load_model)selfr   r   r   r   r   r   r   r   r   	__class__s             d/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/embeddings/optimum_intel.pyr   %QuantizedBiEncoderEmbeddings.__init__)   s     	"6"",&'*0b(.B++//0FN,,00rB!2$8!    c                     SSK Jn   SSKJn  UR
                  " U R                  40 U R                  D6U l        UR                  U R                  S9U l
        U R                  R                  5         g ! [         a  n[        S5      UeS nAff = f! [         a!  n[        SU R                   SU S35      eS nAff = f)	Nr   )AutoTokenizerzQUnable to import transformers, please install with `pip install -U transformers`.)	IPEXModelz
Failed to load model z, due to the following error:
a  
Please ensure that you have installed optimum-intel and ipex correctly,using:

pip install optimum[neural-compressor]
pip install intel_extension_for_pytorch

For more information, please visit:
* Install optimum-intel as shown here: https://github.com/huggingface/optimum-intel.
* Install IPEX as shown here: https://intel.github.io/intel-extension-for-pytorch/index.html#installation?platform=cpu&version=v2.2.0%2Bcpu.
)pretrained_model_name_or_path)transformersr)   ImportErroroptimum.intelr*   from_pretrainedr   r   transformer_model	Exceptiontransformer_tokenizereval)r#   r)   er*   s       r%   r"   'QuantizedBiEncoderEmbeddings.load_modelE   s    	2	/%.%>%>''&+/+<+<&D"$ &3%B%B*.*A*A &C &
" 	##%;  	1 	  	--. / 	 	s.   A4 2B 4
B>B

B
B=B88B=allowr   )extraprotected_namespacesinputsc                     SS K nUR                  5          U R                  " S
0 UD6nU R                  S:X  a  U R                  XAS   5      nO-U R                  S:X  a  U R                  U5      nO[        S5      eU R                  (       a%  UR                  R                  R                  USSS	9nUsS S S 5        $ ! [         a  n[        S5      UeS nAff = f! , (       d  f       g = f)Nr   CUnable to import torch, please install with `pip install -U torch`.meanattention_maskclszpooling method no supported      )pdimr   )torchr-   inference_moder0   r   _mean_pooling_cls_pooling
ValueErrorr!   nn
functional)r#   r9   rC   r4   outputsembs         r%   _embed#QuantizedBiEncoderEmbeddings._embedl   s    	
 !!#,,6v6G||v%((9I2JK&''0 !>??~~hh))33C1!3D $#	  	U	 $#s#   B< BC<
CCC
C(rJ   c                 T    [        U [        5      (       a  U S   nOU S   nUS S 2S4   $ )Nlast_hidden_stater   )
isinstancedict)rJ   token_embeddingss     r%   rF   )QuantizedBiEncoderEmbeddings._cls_pooling   s4    gt$$&':;&qz1%%r'   r=   c                 n    SS K n[        U [        5      (       a  U S   nOU S   nUR	                  S5      R                  UR                  5       5      R                  5       nUR                  XE-  S5      nUR                  UR                  S5      SS9nXg-  $ ! [         a  n[        S5      UeS nAff = f)Nr   r;   rO   r@   g&.>)min)
rC   r-   rP   rQ   	unsqueezeexpandsizefloatsumclamp)rJ   r=   rC   r4   rR   input_mask_expandedsum_embeddingssum_masks           r%   rE   *QuantizedBiEncoderEmbeddings._mean_pooling   s    	
 gt$$&':;  'qz$$R(//0@0E0E0GHNNP 	 #3#I1M;;266q9t;D((  	U	s   B 
B4#B//B4textsc                     U R                  UU R                  SU R                  SS9nU R                  U5      R	                  5       $ )NTpt)
max_length
truncationr   return_tensors)r2   r   r   rL   tolist)r#   ra   r9   s      r%   _embed_text(QuantizedBiEncoderEmbeddings._embed_text   sJ    ++''LL , 
 {{6"))++r'   c                     SSK n SSKJn  U Vs/ sH%  nU R                  (       a  U R                  U-   OUPM'     nnUR	                  US/S9R                  5       nUS   U R                  -  US	'   [        UR                  S	/5      S   R                  [        5      5      n/ n	U" US
S9 H  n
XR                  U
5      -  n	M     U	$ ! [         a  n[        S5      UeSnAff = f! [         a  n[        S5      UeSnAff = fs  snf )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`.)tqdmzAUnable to import tqdm, please install with `pip install -U tqdm`.ra   )columnsindexbatch_indexBatches)desc)pandasr-   rk   r   	DataFramereset_indexr   listgroupbyapplyrh   )r#   ra   pdr4   rk   ddocstext_list_dfbatchesvectorsbatchs              r%   embed_documents,QuantizedBiEncoderEmbeddings.embed_documents   s)   	
	! 
 .2-F-FD%%)AM 	 
 ||D7)|<HHJ '37&;t&N]# |++]O<WEKKDQR'	2E''..G 37  	W	  	S	
s3   C C& +D
C#CC#&
D0C<<Dtextc                 l    U R                   (       a  U R                   U-   nU R                  U/5      S   $ )Nr   )r   rh   )r#   r   s     r%   embed_query(QuantizedBiEncoderEmbeddings.embed_query   s3    !!))D0D'**r'   )r   r   r   r   r   r   r!   r   r   r   r0   r2   )i   r<   NNTNN)r   N)__name__
__module____qualname____firstlineno____doc__strintr   boolr   r   r   r"   r	   model_configrL   staticmethodrF   rE   r   rZ   rh   r~   r   __static_attributes____classcell__)r$   s   @r%   r   r      so   H  &+/.2'+(,  	
 $C= 'sm  tn  ~  
 8 &D L
S S ( &c &c & & )s )C )C ) )&,c ,tDK/@ ,%T#Y %4U3D %N+ +U + +r'   r   N)typingr   r   r   r   langchain_core.embeddingsr   pydanticr   r	   r   r   r'   r%   <module>r      s!    , , 0 *I+9j I+r'   