
    m
i)                    :   d dl mZ d dlZd dl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 d dlmZ d dlmZ d dlmZmZmZ d dl m!Z!  ej"        e#          Z$d%dZ% G d de!          Z&d&d"Z' G d# d$e          Z(dS )'    )annotationsN)Sequence)Any)CallbackManagerForChainRun)BaseLanguageModel)	AIMessage)StrOutputParser)BasePromptTemplate)BaseRetriever)Runnable)Field)override)Chain)PROMPTQUESTION_GENERATOR_PROMPTFinishedOutputParser)LLMChainresponser   returntuple[list[str], list[float]]c                    g }g }| j         d         d         D ]8}|                    |d                    |                    |d                    9||fS )z>Extract tokens and log probabilities from chat model response.logprobscontenttokenlogprob)response_metadataappend)r   tokens	log_probsr   s       C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langchain_classic/chains/flare/base.py_extract_tokens_and_log_probsr!      se    FI+J7	B + +eGn%%%y)****9    c                  d    e Zd ZU dZeZded<   	 eed
d                        Z	e
dd            Zd	S )QuestionGeneratorChainz4Chain that generates questions from uncertain spans.r
   promptr   boolc                    dS )NF )clss    r    is_lc_serializablez)QuestionGeneratorChain.is_lc_serializable/   s	     ur"   	list[str]c                
    g dS )Input keys for the chain.
user_inputcontextr   r(   selfs    r    
input_keysz!QuestionGeneratorChain.input_keys4   s     5444r"   N)r   r&   r   r+   )__name__
__module____qualname____doc__r   r%   __annotations__classmethodr   r*   propertyr3   r(   r"   r    r$   r$   )   sx         >>!:F::::(   X [ 5 5 5 X5 5 5r"   r$   r   Sequence[str]r   Sequence[float]min_probfloatmin_token_gapintnum_pad_tokensr+   c                J    	 dd l }|                    |                    |          k               d         }nJ# t          $ r= t                              d           dd lfdt          |          D             }Y nw xY w fd|D             }t          |          dk    rg S |d         |d         |z   dz   gg}t          |dd                    D ]?\  }	}
|
|z   dz   }|
||	         z
  |k     r||d         d<   (|	                    |
|g           @ fd|D             S )Nr   a  NumPy not found in the current Python environment. FlareChain 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 numpyc                L    g | ] \  }}                     |          k     |!S r(   )exp).0idxlog_probmathr>   s      r    
<listcomp>z)_low_confidence_spans.<locals>.<listcomp>O   s>     
 
 
Xxx!!H,, ,,,r"   c                J    g | ]}t          j        d |                   | S )z\w)research)rF   ir   s     r    rJ   z)_low_confidence_spans.<locals>.<listcomp>T   s.    BBBQbivay&A&ABqBBBr"      c                P    g | ]"\  }}d                      ||                   #S ) )join)rF   startendr   s      r    rJ   z)_low_confidence_spans.<locals>.<listcomp>^   s2    ???:5#BGGF59%&&???r"   )
numpywhererE   ImportErrorloggerwarningrI   	enumeratelenr   )r   r   r>   r@   rB   np_low_idxlow_idxspansrN   rG   rU   rI   s   ` `         @r    _low_confidence_spansra   :   s   
88BFF9--899!< 
 
 
	
 	
 	
 	
 
 
 
 
!*9!5!5
 
 

 CBBB(BBBG
7||q	aj'!*~59:;EGABBK(( % %3N"Q&m++E"IaLLLL#s$$$$????????s   6< ABBc                     e Zd ZU dZded<   	 ded<   	  ee          Zded<   	 ded	<   	 d
Zded<   	 dZ	ded<   	 dZ
ded<   	 dZded<   	 dZded<   	 ed3d            Zed3d            Zd4d"Zd5d%Z	 d6d7d+Ze	 d8d9d2            Zd&S ):
FlareChainzFlare chain.

    Chain that combines a retriever, a question generator,
    and a response generator.

    See [Active Retrieval Augmented Generation](https://arxiv.org/abs/2305.06983) paper.
    r   question_generator_chainresponse_chain)default_factoryr   output_parserr   	retrieverg?r?   r>      rA   r@      rB   
   max_iterTr&   start_with_retrievalr   r+   c                    dgS )r-   r/   r(   r1   s    r    r3   zFlareChain.input_keys}   s     ~r"   c                    dgS )zOutput keys for the chain.r   r(   r1   s    r    output_keyszFlareChain.output_keys   s     |r"   	questionsr/   strr   _run_managerr   tuple[str, bool]c                   |                                 }g }|D ]/}|                    | j                            |                     0d                    d |D                       }| j                            |||dd|i          }	t          |	t                    r|	j        }	| j	        
                    |	          \  }
}|
|fS )Nz

c              3  $   K   | ]}|j         V  d S N)page_content)rF   ds     r    	<genexpr>z,FlareChain._do_generation.<locals>.<genexpr>   s$      ;;an;;;;;;r"   r.   	callbacks)	get_childextendrh   invokerS   re   
isinstancer   r   rg   parse)r2   rq   r/   r   rs   r{   docsquestionr0   resultmarginalfinisheds               r    _do_generationzFlareChain._do_generation   s     !**,,	! 	9 	9HKK--h778888++;;d;;;;;$++("$ 
 )$
 
 fi(( 	$^F!/55f==(!!r"   low_confidence_spansinitial_responsec                z    fd|D             }|                                 }t           j        t                    r+ j                            ||          } fd|D             }	n j                            |d|i          }	|                    d|	 dd	                                |	||          S )
Nc                    g | ]}|d 	S ))r/   current_responseuncertain_spanr(   )rF   spanr   r/   s     r    rJ   z,FlareChain._do_retrieval.<locals>.<listcomp>   s;     
 
 
 	 )$4"& 
 
 
