Ë
    ´Œj  ã                   ó*  — d dl Z d dlZd dlmZ d dlm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  ej2                  e«      Z G d„ deee      «      Z edgd¬«      Zdee
   dee
   fd„Z  G d„ de«      Z!y)é    N)ÚSequence)ÚOptional)Ú#AsyncCallbackManagerForRetrieverRunÚCallbackManagerForRetrieverRun)ÚDocument)ÚBaseLanguageModel)ÚBaseOutputParser)ÚBasePromptTemplate)ÚPromptTemplate)ÚBaseRetriever)ÚRunnable)ÚLLMChainc                   ó&   — e Zd ZdZdedee   fd„Zy)ÚLineListOutputParserz"Output parser for a list of lines.ÚtextÚreturnc                 ój   — |j                  «       j                  d«      }t        t        d |«      «      S )NÚ
)ÚstripÚsplitÚlistÚfilter)Úselfr   Úliness      új/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain/retrievers/multi_query.pyÚparsezLineListOutputParser.parse   s*   € Ø—
‘
“×"Ñ" 4Ó(ˆÜ”F˜4 Ó'Ó(Ð(ó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr   r   © r   r   r   r      s   „ Ù,ð)˜#ð ) $ s¡)ô )r   r   Úquestiona·  You are an AI language model assistant. Your task is
    to generate 3 different versions of the given user
    question to retrieve relevant documents from a vector  database.
    By generating multiple perspectives on the user question,
    your goal is to help the user overcome some of the limitations
    of distance-based similarity search. Provide these alternative
    questions separated by newlines. Original question: {question})Úinput_variablesÚtemplateÚ	documentsr   c                 óZ   — t        | «      D ��cg c]  \  }}|| d | vsŒ|‘Œ c}}S c c}}w )N)Ú	enumerate)r'   ÚiÚdocs      r   Ú_unique_documentsr,   ,   s2   € Ü'¨	Ô2ÔOÑ2‘F�A�s°cÀÈ2ÈAÀÒ6NŠCÐ2ÒOÐOùÓOs   �'Ÿ'c                   óP  — e Zd ZU dZeed<   eed<   dZeed<   dZ	e
ed<   	 dZeed	<   	 eed
dfdedededee
   d	edd fd„«       Zde
dedee   fd„Zde
dedee
   fd„Zdee
   dedee   fd„Zde
dedee   fd„Zde
dedee
   fd„Zdee
   dedee   fd„Zdee   dee   fd„Zy
)ÚMultiQueryRetrieverz‹Given a query, use an LLM to write a set of queries.

    Retrieve docs for each query. Return the unique union of all retrieved docs.
    Ú	retrieverÚ	llm_chainTÚverboser   Ú
parser_keyFÚinclude_originalNÚllmÚpromptr   c                 ó<   — t        «       }||z  |z  } | |||¬«      S )aâ  Initialize from llm using default template.

        Args:
            retriever: retriever to query documents from
            llm: llm for query generation using DEFAULT_QUERY_PROMPT
            prompt: The prompt which aims to generate several different versions
                of the given user query
            include_original: Whether to include the original query in the list of
                generated queries.

        Returns:
            MultiQueryRetriever
        )r/   r0   r3   )r   )Úclsr/   r4   r5   r2   r3   Úoutput_parserr0   s           r   Úfrom_llmzMultiQueryRetriever.from_llm>   s0   € ô, -Ó.ˆØ˜S‘L =Ñ0ˆ	ÙØØØ-ô
ð 	
r   ÚqueryÚrun_managerc             ƒ   óÖ   K  — | j                  ||«      ƒ d{  –—† }| j                  r|j                  |«       | j                  ||«      ƒ d{  –—† }| j	                  |«      S 7 ŒL7 Œ­w)ú¼Get relevant documents given a user query.

        Args:
            query: user query

        Returns:
            Unique union of relevant documents from all generated queries
        N)Úagenerate_queriesr3   ÚappendÚaretrieve_documentsÚunique_union©r   r:   r;   Úqueriesr'   s        r   Ú_aget_relevant_documentsz,MultiQueryRetriever._aget_relevant_documents\   se   è ø€ ð ×.Ñ.¨u°kÓB×BˆØ× Ò Ø�N‰N˜5Ô!Ø×2Ñ2°7¸KÓH×Hˆ	Ø× Ñ  Ó+Ð+ð	 Cøð Iús!   ‚A)˜A%™6A)ÁA'ÁA)Á'A)r$   c              ƒ   ó  K  — | j                   j                  d|id|j                  «       i¬«      ƒ d{  –—† }t        | j                   t        «      r|d   n|}| j
                  rt        j                  d|«       |S 7 ŒI­w)ú¿Generate queries based upon user input.

        Args:
            question: user query

        Returns:
            List of LLM generated queries that are similar to the user input
        r$   Ú	callbacks©ÚconfigNr   úGenerated queries: %s)r0   ÚainvokeÚ	get_childÚ
