
    Igb                     \    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ee	      Zy)    N)AnyDictListOptional)
Embeddings)	BaseModel
ConfigDictmodel_validatorc                   F    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      Zdededdf fdZ ed      ededefd              ZdedefdZd"dededefdZdee   deee      fdZd edee   fd!Z x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 )protected_namespacesargskwargsreturnNc                    t        |   |i | 	 ddlm}m} 	 |j                  | j                        j                         j                         | _
        |j                  | j                        | _        | j                  r| j                  j                          | j                  t!        d      D cg c]  }d| d
 c}       y # t
        $ r}t        d      |d }~ww xY w# t        $ r}t        d|       d }~ww xY wc c}w )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:
   zwarmup z times)super__init__transformersr   r   ImportErrorfrom_pretrainedr   npuevalr   r   	Exceptionr   halfencoderange)selfr   r   r   r   ei	__class__s          b/var/www/html/answerous/venv/lib/python3.12/site-packages/langchain_community/embeddings/ascend.pyr!   zAscendEmbeddings.__init__&   s    $)&)	=	"224??CGGINNPDJ*::4??KDN ==JJOO%)<Qwqc(<=  	1 	  	QRSQTU 	 =s5   C
 AC' 5D
	C$CC$'	D0C>>Dbefore)modevaluesc                 h   d|vrt        d      t        j                  |d   t        j                        st	        d|d    d      	 dd l}	 |j                  j                  |d          |S # t        $ r t        d      t        $ r}|d }~ww xY w# t        $ r}t        d|       d }~ww xY 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%   
set_device)r   r2   r:   r,   s       r/   validate_environmentz%AscendEmbeddings.validate_environment;   s     v%566yy-rww7#6vl7K6LAN 	
	=MM$$VK%89   	W%&UVV 	G	  	=7s;<<	=s0   
A/ B /BBB	B1B,,B1	sentencesc                    | j                  |dddd      }	 dd l}| j                  |j                  j                         |j                  j                         d      j                  }| j                  ||d   j                               }|j                  j                  j                  |d	
      }|j                         j                         j                         S # t        $ r}t        d      |d }~ww xY w)NTpti   )padding
truncationreturn_tensors
max_lengthr   CUnable to import torch, please install with `pip install -U torch`.)return_dictattention_maskdim)r   torchr#   r   	input_idsr%   rG   last_hidden_statepoolingnn
functional	normalizecpudetachnumpy)r+   r>   inputsrK   r,   rM   tmp
embeddingss           r/   r)   zAscendEmbeddings.encodeP   s       
	
 !JJ  "F$9$9$=$=$?T ' 


 	 ll,f5E.F.J.J.LMXX((223B2?
~~&&(..00  	X	s   C   	C:)C55C:rM   rG   c                 x   	 dd l }| j                  dk(  r	|d d df   S | j                  dk(  rY|j                  ||j	                  d      j                         z  d      }|j                  dd	      j                         }||z  S t        d
| j                   d      # t        $ r}t        d      |d }~ww xY w)Nr   rE   r   meanrH   rI      T)rJ   keepdimzPooling method [z] not implemented)rK   r#   r   sum	unsqueezefloatNotImplementedError)r+   rM   rG   rK   r,   sds          r/   rN   zAscendEmbeddings.poolinge   s    	
 %'$QT**  F*		!N$<$<R$@$F$F$HHb  A ""q$"7==?Aq5L%"4#6#6"77HI   	X	s   B 	B9(B44B9textsc                 d    | j                  |D cg c]  }| j                  |z    c}      S c c}w N)r)   r   )r+   rb   texts      r/   embed_documentsz AscendEmbeddings.embed_documentsy   s*    {{OD55<OPPOs   -re   c                 F    | j                  | j                  |z   g      d   S )Nr   )r)   r   )r+   re   s     r/   embed_queryzAscendEmbeddings.embed_query|   s$    {{D22T9:;A>>    rd   )__name__
__module____qualname____doc__str__annotations__r   intr   r   r   boolr   r   r   r	   model_configr!   r
   classmethodr   r=   r)   rN   r   r^   rf   rh   __classcell__)r.   s   @r/   r   r      s    OIs2s5 "#"Hd$)NHSM)JN26L>c >S >T >* (#$ 3   $&1 1 1* c S (QT#Y Q4U3D Q? ?U ?ri   r   )r6   typingr   r   r   r   langchain_core.embeddingsr   pydanticr   r	   r
   r   r   ri   r/   <module>rx      s'    	 , , 0 ; ;u?z9 u?ri   