
    m
iZ                     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      C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langchain_classic/retrievers/multi_query.pyparsezLineListOutputParser.parse   s5    

""4((F4''(((    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OFAsc2A26N6NC6N6N6Nr   )	enumerate)r'   s   `r   _unique_documentsr/   -   s%    OOOOi	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 )MultiQueryRetrieverzGiven 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 -..SL=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       ..ukBBBBBBBB  	"NN5!!!227K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 )zGenerate 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KK/777r   rF   c                 d    K   t          j         fd|D               d{V }d |D             S )zRun 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_     ''{;;  	"NN5!!!++G[AA	  +++r   c                     | j                             d|id|                                i          }t          | j         t                    r|d         n|}| j        rt                              d|           |S )zGenerate 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KK/777r   c                     g }|D ]G}| j                             |d|                                i          }|                    |           H|S )zRun 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 )zGet 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         
 GTJO"d"""Q
 &:!%!&
 
 
 
 #	

 $J
 
 

 
 
 [
>,, 9	,
 
h, , , ,* 9 
c	   .@c@ 9@ 
h	@ @ @ @2,, 4	,
 
h, , , ,* 4 
c	   .c 4 
h	   .	,d8n 	,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   