
    7|hE                        d dl Z d dlmZmZmZmZ d dlZd dlmZm	Z	 d dl
mZ d dlmZmZmZmZ dZdZdZd	Zd
ZdZdZ eddd       G d dee             Z G d dee      Z eddd       G d dee             Z G d dee      Zy)    N)AnyDictListOptional)
deprecatedwarn_deprecated)
Embeddings)	BaseModel
ConfigDictField	SecretStrz'sentence-transformers/all-mpnet-base-v2zhkunlp/instructor-largezBAAI/bge-large-enz&Represent the document for retrieval: z<Represent the question for retrieving supporting documents: z9Represent this question for searching relevant passages: u9   为这个句子生成表示以用于检索相关文章：z0.2.21.0z+langchain_huggingface.HuggingFaceEmbeddings)sinceremovalalternative_importc                       e Zd ZU dZdZeed<   eZe	ed<   	 dZ
ee	   ed<   	  ee      Zee	ef   ed<   	  ee      Zee	ef   ed<   	 d	Zeed
<   	 d	Zeed<   	 def fdZ edd      Zdee	   deee      fdZde	dee   fdZ xZS )HuggingFaceEmbeddingsai  HuggingFace sentence_transformers embedding models.

    To use, you should have the ``sentence_transformers`` python package installed.

    Example:
        .. code-block:: python

            from langchain_community.embeddings import HuggingFaceEmbeddings

            model_name = "sentence-transformers/all-mpnet-base-v2"
            model_kwargs = {'device': 'cpu'}
            encode_kwargs = {'normalize_embeddings': False}
            hf = HuggingFaceEmbeddings(
                model_name=model_name,
                model_kwargs=model_kwargs,
                encode_kwargs=encode_kwargs
            )
    Nclient
model_namecache_folderdefault_factorymodel_kwargsencode_kwargsFmulti_processshow_progresskwargsc                    t        |   di | d|vrSd}d}t        ||d| j                  j                   dd| dz   d| d	z   d| j                  j                   d
z          	 ddl} |j                  | j                  fd| j                  i| j                  | _        y# t        $ r}t        d      |d}~ww xY w)$Initialize the sentence_transformer.r   0.2.160.4.0Default values for .model_name were deprecated in LangChain  and will be removed in %. Explicitly pass a model_name to the constructor instead.r   r   messager   NrCould not import sentence_transformers python package. Please install it with `pip install sentence-transformers`.r    )super__init__r   	__class____name__sentence_transformersImportErrorSentenceTransformerr   r   r   r   )selfr   r   r   r1   excr/   s         i/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/embeddings/huggingface.pyr.   zHuggingFaceEmbeddings.__init__C   s    "6"v%EG-dnn.E.E-FkR25'9PQRgYCDE dnn--..CDE	( @+??OO
*.*;*;
?C?P?P
  	N 	s   )B& &	C /B;;C forbidr,   extraprotected_namespacestextsreturnc                    ddl }t        t        d |            }| j                  ra| j                  j                         }| j                  j                  ||      }|j                  j                  |       |j                         S  | j                  j                  |fd| j                  i| j                  }|j                         S )Compute doc embeddings using a HuggingFace transformer model.

        Args:
            texts: The list of texts to embed.

        Returns:
            List of embeddings, one for each text.
        r   Nc                 &    | j                  dd      S )N
r&   )replace)xs    r6   <lambda>z7HuggingFaceEmbeddings.embed_documents.<locals>.<lambda>m   s    199T3#7     show_progress_bar)r1   listmapr   r   start_multi_process_poolencode_multi_processr3   stop_multi_process_poolencoder   r   tolist)r4   r;   r1   pool
embeddingss        r6   embed_documentsz%HuggingFaceEmbeddings.embed_documentsb   s     	%S7?@;;779D99%FJ!55MMdS   ""	 ,++)-););?C?Q?QJ   ""rD   textc                 ,    | j                  |g      d   S Compute query embeddings using a HuggingFace transformer model.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text.
        r   rO   r4   rP   s     r6   embed_queryz!HuggingFaceEmbeddings.embed_queryy        ##TF+A..rD   )r0   
