
    7|h-                     \    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                   T    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      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    
batch_size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          d/var/www/html/test/engine/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   r4   r<   r.   s       r1   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'   rI   last_hidden_statepoolingnn
functional	normalizecpudetachnumpy)r-   r@   inputsrM   r.   rO   tmp
embeddingss           r1   r+   zAscendEmbeddings.encodeQ   s       
	
 !JJ  "F$9$9$=$=$?T ' 


 	 ll,f5E.F.J.J.LMXX((223B2?
~~&&(..00  	U	s   C   	C:)C55C:rO   rI   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   rG   r   meanrJ   rK      T)rL   keepdimzPooling method [z] not implemented)rM   r%   r   sum	unsqueezefloatNotImplementedError)r-   rO   rI   rM   r.   sds          r1   rP   zAscendEmbeddings.poolingf   s    	
 %'$QT**  F*		!N$<$<R$@$F$F$HHb  A ""q$"7==?Aq5L%"4#6#6"77HI   	U	s   B 	B9(B44B9textsc                 ^   	 dd l }g }t        dt        |      | j                        D ]Q  }|||| j                  z    }| j                  |D cg c]  }| j                  |z    c}      }|j                  |       S |j                  |      S # t        $ r}t        d      |d }~ww xY wc c}w )Nr   zCUnable to import numpy, please install with `pip install -U numpy`.)	rV   r%   r,   lenr   r+   r   appendconcatenate)	r-   rd   npr.   embedding_listr/   texts_textembs	            r1   embed_documentsz AscendEmbeddings.embed_documentsz   s    	
 q#e*doo6 	'A1q4??23F++FSDt884?STC!!#&	' ~~n--  	U	 Ts   B B*
	B'B""B'rl   c                 F    | j                  | j                  |z   g      d   S )Nr   )r+   r   )r-   rl   s     r1   embed_queryzAscendEmbeddings.embed_query   s$    {{D22T9:;A>>    )N)__name__
__module____qualname____doc__str__annotations__r   intr   r   r   boolr   r   r   r   r	   model_configr#   r
   classmethodr   r?   r+   rP   r   r`   rn   rp   __classcell__)r0   s   @r1   r   r      s    OIs2s5 "#"Hd$)NHSM)JJN26L>c >S >T >* (#$ 3   $&1 1 1* c S (.T#Y .4U3D .? ?U ?rq   r   )r8   typingr   r   r   r   langchain_core.embeddingsr   pydanticr   r	   r
   r   r   rq   r1   <module>r      s'    	 , , 0 ; ;A?z9 A?rq   