§
    ™ŠtjZ  ã                   óR  — d dl Z d dl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 d dlmZ  ej        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!dS )é    N)ÚSequence)Ú#AsyncCallbackManagerForRetrieverRunÚCallbackManagerForRetrieverRun)ÚDocument)ÚBaseLanguageModel)ÚBaseOutputParser)ÚBasePromptTemplate)ÚPromptTemplate)ÚBaseRetriever)ÚRunnable)Úoverride)ÚLLMChainc                   ó>   — e Zd ZdZededee         fd„¦   «         ZdS )ÚLineListOutputParserz"Output parser for a list of lines.ÚtextÚreturnc                 óŠ   — |                      ¦   «                              d¦  «        }t          t          d |¦  «        ¦  «        S )Nú
)ÚstripÚsplitÚlistÚfilter)Úselfr   Úliness      úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_classic/retrievers/multi_query.pyÚparsezLineListOutputParser.parse   s5   € à—
’
‘”×"Ò" 4Ñ(Ô(ˆÝ•F˜4 Ñ'Ô'Ñ(Ô(Ð(ó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ústrr   r   © r   r   r   r      sJ   € € € € € Ø,Ð,àð)˜#ð ) $ s¤)ð )ð )ð )ñ „Xð)ð )ð )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                 ó:   ‡ — ˆ fd„t          ‰ ¦  «        D ¦   «         S )Nc                 ó2   •— g | ]\  }}|‰d |…         v¯|‘ŒS )Nr#   )Ú.0ÚiÚdocr'   s      €r   ú
<listcomp>z%_unique_documents.<locals>.<listcomp>.   s/   ø€ ÐOÐOÐO‘F�A�s°cÀÈ2ÈAÈ2ÄÐ6NÐ6NˆCÐ6NÐ6NÐ6Nr   )Ú	enumerate)r'   s   `r   Ú_unique_documentsr/   -   s%   ø€ ØOÐOÐOÐO�i¨	Ñ2Ô2ÐOÑOÔOÐOr   c                   ó”  — 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
d
z  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d
S )Ú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                 óJ   — t          ¦   «         }||z  |z  } | |||¬¦  «        S )aR  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
            parser_key: DEPRECATED. `parser_key` is no longer used and should not be
                specified.
            include_original: Whether to include the original query in the list of
                generated queries.

        Returns:
            MultiQueryRetriever
        )r2   r3   r6   )r   )Úclsr2   r7   r8   r5   r6   Úoutput_parserr3   s           r   Úfrom_llmzMultiQueryRetriever.from_llm?   s?   € õ0 -Ñ.Ô.ˆØ˜S‘L =Ñ0ˆ	ØˆsØØØ-ð
ñ 
ô 
ð 	
r   ÚqueryÚrun_managerc             ƒ   óØ   K  — |                       ||¦  «        ƒ d{V —†}| j        r|                     |¦  «         |                      ||¦  «        ƒ d{V —†}|                      |¦  «        S )úòGet relevant documents given a user query.

        Args:
            query: user query
            run_manager: the callback handler to use.

        Returns:
            Unique union of relevant documents from all generated queries
        N)Úagenerate_queriesr6   ÚappendÚaretrieve_documentsÚunique_union©r   r=   r>   Úqueriesr'   s        r   Ú_aget_relevant_documentsz,MultiQueryRetriever._aget_relevant_documents_   s‡   è è € ð ×.Ò.¨u°kÑBÔBÐBÐBÐBÐBÐBÐBˆØÔ ð 	"Ø�NŠN˜5Ñ!Ô!Ð!Ø×2Ò2°7¸KÑHÔHÐHÐHÐHÐHÐHÐHˆ	Ø× Ò  Ñ+Ô+Ð+r   r$   c              ƒ   ó  K  — | j                              d|id|                     ¦   «         i¬¦  «        ƒ d{V —†}t          | j         t          ¦  «        r|d         n|}| j        rt                               d|¦  «         |S )zõGenerate queries based upon user input.

        Args:
            question: user query
            run_manager: the callback handler to use.

        Returns:
            List of LLM generated queries that are similar to the user input
        r$   Ú	callbacks©ÚconfigNr   úGenerated queries: %s)r3   ÚainvokeÚ	get_childÚ
isinstancer   r4   ÚloggerÚinfo©r   r$   r>   Úresponser   s        r   rA   z%MultiQueryRetriever.agenerate_queriest   s¤   è è € ð œ×/Ò/Ø˜Ð"Ø ×!6Ò!6Ñ!8Ô!8Ð9ð 0ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆõ %/¨t¬~½xÑ$HÔ$HÐV�˜Ô Ð ÈhˆØŒ<ð 	8Ý�KŠKÐ/°Ñ7Ô7Ð7Øˆr   rF   c              ƒ   ód   ‡ ‡K  — t          j        ˆˆ fd„|D ¦   «         Ž ƒ d{V —†}d„ |D ¦   «         S )zÅRun all LLM generated queries.

        Args:
            queries: query list
            run_manager: the callback handler to use

        Returns:
            List of retrieved Documents
        c              3   óx   •K  — | ]4}‰j                              |d ‰                     ¦   «         i¬¦  «        V — Œ5dS )rI   rJ   N)r2   rM   rN   )r*   r=   r>   r   s     €€r   ú	<genexpr>z:MultiQueryRetriever.aretrieve_documents.<locals>.<genexpr>š   sg   øè è € ð ð ð
 ð	 ”×&Ò&ØØ'¨×)>Ò)>Ñ)@Ô)@ÐAð 'ñ ô ðð ð ð ð ð r   Nc                 ó   — g | ]	}|D ]}|‘ŒŒ
