§
    šŠtj³1  ã                   óŒ   — d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	m
Z
mZ dZdZdZ G d„ d	e	e¦  «        Z G d
„ de¦  «        ZdS )é    )ÚPath)ÚAnyÚDictÚList)Ú
Embeddings)Ú	BaseModelÚ
ConfigDictÚFieldz<Represent the question for retrieving supporting documents: z9Represent this question for searching relevant passages: u9   ä¸ºè¿™ä¸ªå�¥å­�ç”Ÿæˆ�è¡¨ç¤ºä»¥ç”¨äºŽæ£€ç´¢ç›¸å…³æ–‡ç« ï¼šc                   óŽ  ‡ — e Zd ZU dZdZeed<   	 dZeed<   	 eed<   	  e	e
¬¦  «        Zeeef         ed<   	  e	e
¬¦  «        Zeeef         ed<   	 d	Zeed
<   	 defˆ fd„Zdedefd„Z	 	 	 	 	 	 d"dedededededededefd„Z edd¬¦  «        Zdee         deee                  fd„Zdedee         fd„Zd edefd!„Zˆ xZS )#ÚOpenVINOEmbeddingsaü  OpenVINO embedding models.

    Example:
        .. code-block:: python

            from langchain_community.embeddings import OpenVINOEmbeddings

            model_name = "sentence-transformers/all-mpnet-base-v2"
            model_kwargs = {'device': 'CPU'}
            encode_kwargs = {'normalize_embeddings': True}
            ov = OpenVINOEmbeddings(
                model_name_or_path=model_name,
                model_kwargs=model_kwargs,
                encode_kwargs=encode_kwargs
            )
    NÚov_modelÚ	tokenizerÚmodel_name_or_path)Údefault_factoryÚmodel_kwargsÚencode_kwargsFÚshow_progressÚkwargsc           	      óX  •‡—  t          ¦   «         j        di |¤Ž 	 ddlm} n"# t          $ r}t	          d¦  «        |‚d}~ww xY w	 ddlmŠ n"# t          $ r}t	          d¦  «        |‚d}~ww xY w	 ddt          dt          d	t          d
t          fˆfd„} || j
        ¦  «        r  |j        | j
        fddi| j        ¤Ž| _        n |j        | j
        fi | j        ¤Ž| _        	 ddlm} n"# t          $ r}t	          d¦  «        |‚d}~ww xY w|                     | j
        ¦  «        | _        dS )ú$Initialize the sentence_transformer.r   )ÚOVModelForFeatureExtractionznCould not import optimum-intel python package. Please install it with: pip install -U 'optimum[openvino,nncf]'N)ÚHfApizjCould not import huggingface_hub python package. Please install it with: `pip install -U huggingface_hub`.Úmodel_idÚrevisionÚ	subfolderÚreturnc                 óÞ  •‡— t          | ¦  «        }|�||z  }|                     ¦   «         r0|dz                       ¦   «          p|dz                       ¦   «          S  ‰	¦   «         }	 |                     | |pd¬¦  «        }|€d n t          |¦  «                             ¦   «         Šˆfd„|j        D ¦   «         }|€dn‰› d�}||vp|                     dd¦  «        |vS # t          $ r Y d	S w xY w)