__module____qualname____doc__r   r   __annotations__DEFAULT_MODEL_NAMEr   strr   r   r   dictr   r   r   r   boolr   r.   r   model_configr   floatrO   rV   __classcell__r/   s   @r6   r   r      s    & FC(J("&L(3-&K#(#>L$sCx.>d %*$$?M4S>?k  M4(M4)
 
: H2FL#T#Y #4U3D #.	/ 	/U 	/rD   r   c                   *    e Zd ZU dZdZeed<   eZe	ed<   	 dZ
ee	   ed<   	  ee      Zee	ef   ed<   	  ee      Zee	ef   ed<   	 eZe	ed	<   	 eZe	ed
<   	 dZeed<   	 def fdZ edd      Zdee	   deee      fdZde	dee   fdZ xZS )HuggingFaceInstructEmbeddingsa  Wrapper around sentence_transformers embedding models.

    To use, you should have the ``sentence_transformers``
    and ``InstructorEmbedding`` python packages installed.

    Example:
        .. code-block:: python

            from langchain_community.embeddings import HuggingFaceInstructEmbeddings

            model_name = "hkunlp/instructor-large"
            model_kwargs = {'device': 'cpu'}
            encode_kwargs = {'normalize_embeddings': True}
            hf = HuggingFaceInstructEmbeddings(
                model_name=model_name,
                model_kwargs=model_kwargs,
                encode_kwargs=encode_kwargs
            )
    Nr   r   r   r   r   r   embed_instructionquery_instructionFr   r   c                 b   t        |   di | d|vrSd}d}t        ||d| j                  j                   dd| dz   d| d	z   d| j                  j                   d
z          	 ddlm}  || j                  fd| j                  i| j                  | _
        d| j                  v rht        dddd| j                  j                          | j                  rt        j                  d       | j                  j!                  d      | _        yy# t        $ r}t        d      |d}~ww xY w)r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r   )
INSTRUCTORr   z/Dependencies for InstructorEmbedding not found.NrE   0.2.5r   "encode_kwargs['show_progress_bar']the show_progress method on r   r   namealternativeuBoth encode_kwargs['show_progress_bar'] and show_progress are set;encode_kwargs['show_progress_bar'] takes precedencer,   )r-   r.   r   r/   r0   InstructorEmbeddingri   r   r   r   r   r2   r   r   warningswarnpop)r4   r   r   r   ri   er/   s         r6   r.   z&HuggingFaceInstructEmbeddings.__init__   s_   "6"v%EG-dnn.E.E-FkR25'9PQRgYCDE dnn--..CDE	X6$.2.?.?CGCTCTDK $"4"449:4>>;R;R:ST	 !!J "&!3!3!7!78K!LD 5  	XOPVWW	Xs   )4D 	D.D))D.r7   r,   r8   r;   r<   c                     |D cg c]  }| j                   |g }} | j                  j                  |fd| j                  i| j                  }|j                         S c c}w )zCompute doc embeddings using a HuggingFace instruct model.

        Args:
            texts: The list of texts to embed.

        Returns:
            List of embeddings, one for each text.
        rE   )rf   r   rK   r   r   rL   )r4   r;   rP   instruction_pairsrN   s        r6   rO   z-HuggingFaceInstructEmbeddings.embed_documents   ss     INNd44d;NN'T[[''
"00
   


   "" Os   ArP   c                     | j                   |g} | j                  j                  |gfd| j                  i| j                  d   }|j                         S )zCompute query embeddings using a HuggingFace instruct model.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text.
        rE   r   )rg   r   rK   r   r   rL   )r4   rP   instruction_pair	embeddings       r6   rV   z)HuggingFaceInstructEmbeddings.embed_query   sj     !22D9&DKK&&