S r#   r#   )r*   Údocsr,   s      r   r-   z;MultiQueryRetriever.aretrieve_documents.<locals>.<listcomp>¢   s%   € Ð?Ð?Ð?˜¸$Ð?Ð?°3�Ð?Ð?Ð?Ð?r   )ÚasyncioÚgather)r   rF   r>   Údocument_listss   ` ` r   rC   z'MultiQueryRetriever.aretrieve_documents‹   sx   øøè è € õ  'œ~ðð ð ð ð ð
 %ðñ ô ð 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð @Ð? Ð?Ñ?Ô?Ð?r   c                ó¼   — |                       ||¦  «        }| j        r|                     |¦  «         |                      ||¦  «        }|                      |¦  «        S )r@   )Úgenerate_queriesr6   rB   Úretrieve_documentsrD   rE   s        r   Ú_get_relevant_documentsz+MultiQueryRetriever._get_relevant_documents¤   s_   € ð ×'Ò'¨¨{Ñ;Ô;ˆØÔ ð 	"Ø�NŠN˜5Ñ!Ô!Ð!Ø×+Ò+¨G°[ÑAÔAˆ	Ø× Ò  Ñ+Ô+Ð+r   c                 óö   — | j                              d|id|                     ¦   «         i¬¦  «        }t          | j         t          ¦  «        r|d         n|}| j        rt                               d|¦  «         |S )zòGenerate queries based upon user input.

        Args:
            question: user query
            run_manager: run manager for callbacks

        Returns:
            List of LLM generated queries that are similar to the user input
        r$   rI   rJ   r   rL   )r3   ÚinvokerN   rO   r   r4   rP   rQ   rR   s        r   r]   z$MultiQueryRetriever.generate_queries¹   s‚   € ð ”>×(Ò(Ø˜Ð"Ø ×!6Ò!6Ñ!8Ô!8Ð9ð )ñ 
ô 
ˆõ %/¨t¬~½xÑ$HÔ$HÐV�˜Ô Ð ÈhˆØŒ<ð 	8Ý�KŠKÐ/°Ñ7Ô7Ð7Øˆr   c                 óž   — g }|D ]G}| j                              |d|                     ¦   «         i¬¦  «        }|                     |¦  «         ŒH|S )zÃRun all LLM generated queries.

        Args:
            queries: query list
            run_manager: run manager for callbacks

        Returns:
            List of retrieved Documents
        rI   rJ   )r2   ra   rN   Úextend)r   rF   r>   r'   r=   rX   s         r   r^   z&MultiQueryRetriever.retrieve_documentsÐ   sj   € ð ˆ	Øð 	#ð 	#ˆ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   rD   z MultiQueryRetriever.unique_unionç   s   € õ ! Ñ+Ô+Ð+r   )r   r   r    r!   r   Ú__annotations__r   r4   Úboolr5   r"   r6   ÚclassmethodÚDEFAULT_QUERY_PROMPTr   r	   r<   r   r   r   rG   rA   rC   r   r_   r]   r^   rD   r#   r   r   r1   r1   1   sN  € € € € € € ðð ð
 ÐÐÑØÐÐÑØ€GˆTÐÐÑØ€J�ÐÐÑØOØ"Ð�dÐ"Ð"Ñ"ØQàð
 &:Ø!%Ø!&ð
ð 
à ð
ð ð
ð #ð	
ð
 ˜$‘Jð
ð ð
ð 
ð
ð 
ð 
ñ „[ð
ð>,àð,ð 9ð	,ð
 
ˆhŒð,ð ,ð ,ð ,ð*àðð 9ðð 
ˆcŒð	ð ð ð ð.@à�c”ð@ð 9ð@ð 
ˆhŒð	@ð @ð @ð @ð2,àð,ð 4ð	,ð
 
ˆhŒð,ð ,ð ,ð ,ð*àðð 4ðð 
ˆcŒð	ð ð ð ð.à�c”ðð 4ðð 
ˆhŒð	ð ð ð ð.	, d¨8¤nð 	,¸¸h¼ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,r   r1   )"rY   ÚloggingÚcollections.abcr   Ú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   Útyping_extensionsr   Úlangchain_classic.chains.llmr   Ú	getLoggerr   rP   r   r"   r   rh   r/   r1   r#   r   r   ú<module>rv      sÎ  ðØ €€€Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $ðð ð ð ð ð ð ð ð .Ð -Ð -Ð -Ð -Ð -Ø <Ð <Ð <Ð <Ð <Ð <Ø :Ð :Ð :Ð :Ð :Ð :Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø -Ð -Ð -Ð -Ð -Ð -Ø &Ð &Ð &Ð &Ð &Ð &à 1Ð 1Ð 1Ð 1Ð 1Ð 1à	ˆÔ	˜8Ñ	$Ô	$€ð)ð )ð )ð )ð )Ð+¨D°¬IÔ6ñ )ô )ð )ð &�~Ø�LðFð	ñ 	ô 	Ð ðP ¨(Ô!3ð P¸¸X¼ð Pð Pð Pð Pð,ð ,ð ,ð ,ð ,˜-ñ ,ô ,ð ,ð ,ð ,r   