Nzopenvino_model.xmlzopenvino_model.binÚmain)r   c                 óV   •— g | ]%}‰�|j                              ‰¦  «        ¯|j         ‘Œ&S )N)Ú	rfilenameÚ
startswith)Ú.0ÚfileÚnormalized_subfolders     €úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/embeddings/openvino.pyú
<listcomp>zMOpenVINOEmbeddings.__init__.<locals>.require_model_export.<locals>.<listcomp>V   sD   ø€ ð ð ð àØ+Ð3Ø”~×0Ò0Ð1EÑFÔFð 4ð ”Nà3Ð3Ð3ó    z/openvino_model.xmlz.xmlz.binT)r   Úis_dirÚexistsÚ
model_infoÚas_posixÚsiblingsÚreplaceÚ	Exception)
r   r   r   Ú	model_dirÚhf_apir*   Úmodel_filesÚov_model_pathr$   r   s
           @€r%   Úrequire_model_exportz9OpenVINOEmbeddings.__init__.<locals>.require_model_exportE   s_  øø€ õ ˜X™œˆIØÐ$Ø%¨	Ñ1�	Ø×ÒÑ!Ô!ð à"Ð%9Ñ9×AÒAÑCÔCÐCð GØ%Ð(<Ñ<×DÒDÑFÔFÐFðð �U‘W”WˆFðØ#×.Ò.¨xÀ(ÐBTÈfÐ.ÑUÔU�
à%Ð-�D�Dµ4¸	±?´?×3KÒ3KÑ3MÔ3Mð %ðð ð ð à *Ô 3ðñ ô �ð !Ð(ð )Ð(à0ÐEÐEÐEð ð "¨Ð4ð PØ$×,Ò,¨V°VÑ<Ô<ÀKÐOðøõ ð ð ð Ø�t�tðøøøs   Á(A5C Ã
C,Ã+C,ÚexportT)ÚAutoTokenizerzQUnable to import transformers, please install with `pip install -U transformers`.© )NN)ÚsuperÚ__init__Úoptimum.intel.openvinor   ÚImportErrorÚhuggingface_hubr   Ústrr   Úboolr   Úfrom_pretrainedr   r   Útransformersr5   r   )Úselfr   r   Úer3   r5   r   Ú	__class__s         @€r%   r8   zOpenVINOEmbeddings.__init__/   s  øø€ à�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"ð	ØJÐJÐJÐJÐJÐJÐJøÝð 	ð 	ð 	Ýð:ñô ð ð	øøøøð	øøøð	Ø-Ð-Ð-Ð-Ð-Ð-Ð-øÝð 	ð 	ð 	Ýð4ñô ð ð	øøøøð	øøøð CGð!	ð !	Ýð!	Ý%(ð!	Ý<?ð!	åð!	ð !	ð !	ð !	ð !	ð !	ðF  Ð Ô 7Ñ8Ô8ð 		àGÐ7ÔGØÔ'ðð Ø04ðØ8<Ô8Iðð ˆDŒMˆMð
 HÐ7ÔGØÔ'ðð Ø+/Ô+<ðð ˆDŒMð	Ø2Ð2Ð2Ð2Ð2Ð2Ð2øÝð 	ð 	ð 	Ýð1ñô ð ðøøøøð	øøøð
 '×6Ò6°tÔ7NÑOÔOˆŒˆˆsB   �$ ¤
A®>¾AÁA Á
A-ÁA(Á(A-Ã"C) Ã)
DÃ3DÄDÚtextr   c                 ór  — t          |t          ¦  «        r;t          t          t	          |                     ¦   «         ¦  «        ¦  «        ¦  «        S t          |d¦  «        sdS t          |¦  «        dk    st          |d         t          ¦  «        rt          |¦  «        S t          d„ |D ¦   «         ¦  «        S )zé
        Help function to get the length for the input text. Text can be either
        a list of ints (which means a single text as input), or a tuple of list of ints
        (representing several text inputs to the model).
        Ú__len__é   r   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r6   )Úlen)r"   Úts     r%   r&   z3OpenVINOEmbeddings._text_length.<locals>.<listcomp>Œ   s   € Ð-Ð-Ð- 1�˜A™œÐ-Ð-Ð-r'   )	Ú
