
    @h$                    D   S SK Jr  S SKrS SKrS SKJr  S SKJrJr  S SK	J
r
  S SKJr  S SKJr  S SKJr  S S	KJr  S S
KJr  S SKJr  S SKJr  S SKJr  S SKJrJrJr  S SKJ r   \RB                  " \"5      r#SS jr$ " S S\ 5      r%            SS jr& " S S\5      r'g)    )annotationsN)Sequence)AnyOptional)CallbackManagerForChainRun)BaseLanguageModel)	AIMessage)StrOutputParser)BasePromptTemplate)BaseRetriever)Runnable)Field)Chain)PROMPTQUESTION_GENERATOR_PROMPTFinishedOutputParser)LLMChainc                    / n/ nU R                   S   S    H+  nUR                  US   5        UR                  US   5        M-     X4$ )z>Extract tokens and log probabilities from chat model response.logprobscontenttokenlogprob)response_metadataappend)responsetokens	log_probsr   s       S/var/www/html/shao/venv/lib/python3.13/site-packages/langchain/chains/flare/base.py_extract_tokens_and_log_probsr      sU    FI++J7	BeGn%y)* C     c                  R    \ rS rSr% Sr\rS\S'    \S	S j5       r	\
S
S j5       rSrg)QuestionGeneratorChain(   z4Chain that generates questions from uncertain spans.r   promptc                    g)NF )clss    r   is_lc_serializable)QuestionGeneratorChain.is_lc_serializable.   s    r    c                
    / SQ$ )Input keys for the chain.
user_inputcontextr   r&   selfs    r   
input_keys!QuestionGeneratorChain.input_keys2   s
     54r    r&   N)returnboolr3   	list[str])__name__
