U
    h1                     @   sn   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
 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Fieldz<Represent the question for retrieving supporting documents: z9Represent this question for searching relevant passages: u9   为这个句子生成表示以用于检索相关文章：c                
       s   e Zd ZU dZeed< 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	< ed
 fddZeedddZdeeeeeeeedddZG dd dZee eee  dddZeee dddZeed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
            )
    ov_model	tokenizermodel_name_or_path)default_factorymodel_kwargsencode_kwargsFshow_progresskwargsc              
      s2  t  jf | zddlm} W n, tk
rJ } ztd|W 5 d}~X Y nX zddlm  W n, tk
r } ztd|W 5 d}~X Y nX dtttt	d fdd	}|| j
r|j| j
fd
di| j| _n|j| j
f| j| _zddlm} W n. tk
r } ztd|W 5 d}~X Y nX || 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 k	r|| }| r<|d   p:|d   S  }zn|j| |pPdd}|d krbd n
t |   fdd|jD }|d krdn  d}||kp|dd	|kW S  tk
r   Y d
S X d S )Nzopenvino_model.xmlzopenvino_model.binmain)r   c                    s&   g | ]} d ks|j  r|j qS )N)Z	rfilename
startswith).0fileZnormalized_subfolder K/tmp/pip-unpacked-wheel-9gdii04g/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   s0    
z9OpenVINOEmbeddings.__init__.<locals>.require_model_exportexportT)AutoTokenizerzQUnable to import transformers, please install with `pip install -U transformers`.)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-   /   s^         #

zOpenVINOEmbeddings.__init__textr   c                 C   sd   t |trttt| S t|ds,dS t|dksFt |d trNt|S tdd |D S 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"      s     z3OpenVINOEmbeddings._text_length.<locals>.<listcomp>N)	
isinstancedictr9   nextitervalueshasattrintsumr1   r6   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_embeddingsr   c              
      sl  zddl }W n, tk
r8 }	 ztd|	W 5 d}	~	X Y nX zddlm}
 W n, tk
rv }	 ztd|	W 5 d}	~	X Y nX zddlW n, tk
r }	 ztd|	W 5 d}	~	X Y nX tttdfdd	}|rd
}d
}ttstdsgd}g  |	fddD }fdd|D }|
dt
|d| dD ]}||||  }jjjd  d }|jr~j|dddd}nj|d| ddd}jf |}|r|||d }n|d dddf }|rjjj|ddd}|r| } | q8 fdd|	|D  |r@t
 r6  n  n|rZ|dd  D  |rh 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   r8   g&.>)min)Z	unsqueezeexpandsizefloatrC   clamp)rO   rP   Ztoken_embeddingsZinput_mask_expanded)torchr    r!   run_mean_pooling   s     z3OpenVINOEmbeddings.encode.<locals>.run_mean_poolingFr7   Tc                    s   g | ]}  | qS r    )rE   )r   Zsenr1   r    r!   r"      s     z-OpenVINOEmbeddings.encode.<locals>.<listcomp>c                    s   g | ]} | qS r    r    r   idx)rG   r    r!   r"      s     ZBatches)descdisabler8   pt)padding
truncationreturn_tensors
max_length)r_   rb   r`   ra   rP      )pZdimc                    s   g | ]} | qS r    r    rZ   )all_embeddingsr    r!   r"      s     c                 S   s   g | ]}|  qS r    )numpy)r   Zembr    r    r!   r"      s     )rf   r.   ZtqdmrN   rW   r   r<   r/   rA   Zargsortr9   r
   requestinputsZget_partial_shapeZ
is_dynamicr   Z
get_lengthnnZ
functional	normalizecpuextendstackZTensorZasarray)r1   rG   rH   rI   rJ   rK   rL   rM   npr2   rN   rX   Zinput_was_stringZlength_sorted_idxZsentences_sortedstart_indexZsentences_batchlengthfeaturesZout_features
embeddingsr    )re   r1   rG   rW   r!   encode   s         
   

zOpenVINOEmbeddings.encodec                   @   s   e Zd ZdZdS )zOpenVINOEmbeddings.ConfigZforbidN)__name__
__module____qualname__extrar    r    r    r!   Config  s   rx   textsr   c                 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>      z4OpenVINOEmbeddings.embed_documents.<locals>.<lambda>rI   )listmaprs   r   r   tolistr1   rz   rr   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   rD   r    r    r!   embed_query  s    	zOpenVINOEmbeddings.embed_query)
model_pathr   c                 C   s&   | j   | j | | j| dS )NT)r
   ZhalfZsave_pretrainedr   )r1   r   r    r    r!   
save_model   s    
zOpenVINOEmbeddings.save_model)rF   FTFFT)rt   ru   rv   __doc__r   __annotations__r/   r   r=   r   r   r   r   r0   r-   rB   rE   rs   rx   r   rU   r   r   r   __classcell__r    r    r3   r!   r	      s>   
M      sr	   c                       sp   e Zd ZU dZeZeed< dZeed< e	d fddZ
ee eee  dd	d
Zeee d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f | d| jkrt| _dS )r   z-zhN)r,   r-   r    DEFAULT_QUERY_BGE_INSTRUCTION_ZHr   )r1   r   r3   r    r!   r-   A  s    
zOpenVINOBgeEmbeddings.__init__ry   c                    s*    fdd|D } j |f j}| S )r{   c                    s   g | ]} j |d d qS )r|   r}   )r   r'   r:   rY   r    r!   r"   Q  s     z9OpenVINOBgeEmbeddings.embed_documents.<locals>.<listcomp>)rs   r   r   r   r    rY   r!   r   H  s    	z%OpenVINOBgeEmbeddings.embed_documentsr5   c                 C   s*   | dd}| j| j| f| j}| S )r   r|   r}   )r'   rs   r   r   r   )r1   r6   Z	embeddingr    r    r!   r   U  s    	z!OpenVINOBgeEmbeddings.embed_query)rt   ru   rv   r    DEFAULT_QUERY_BGE_INSTRUCTION_ENr   r/   r   r   r   r-   r   rU   r   r   r   r    r    r3   r!   r   *  s   
r   N)pathlibr   typingr   r   r   Zlangchain_core.embeddingsr   Zlangchain_core.pydantic_v1r   r   ZDEFAULT_QUERY_INSTRUCTIONr   r   r	   r   r    r    r    r!   <module>   s     