§
    è˜ºhƒ  ã                   óF  — d dl 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mZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ  ej        e¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z e
dgd¬¦  «        Zdee         dee         fd„Z G d„ de¦  «        ZdS )é    N)ÚListÚSequence)ÚDocument)ÚBaseLLM)ÚPromptTemplate)Ú	BaseModelÚField)ÚBaseRetriever)Ú#AsyncCallbackManagerForRetrieverRunÚCallbackManagerForRetrieverRun)ÚLLMChain)ÚPydanticOutputParserc                   óB   — e Zd ZU dZ ed¬¦  «        Zee         ed<   dS )ÚLineListzList of lines.zLines of text)ÚdescriptionÚlinesN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r   ÚstrÚ__annotations__© ó    úh/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain/retrievers/multi_query.pyr   r      s9   € € € € € € ØÐà�u¨Ð9Ñ9Ô9€Eˆ4�Œ9Ð9Ð9Ñ9ØÐr   r   c                   ó4   ‡ — e Zd ZdZdˆ fd„Zdedefd„Zˆ xZS )ÚLineListOutputParserz"Output parser for a list of lines.ÚreturnNc                 óV   •— t          ¦   «                              t          ¬¦  «         d S )N)Úpydantic_object)ÚsuperÚ__init__r   )ÚselfÚ	__class__s    €r   r"   zLineListOutputParser.__init__   s$   ø€ Ý‰Œ×Ò­ÐÑ2Ô2Ð2Ð2Ð2r   Útextc                 óp   — |                      ¦   «                              d¦  «        }t          |¬¦  «        S )Nú
)r   )ÚstripÚsplitr   )r#   r%   r   s      r   ÚparsezLineListOutputParser.parse"   s.   € Ø—
’
‘”×"Ò" 4Ñ(Ô(ˆÝ˜eÐ$Ñ$Ô$Ð$r   )r   N)	r   r   r   r   r"   r   r   r*   Ú__classcell__)r$   s   @r   r   r      se   ø€ € € € € Ø,Ð,ð3ð 3ð 3ð 3ð 3ð 3ð%˜#ð % (ð %ð %ð %ð %ð %ð %ð %ð %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>5   s/   ø€ ÐOÐOÐO‘F�A�s°cÀÈ2ÈAÈ2ÄÐ6NÐ6NˆCÐ6NÐ6NÐ6Nr   )Ú	enumerate)r/   s   `r   Ú_unique_documentsr7   4   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	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_originalÚllmÚpromptr   c                 ó`   — t          ¦   «         }t          |||¬¦  «        } | ||||¬¦  «        S )ai  Initialize from llm using default template.

        Args:
            retriever: retriever to query documents from
            llm: llm for query generation using DEFAULT_QUERY_PROMPT
            include_original: Whether to include the original query in the list of
                generated queries.

        Returns:
            MultiQueryRetriever
        )r?   r@   Úoutput_parser)r:   r;   r=   r>   )r   r   )Úclsr:   r?   r@   r=   r>   rB   r;   s           r   Úfrom_llmzMultiQueryRetriever.from_llmE   sH   € õ( -Ñ.Ô.ˆÝ ¨VÀ=ÐQÑQÔQˆ	ØˆsØØØ!Ø-ð	
ñ 
ô 
ð 	
r   ÚqueryÚrun_managerc             ƒ   óØ   K  — |                       ||¦  «        ƒ d{V —†}| j        r|                     |¦  «         |                      ||¦  «        ƒ d{V —†}|                      |¦  «        S )ú¿Get relevant documents given a user query.

        Args:
            question: user query

        Returns:
            Unique union of relevant documents from all generated queries
        N)Úagenerate_queriesr>   ÚappendÚaretrieve_documentsÚunique_union©r#   rE   rF   Úqueriesr/   s        r   Ú_aget_relevant_documentsz,MultiQueryRetriever._aget_relevant_documentsb   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{V —†}t          |d         | j        g ¦  «        }| j        rt                               d|› �¦  «         |S )ú¿Generate queries based upon user input.

        Args:
            question: user query

        Returns:
            List of LLM generated queries that are similar to the user input
        r,   )ÚinputsÚ	callbacksNr%   úGenerated queries: )r;   ÚacallÚ	get_childÚgetattrr=   r<   ÚloggerÚinfo©r#   r,   rF   Úresponser   s        r   rI   z%MultiQueryRetriever.agenerate_queriesv   sœ   è è € ð œ×-Ò-Ø Ð)°[×5JÒ5JÑ5LÔ5Lð .ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆõ ˜ Ô(¨$¬/¸2Ñ>Ô>ˆØŒ<ð 	7Ý�KŠKÐ5¨eÐ5Ð5Ñ6Ô6Ð6Øˆr   rN   c              ƒ   ód   ‡ ‡K  — t          j        ˆˆ fd„|D ¦   «         Ž ƒ d{V —†}d„ |D ¦   «         S )ú�Run all LLM generated queries.

        Args:
            queries: query list

        Returns:
            List of retrieved Documents
        c              3   ót   •K  — | ]2}‰j                              |‰                     ¦   «         ¬ ¦  «        V — Œ3dS )©rS   N)r:   Úaget_relevant_documentsrV   )r2   rE   rF   r#   s     €€r   ú	<genexpr>z:MultiQueryRetriever.aretrieve_documents.<locals>.<genexpr>•   sa   øè è € ð ð ð ð ”×6Ò6Ø [×%:Ò%:Ñ%<Ô%<ð 7ñ ô ðð ð ð ð ð r   Nc                 ó   — g | ]	}|D ]}|‘ŒŒ