__module____qualname____firstlineno____doc__r   r$   __annotations__classmethodr(   propertyr1   __static_attributes__r&   r    r   r"   r"   (   s9    >!:F:(  5 5r    r"   c           	         SS K nUR                  UR                  U5      U:  5      S   nU V
s/ sH%  n
[        R                  " SX
   5      (       d  M#  U
PM'     nn
[        U5      S:X  a  / $ US   US   U-   S-   //n[        USS  5       H2  u  pX-   S-   nXU
   -
  U:  a	  XS   S'   M   UR                  X/5        M4     U VVs/ sH  u  pSR                  XU 5      PM     snn$ ! [         aY    [        R                  S5        SS Kn[        U5       VV	s/ sH  u  pUR                  U	5      U:  d  M  UPM      Os  sn	nf nnn	 GN f = fs  sn
f s  snnf )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 numpyz\w    )numpywhereexpImportErrorloggerwarningmath	enumerateresearchlenr   join)r   r   min_probmin_token_gapnum_pad_tokensnp_low_idxrJ   idxlog_probilow_idxspansendstarts                  r   _low_confidence_spansr\   8   sc   
88BFF9-89!<  #B(Qbiivy&Aq(GB
7|q	aj'!*~59:;EGABK("Q&m+"IaLLL#$ ) :??:5BGGF%&??3  
	
 	 "+9!5
!5xx!H, !5
 

 C @s4   *C* !EEE*1EE 9E ?
EEc                  P   \ rS rSr% SrS\S'    S\S'    \" \S9rS\S'    S	\S
'    Sr	S\S'    Sr
S\S'    SrS\S'    SrS\S'    SrS\S'    \S S j5       r\S S j5       r          S!S jr            S"S jr S#     S$S jjr\ S%       S&S jj5       rSrg)'
FlareChain_   zChain 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?floatrP      intrQ      rR   
   max_iterTr4   start_with_retrievalc                    S/$ )r+   r-   r&   r/   s    r   r1   FlareChain.input_keysy   s     ~r    c                    S/$ )zOutput keys for the chain.r   r&   r/   s    r   output_keysFlareChain.output_keys~   s     |r    c                   UR                  5       n/ nU H-  nUR                  U R                  R                  U5      5        M/     SR	                  S U 5       5      nU R
                  R                  UUUS.SU05      n	[        U	[        5      (       a  U	R                  n	U R                  R                  U	5      u  pX4$ )Nz

c              3  6   #    U H  oR                   v   M     g 7fN)page_content).0ds     r   	<genexpr>,FlareChain._do_generation.<locals>.<genexpr>   s     ;dnnds   r,   	callbacks)	get_childextendrd   invokerO   ra   
isinstancer	   r   rc   parse)r0   	questionsr-   r   _run_managerry   docsquestionr.   resultmarginalfinisheds               r   _do_generationFlareChain._do_generation   s     !**,	!HKK--h78 "++;d;;$$++("$
 )$
 fi((^^F!//55f=!!r    c                   U Vs/ sH	  nUUUS.PM     nnUR                  5       n[        U R                  [        5      (       aE  U R                  R	                  UUS9n	U	 V
s/ sH  n
XR                  R
                  S      PM      nn
OU R                  R                  USU0S9nUR                  SU 3SSS	9  U R                  XXB5      $ s  snf s  sn
f )
N)r-   current_responseuncertain_span)ry   r   ry   )configzGenerated Questions: yellow
colorrZ   )	rz   r}   r`   r   applyro   batchon_textr   )r0   low_confidence_spansr   r-   r   initial_responsespanquestion_gen_inputsry   question_gen_outputsoutputr   s               r   _do_retrievalFlareChain._do_retrieval   s    -
 -	 )$4"&
 - 	 
 !**,	d33X>>#'#@#@#F#F## $G $  32F 44@@CD2  I
 55;;##Y/ < I 	#I;/ 	 	

 ""9(QQ9
s   C#$CNc           	        U=(       d    [         R                  " 5       nXR                  S      nSn[        U R                  5       GH  nUR                  SU 3SSS9  USUS.n[        U R                  R                  USUR                  5       05      5      u  p[        UU	U R                  U R                  U R                  5      n
UR                  5       S	-   SR                  U5      -   nU
(       d;  UnU R                   R#                  U5      u  pU(       a  U R$                  S   U0s  $ M  U R'                  U
UUUU5      u  pUR                  5       S	-   U-   nU(       d  GM     O   U R$                  S   U0$ )
Nr   rC   zCurrent Response: bluer   r   r,   ry    )r   get_noop_managerr1   rangerj   r   r   ra   r|   rz   r\   rP   rQ   rR   striprO   rc   r~   ro   r   )r0   inputsrun_managerr   r-   r   _i_inputr   r   r   r   final_responser   r   s                  r   _callFlareChain._call   s   
 #S&@&Q&Q&SOOA./
&B  $XJ/ ! 
 %/28TF =##** ,"8"8":;!F $9""##$   (~~/#5G'++/+=+=+C+CH+M( ,,Q/@@!%!3!3$ "H  ~~'#-8HxK 'L   #X..r    c                     SSK Jn  U" USSS9n[        U-  n[        U-  [        5       -  nU " SUUS.UD6$ ! [         a  nSn[        U5      UeSnAff = f)	a  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   temperature)r`   ra   r&   )langchain_openair   rG   r   r   r
   )	r'   llmmax_generation_lenkwargsr   emsgra   question_gen_chains	            r   from_llmFlareChain.from_llm   s    "	*3 "4

  #6<?PP 
%7)
 
 	
  	*/ 
 c")	*s   8 
AAAr&   r5   )
r   r6   r-   strr   r   r   r   r3   tuple[str, bool])r   r6   r   r   r-   r   r   r   r   r   r3   r   rs   )r   dict[str, Any]r   z$Optional[CallbackManagerForChainRun]r3   r   )    )r   r   r   rg   r   r   r3   r^   )r7   r8   r9   r:   r;   r<   r   r   rc   rP   rQ   rR   rj   rk   r>   r1   ro   r   r   r   r=   r   r?   r&   r    r   r^   r^   _   s    '&>E*/@T*UM'U?HHeJM3DNC?Hc'!%$%*   "" " 	"
 1" 
"2$R'$R 1$R 	$R
 $R $R 
$RR =A1/1/ :1/ 
	1/f  #%$
$
  $
 	$

 
$
 $
r    r^   )r   r	   r3   ztuple[list[str], list[float]])r   zSequence[str]r   zSequence[float]rP   re   rQ   rg   rR   rg   r3   r6   )(
__future__r   loggingrL   collections.abcr   typingr   r   langchain_core.callbacksr   langchain_core.language_modelsr   langchain_core.messagesr	   langchain_core.output_parsersr
   langchain_core.promptsr   langchain_core.retrieversr   langchain_core.runnablesr   pydanticr   langchain.chains.baser   langchain.chains.flare.promptsr   r   r   langchain.chains.llmr   	getLoggerr7   rH   r   r"   r\   r^   r&   r    r   <module>r      s    "  	 $   = - 9 5 3 -  ' 
 *			8	$5X 5 $@$@$@ $@ 	$@
 $@ $@N{
 {
r    