
    h                        d Z ddlmZ ddlZddlmZ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 ddlmZ  ej6                  e      Z G d dee
      Zy)zDHypothetical Document Embeddings.

https://arxiv.org/abs/2212.10496
    )annotationsN)AnyOptional)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y)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extrac                P    | j                   j                  j                         d   S )z Input keys for Hyde's LLM chain.required)r   input_schemamodel_json_schemaselfs    X/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain/chains/hyde/base.py
input_keysz'HypotheticalDocumentEmbedder.input_keys(   s"     ~~**<<>zJJ    c                h    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)     dnnh/>>---xr   c                8    | j                   j                  |      S )zCall the base embeddings.)r   embed_documents)r   textss     r   r%   z,HypotheticalDocumentEmbedder.embed_documents4   s    ##33E::r   c                   	 ddl }t        |j                  |      j                  d            S # t        $ rQ t
        j                  d       |sg cY S t        |      }t        | D cg c]  }t        |      |z   nc c}w c}cY S w xY w)z)Combine embeddings into final embeddings.r   N)axisa*  NumPy not found in the current Python environment. HypotheticalDocumentEmbedder will use a pure Python implementation for internal calculations, which may significantly impact performance, especially for large datasets. For optimal speed and efficiency, consider installing NumPy: pip install numpy)
numpylistarraymeanImportErrorloggerwarninglenzipsum)r   
embeddingsnpnum_vectors
dim_valuess        r   combine_embeddingsz/HypotheticalDocumentEmbedder.combine_embeddings8   s    	V,11q19:: 	VNNK 	j/KDGDTUjC
Ok1UUU	Vs!   -0 "B
B
)A?>	B
	B
c                    | j                   d   }| j                  j                  ||i      }t        | j                  t              r|| j
                  d      g}n|g}| j                  |      }| j                  |      S )z1Generate a hypothetical document and embedded it.r   )r   r   invoker"   r   r#   r%   r7   )r   r!   var_nameresult	documentsr3   s         r   embed_queryz(HypotheticalDocumentEmbedder.embed_queryK   sw    ??1%&&$'78dnnh/ 0 0 345II)))4
&&z22r   Nc                    |xs t        j                         }| j                  j                  |d|j	                         i      S )zCall the internal llm chain.	callbacks)config)r   get_noop_managerr   r9   	get_child)r   inputsrun_manager_run_managers       r   _callz"HypotheticalDocumentEmbedder._callV   sH     #S&@&Q&Q&S~~$$!7!7!9: % 
 	
r   c                    ||}n@||t         v r
t         |   }n,dt        t        j                                d}t        |      ||z  t	               z  } | d||d|S )zILoad and use LLMChain with either a specific prompt key or custom prompt.zHMust specify prompt_key if custom_prompt not provided. Should be one of .)r   r    )r   r*   keys
ValueErrorr	   )	clsllmr   
prompt_keycustom_promptkwargspromptmsgr   s	            r   from_llmz%HypotheticalDocumentEmbedder.from_llmb   s{     $"F#
j(@
+F:??,-.a1  S/!SL?#44	R?iR6RRr   c                     y)N
hyde_chainrI   r   s    r   _chain_typez(HypotheticalDocumentEmbedder._chain_typez   s    r   )return	list[str])r&   rX   rW   list[list[float]])r3   rY   rW   list[float])r!   strrW   rZ   )N)rC   zdict[str, Any]rD   z$Optional[CallbackManagerForChainRun]rW   zdict[str, str])NN)rM   r   r   r   rN   zOptional[str]rO   zOptional[BasePromptTemplate]rP   r   rW   r   )rW   r[   )__name__
__module____qualname____doc____annotations__r   model_configpropertyr   r#   r%   r7   r=   rF   classmethodrS   rV   rI   r   r   r   r      s    
   $L
 K K  ;V&	3 =A



 :

 
	

 
 %)6:SS $S "	S
 4S S 
&S S.  r   r   )r_   
__future__r   loggingtypingr   r   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   	getLoggerr\   r.   r   rI   r   r   <module>rr      sU   
 #    ? 0 < 9 5 -  ' 4 )			8	$b5* br   