o
    Zh-                     @   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< dZeed< eed< eed< eddZdededdf fddZeddededefddZdedefddZd*d ed!ede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 )+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    
batch_sizemodel	tokenizer )Zprotected_namespacesargskwargsreturnNc              
      s   t  j|i | z
ddlm}m} W n ty$ } ztd|d }~ww z|| j 	 | _
|| j| _W n tyL } ztd| d }~ww | jrU| 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   \/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/embeddings/ascend.py
<listcomp>:   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__before)modevaluesc              
   C   s   d|vrt dt|d tjstd|d  dzdd l}W n ty,   td ty9 } z|d }~ww z|j	
|d  W |S  tyX } ztd| d }~ww )	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   r0   r7   r+   r   r   r   validate_environment<   s*   z%AscendEmbeddings.validate_environment	sentencesc              
   C   s   | j |ddddd}zdd l}W n ty! } ztd|d }~ww | 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*   r:   ZinputsrC   r+   rD   tmpZ
embeddingsr   r   r   r(   Q   s2   zAscendEmbeddings.encoderD   r?   c              
   C   s   zdd l }W n ty } ztd|d }~ww | jdkr%|d d df S | jdkrE|j||d  dd}|jddd	 }|| S td
| j d)Nr   r>   r   meanr@   rA      T)rB   ZkeepdimzPooling method [z] not implemented)rC   r$   r   sumZ	unsqueezefloatNotImplementedError)r*   rD   r?   rC   r+   sdr   r   r   rE   f   s*   

zAscendEmbeddings.poolingtextsc              
      s   zdd l }W n ty } ztd|d }~ww g }tdt| jD ]}||| j  }  fdd|D }|| q#||S )Nr   zCUnable to import numpy, please install with `pip install -U numpy`.c                    s   g | ]} j | qS r   )r   )r   textr*   r   r   r       s    z4AscendEmbeddings.embed_documents.<locals>.<listcomp>)rJ   r$   r)   lenr   r(   appendZconcatenate)r*   rS   npr+   Zembedding_listr   Ztexts_Zembr   rU   r   embed_documentsz   s    
z AscendEmbeddings.embed_documentsrT   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   r   Zmodel_configr#   r	   classmethodr   r9   r(   rE   r   rO   rY   rZ   __classcell__r   r   r,   r   r
      s0   
 
r
   )r3   typingr   r   r   r   Zlangchain_core.embeddingsr   Zpydanticr   r   r	   r
   r   r   r   r   <module>   s
    