
    7|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y)    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                R   t        |   di |
 t        j                  j	                  d      t        d      t        j                  j	                  d      t        d      t        j                  j	                  d      t        d      || _        || _        || _        || _	        |xs i | _
        |xs i | _        | j                  j                  dd      | _        | j                  j                  d	d
      | _        || _        || _        |	| _        | j%                          y )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              c/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/embeddings/itrex.pyr!   zQuantizedBgeEmbeddings.__init__/   s%    	"6" >>##$FGOE  >>##G,4A  >>##F+3@ 
 #-&'*0b(.B++//0FN,,00rB!2$8!,    c                    ddl m} ddlm} ddlm}m} |j                  | j                        j                  | _	        |j                  | j                        | _
        t        j                  j                  | j                  | j                        }t        j                  j                  |      s || j                  | j                        }|j                  |d      | _        y )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K:%55##

+ 	 &3%B%B##&
" '',,t'>'>@S@STww~~o.-''$2E2EO "+!:!:4 "; "
r.   allowr   )extraprotected_namespacesinputsc                    dd l }|j                         D cg c]  }| }}| j                  j                  |      }d|v r|d   }n!|j                         D cg c]  }| c}d   }|j	                  |      j                  |d   j                  d   |d   j                  d   | j                        }| j                  dk(  r| j                  ||d         }n,| j                  dk(  r| j                  |      }nt        d      | j                  r(|j                  j                  j                  |d	d
      }|S c c}w c c}w )Nr   zlast_hidden_state:0	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   valueengine_inputoutputslast_hidden_stateoutembs	            r-   _embedzQuantizedBgeEmbeddings._embed~   s5   +1==?;%;;((11,? G+ '(= >070@ A A! D!LL):;CC;%%a(&*=*C*CA*FHXHX
 <<6!$$%6?O8PQC\\U"##$56C:;;>>((%%//qa/@C
% <
 !Bs   	D;	E r[   c                     | d d df   S Nr   r   )r[   s    r-   rT   z#QuantizedBgeEmbeddings._cls_pooling   s     A&&r.   rI   c                 6   	 dd l }|j                  d      j                  | j	                               j                         }|j                  | |z  d      }|j                  |j                  d      d      }||z  S # t        $ r}t        d      |d }~ww xY w)Nr   zCUnable to import torch, please install with `pip install -U torch`.rH   g&.>)min)r   r%   	unsqueezeexpandsizefloatsumclamp)r[   rI   r   einput_mask_expandedsum_embeddingssum_masks          r-   rS   z$QuantizedBgeEmbeddings._mean_pooling   s    	 $$R(//0A0F0F0HIOOQ 	 #47J#JAN;;266q9t;D((  	U	s   A> >	BBBtextsc                     | j                  || j                  d| j                  d      }| j                  |      j	                         S )NTpt)
max_length
truncationr   return_tensors)r;   r   r   r^   tolist)r+   rn   rE   s      r-   _embed_textz"QuantizedBgeEmbeddings._embed_text   sJ    ++''LL , 
 {{6"))++r.   c                    	 ddl }|D cg c]  }| j                  r| j                  |z   n|! }}|j                  |dg      j	                         }|d   | j
                  z  |d<   t        |j                  dg      d   j                  t                    }g }|D ]  }	|| j                  |	      z  } |S # t        $ r}t        d      |d}~ww xY wc c}w )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`.rn   )columnsindexbatch_index)
pandasr%   r   	DataFramereset_indexr   listgroupbyapplyru   )
r+   rn   pdrj   ddocstext_list_dfbatchesvectorsbatchs
             r-   embed_documentsz&QuantizedBgeEmbeddings.embed_documents   s    	 
 .2-F-FD%%)AM
 
 ||D7)|<HHJ '37&;t&N]# |++]O<WEKKDQR 	/Et''..G	/+  	W	
s   B7 $C7	C CCtextc                 b    | j                   r| j                   |z   }| j                  |g      d   S r`   )r   ru   )r+   r   s     r-   embed_queryz"QuantizedBgeEmbeddings.embed_query   s3    !!))D0D'**r.   )r   N)__name__
__module____qualname____doc__strintr   boolr   r   r!   r*   r	   model_configr^   staticmethodrT   rS   r   rg   ru   r   r   __classcell__)r,   s   @r-   r   r   	   sv   #R  &+/.2'+(,(944 	4
 4 $C=4 'sm4 4 tn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 *M+Y
 M+r.   