
    Ngb                     d    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dS )    N)AnyDictListOptional)
Embeddings)	BaseModel
ConfigDictmodel_validatorc                   |    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                      j        |i | 	 ddlm}m} n"# t
          $ r}t          d          |d }~ww xY w	 |                    | j                                                  	                                | _
        |                    | j                  | _        n$# t          $ r}t          d|           d }~ww xY w| j        r| j
                                         |                     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                     g | ]}d | d	S )zwarmup z timesr   ).0is     a/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/embeddings/ascend.py
<listcomp>z-AscendEmbeddings.__init__.<locals>.<listcomp>9   s$    <<<Q(q(((<<<    
   )super__init__transformersr   r   ImportErrorfrom_pretrainedr   npuevalr   r   	Exceptionr   halfencoderange)selfr   r   r   r   e	__class__s         r"   r'   zAscendEmbeddings.__init__&   sO   $)&)))	========= 	 	 	1  	
	"224?CCGGIINNPPDJ*::4?KKDNN 	 	 	URSUU  	
 = 	JOO<<%))<<<=====s+   % 
A?AA"B+ +
C5CCbefore)modevaluesc                    d|vrt          d          t          j        |d         t          j                  st	          d|d          d          	 dd l}n,# t          $ r t          d          t          $ r}|d }~ww xY w	 |j	        
                    |d                    n$# t          $ r}t          d|           d }~ww xY w|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+   
set_device)r   r6   r>   r2   s       r"   validate_environmentz%AscendEmbeddings.validate_environment;   s    v%%5666y-rw77 	#Nvl7KNNN  	 	W 	W 	W%&UVVV 	 	 	G		=M$$VK%89999 	= 	= 	=;;;<<<	=s0   A "B:A<<B B& &
C0CC	sentencesc                 *   |                      |dddd          }	 dd l}n"# t          $ r}t          d          |d }~ww xY w|                     |j                                        |j                                        d          j        }|                     ||d                                                   }|j	        j
                            |d	
          }|                                                                                                S )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+   rK   last_hidden_statepoolingnn
functional	normalizecpudetachnumpy)r1   rB   inputsrO   r2   rQ   tmp
embeddingss           r"   r/   zAscendEmbeddings.encodeP   s"      
 
	LLLL 	 	 	X 	 !JJ  ""F$9$=$=$?$?T ' 
 

 	 ll,f5E.F.J.J.L.LMMX(223B2??
~~&&((..000s   ! 
A ;A rQ   rK   c                    	 dd l }n"# t          $ r}t          d          |d }~ww xY w| j        dk    r|d d df         S | j        dk    rm|                    ||                    d                                          z  d          }|                    dd	                                          }||z  S t          d
| j         d          )Nr   rI   r   meanrL   rM      T)rN   keepdimzPooling method [z] not implemented)rO   r)   r   sum	unsqueezefloatNotImplementedError)r1   rQ   rK   rO   r2   sds          r"   rR   zAscendEmbeddings.poolinge   s   	LLLL 	 	 	X 	 %''$QQQT** F**		!N$<$<R$@$@$F$F$H$HHb   A ""q$"77==??Aq5L%I4#6III  s    
&!&textsc                 F                            fd|D                       S )Nc                 $    g | ]}j         |z   S r   )r   )r    textr1   s     r"   r#   z4AscendEmbeddings.embed_documents.<locals>.<listcomp>z   s!    OOOD5<OOOr$   )r/   )r1   rf   s   ` r"   embed_documentsz AscendEmbeddings.embed_documentsy   s*    {{OOOOOOOPPPr$   ri   c                 J    |                      | j        |z   g          d         S )Nr   )r/   r   )r1   ri   s     r"   embed_queryzAscendEmbeddings.embed_query|   s$    {{D2T9:;;A>>r$   )N)__name__
__module____qualname____doc__str__annotations__r   intr   r   r   boolr   r   r   r	   model_configr'   r
   classmethodr   rA   r/   rR   r   rb   rj   rl   __classcell__)r3   s   @r"   r   r      s          OOOIs2s5 "#"""Hd$)NHSM)))JJJNNN:2666L>c >S >T > > > > > >* _(###$ 3    [ $#&1 1 1 1 1 1*  c S    (QT#Y Q4U3D Q Q Q Q? ?U ? ? ? ? ? ? ? ?r$   r   )r:   typingr   r   r   r   langchain_core.embeddingsr   pydanticr   r	   r
   r   r   r$   r"   <module>r{      s    				 , , , , , , , , , , , , 0 0 0 0 0 0 ; ; ; ; ; ; ; ; ; ;u? u? u? u? u?z9 u? u? u? u? u?r$   