isinstanceÚdictrH   ÚnextÚiterÚvaluesÚhasattrÚintÚsum©r@   rC   s     r%   Ú_text_lengthzOpenVINOEmbeddings._text_length|   sŸ   € õ �d�DÑ!Ô!ð 		/Ý•t�D §¢¡¤Ñ/Ô/Ñ0Ô0Ñ1Ô1Ð1Ý˜˜yÑ)Ô)ð 	/Ø�1å�‰YŒY˜!Š^ˆ^�z¨$¨q¬'µ3Ñ7Ô7ˆ^Ý�t‘9”9Ðõ Ð-Ð-¨Ð-Ñ-Ô-Ñ.Ô.Ð.r'   é   TÚ	sentencesÚ
batch_sizeÚshow_progress_barÚconvert_to_numpyÚconvert_to_tensorÚmean_poolingÚnormalize_embeddingsc                 óh  ‡ ‡‡‡— 	 ddl }n"# t          $ r}	t          d¦  «        |	‚d}	~	ww xY w	 ddlm}
 n"# t          $ r}	t          d¦  «        |	‚d}	~	ww xY w	 ddlŠn"# t          $ r}	t          d¦  «        |	‚d}	~	ww xY wdt
          dt
          d	t
          fˆfd
„}|rd}d}t          ‰t          ¦  «        st          ‰d¦  «        s‰gŠd}g Š| 	                    ˆ fd„‰D ¦   «         ¦  «        }ˆfd„|D ¦   «         } |
dt          ‰¦  «        |d| ¬¦  «        D �]}||||z   …         }‰ j        j        j        d                              ¦   «         d         }|j        r‰                      |ddd¬¦  «        }n,‰                      |d|                     ¦   «         dd¬¦  «        } ‰ j        di |¤Ž}|r |||d         ¦  «        }n|d         dd…df         }|r"‰j        j                             |dd¬¦  «        }|r|                     ¦   «         }‰                     |¦  «         �Œˆfd„| 	                    |¦  «        D ¦   «         Š|r:t          ‰¦  «        r‰                     ‰¦  «        Šn6‰                     ¦   «         Šn!|r|                     d„ ‰D ¦   «         ¦  «        Š|r‰d         Š‰S )aw  
        Computes sentence embeddings.

        :param sentences: the sentences to embed.
        :param batch_size: the batch size used for the computation.
        :param show_progress_bar: Whether to output a progress bar.
        :param convert_to_numpy: Whether the output should be a list of numpy vectors.
        :param convert_to_tensor: Whether the output should be one large tensor.
        :param mean_pooling: Whether to pool returned vectors.
        :param normalize_embeddings: Whether to normalize returned vectors.

        :return: By default, a 2d numpy array with shape [num_inputs, output_dimension].
        r   NzCUnable to import numpy, please install with `pip install -U numpy`.)ÚtrangezAUnable to import tqdm, please install with `pip install -U tqdm`.zCUnable to import torch, please install with `pip install -U torch`.Úmodel_outputÚattention_maskr   c                 ó4  •— | d         }|                      d¦  «                             |                     ¦   «         ¦  «                             ¦   «         }‰                     ||z  d¦  «        ‰                     |                     d¦  «        d¬¦  «        z  S )Nr   éÿÿÿÿrF   g•Ö&è.>)Úmin)Ú	unsqueezeÚexpandÚsizeÚfloatrQ   Úclamp)r^   r_   Útoken_embeddingsÚinput_mask_expandedÚtorchs       €r%   Úrun_mean_poolingz3OpenVINOEmbeddings.encode.<locals>.run_mean_pooling¸   s    ø€ Ø+Øô Ðð ×(Ò(¨Ñ,Ô,×3Ò3Ð4D×4IÒ4IÑ4KÔ4KÑLÔL×RÒRÑTÔTð  ð —9’9Ð-Ð0CÑCÀQÑGÔGÈ%Ï+Ê+Ø#×'Ò'¨Ñ*Ô*°ð KVñ Kô Kñ ð r'   FrE   Tc                 ó<   •— g | ]}‰                      |¦  «         ‘ŒS r6   )rS   )r"   Úsenr@   s     €r%   r&   z-OpenVINOEmbeddings.encode.<locals>.<listcomp>Î   s*   ø€ Ð'UÐ'UÐ'UÀC¨×):Ò):¸3Ñ)?Ô)?Ð(?Ð'UÐ'UÐ'Ur'   c                 ó    •— g | ]
}‰|         ‘ŒS r6   r6   )r"   ÚidxrU   s     €r%   r&   z-OpenVINOEmbeddings.encode.<locals>.<listcomp>Ï   s   ø€ ÐHÐHÐH¨s˜I cœNÐHÐHÐHr'   ÚBatches)ÚdescÚdisablerF   Úpt)ÚpaddingÚ
truncationÚreturn_tensorsÚ
max_length)rt   rw   ru   rv   é   )ÚpÚdimc                 ó    •— g | ]
}‰|         ‘ŒS r6   r6   )r"   ro   Úall_embeddingss     €r%   r&   z-OpenVINOEmbeddings.encode.<locals>.<listcomp>ò   s   ø€ ÐWÐWÐW°#˜.¨Ô-ÐWÐWÐWr'   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r6   )Únumpy)r"   Úembs     r%   r&   z-OpenVINOEmbeddings.encode.<locals>.<listcomp>ú   s    € Ð(OÐ(OÐ(O¸¨¯ª©¬Ð(OÐ(OÐ(Or'   r6   )r~   r:   Útqdmr]   rj   r   rJ   r<   rO   ÚargsortrH   r   ÚrequestÚinputsÚget_partial_shapeÚ
is_dynamicr   Ú
get_lengthÚnnÚ
functionalÚ	normalizeÚcpuÚextendÚstackÚTensorÚasarray)r@   rU   rV   rW   rX   rY   rZ   r[   ÚnprA   r]   rk   Úinput_was_stringÚlength_sorted_idxÚsentences_sortedÚstart_indexÚsentences_batchÚlengthÚfeaturesÚout_featuresÚ
embeddingsr|   rj   s   ``                   @@r%   ÚencodezOpenVINOEmbeddings.encodeŽ   sÎ  øøøø€ ð.	ØÐÐÐÐøÝð 	ð 	ð 	ÝØUñô àðøøøøð	øøøð	Ø#Ð#Ð#Ð#Ð#Ð#Ð#øÝð 	ð 	ð 	ÝØSñô àðøøøøð	øøøð	ØˆLˆLˆLˆLøÝð 	ð 	ð 	ÝØUñô àðøøøøð	øøøð
		­3ð 		Åð 		Íð 		ð 		ð 		ð 		ð 		ð 		ð ð 	%Ø$Ðà ÐÝ�i¥Ñ%Ô%ð 	$­WØ�yñ.
ô .
ð 	$ð #˜ˆIØ#Ðà ˆØŸJšJÐ'UÐ'UÐ'UÐ'UÈ9Ð'UÑ'UÔ'UÑVÔVÐØHÐHÐHÐHÐ6GÐHÑHÔHÐà!˜6Ø�s�9‰~Œ~˜z°	ÐGXÐCXð
ñ 
ô 
ð 	.ñ 	.ˆKð /¨{¸[È:Ñ=UÐ/UÔVˆOà”]Ô*Ô1°!Ô4×FÒFÑHÔHÈÔKˆFØÔ ð ØŸ>š>Ø#¨T¸dÐSWð *ñ ô ��ð  Ÿ>š>Ø#Ø(Ø%×0Ò0Ñ2Ô2Ø#Ø#'ð *ñ ô �ð )˜4œ=Ð4Ð4¨8Ð4Ð4ˆLØð 3Ø-Ð-¨l¸HÐEUÔ<VÑWÔW�
�
à)¨!œ_¨Q¨Q¨Q°¨TÔ2�
Ø#ð SØ"œXÔ0×:Ò:¸:ÈÐPQÐ:ÑRÔR�
ð  ð .Ø'Ÿ^š^Ñ-Ô-�
à×!Ò! *Ñ-Ô-Ð-Ñ-àWÐWÐWÐW¸¿ºÐDUÑ9VÔ9VÐWÑWÔWˆàð 	QÝ�>Ñ"Ô"ð 0Ø!&§¢¨^Ñ!<Ô!<��à!&§¢¡¤��Øð 	QØŸZšZÐ(OÐ(OÀÐ(OÑ(OÔ(OÑPÔPˆNàð 	/Ø+¨AÔ.ˆNàÐs<   † ‹
*•%¥*®5 µ
A¿AÁAÁA Á
A<Á'A7Á7A<Úforbidr6   )ÚextraÚprotected_namespacesÚtextsc                 óš   — t          t          d„ |¦  «        ¦  «        } | j        |fd| j        i| j        ¤Ž}|                     ¦   «         S )úÉCompute doc embeddings using a HuggingFace transformer model.

        Args:
            texts: The list of texts to embed.

        Returns:
            List of embeddings, one for each text.
        c                 ó.   — |                       dd¦  «        S )Nú
ú )r-   )Úxs    r%   ú<lambda>z4OpenVINOEmbeddings.embed_documents.<locals>.<lambda>  s   €  1§9¢9¨T°3Ñ#7Ô#7€ r'   rW   )ÚlistÚmapr™   r   r   Útolist©r@   r�   r˜   s      r%   Úembed_documentsz"OpenVINOEmbeddings.embed_documents  sd   € õ •SÐ7Ð7¸Ñ?Ô?Ñ@Ô@ˆØ �T”[Øð
ð 
Ø%)Ô%7ð
Ø;?Ô;Mð
ð 
ˆ
ð × Ò Ñ"Ô"Ð"r'   c                 ó:   — |                       |g¦  «        d         S )ú³Compute query embeddings using a HuggingFace transformer model.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text.
        r   )r©   rR   s     r%   Úembed_queryzOpenVINOEmbeddings.embed_query  s   € ð ×#Ò# T FÑ+Ô+¨AÔ.Ð.r'   Ú
model_pathc                 ó    — | j                              ¦   «          | j                              |¦  «         | j                             |¦  «         dS )NT)r   ÚhalfÚsave_pretrainedr   )r@   r­   s     r%   Ú
save_modelzOpenVINOEmbeddings.save_model  sI   € ð 	Œ×ÒÑÔÐØŒ×%Ò% jÑ1Ô1Ð1ØŒ×&Ò& zÑ2Ô2Ð2Øˆtr'   )rT   FTFFT)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__annotations__r   r<   r
   rK   r   r   r   r   r=   r8   rP   rS   r™   r	   Úmodel_configr   rf   r©   r¬   r±   Ú__classcell__©rB   s   @r%   r   r      s5  ø€ € € € € € ðð ð" €HˆcÐÐÑØ Ø€IˆsÐÐÑØ(ØÐÐÑØØ#( 5¸Ð#>Ñ#>Ô#>€L�$�s˜C�x”.Ð>Ð>Ñ>Ø1Ø$) E¸$Ð$?Ñ$?Ô$?€M�4˜˜S˜”>Ð?Ð?Ñ?ØRØ€M�4ÐÐÑØ)ðKP ð KPð KPð KPð KPð KPð KPðZ/ ð /¨ð /ð /ð /ð /ð* Ø"'Ø!%Ø"'Ø"Ø%)ðqð qàðqð ðqð  ð	qð
 ðqð  ðqð ðqð #ðqð 
ðqð qð qð qðf �: HÀ2ÐFÑFÔF€Lð# T¨#¤Yð #°4¸¸U¼Ô3Dð #ð #ð #ð #ð"	/ ð 	/¨¨U¬ð 	/ð 	/ð 	/ð 	/ðàðð 
ðð ð ð ð ð ð ð r'   r   c                   óš   ‡ — e Zd ZU dZeZeed<   	 dZeed<   	 de	fˆ fd„Z
dee         deee                  fd	„Zd
edee         fd„Zˆ xZS )ÚOpenVINOBgeEmbeddingsaø  OpenVNO BGE embedding models.

    Bge Example:
        .. code-block:: python

            from langchain_community.embeddings import OpenVINOBgeEmbeddings

            model_name = "BAAI/bge-large-en-v1.5"
            model_kwargs = {'device': 'CPU'}
            encode_kwargs = {'normalize_embeddings': True}
            ov = OpenVINOBgeEmbeddings(
                model_name_or_path=model_name,
                model_kwargs=model_kwargs,
                encode_kwargs=encode_kwargs
            )
    Úquery_instructionÚ Úembed_instructionr   c                 óh   •—  t          ¦   «         j        di |¤Ž d| j        v rt          | _        dS dS )r   z-zhNr6   )r7   r8   r   Ú DEFAULT_QUERY_BGE_INSTRUCTION_ZHr¼   )r@   r   rB   s     €r%   r8   zOpenVINOBgeEmbeddings.__init__@  sD   ø€ à�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"à�DÔ+Ð+Ð+Ý%EˆDÔ"Ð"Ð"ð ,Ð+r'   r�   r   c                 ón   ‡ — ˆ fd„|D ¦   «         } ‰ j         |fi ‰ j        ¤Ž}|                     ¦   «         S )rŸ   c                 óL   •— g | ] }‰j         |                     d d¦  «        z   ‘Œ!S )r¡   r¢   )r¾   r-   )r"   rI   r@   s     €r%   r&   z9OpenVINOBgeEmbeddings.embed_documents.<locals>.<listcomp>P  s/   ø€ ÐNÐNÐNÀ1�Ô'¨!¯)ª)°D¸#Ñ*>Ô*>Ñ>ÐNÐNÐNr'   )r™   r   r§   r¨   s   `  r%   r©   z%OpenVINOBgeEmbeddings.embed_documentsG  sM   ø€ ð OÐNÐNÐNÈÐNÑNÔNˆØ �T”[ Ð=Ð=¨$Ô*<Ð=Ð=ˆ
