
    ~
i-                     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<   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                      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     C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langchain_community/embeddings/ascend.py
<listcomp>z-AscendEmbeddings.__init__.<locals>.<listcomp>:   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   r8   r@   r4   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-   rM   last_hidden_statepoolingnn
functional	normalizecpudetachnumpy)r3   rD   inputsrQ   r4   rS   tmp
embeddingss           r$   r1   zAscendEmbeddings.encodeQ   s"      
 
	LLLL 	 	 	U 	 !JJ  ""F$9$=$=$?$?T ' 
 

 	 ll,f5E.F.J.J.L.LMMX(223B2??
~~&&((..000s   ! 
A ;A rS   rM   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   rK   r   meanrN   rO      T)rP   keepdimzPooling method [z] not implemented)rQ   r+   r   sum	unsqueezefloatNotImplementedError)r3   rS   rM   rQ   r4   sds          r$   rT   zAscendEmbeddings.poolingf   s   	LLLL 	 	 	U 	 %''$QQQT** F**		!N$<$<R$@$@$F$F$H$HHb   A ""q$"77==??Aq5L%I4#6III  s    
&!&textsc                 ^    	 dd l }n"# t          $ r}t          d          |d }~ww xY wg }t          dt          |           j                  D ]J}||| j        z            }                      fd|D                       }|                    |           K|                    |          S )Nr   zCUnable to import numpy, please install with `pip install -U numpy`.c                 $    g | ]}j         |z   S r   )r   )r"   textr3   s     r$   r%   z4AscendEmbeddings.embed_documents.<locals>.<listcomp>   s!    SSSDt84?SSSr&   )rZ   r+   r2   lenr   r1   appendconcatenate)r3   rh   npr4   embedding_listr#   texts_embs   `       r$   embed_documentsz AscendEmbeddings.embed_documentsz   s    	 	 	 	U 	 q#e**do66 	' 	'A1q4?223F++SSSSFSSSTTC!!#&&&&~~n---s    
'"'rk   c                 J    |                      | j        |z   g          d         S )Nr   )r1   r   )r3   rk   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   r	   model_configr)   r
   classmethodr   rC   r1   rT   r   rd   rs   ru   __classcell__)r5   s   @r$   r   r      s          OOOIs2s5 "#"""Hd$)NHSM)))JJJJNNN:2666L>c >S >T > > > > > >* _(###$ 3    [ $#&1 1 1 1 1 1*  c S    (.T#Y .4U3D . . . .? ?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 ; ; ; ; ; ; ; ; ; ;A? A? A? A? A?z9 A? A? A? A? A?r&   