Ë
    ´Œj  ã                  óà   — 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    úd/var/www/html/Fitness-lenito-AI-main/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)   € ô �d—n‘n¤hÔ/Ø—>‘>×-Ñ-Ð-Øˆ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Ñ3°EÓ:Ð: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Ñ1°qÐ1Ó9Ó:Ð:øÜò 	VÜ�N‰NðKôñ Ø’	Ü˜j›/ˆKÜDGÈÑDTÓUÑDT°j”C˜
“O kÓ1ÑDTùÔ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ˆÜ�d—n‘n¤hÔ/Ø × 0Ñ 0°Ñ 3Ñ4Ð5‰Ià˜ˆ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“/Ð!à˜S‘L¤?Ó#4Ñ4ˆ	ÙÐR ?¸iÑRÈ6Ñ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   