"00
   
 		
 !!rD   )r0   rX   rY   rZ   r   r   r[   DEFAULT_INSTRUCT_MODELr   r]   r   r   r   r^   r   r   r   DEFAULT_EMBED_INSTRUCTIONrf   DEFAULT_QUERY_INSTRUCTIONrg   r   r_   r.   r   r`   r   ra   rO   rV   rb   rc   s   @r6   re   re      s    ( FC,J,"&L(3-&K#(#>L$sCx.>1$)$$?M4S>?R6s656s61M4)%M %MN H2FL#T#Y #4U3D #"" "U "rD   re   c                   *    e Zd ZU dZdZeed<   eZe	ed<   	 dZ
ee	   ed<   	  ee      Zee	ef   ed<   	  ee      Zee	ef   ed<   	 eZe	ed	<   	 d
Ze	ed<   	 dZeed<   	 def fdZ edd      Zdee	   deee      fdZde	dee   fdZ xZS )HuggingFaceBgeEmbeddingsaE  HuggingFace sentence_transformers embedding models.

    To use, you should have the ``sentence_transformers`` python package installed.
    To use Nomic, make sure the version of ``sentence_transformers`` >= 2.3.0.

    Bge Example:
        .. code-block:: python

            from langchain_community.embeddings import HuggingFaceBgeEmbeddings

            model_name = "BAAI/bge-large-en-v1.5"
            model_kwargs = {'device': 'cpu'}
            encode_kwargs = {'normalize_embeddings': True}
            hf = HuggingFaceBgeEmbeddings(
                model_name=model_name,
                model_kwargs=model_kwargs,
                encode_kwargs=encode_kwargs
            )
     Nomic Example:
        .. code-block:: python

            from langchain_community.embeddings import HuggingFaceBgeEmbeddings

            model_name = "nomic-ai/nomic-embed-text-v1"
            model_kwargs = {
                'device': 'cpu',
                'trust_remote_code':True
                }
            encode_kwargs = {'normalize_embeddings': True}
            hf = HuggingFaceBgeEmbeddings(
                model_name=model_name,
                model_kwargs=model_kwargs,
                encode_kwargs=encode_kwargs,
                query_instruction = "search_query:",
                embed_instruction = "search_document:"
            )
    Nr   r   r   r   r   r   rg    rf   Fr   r   c                 ,   t        	|   di | d|vrSd}d}t        ||d| j                  j                   dd| dz   d| d	z   d| j                  j                   d
z          	 ddl}g d}|D ci c],  }|| j                  v r|| j                  j                  |      . }} |j                  | j                  fd| j                  i| j                  d|i| _        d| j                  v rt        | _        d| j                  v rht        dddd| j                  j                          | j                   rt#        j$                  d       | j                  j                  d      | _        yy# t        $ r}t        d      |d}~ww xY wc c}w )r   r   rj   r!   r"   r#   r$   r%   r&   r'   r(   r)   r   Nr+   )torch_dtypeattn_implementationprovider	file_nameexportr   r   z-zhrE   r   rk   rl   rm   rp   r,   )r-   r.   r   r/   r0   r1   r2   r   rt   r3   r   r   r    DEFAULT_QUERY_BGE_INSTRUCTION_ZHrg   r   r   rr   rs   )
r4   r   r   r   r1   r5   extra_model_kwargskextra_model_kwargs_dictr/   s
            r6   r.   z!HuggingFaceBgeEmbeddings.__init__4  s   "6"v%EG-dnn.E.E-FkR25'9PQRgYCDE dnn--..CDE	(
 (#
D%%% t  $$Q''#
 #

 @+??OO
**
 
 1	
 DOO#%ED"$"4"449:4>>;R;R:ST	 !!J "&!3!3!7!78K!LD 57  	N 	#
s   )E4 51F4	F=F		Fr7   r,   r8   r;   r<   c                     |D cg c]!  }| j                   |j                  dd      z   # }} | j                  j                  |fd| j                  i| j
                  }|j                         S c c}w )r>   r@   r&   rE   )rf   rA   r   rK   r   r   rL   )r4   r;   trN   s       r6   rO   z(HuggingFaceBgeEmbeddings.embed_documentsr  s{     INN1''!))D#*>>NN'T[[''
%)%7%7
;?;M;M

   ""	 Os   &A0rP   c                     |j                  dd      } | j                  j                  | j                  |z   fd| j                  i| j
                  }|j                         S )rS   r@   r&   rE   )rA   r   rK   rg   r   r   rL   )r4   rP   rz   s      r6   rV   z$HuggingFaceBgeEmbeddings.embed_query  sg     ||D#&&DKK&&""T)
"00
   
	
 !!rD   )r0   rX   rY   rZ   r   r   r[   DEFAULT_BGE_MODELr   r]   r   r   r   r^   r   r   r    DEFAULT_QUERY_BGE_INSTRUCTION_ENrg   rf   r   r_   r.   r   r`   r   ra   rO   rV   rb   rc   s   @r6   r   r      s    $L FC'J'"&L(3-&K#(#>L$sCx.>1$)$$?M4S>?R=s=1s4M4):M :Mx H2FL#T#Y #4U3D #" "U "rD   r   c                       e Zd ZU dZeed<   	 dZeed<   	 dZe	e   ed<   	 i Z
