a
    bgb                     @   sV   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
mZ G dd dee	ZdS )    N)AnyDictListOptional)
Embeddings)	BaseModel
ConfigDictmodel_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ddZeedd fddZedde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	tokenizer )Zprotected_namespacesN)argskwargsreturnc              
      s   t  j|i | zddlm}m} W n. tyT } ztd|W Y d }~n
d }~0 0 z(|| j 	 | _
|| j| _W n2 ty } ztd| W Y d }~n
d }~0 0 | 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 timesr   ).0ir   r   s/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/embeddings/ascend.py
<listcomp>9       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__before)mode)valuesr   c              
   C   s   d|vrt dt|d tjs6td|d  dzdd l}W n@ ty\   tdY n( ty } z|W Y d }~n
d }~0 0 z|j	
|d  W n2 ty } ztd| W Y d }~n
d }~0 0 |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/   r6   r*   r   r   r   validate_environment;   s"    $z%AscendEmbeddings.validate_environment)	sentencesr   c              
   C   s   | j |ddddd}zdd l}W n. tyN } ztd|W Y d }~n
d }~0 0 | 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detachnumpy)r)   r9   inputsrB   r*   rC   tmpZ
embeddingsr   r   r   r'   P   s*    zAscendEmbeddings.encode)rC   r>   r   c              
   C   s   zdd l }W n. ty: } ztd|W Y d }~n
d }~0 0 | jdkrV|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   meanr?   r@      T)rA   ZkeepdimzPooling method [z] not implemented)rB   r#   r   sumZ	unsqueezefloatNotImplementedError)r)   rC   r>   rB   r*   sdr   r   r   rD   e   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   z   r   z4AscendEmbeddings.embed_documents.<locals>.<listcomp>)r'   )r)   rS   r   rU   r   embed_documentsy   s    z AscendEmbeddings.embed_documents)rT   r   c                 C   s   |  | j| gd S )Nr   )r'   r   )r)   rT   r   r   r   embed_query|   s    zAscendEmbeddings.embed_query)N)__name__
__module____qualname____doc__str__annotations__r   intr   r   r   boolr   r   r   r   Zmodel_configr"   r	   classmethodr   r8   r'   rD   r   rO   rV   rW   __classcell__r   r   r+   r   r
      s$   

r
   )r2   typingr   r   r   r   Zlangchain_core.embeddingsr   Zpydanticr   r   r	   r
   r   r   r   r   <module>   s   