r"   )r{   c                @    g | ]}|j         j        d                   S )r   )rd   rp   )rF   outputr2   s     r    rJ   z,FlareChain._do_retrieval.<locals>.<listcomp>   s9        t4@CD  r"   r{   )configzGenerated Questions: yellow
colorrU   )r|   r   rd   r   applybatchon_textr   )
r2   r   rs   r/   r   r   question_gen_inputsr{   question_gen_outputsrq   s
   `  ` `    r    _do_retrievalzFlareChain._do_retrieval   s"   
 
 
 
 
 -
 
 
 !**,,	d3X>> 	#'#@#F#F## $G $ $    2  II
 5;;##Y/ <  I 	/I// 	 	
 	
 	

 ""9j(LQQQr"   Ninputsdict[str, Any]run_manager!CallbackManagerForChainRun | Nonec           	        |pt          j                    }|| j        d                  }d}t          | j                  D ]!}|                    d| dd           |d|d}t          | j                            |d|	                                i                    \  }}	t          ||	| j        | j        | j                  }
|                                d	z   d                    |          z   }|
s3|}| j                            |          \  }}|r| j        d         |ic S |                     |
||||          \  }}|                                d	z   |z   }|r n#| j        d         |iS )
Nr   rR   zCurrent Response: bluer   r   r.   r{    )r   get_noop_managerr3   rangerl   r   r!   re   r~   r|   ra   r>   r@   rB   striprS   rg   r   rp   r   )r2   r   r   rs   r/   r   _i_inputr   r   r   r   final_responser   r   s                  r    _callzFlareChain._call   s   
 #S&@&Q&S&SDOA./
&& %	 %	B  /X// !   
 %/28TTF =#** ,"8"8":":; ! !FI $9"#$ $   (~~//#5G' ++/+=+C+CH+M+M( A ,Q/@@@@!%!3!3$ " "Hh  ~~''#-8H  #X..r"       llmBaseLanguageModel | Nonemax_generation_lenkwargsr   c                   	 ddl m} n$# t          $ r}d}t          |          |d}~ww xY w| ||dd          }nt          ||          s'dt	          |          j         d}t          |          t          |d	d
          sd}t          |          t          |dd          }|"||k    rt          
                    d||           t          |z  }t          |z  t                      z  }	 | d|	|d|S )aH  Creates a FlareChain from a language model.

        Args:
            llm: Language model to use.
            max_generation_len: Maximum length of the generated response.
            kwargs: Additional arguments to pass to the constructor.

        Returns:
            FlareChain class with the given language model.
        r   )
ChatOpenAIz_OpenAI is required for FlareChain. Please install langchain-openai.pip install langchain-openaiNT)max_completion_tokensr   temperaturez-FlareChain.from_llm requires ChatOpenAI; got .r   FzSProvided ChatOpenAI instance must be constructed with logprobs=True for FlareChain.r   zFlareChain.from_llm: supplied llm max_completion_tokens=%s differs from requested max_generation_len=%s; leaving model unchanged.)rd   re   r(   )langchain_openair   rX   r   typer5   	TypeErrorgetattr
ValueErrorrY   debugr   r   r	   )
r)   r   r   r   r   emsgcurrent_maxre   question_gen_chains
             r    from_llmzFlareChain.from_llm   s   "	*3333333 	* 	* 	*/ 
 c"")	* ;*&8  CC c:.. %-Cyy)- - -   nn$3
E22 &4  !oo%!#'>EEK&;:L+L+L/  &    #6<?P?PPs 
%7)
 
 
 
 	
s   	 
*%*r4   )
rq   r+   r/   rr   r   rr   rs   r   r   rt   )r   r+   rs   r   r/   rr   r   rr   r   rr   r   rt   rw   )r   r   r   r   r   r   )r   )r   r   r   rA   r   r   r   rc   )r5   r6   r7   r8   r9   r   r   rg   r>   r@   rB   rl   rm   r;   r3   rp   r   r   r   r:   r   r(   r"   r    rc   rc   a   s          '&&&>E*/%@T*U*U*UMUUUU?HHJMDN?H'!%%%%%*   X    X" " " "2$R $R $R $RR :>1/ 1/ 1/ 1/ 1/f  #%=
 =
 =
 =
 [=
 =
 =
r"   rc   )r   r   r   r   )r   r<   r   r=   r>   r?   r@   rA   rB   rA   r   r+   ))
__future__r   loggingrL   collections.abcr   typingr   langchain_core.callbacksr   langchain_core.language_modelsr   langchain_core.messagesr   langchain_core.output_parsersr	   langchain_core.promptsr
   langchain_core.retrieversr   langchain_core.runnablesr   pydanticr   typing_extensionsr   langchain_classic.chains.baser   &langchain_classic.chains.flare.promptsr   r   r   langchain_classic.chains.llmr   	getLoggerr5   rY   r!   r$   ra   rc   r(   r"   r    <module>r      s   " " " " " "  				 $ $ $ $ $ $            = < < < < < - - - - - - 9 9 9 9 9 9 5 5 5 5 5 5 3 3 3 3 3 3 - - - - - -       & & & & & & / / / / / /         
 2 1 1 1 1 1		8	$	$   5 5 5 5 5X 5 5 5"$@ $@ $@ $@NV
 V
 V
 V
 V
 V
 V
 V
 V
 V
r"   