§
    ™ŠtjG  ã                  óà   — d Z ddl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 ddlmZ  ej        e¦  «        Z G d„ dee	¦  «        ZdS )zDHypothetical Document Embeddings.

https://arxiv.org/abs/2212.10496
é    )ÚannotationsN)ÚAny)Ú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    ú`/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_classic/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*   € õ �d”n¥hÑ/Ô/ð 	.Ø”>Ô-Ð-Øˆxˆ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_documents4   s   € àÔ#×3Ò3°EÑ:Ô:Ð:r    Ú
embeddingsúlist[float]c                ó(  ‡— 	 ddl }t          |                     |¦  «                             d¬¦  «        ¦  «        S # t          $ rJ t
                               d¦  «         |sg cY S t          |¦  «        Šˆfd„t          |ddiŽD ¦   «         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 numpyc                ó4   •— g | ]}t          |¦  «        ‰z  ‘ŒS © )Úsum)Ú.0Ú
dim_valuesÚnum_vectorss     €r   ú
<listcomp>zCHypotheticalDocumentEmbedder.combine_embeddings.<locals>.<listcomp>I   s4   ø€ ð ð ð àõ �J‘” +Ñ-ðð ð r    ÚstrictF)	ÚnumpyÚlistÚarrayÚmeanÚImportErrorÚloggerÚwarningÚlenÚzip)r   r)   Únpr2   s      @r   Úcombine_embeddingsz/HypotheticalDocumentEmbedder.combine_embeddings8   sÖ   ø€ ð	ØÐÐÐå˜Ÿš Ñ,Ô,×1Ò1°qÐ1Ñ9Ô9Ñ:Ô:Ð:øÝð 	ð 	ð 	Ý�NŠNðKñô ð ð ð Ø�	�	�	Ý˜j™/œ/ˆKðð ð ð å"% zÐ"@¸%Ð"@Ð"@ðñ ô ð ð ð ð	øøøs   ƒ9= ½(BÁ''BÂB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(   r?   )r   r"   Úvar_nameÚresultÚ	documentsr)   s         r   Úembed_queryz(HypotheticalDocumentEmbedder.embed_queryN   s�   € à”? 1Ô%ˆØ”×&Ò&¨°$Ð'7Ñ8Ô8ˆÝ�d”n¥hÑ/Ô/ð 	!Ø Ô 0°Ô 3Ô4Ð5ˆIˆIà˜ˆIØ×)Ò)¨)Ñ4Ô4ˆ
Ø×&Ò& zÑ2Ô2Ð2r    NÚinputsúdict[str, Any]Úrun_managerú!CallbackManagerForChainRun | Noneúdict[str, str]c                óŒ   — |pt          j        ¦   «         }| j                             |d|                     ¦   «         i¬¦  «        S )zCall the internal llm chain.Ú	callbacks)Úconfig)r   Úget_noop_managerr   rB   Ú	get_child)r   rG   rI   Ú_run_managers       r   Ú_callz"HypotheticalDocumentEmbedder._callY   sN   € ð #ÐSÕ&@Ô&QÑ&SÔ&SˆØŒ~×$Ò$ØØ ×!7Ò!7Ñ!9Ô!9Ð:ð %ñ 
ô 
ð 	
r    Úllmr   Ú
prompt_keyú
str | NoneÚcustom_promptúBasePromptTemplate | NoneÚkwargsr   c                óâ   — |�|}nL|�|t           v rt           |         }n3dt          t          j        ¦   «         ¦  «        › d�}t          |¦  «        ‚||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.   )r   r6   ÚkeysÚ
ValueErrorr   )	ÚclsrS   r   rT   rV   rX   ÚpromptÚmsgr   s	            r   Úfrom_llmz%HypotheticalDocumentEmbedder.from_llme   s˜   € ð Ð$Ø"ˆFˆFØÐ#¨
µjÐ(@Ð(@Ý 
Ô+ˆFˆFð1Ý�:œ?Ñ,Ô,Ñ-Ô-ð1ð 1ð 1ð õ ˜S‘/”/Ð!à˜S‘L¥?Ñ#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*   )r"   r@   r   r*   )N)rG   rH   rI   rJ   r   rK   )NN)rS   r   r   r   rT   rU   rV   rW   rX   r   r   r   )r   r@   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   Úmodel_configÚpropertyr   r$   r(   r?   rF   rR   Úclassmethodr`   rc   r.   r    r   r   r      sF  € € € € € € ðð ð
  ÐÐÑØÐÐÑà�:Ø $Øðñ ô €Lð
 ðKð Kð Kñ „XðKð ðð ð ñ „Xðð;ð ;ð ;ð ;ðð ð ð ð,	3ð 	3ð 	3ð 	3ð :>ð

ð 

ð 

ð 

ð 

ð ð
 "&Ø37ðSð Sð Sð Sñ „[ðSð. ðð ð ñ „Xðð ð r    r   )rg   Ú
__future__r   ÚloggingÚtypingr   Úlangchain_core.callbacksr   Úlangchain_core.embeddingsr   Úlangchain_core.language_modelsr   Úlangchain_core.output_parsersr   Úlangchain_core.promptsr	   Úlangchain_core.runnablesr
   Úpydanticr   Úlangchain_classic.chains.baser   Ú%langchain_classic.chains.hyde.promptsr   Úlangchain_classic.chains.llmr   Ú	getLoggerrd   r:   r   r.   r    r   ú<module>rz      sD  ððð ð
 #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð à ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø <Ð <Ð <Ð <Ð <Ð <Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø -Ð -Ð -Ð -Ð -Ð -Ø Ð Ð Ð Ð Ð à /Ð /Ð /Ð /Ð /Ð /Ø <Ð <Ð <Ð <Ð <Ð <Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1à	ˆÔ	˜8Ñ	$Ô	$€ðeð eð eð eð e 5¨*ñ eô eð eð eð er    