§
    è˜ºh  ã                  ó´   — 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  G d„ dee¦  «        ZdS )zDHypothetical Document Embeddings.

https://arxiv.org/abs/2212.10496
é    )Úannotations)ÚAnyÚDictÚListÚOptionalN)Ú
Embeddings)ÚBaseLanguageModel)ÚBasePromptTemplate)ÚExtra)ÚCallbackManagerForChainRun)ÚChain)Ú
PROMPT_MAP)ÚLLMChainc                  óÌ   — e Zd ZU dZded<   ded<    G 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 )/ÚHypotheticalDocumentEmbedderzrGenerate hypothetical document for query, and then embed that.

    Based on https://arxiv.org/abs/2212.10496
    r   Úbase_embeddingsr   Ú	llm_chainc                  ó$   — e Zd ZdZej        ZdZdS )ú#HypotheticalDocumentEmbedder.Configz'Configuration for this pydantic object.TN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚforbidÚextraÚarbitrary_types_allowed© ó    úb/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain/chains/hyde/base.pyÚConfigr      s#   € € € € € Ø5Ð5à”ˆØ"&ÐÐÐr   r    Úreturnú	List[str]c                ó   — | j         j        S )z Input keys for Hyde's LLM chain.)r   Ú
input_keys©Úselfs    r   r$   z'HypotheticalDocumentEmbedder.input_keys$   s   € ð Œ~Ô(Ð(r   c                ó   — | j         j        S )z!Output keys for Hyde's LLM chain.)r   Úoutput_keysr%   s    r   r(   z(HypotheticalDocumentEmbedder.output_keys)   s   € ð Œ~Ô)Ð)r   ÚtextsúList[List[float]]c                ó6   — | j                              |¦  «        S )zCall the base embeddings.)r   Úembed_documents)r&   r)   s     r   r,   z,HypotheticalDocumentEmbedder.embed_documents.   s   € àÔ#×3Ò3°EÑ:Ô:Ð: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_embeddings2   s+   € å•B”H˜ZÑ(Ô(×-Ò-°1Ð-Ñ5Ô5Ñ6Ô6Ð6r   ÚtextÚstrc                óâ   — | j         j        d         }| j                              ||ig¦  «        }d„ |j        d         D ¦   «         }|                      |¦  «        }|                      |¦  «        S )z1Generate a hypothetical document and embedded it.r   c                ó   — g | ]	}|j         ‘Œ
S r   )r6   )Ú.0Ú
generations     r   ú
<listcomp>z<HypotheticalDocumentEmbedder.embed_query.<locals>.<listcomp>:   s   € ÐMÐMÐM¨�Z”_ÐMÐMÐMr   )r   r$   ÚgenerateÚgenerationsr,   r5   )r&   r6   Úvar_nameÚresultÚ	documentsr-   s         r   Úembed_queryz(HypotheticalDocumentEmbedder.embed_query6   sp   € à”>Ô,¨QÔ/ˆØ”×(Ò(¨8°TÐ*:Ð);Ñ<Ô<ˆØMÐM°vÔ7IÈ!Ô7LÐMÑMÔMˆ	Ø×)Ò)¨)Ñ4Ô4ˆ
Ø×&Ò& zÑ2Ô2Ð2r   NÚinputsúDict[str, Any]Úrun_managerú$Optional[CallbackManagerForChainRun]úDict[str, str]c                ó~   — |pt          j        ¦   «         }|                      ||                     ¦   «         ¬¦  «        S )zCall the internal llm chain.)Ú	callbacks)r   Úget_noop_managerr   Ú	get_child)r&   rC   rE   Ú_run_managers       r   Ú_callz"HypotheticalDocumentEmbedder._call>   s:   € ð #ÐSÕ&@Ô&QÑ&SÔ&SˆØ�~Š~˜f°×0FÒ0FÑ0HÔ0Hˆ~ÑIÔIÐIr   Úllmr	   Ú
prompt_keyúOptional[str]Úcustom_promptúOptional[BasePromptTemplate]Úkwargsr   c                óØ   — |�|}nJ|�|t           v rt           |         }n1t          dt          t          j        ¦   «         ¦  «        › d�¦  «        ‚t	          ||¬¦  «        } | 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 ú.)rN   Úprompt)r   r   r   )r   Ú
ValueErrorr1   Úkeysr   )ÚclsrN   r   rO   rQ   rS   rV   r   s           r   Úfrom_llmz%HypotheticalDocumentEmbedder.from_llmG   s—   € ð Ð$Ø"ˆFˆFØÐ#¨
µjÐ(@Ð(@Ý 
Ô+ˆFˆFåð1Ý�:œ?Ñ,Ô,Ñ-Ô-ð1ð 1ð 1ñô ð õ
  ¨VÐ4Ñ4Ô4ˆ	ØˆsÐR ?¸iÐRÐRÈ6ÐRÐRÐRr   c                ó   — dS )NÚ
hyde_chainr   r%   s    r   Ú_chain_typez(HypotheticalDocumentEmbedder._chain_type^   s   € àˆ|r   )r!   r"   )r)   r"   r!   r*   )r-   r*   r!   r.   )r6   r7   r!   r.   )N)rC   rD   rE   rF   r!   rG   )NN)rN   r	   r   r   rO   rP   rQ   rR   rS   r   r!   r   )r!   r7   )r   r   r   r   Ú__annotations__r    Úpropertyr$   r(   r,   r5   rB   rM   ÚclassmethodrZ   r]   r   r   r   r   r      sT  € € € € € € ðð ð
  ÐÐÑØÐÐÑð'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ð ð)ð )ð )ñ „Xð)ð ð*ð *ð *ñ „Xð*ð;ð ;ð ;ð ;ð7ð 7ð 7ð 7ð3ð 3ð 3ð 3ð =AðJð Jð Jð Jð Jð ð
 %)Ø6:ðSð Sð Sð Sñ „[ðSð, ðð ð ñ „Xðð ð r   r   )r   Ú
__future__r   Útypingr   r   r   r   Únumpyr2   Úlangchain_core.embeddingsr   Úlangchain_core.language_modelsr	   Úlangchain_core.promptsr
   Úlangchain_core.pydantic_v1r   Úlangchain.callbacks.managerr   Úlangchain.chains.baser   Úlangchain.chains.hyde.promptsr   Úlangchain.chains.llmr   r   r   r   r   ú<module>rl      s#  ððð ð #Ð "Ð "Ð "Ð "Ð "à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à Ð Ð Ð Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø <Ð <Ð <Ð <Ð <Ð <Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,à BÐ BÐ BÐ BÐ BÐ BØ 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø )Ð )Ð )Ð )Ð )Ð )ðKð Kð Kð Kð K 5¨*ñ Kô Kð Kð Kð Kr   