isinstancer   r1   ÚloggerÚinfo©r   r$   r;   Úresponser   s        r   r>   z%MultiQueryRetriever.agenerate_queriesp   sz   è ø€ ð Ÿ™×/Ñ/Ø˜Ð"Ø ×!6Ñ!6Ó!8Ð9ð 0ó 
÷ 
ˆô %/¨t¯~©~¼xÔ$H�˜Ò ÈhˆØ�<Š<Ü�K‰KÐ/°Ô7Øˆð
ús   ‚3BµA?¶A
BrC   c              ƒ   ó˜   ‡ ‡K  — t        j                  ˆˆ fd„|D «       Ž ƒ d{  –—† }|D ��cg c]  }|D ]  }|‘Œ Œ c}}S 7 Œc c}}w ­w)ú�Run all LLM generated queries.

        Args:
            queries: query list

        Returns:
            List of retrieved Documents
        c              3   óx   •K  — | ]1  }‰j                   j                  |d ‰j                  «       i¬«      –— Œ3 y­w)rG   rH   N)r/   rK   rL   )Ú.0r:   r;   r   s     €€r   Ú	<genexpr>z:MultiQueryRetriever.aretrieve_documents.<locals>.<genexpr>”   sE   øè ø€ ð ñ
 %�Eð	 —‘×&Ñ&ØØ'¨×)>Ñ)>Ó)@ÐAð '÷ ñ %ùs   ƒ7:N)ÚasyncioÚgather)r   rC   r;   Údocument_listsÚdocsr+   s   ` `   r   r@   z'MultiQueryRetriever.aretrieve_documents†   sU   ùè ø€ ô  'Ÿ~™~ôñ
 %óð 
÷ 
ˆñ !/Ô?¡˜»$°3’¸$� Ò?Ð?ð
úó @ùs   „ A
¤A¥	A
®A¾A
ÁA
c                ó¦   — | j                  ||«      }| j                  r|j                  |«       | j                  ||«      }| j	                  |«      S )r=   )Úgenerate_queriesr3   r?   Úretrieve_documentsrA   rB   s        r   Ú_get_relevant_documentsz+MultiQueryRetriever._get_relevant_documentsž   sN   € ð ×'Ñ'¨¨{Ó;ˆØ× Ò Ø�N‰N˜5Ô!Ø×+Ñ+¨G°[ÓAˆ	Ø× Ñ  Ó+Ð+r   c                 óê   — | j                   j                  d|id|j                  «       i¬«      }t        | j                   t        «      r|d   n|}| j
                  rt        j                  d|«       |S )rF   r$   rG   rH   r   rJ   )r0   ÚinvokerL   rM   r   r1   rN   rO   rP   s        r   r\   z$MultiQueryRetriever.generate_queries²   sl   € ð —>‘>×(Ñ(Ø˜Ð"Ø ×!6Ñ!6Ó!8Ð9ð )ó 
ˆô %/¨t¯~©~¼xÔ$H�˜Ò ÈhˆØ�<Š<Ü�K‰KÐ/°Ô7Øˆr   c                 ó”   — g }|D ]@  }| j                   j                  |d|j                  «       i¬«      }|j                  |«       ŒB |S )rS   rG   rH   )r/   r`   rL   Úextend)r   rC   r;   r'   r:   rZ   s         r   r]   z&MultiQueryRetriever.retrieve_documentsÈ   sX   € ð ˆ	ÛˆEØ—>‘>×(Ñ(ØØ# [×%:Ñ%:Ó%<Ð=ð )ó ˆDð ×Ñ˜TÕ"ð ð Ðr   r'   c                 ó   — t        |«      S )z¡Get unique Documents.

        Args:
            documents: List of retrieved Documents

        Returns:
            List of unique retrieved Documents
        )r,   )r   r'   s     r   rA   z MultiQueryRetriever.unique_unionÞ   s   € ô ! Ó+Ð+r   )r   r   r    r!   r   Ú__annotations__r   r1   Úboolr2   r"   r3   ÚclassmethodÚDEFAULT_QUERY_PROMPTr   r
   r   r9   r   r   r   rD   r>   r@   r   r^   r\   r]   rA   r#   r   r   r.   r.   0   sš  … ñð
 ÓØÓØ€GˆTÓØ€J�ÓØOØ"Ð�dÓ"ØQàð
 &:Ø$(Ø!&ñ
à ð
ð ð
ð #ð	
ð
 ˜S‘Mð
ð ð
ð 
ò
ó ð
ð:,àð,ð 9ð	,ð
 
ˆh‰ó,ð(àðð 9ðð 
ˆc‰ó	ð,@à�c‘ð@ð 9ð@ð 
ˆh‰ó	@ð0,àð,ð 4ð	,ð
 
ˆh‰ó,ð(àðð 4ðð 
ˆc‰ó	ð,à�c‘ðð 4ðð 
ˆh‰ó	ð,	, d¨8¡nð 	,¸¸h¹ô 	,r   r.   )"rW   ÚloggingÚcollections.abcr   Útypingr   Úlangchain_core.callbacksr   r   Úlangchain_core.documentsr   Úlangchain_core.language_modelsr   Úlangchain_core.output_parsersr	   Úlangchain_core.promptsr
   Úlangchain_core.prompts.promptr   Úlangchain_core.retrieversr   Úlangchain_core.runnablesr   Úlangchain.chains.llmr   Ú	getLoggerr   rN   r   r"   r   rg   r,   r.   r#   r   r   Ú<module>ru      s�   ðÛ Û Ý $Ý ÷õ .Ý <Ý :Ý 5Ý 8Ý 3Ý -å )à	ˆ×	Ñ	˜8Ó	$€ô)Ð+¨D°©IÑ6ô )ñ &Ø�LðFô	Ð ðP ¨(Ñ!3ð P¸¸X¹ó Pôw,˜-õ w,r   