Ø× Ò Ñ"Ô"Ð"r'   rC   c                 óŒ   — |                      dd¦  «        } | j        | j        |z   fi | j        ¤Ž}|                     ¦   «         S )r«   r¡   r¢   )r-   r™   r¼   r   r§   )r@   rC   Ú	embeddings      r%   r¬   z!OpenVINOBgeEmbeddings.embed_queryT  sM   € ð �|Š|˜D #Ñ&Ô&ˆØ�D”K Ô 6¸Ñ =ÐTÐTÀÔASÐTÐTˆ	Ø×ÒÑ!Ô!Ð!r'   )r²   r³   r´   rµ   Ú DEFAULT_QUERY_BGE_INSTRUCTION_ENr¼   r<   r¶   r¾   r   r8   r   rf   r©   r¬   r¸   r¹   s   @r%   r»   r»   )  sÖ   ø€ € € € € € ðð ð" >Ð�sÐ=Ð=Ñ=Ø1ØÐ�sÐÐÑØ4ðF ð Fð Fð Fð Fð Fð Fð# T¨#¤Yð #°4¸¸U¼Ô3Dð #ð #ð #ð #ð" ð "¨¨U¬ð "ð "ð "ð "ð "ð "ð "ð "r'   r»   N)Úpathlibr   Útypingr   r   r   Úlangchain_core.embeddingsr   Úpydanticr   r	   r
   ÚDEFAULT_QUERY_INSTRUCTIONrÅ   rÀ   r   r»   r6   r'   r%   ú<module>rË      sî   ðØ Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1ð Cð ð @ð !ð $_Ð  ðVð Vð Vð Vð V˜ Jñ Vô Vð Vðr6"ð 6"ð 6"ð 6"ð 6"Ð.ñ 6"ô 6"ð 6"ð 6"ð 6"r'   