U
    h                     @   sR   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 dee	ZdS )    N)AnyDictListOptional)
Embeddings)	BaseModelroot_validatorc                       s   e Zd ZU dZeed< dZeed< dZeed< dZ	eed< dZ
eed	< d
Zee ed< eed< eed< eedd fddZeddeedddZeedddZd"eeedddZee eee  dddZeee dd d!Z  ZS )#AscendEmbeddingsag  
    Ascend NPU accelerate Embedding model

    Please ensure that you have installed CANN and torch_npu.

    Example:

    from langchain_community.embeddings import AscendEmbeddings
    model = AscendEmbeddings(model_path=<path_to_model>,
        device_id=0,
        query_instruction="Represent this sentence for searching relevant passages: "
    )
    
model_pathr   	device_id query_instructiondocument_instructionTuse_fp16clspooling_methodmodel	tokenizerN)argskwargsreturnc              
      s   t  j|| zddlm}m} W n, tk
rN } ztd|W 5 d }~X Y nX z(|| j 	 | _
|| j| _W n0 tk
r } ztd| W 5 d }~X Y nX | jr| j
  | dd tdD  d S )Nr   )	AutoModelAutoTokenizerzQUnable to import transformers, please install with `pip install -U transformers`.z?Failed to load model [self.model_path], due to following error:c                 S   s   g | ]}d | dqS )zwarmup z times ).0ir   r   I/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/embeddings/ascend.py
<listcomp>7   s     z-AscendEmbeddings.__init__.<locals>.<listcomp>
   )super__init__Ztransformersr   r   ImportErrorZfrom_pretrainedr
   npuevalr   r   	Exceptionr   Zhalfencoderange)selfr   r   r   r   e	__class__r   r   r    $   s&    
zAscendEmbeddings.__init__)pre)valuesr   c              
   C   s   d|krt dt|d tjs6td|d  dzdd l}W n@ tk
r^   tdY n& tk
r } z|W 5 d }~X Y nX z|j	
|d  W n0 tk
r } ztd| W 5 d }~X Y nX |S )	Nr
   zmodel_path is requiredz$Unable to find valid model path in []r   z-torch_npu not found, please install torch_npur   zset device failed due to )
ValueErrorosaccessF_OKFileNotFoundError	torch_npur!   ModuleNotFoundErrorr$   r"   Z
set_device)r   r,   r3   r(   r   r   r   validate_environment9   s"     z%AscendEmbeddings.validate_environment)	sentencesr   c              
   C   s   | j |ddddd}zdd l}W n, tk
rL } ztd|W 5 d }~X Y nX | j|j |j ddj}| ||d  }|j	j
j|d	d
}|   S )NTpti   )paddingZ
truncationZreturn_tensors
max_lengthr   CUnable to import torch, please install with `pip install -U torch`.)Zreturn_dictattention_maskdim)r   torchr!   r   Z	input_idsr"   r;   last_hidden_statepoolingnnZ
functional	normalizecpudetachZnumpy)r'   r6   inputsr?   r(   r@   tmpZ
embeddingsr   r   r   r%   M   s.      zAscendEmbeddings.encode)r@   r;   r   c              
   C   s   zdd l }W n, tk
r8 } ztd|W 5 d }~X Y nX | jdkrT|d d df S | jdkr|j||d  dd}|jddd	 }|| S td
| j dd S )Nr   r:   r   Zmeanr<   r=      T)r>   ZkeepdimzPooling method [z] not implemented)r?   r!   r   sumZ	unsqueezefloatNotImplementedError)r'   r@   r;   r?   r(   sdr   r   r   rA   b   s(    

 zAscendEmbeddings.pooling)textsr   c                    s      fdd|D S )Nc                    s   g | ]} j | qS r   )r   )r   textr'   r   r   r   w   s     z4AscendEmbeddings.embed_documents.<locals>.<listcomp>)r%   )r'   rN   r   rP   r   embed_documentsv   s    z AscendEmbeddings.embed_documents)rO   r   c                 C   s   |  | j| gd S )Nr   )r%   r   )r'   rO   r   r   r   embed_queryy   s    zAscendEmbeddings.embed_query)N)__name__
__module____qualname____doc__str__annotations__r   intr   r   r   boolr   r   r   r    r   r   r5   r%   rA   r   rJ   rQ   rR   __classcell__r   r   r)   r   r	      s    
r	   )r/   typingr   r   r   r   Zlangchain_core.embeddingsr   Zlangchain_core.pydantic_v1r   r   r	   r   r   r   r   <module>   s   