S r   r   )r2   Údocsr4   s      r   r5   z;MultiQueryRetriever.aretrieve_documents.<locals>.<listcomp>œ   s%   € Ð?Ð?Ð?˜¸$Ð?Ð?°3�Ð?Ð?Ð?Ð?r   )ÚasyncioÚgather)r#   rN   rF   Údocument_listss   ` ` r   rK   z'MultiQueryRetriever.aretrieve_documents‰   sx   øøè è € õ  'œ~ðð ð ð ð ð %ð	ñ ô ð 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð @Ð? Ð?Ñ?Ô?Ð?r   c                ó¼   — |                       ||¦  «        }| j        r|                     |¦  «         |                      ||¦  «        }|                      |¦  «        S )rH   )Úgenerate_queriesr>   rJ   Úretrieve_documentsrL   rM   s        r   Ú_get_relevant_documentsz+MultiQueryRetriever._get_relevant_documentsž   s_   € ð ×'Ò'¨¨{Ñ;Ô;ˆØÔ ð 	"Ø�NŠN˜5Ñ!Ô!Ð!Ø×+Ò+¨G°[ÑAÔAˆ	Ø× Ò  Ñ+Ô+Ð+r   c                 óÜ   — |                       d|i|                     ¦   «         ¬¦  «        }t          |d         | j        g ¦  «        }| j        rt
                               d|› �¦  «         |S )rQ   r,   r_   r%   rT   )r;   rV   rW   r=   r<   rX   rY   rZ   s        r   rh   z$MultiQueryRetriever.generate_queries²   sv   € ð —>’>Ø˜Ð"¨k×.CÒ.CÑ.EÔ.Eð "ñ 
ô 
ˆõ ˜ Ô(¨$¬/¸2Ñ>Ô>ˆØŒ<ð 	7Ý�KŠKÐ5¨eÐ5Ð5Ñ6Ô6Ð6Øˆr   c                 óš   — g }|D ]E}| j                              ||                     ¦   «         ¬¦  «        }|                     |¦  «         ŒF|S )r]   r_   )r:   Úget_relevant_documentsrV   Úextend)r#   rN   rF   r/   rE   rc   s         r   ri   z&MultiQueryRetriever.retrieve_documentsÅ   sd   € ð ˆ	Øð 	#ð 	#ˆEØ”>×8Ò8Ø ×!6Ò!6Ñ!8Ô!8ð 9ñ ô ˆDð ×Ò˜TÑ"Ô"Ð"Ð"ØÐr   r/   c                 ó    — t          |¦  «        S )z¡Get unique Documents.

        Args:
            documents: List of retrieved Documents

        Returns:
            List of unique retrieved Documents
        )r7   )r#   r/   s     r   rL   z MultiQueryRetriever.unique_unionØ   s   € õ ! Ñ+Ô+Ð+r   N)r   r   r   r   r
   r   r   r<   Úboolr=   r   r>   ÚclassmethodÚDEFAULT_QUERY_PROMPTr   r   rD   r   r   r   rO   rI   rK   r   rj   rh   ri   rL   r   r   r   r9   r9   8   s7  € € € € € € ðð ð
 ÐÐÑØÐÐÑØ€GˆTÐÐÑØ€J�ÐÐÑØ"Ð�dÐ"Ð"Ñ"ØQàð
 "6Ø!Ø!&ð
ð 
à ð
ð ð
ð ð	
ð
 ð
ð ð
ð 
ð
ð 
ð 
ñ „[ð
ð8,àð,ð 9ð	,ð
 
ˆhŒð,ð ,ð ,ð ,ð(ØðØ*Mðà	ˆcŒðð ð ð ð&@Ø˜C”yð@Ø/Rð@à	ˆhŒð@ð @ð @ð @ð*,àð,ð 4ð	,ð
 
ˆhŒð,ð ,ð ,ð ,ð(ØðØ*Hðà	ˆcŒðð ð ð ð&Ø˜C”yðØ/Mðà	ˆhŒðð ð ð ð&	, d¨8¤nð 	,¸¸h¼ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,r   r9   )rd   ÚloggingÚtypingr   r   Úlangchain_core.documentsr   Úlangchain_core.language_modelsr   Úlangchain_core.prompts.promptr   Úlangchain_core.pydantic_v1r   r	   Úlangchain_core.retrieversr
   Úlangchain.callbacks.managerr   r   Úlangchain.chains.llmr   Ú!langchain.output_parsers.pydanticr   Ú	getLoggerr   rX   r   r   rr   r7   r9   r   r   r   ú<module>r~      s×  ðØ €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !à -Ð -Ð -Ð -Ð -Ð -Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð *Ð )Ð )Ð )Ð )Ð )Ø BÐ BÐ BÐ BÐ BÐ Bà	ˆÔ	˜8Ñ	$Ô	$€ðð ð ð ð ˆyñ ô ð ð%ð %ð %ð %ð %Ð/ñ %ô %ð %ð &�~Ø�LðFð	ñ 	ô 	Ð ðP ¨(Ô!3ð P¸¸X¼ð Pð Pð Pð Pði,ð i,ð i,ð i,ð i,˜-ñ i,ô i,ð i,ð i,ð i,r   