o
    Jjg#                     @  s   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 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                   @  s   e Zd ZU dZded< ded< edddZed/ddZed/ddZ	d0ddZ
d1ddZd2ddZ	d3d4d!d"Ze		d5d6d+d,Zed7d-d.ZdS )8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                 C  s   | j j d S )z Input keys for Hyde's LLM chain.required)r   input_schemamodel_json_schemaself r   R/var/www/html/zoom/venv/lib/python3.10/site-packages/langchain/chains/hyde/base.py
input_keys&   s   z'HypotheticalDocumentEmbedder.input_keysc                 C  s   t | jtr
| jjS dgS )z!Output keys for Hyde's LLM chain.text)
isinstancer   r   output_keysr   r   r   r   r#   +   s   z(HypotheticalDocumentEmbedder.output_keystextsList[List[float]]c                 C  s   | j |S )zCall the base embeddings.)r   embed_documents)r   r$   r   r   r   r&   3   s   z,HypotheticalDocumentEmbedder.embed_documents
embeddingsList[float]c                 C  s   t t|jddS )z)Combine embeddings into final embeddings.r   )axis)listnparraymean)r   r'   r   r   r   combine_embeddings7   s   z/HypotheticalDocumentEmbedder.combine_embeddingsr!   strc                 C  sR   | 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&   r.   )r   r!   var_nameresult	documentsr'   r   r   r   embed_query;   s   


z(HypotheticalDocumentEmbedder.embed_queryNinputsDict[str, Any]run_manager$Optional[CallbackManagerForChainRun]Dict[str, str]c                 C  s$   |pt  }| jj|d| idS )zCall the internal llm chain.	callbacks)config)r   get_noop_managerr   r0   	get_child)r   r5   r7   _run_managerr   r   r   _callF   s   z"HypotheticalDocumentEmbedder._callllmr	   
prompt_keyOptional[str]custom_promptOptional[BasePromptTemplate]kwargsr   c                 K  sb   |dur|}n|dur|t v rt | }ntdtt   d||B t B }| 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   )r   
ValueErrorr*   keysr
   )clsr@   r   rA   rC   rE   promptr   r   r   r   from_llmQ   s   


z%HypotheticalDocumentEmbedder.from_llmc                 C  s   dS )N
hyde_chainr   r   r   r   r   _chain_typeh   s   z(HypotheticalDocumentEmbedder._chain_type)r   r   )r$   r   r   r%   )r'   r%   r   r(   )r!   r/   r   r(   )N)r5   r6   r7   r8   r   r9   )NN)r@   r	   r   r   rA   rB   rC   rD   rE   r   r   r   )r   r/   )__name__
__module____qualname____doc____annotations__r   model_configpropertyr    r#   r&   r.   r4   r?   classmethodrK   rM   r   r   r   r   r      s.   
 


r   )rQ   
__future__r   typingr   r   r   r   numpyr+   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   r   r   r   r   <module>   s    