§
    šŠtjÓ  ã                   ó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_transformersz‹Could 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              €úb/var/www/html/CA-Chatbot/venv/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Ýð@ñô ð ð
 #-ˆÔØ&ˆÔØ'ˆŒØˆŒØ*Ð0¨bˆÔØ(Ð.¨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ÐØ!ŸLšLÐ):Ñ;Ô;×CÒCØ�;ÔÔ% aÔ(¨&°Ô*=Ô*CÀAÔ*FÈÔHXñ
ô 
Ðð Œ<˜6Ò!Ð!Ø×$Ò$Ð%6¸Ð?OÔ8PÑQÔQˆCˆCØŒ\˜UÒ"Ð"Ø×#Ò#Ð$5Ñ6Ô6ˆCˆCåÐ:Ñ;Ô;Ð;àŒ>ð 	AØ”(Ô%×/Ò/°°q¸aÐ/Ñ@Ô@ˆ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Ó   € ð	ØˆLˆLˆLˆLøÝð 	ð 	ð 	ÝØUñô àðøøøøð	øøøð
 ×$Ò$ RÑ(Ô(×/Ò/Ð0A×0FÒ0FÑ0HÔ0HÑIÔI×OÒOÑQÔQð 	ð ŸšÐ#4Ð7JÑ#JÈAÑNÔNˆØ—;’;Ð2×6Ò6°qÑ9Ô9¸t�;Ñ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 )	zñEmbed 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ÐMˆDÔ%¨Ñ)Ð)È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ñô àðøøøøð	øøøð
ð 
ð 
ð 
àð
ñ 
ô 
ˆð —|’| D°7°)�|Ñ<Ô<×HÒHÑJÔJˆð '3°7Ô&;¸t¼Ñ&Nˆ�]Ñ#õ �|×+Ò+¨]¨OÑ<Ô<¸WÔE×KÒKÍDÑQÔQÑRÔRˆàˆØð 	/ð 	/ˆEØ�t×'Ò'¨Ñ.Ô.Ñ.ˆGˆGØˆs   ƒ ˆ
'’"¢'Útextc                 ó\   — | j         r
| j         |z   }|                      |g¦  «        d         S rd   )r   ry   )r+   r�   s     r-   Úembed_queryz"QuantizedBgeEmbeddings.embed_queryÓ   s5   € ØÔ!ð 	1ØÔ)¨DÑ0ˆDØ×Ò  Ñ'Ô'¨Ô*Ð*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ð ' sœmð4ð ð4ð ˜t”nð4ð   ”~ð4ð ! œð4ð ð4ð 
ð4ð 4ð 4ð 4ð 4ð 4ðl
ð 
ð 
ð 
ð( �:ØØðñ ô €Lð
˜Sð  Sð ð ð ð ð. ð'¨ð '°ð 'ð 'ð 'ñ „\ð'ð ð)¨ð )¸cð )Àcð )ð )ð )ñ „\ð)ð,  c¤ð ,¨t°D¸´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.   