o
    Zh1                     @   sr   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	 d	e	eZG d
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                       s0  e Zd ZU dZdZeed< 	 dZeed< 	 eed< 	 e	e
dZeeef ed< 	 e	e
dZeeef ed< 	 d	Zeed
< 	 def fddZdedefddZ									d(dedededededededefddZedddZd ee deee  fd!d"Zdedee fd#d$Zd%edefd&d'Z  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              
      s"  t  jdi | zddlm} W n ty" } ztd|d}~ww zddlm  W n ty< } ztd|d}~ww 	ddtdtd	td
t	f fdd}|| j
rb|j| j
fddi| j| _n|j| j
fi | j| _zddlm} W n ty } ztd|d}~w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                    s   t | }|d ur|| }| r|d   p|d   S  }z7|j| |p(dd}|d u r1d nt |   fdd|jD }|d u rGdn  d}||vpW|dd	|vW S  tyb   Y d
S w )Nzopenvino_model.xmlzopenvino_model.binmain)r   c                    s&   g | ]} d u s|j  r|j qS )N)Z	rfilename
startswith).0fileZnormalized_subfolder ^/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/embeddings/openvino.py
<listcomp>V   s    
zMOpenVINOEmbeddings.__init__.<locals>.require_model_export.<locals>.<listcomp>z/openvino_model.xmlz.xmlz.binT)r   is_direxists
model_infoas_posixZsiblingsreplace	Exception)r   r   r   Z	model_dirZhf_apir%   Zmodel_filesZov_model_pathr   r   r!   require_model_exportE   s2   
z9OpenVINOEmbeddings.__init__.<locals>.require_model_exportZexportT)AutoTokenizerzQUnable to import transformers, please install with `pip install -U transformers`.r    )NN)super__init__Zoptimum.intel.openvinor   ImportErrorZhuggingface_hubr   strr   boolr   Zfrom_pretrainedr   r   Ztransformersr*   r   )selfr   r   er)   r*   	__class__r   r!   r,   /   sn   
#
zOpenVINOEmbeddings.__init__textr   c                 C   s`   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 |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                 S   s   g | ]}t |qS r    )lenr   tr    r    r!   r"          z3OpenVINOEmbeddings._text_length.<locals>.<listcomp>)	
isinstancedictr7   nextitervalueshasattrintsumr0   r4   r    r    r!   _text_length|   s   

zOpenVINOEmbeddings._text_length   T	sentences
batch_sizeshow_progress_barconvert_to_numpyconvert_to_tensormean_poolingnormalize_embeddingsc              
      sL  zddl }W n ty }	 ztd|	d}	~	ww zddlm}
 W n ty1 }	 ztd|	d}	~	ww zddlW n tyI }	 ztd|	d}	~	ww dtdtd	tffd
d}|r[d}d}ttsgtdslgd}g  |	fddD }fdd|D }|
dt
|d| dD ]a}||||  }jjjd  d }|jrj|dddd}nj|d| ddd}jdi |}|r|||d }n
|d dddf }|rjjj|ddd}|r| } | q fdd|	|D  |rt
 r  n  n|r|d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                    sD   | d }| d|  } || d j|ddd S )Nr   r6   g&.>)min)Z	unsqueezeexpandsizefloatrB   clamp)rN   rO   Ztoken_embeddingsZinput_mask_expanded)torchr    r!   run_mean_pooling   s   
z3OpenVINOEmbeddings.encode.<locals>.run_mean_poolingFr5   Tc                    s   g | ]}  | qS r    )rD   )r   Zsenr0   r    r!   r"      s    z-OpenVINOEmbeddings.encode.<locals>.<listcomp>c                       g | ]} | qS r    r    r   idx)rF   r    r!   r"      r:   ZBatches)Zdescdisabler6   pt)padding
truncationreturn_tensors
max_length)r^   ra   r_   r`      )pdimc                    rY   r    r    rZ   )all_embeddingsr    r!   r"      r:   c                 S   s   g | ]}|  qS r    )numpy)r   Zembr    r    r!   r"      r:   r    )rf   r-   ZtqdmrM   rV   r   r;   r.   r@   Zargsortr7   r   requestZinputsZget_partial_shapeZ
is_dynamicr   Z
get_lengthnnZ
functional	normalizecpuextendstackZTensorZasarray)r0   rF   rG   rH   rI   rJ   rK   rL   npr1   rM   rW   Zinput_was_stringZlength_sorted_idxZsentences_sortedstart_indexZsentences_batchlengthfeaturesZout_features
embeddingsr    )re   r0   rF   rV   r!   encode   s   


zOpenVINOEmbeddings.encodeZforbidr    )extraZprotected_namespacestextsc                 C   s4   t td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                 S   s   |  ddS )N
 )r'   )xr    r    r!   <lambda>  s    z4OpenVINOEmbeddings.embed_documents.<locals>.<lambda>rH   )listmaprr   r   r   tolistr0   rt   rq   r    r    r!   embed_documents  s   
z"OpenVINOEmbeddings.embed_documentsc                 C   s   |  |gd S )Compute query embeddings using a HuggingFace transformer model.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text.
        r   )r~   rC   r    r    r!   embed_query  s   	zOpenVINOEmbeddings.embed_query
model_pathc                 C   s&   | j   | j | | j| dS )NT)r   ZhalfZsave_pretrainedr   )r0   r   r    r    r!   
save_model  s   
zOpenVINOEmbeddings.save_model)rE   FTFFT)__name__
__module____qualname____doc__r   r   __annotations__r   r.   r	   r<   r   r   r   r   r/   r,   rA   rD   rr   r   Zmodel_configr   rT   r~   r   r   __classcell__r    r    r2   r!   r
      s^   
 M	
sr
   c                       sx   e Zd ZU dZeZeed< 	 dZeed< 	 de	f fddZ
dee d	eee  fd
dZded	ee fddZ  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                    s*   t  jdi | d| jv rt| _dS dS )r   z-zhNr    )r+   r,   r    DEFAULT_QUERY_BGE_INSTRUCTION_ZHr   )r0   r   r2   r    r!   r,   @  s   

zOpenVINOBgeEmbeddings.__init__rt   r   c                    s.    fdd|D } j |fi  j}| S )ru   c                    s   g | ]} j |d d qS )rv   rw   )r   r'   r8   rX   r    r!   r"   P  s    z9OpenVINOBgeEmbeddings.embed_documents.<locals>.<listcomp>)rr   r   r|   r}   r    rX   r!   r~   G  s   	z%OpenVINOBgeEmbeddings.embed_documentsr4   c                 C   s.   | dd}| j| j| fi | j}| S )r   rv   rw   )r'   rr   r   r   r|   )r0   r4   Z	embeddingr    r    r!   r   T  s   	z!OpenVINOBgeEmbeddings.embed_query)r   r   r   r    DEFAULT_QUERY_BGE_INSTRUCTION_ENr   r.   r   r   r   r,   r   rT   r~   r   r   r    r    r2   r!   r   )  s   
 r   N)pathlibr   typingr   r   r   Zlangchain_core.embeddingsr   Zpydanticr   r   r	   ZDEFAULT_QUERY_INSTRUCTIONr   r   r
   r   r    r    r    r!   <module>   s      