
    Ng#                        d Z ddlmZ ddlmZmZmZmZ ddlZ	ddl
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ  G d dee          ZdS )zDHypothetical Document Embeddings.

https://arxiv.org/abs/2212.10496
    )annotations)AnyDictListOptionalN)CallbackManagerForChainRun)
Embeddings)BaseLanguageModel)StrOutputParser)BasePromptTemplate)Runnable)
ConfigDict)Chain)
PROMPT_MAP)LLMChainc                      e Zd ZU dZded<   ded<    edd          Zed'd            Zed'd            Z	d(dZ
d)dZd*dZ	 d+d,dZe	 	 d-d.d%            Zed/d&            ZdS )0HypotheticalDocumentEmbedderzrGenerate hypothetical document for query, and then embed that.

    Based on https://arxiv.org/abs/2212.10496
    r	   base_embeddingsr   	llm_chainTforbid)arbitrary_types_allowedextrareturn	List[str]c                J    | j         j                                        d         S )z Input keys for Hyde's LLM chain.required)r   input_schemamodel_json_schemaselfs    V/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/chains/hyde/base.py
input_keysz'HypotheticalDocumentEmbedder.input_keys&   s      ~*<<>>zJJ    c                T    t          | j        t                    r| j        j        S dgS )z!Output keys for Hyde's LLM chain.text)
isinstancer   r   output_keysr   s    r!   r'   z(HypotheticalDocumentEmbedder.output_keys+   s*     dnh// 	>--8Or#   textsList[List[float]]c                6    | j                             |          S )zCall the base embeddings.)r   embed_documents)r    r(   s     r!   r+   z,HypotheticalDocumentEmbedder.embed_documents3   s    #33E:::r#   
embeddingsList[float]c                l    t          t          j        |                              d                    S )z)Combine embeddings into final embeddings.r   )axis)listnparraymean)r    r,   s     r!   combine_embeddingsz/HypotheticalDocumentEmbedder.combine_embeddings7   s+    BHZ((--1-55666r#   r%   strc                   | j         d         }| j                            ||i          }t          | j        t                    r|| j        d                  g}n|g}|                     |          }|                     |          S )z1Generate a hypothetical document and embedded it.r   )r"   r   invoker&   r   r'   r+   r4   )r    r%   var_nameresult	documentsr,   s         r!   embed_queryz(HypotheticalDocumentEmbedder.embed_query;   s    ?1%&&$'788dnh// 	! 0 345III)))44
&&z222r#   NinputsDict[str, Any]run_manager$Optional[CallbackManagerForChainRun]Dict[str, str]c                    |pt          j                    }| j                            |d|                                i          S )zCall the internal llm chain.	callbacks)config)r   get_noop_managerr   r7   	get_child)r    r<   r>   _run_managers       r!   _callz"HypotheticalDocumentEmbedder._callF   sM     #S&@&Q&S&S~$$K)?)?)A)AB % 
 
 	
r#   llmr
   
prompt_keyOptional[str]custom_promptOptional[BasePromptTemplate]kwargsr   c                    ||}nJ||t           v rt           |         }n1t          dt          t          j                               d          ||z  t	                      z  } | d||d|S )zILoad and use LLMChain with either a specific prompt key or custom prompt.NzHMust specify prompt_key if custom_prompt not provided. Should be one of .)r   r    )r   
ValueErrorr0   keysr   )clsrH   r   rI   rK   rM   promptr   s           r!   from_llmz%HypotheticalDocumentEmbedder.from_llmQ   s     $"FF#
j(@(@
+FF1:?,,--1 1 1  
 SL?#4#44	sR?iRR6RRRr#   c                    dS )N
hyde_chainrP   r   s    r!   _chain_typez(HypotheticalDocumentEmbedder._chain_typeh   s    |r#   )r   r   )r(   r   r   r)   )r,   r)   r   r-   )r%   r5   r   r-   )N)r<   r=   r>   r?   r   r@   )NN)rH   r
   r   r	   rI   rJ   rK   rL   rM   r   r   r   )r   r5   )__name__
__module____qualname____doc____annotations__r   model_configpropertyr"   r'   r+   r4   r;   rG   classmethodrU   rX   rP   r#   r!   r   r      sG         
  : $  L
 K K K XK    X; ; ; ;7 7 7 7	3 	3 	3 	3 =A	
 	
 	
 	
 	
 
 %)6:S S S S [S,    X  r#   r   )r\   
__future__r   typingr   r   r   r   numpyr1   langchain_core.callbacksr   langchain_core.embeddingsr	   langchain_core.language_modelsr
   langchain_core.output_parsersr   langchain_core.promptsr   langchain_core.runnablesr   pydanticr   langchain.chains.baser   langchain.chains.hyde.promptsr   langchain.chains.llmr   r   rP   r#   r!   <module>rn      sG   
 # " " " " " , , , , , , , , , , , ,     ? ? ? ? ? ? 0 0 0 0 0 0 < < < < < < 9 9 9 9 9 9 5 5 5 5 5 5 - - - - - -       ' ' ' ' ' ' 4 4 4 4 4 4 ) ) ) ) ) )R R R R R5* R R R R Rr#   