
    dh1                     ~    S SK Jr  S SKJrJrJr  S SKJr  S SKJ	r	J
r
Jr  SrSrSr " S S	\	\5      r " S
 S\5      rg)    )Path)AnyDictList)
Embeddings)	BaseModel
ConfigDictFieldz<Represent the question for retrieving supporting documents: z9Represent this question for searching relevant passages: u9   为这个句子生成表示以用于检索相关文章：c                   ^  ^  \ rS rSr% SrSr\\S'    Sr\\S'    \	\S'    \
" \S9r\\	\4   \S'    \
" \S9r\\	\4   \S	'    S
r\\S'    S\4U 4S jjrS\S\4S jr      S"S\S\S\S\S\S\S\S\4S jjr\" SSS9rS\\	   S\\\      4S jrS\	S\\   4S jrS\	S\4S  jrS!rU =r$ )#OpenVINOEmbeddings   a  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           	      p  >^ [         TU ]  " S0 UD6   SSKJn   SSKJm   SS[        S[        S	[        S
[        4U4S jjjnU" U R                  5      (       a/  UR                  " U R                  4SS0U R                  D6U l        O,UR                  " U R                  40 U R                  D6U l         SSKJn  UR                  U R                  5      U l        g! [         a  n[	        S5      UeSnAff = f! [         a  n[	        S5      UeSnAff = f! [         a  n[	        S5      UeSnAff = f)$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                 N  > [        U 5      nUb  X2-  nUR                  5       (       a7  US-  R                  5       (       + =(       d    US-  R                  5       (       + $ T
" 5       n UR                  X=(       d    SS9nUc  S O[        U5      R	                  5       nUR
                   Vs/ sH4  nUb"  UR                  R                  U5      (       d  M(  UR                  PM6     nnUc  SOU S3n	X;  =(       d    U	R                  SS5      U;  $ s  snf ! [         a     gf = f)	Nzopenvino_model.xmlzopenvino_model.binmain)r   z/openvino_model.xmlz.xmlz.binT)
r   is_direxists
model_infoas_posixsiblings	rfilename
startswithreplace	Exception)r   r   r   	model_dirhf_apir"   normalized_subfolderfilemodel_filesov_model_pathr   s             _/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/embeddings/openvino.pyrequire_model_export9OpenVINOEmbeddings.__init__.<locals>.require_model_exportE   sH    XI$%1	!!"%99AACC G%(<<DDFF WF#..xBTf.U
%-D4	?3K3K3M %
 !+ 3 3 3+3~~001EF #DNN 3   !( )011DE  "4 P$,,VV<KO  s+   (AD ,&DD&+D D 
D$#D$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   transformersr3   r   )selfr   r   er0   r3   r   	__class__s         @r/   r6   OpenVINOEmbeddings.__init__/   sa   "6"	J	- CG!	!	%(!	<?!	!	 !	F   7 7887GG''048<8I8IDM
 8GG''+/+<+<DM	2 '66t7N7NOK  	: 		  	4 		n  	1 	sF   C C< 7D 
C9(C44C9<
DDD
D5$D00D5textr   c                 \   [        U[        5      (       a+  [        [        [	        UR                  5       5      5      5      $ [        US5      (       d  g[        U5      S:X  d  [        US   [        5      (       a  [        U5      $ [        U Vs/ sH  n[        U5      PM     sn5      $ s  snf )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   )	
isinstancedictlennextitervalueshasattrintsum)r>   rB   ts      r/   _text_lengthOpenVINOEmbeddings._text_length|   s     dD!!tD/011y))Y!^z$q'377t9 -1A-..-s   B)	sentences
batch_sizeshow_progress_barconvert_to_numpyconvert_to_tensormean_poolingnormalize_embeddingsc           	        ^  SSK n SSKJn
   SSKmS[
        S[
        S	[
        4U4S
 jjnU(       a  SnSn[        U[        5      (       d  [        US5      (       d  U/nSn/ nUR                  U Vs/ sH  oR                  U5      * PM     sn5      nU Vs/ sH  nUU   PM
     nnU
" S[        U5      USU(       + S9 GH  nUUUU-    nU R                  R                  R                  S   R                  5       S   nUR                   (       a  U R#                  USSSS9nO!U R#                  USUR%                  5       SSS9nU R                  " S0 UD6nU(       a  U" UUS   5      nOUS   SS2S4   nU(       a%  TR&                  R(                  R+                  USSS9nU(       a  UR-                  5       nUR/                  U5        GM     UR                  U5       Vs/ sH  nUU   PM
     nnU(       a3  [        U5      (       a  TR1                  U5      nOGTR3                  5       nO6U(       a/  UR5                  U Vs/ sH  nUR                  5       PM     sn5      nU(       a  US   n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! [         a  n	[        S5      U	eSn	A	ff = fs  snf s  snf s  snf s  snf )a'  
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                    > U S   nUR                  S5      R                  UR                  5       5      R                  5       nTR	                  X#-  S5      TR                  UR	                  S5      SS9-  $ )Nr   rE   g&.>)min)	unsqueezeexpandsizefloatrN   clamp)r[   r\   token_embeddingsinput_mask_expandedtorchs       r/   run_mean_pooling3OpenVINOEmbeddings.encode.<locals>.run_mean_pooling   s    +  ((,334D4I4I4KLRRT   99-CQG%++#''* KV K      FrD   TBatches)descdisablerE   pt)padding
truncationreturn_tensors
max_length)ro   rr   rp   rq      )pdimr4   )numpyr8   tqdmrZ   rg   r   rF   r:   rL   argsortrP   rH   r   requestinputsget_partial_shape
is_dynamicr   
get_lengthnn
functional	normalizecpuextendstackTensorasarray)r>   rR   rS   rT   rU   rV   rW   rX   npr?   rZ   rh   input_was_stringall_embeddingssenlength_sorted_idxidxsentences_sortedstart_indexsentences_batchlengthfeaturesout_features
embeddingsembrg   s                            @r/   encodeOpenVINOEmbeddings.encode   s   .	
	#
			3 		 		 		 $ i%%Wy.
 .
 #I# JJ9'U9C):):3)?(?9'UV6GH6GsIcN6GH!s9~z	GXCX
K /{[:=UVO]]**11!4FFHKF  >>#TdSW *   >>#(%002##' *   ==484L-lHEU<VW
)!_QT2
#"XX00:::PQ:R
  '^^-
!!*-?
B :<DU9VW9V#.-9VW>""!&^!<!&ZZ(O(OPN+A.Nq  	U	  	S	  	U	6 (VHF X )Ps]   I2 J J. 4KK$KK2
J<JJ
J+J&&J+.
K	8KK	forbidr4   )extraprotected_namespacestextsc                     [        [        S U5      5      nU R                  " U4SU R                  0U R                  D6nUR                  5       $ )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                 &    U R                  SS5      $ )N
 )r'   )xs    r/   <lambda>4OpenVINOEmbeddings.embed_documents.<locals>.<lambda>  s    199T3#7rj   rT   )listmapr   r   r   tolist)r>   r   r   s      r/   embed_documents"OpenVINOEmbeddings.embed_documents  sT     S7?@[[
%)%7%7
;?;M;M

   ""rj   c                 ,    U R                  U/5      S   $ )Compute query embeddings using a HuggingFace transformer model.

Args:
    text: The text to embed.

Returns:
    Embeddings for the text.
r   )r   )r>   rB   s     r/   embed_queryOpenVINOEmbeddings.embed_query  s     ##TF+A..rj   
model_pathc                     U R                   R                  5         U R                   R                  U5        U R                  R                  U5        g)NT)r   halfsave_pretrainedr   )r>   r   s     r/   
save_modelOpenVINOEmbeddings.save_model  s;     	%%j1&&z2rj   )r   r   )   FTFFT)__name__
__module____qualname____firstlineno____doc__r   r   __annotations__r   r:   r
   rG   r   r   r   r   r;   r6   rM   rP   r   r	   model_configr   rc   r   r   r   __static_attributes____classcell__r@   s   @r/   r   r      sd   " Hc Is(#(#>L$sCx.>1$)$$?M4S>?RM4)KP KPZ/ / /* "'!%"'"%)qq q  	q
 q  q q #q 
qf H2FL#T#Y #4U3D #"	/ 	/U 	/ 
 rj   r   c                      ^  \ rS rSr% Sr\r\\S'    Sr	\\S'    S\
4U 4S jjrS\\   S	\\\      4S
 jrS\S	\\   4S jrSrU =r$ )OpenVINOBgeEmbeddingsi)  a  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                 ^   > [         TU ]  " S0 UD6  SU R                  ;   a  [        U l        gg)r   z-zhNr4   )r5   r6   r    DEFAULT_QUERY_BGE_INSTRUCTION_ZHr   )r>   r   r@   s     r/   r6   OpenVINOBgeEmbeddings.__init__@  s.    "6"D+++%ED" ,rj   r   r   c                     U Vs/ sH!  o R                   UR                  SS5      -   PM#     nnU R                  " U40 U R                  D6nUR	                  5       $ s  snf )r   r   r   )r   r'   r   r   r   )r>   r   rO   r   s       r/   r   %OpenVINOBgeEmbeddings.embed_documentsG  s\     INN1''!))D#*>>N[[=$*<*<=
  "" Os   'ArB   c                     UR                  SS5      nU R                  " U R                  U-   40 U R                  D6nUR	                  5       $ )r   r   r   )r'   r   r   r   r   )r>   rB   	embeddings      r/   r   !OpenVINOBgeEmbeddings.embed_queryT  sG     ||D#&KK 6 6 =TASAST	!!rj   )r   )r   r   r   r   r    DEFAULT_QUERY_BGE_INSTRUCTION_ENr   r:   r   r   r   r6   r   rc   r   r   r   r   r   s   @r/   r   r   )  sp    " >s=1s4F F#T#Y #4U3D #" "U " "rj   r   N)pathlibr   typingr   r   r   langchain_core.embeddingsr   pydanticr   r	   r
   DEFAULT_QUERY_INSTRUCTIONr   r   r   r   r4   rj   r/   <module>r      sT     " " 0 1 1 C  @ ! $_  VJ Vr6". 6"rj   