eeef   ed<   	  edd	
      Zedefd       Zedefd       Zedefd       Zdee   deee      fdZdedee   fdZy)!HuggingFaceInferenceAPIEmbeddingszkEmbed texts using the HuggingFace API.

    Requires a HuggingFace Inference API key and a model name.
    api_keyz&sentence-transformers/all-MiniLM-L6-v2r   Napi_urladditional_headersr7   r,   r8   r<   c                 6    | j                   xs | j                  S )N)r   _default_api_urlr4   s    r6   _api_urlz*HuggingFaceInferenceAPIEmbeddings._api_url  s    ||4t444rD   c                      d| j                    S )NzAhttps://api-inference.huggingface.co/pipeline/feature-extraction/)r   r   s    r6   r   z2HuggingFaceInferenceAPIEmbeddings._default_api_url  s      "	
rD   c                 X    dd| j                   j                          i| j                  S )NAuthorizationzBearer )r   get_secret_valuer   r   s    r6   _headersz*HuggingFaceInferenceAPIEmbeddings._headers  s6     wt||'D'D'F&GH
%%
 	
rD   r;   c                     t        j                  | j                  | j                  |dddd      }|j	                         S )a  Get the embeddings for a list of texts.

        Args:
            texts (Documents): A list of texts to get embeddings for.

        Returns:
            Embedded texts as List[List[float]], where each inner List[float]
                corresponds to a single input text.

        Example:
            .. code-block:: python

                from langchain_community.embeddings import (
                    HuggingFaceInferenceAPIEmbeddings,
                )

                hf_embeddings = HuggingFaceInferenceAPIEmbeddings(
                    api_key="your_api_key",
                    model_name="sentence-transformers/all-MiniLM-l6-v2"
                )
                texts = ["Hello, world!", "How are you?"]
                hf_embeddings.embed_documents(texts)
        T)wait_for_model	use_cache)inputsoptions)headersjson)requestspostr   r   r   )r4   r;   responses      r6   rO   z1HuggingFaceInferenceAPIEmbeddings.embed_documents  s>    0 ==MMMM.2F
 }}rD   rP   c                 ,    | j                  |g      d   S rR   rT   rU   s     r6   rV   z-HuggingFaceInferenceAPIEmbeddings.embed_query  rW   rD   )r0   rX   rY   rZ   r   r[   r   r]   r   r   r   r   r   r`   propertyr   r   r^   r   r   ra   rO   rV   r,   rD   r6   r   r     s    
 9>J>;!GXc]!K)+S#X+DH2FL5# 5 5 
# 
 
 
$ 
 
 T#Y  4U3D  D	/ 	/U 	/rD   r   )rr   typingr   r   r   r   r   langchain_core._apir   r   langchain_core.embeddingsr	   pydanticr
   r   r   r   r\   r{   r   r|   r}   r   r   r   re   r   r   r,   rD   r6   <module>r      s     , ,  ; 0 < <> 2 ' D B  @ ! $_   
D
g/Iz g/
g/To"Iz o"d 
D
T"y* T"
T"nP/	: P/rD   