
    9|h#                    D   d dl mZ d dlZd dlZd dlmZmZmZmZ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 d dlmZmZm Z  d dl!m"Z"  ejF                  e$      Z%ddZ& G d de"      Z'	 	 	 	 	 	 	 	 	 	 	 	 ddZ( G d de      Z)y)    )annotationsN)AnyDictListOptionalSequenceTuple)CallbackManagerForChainRun)BaseLanguageModel)	AIMessage)StrOutputParser)BasePromptTemplate)BaseRetriever)Runnable)Field)Chain)PROMPTQUESTION_GENERATOR_PROMPTFinishedOutputParser)LLMChainc                    g }g }| j                   d   d   D ]*  }|j                  |d          |j                  |d          , ||fS )z>Extract tokens and log probabilities from chat model response.logprobscontenttokenlogprob)response_metadataappend)responsetokens	log_probsr   s       Z/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain/chains/flare/base.py_extract_tokens_and_log_probsr"      s[    FI++J7	B +eGn%y)*+ 9    c                  F    e Zd ZU dZeZded<   	 edd       Ze	dd       Z
y)	QuestionGeneratorChainz4Chain that generates questions from uncertain spans.r   promptc                     y)NF )clss    r!   is_lc_serializablez)QuestionGeneratorChain.is_lc_serializable-   s    r#   c                
    g dS )Input keys for the chain.
user_inputcontextr   r(   selfs    r!   
input_keysz!QuestionGeneratorChain.input_keys1   s
     54r#   N)returnboolr3   	List[str])__name__
__module____qualname____doc__r   r&   __annotations__classmethodr*   propertyr2   r(   r#   r!   r%   r%   '   s9    >!:F:(  5 5r#   r%   c           	        	 dd l }|j                  |j                  |      |k        d   }|D 
cg c]  }
t        j                  d| |
         s|
  }}
t        |      dk(  rg S |d   |d   |z   dz   gg}t        |dd        D ]4  \  }
}||z   dz   }|||
   z
  |k  r	||d   d<   "|j                  ||g       6 |D cg c]  \  }}dj                  | ||        c}}S # t        $ rU t        j                  d       dd l}t        |      D 	cg c]  \  }}	|j                  |	      |k  r| nc c}	}w }}}	Y w xY wc c}
w c c}}w )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_idxrH   idxlog_probilow_idxspansendstarts                  r!   _low_confidence_spansrZ   7   st   
88BFF9-89!< #BQbiivay&AqBGB
7|q	aj'!*~59:;EGABK( %3N"Q&m+E"IaLLL#s$% :??:5#BGGF5%&??1  
Y	
 	 "+9!5
Xxx!H, 
 
 

 C @s.   *C" EE E"0E  D32
E ?E 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dd       Zedd       Z	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 d dZ	 d!	 	 	 	 	 d"dZe	 d#	 	 	 	 	 	 	 d$d       Zy)%
FlareChainzChain 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?floatrN      intrO      rP   
   max_iterTr4   start_with_retrievalc                    dgS )r,   r.   r(   r0   s    r!   r2   zFlareChain.input_keysw   s     ~r#   c                    dgS )zOutput keys for the chain.r   r(   r0   s    r!   output_keyszFlareChain.output_keys|   s     |r#   c                x   |j                         }g }|D ],  }|j                  | j                  j                  |             . dj	                  d |D              }| j
                  j                  |||dd|i      }	t        |	t              r|	j                  }	| j                  j                  |	      \  }
}|
|fS )Nz

c              3  4   K   | ]  }|j                     y wN)page_content).0ds     r!   	<genexpr>z,FlareChain._do_generation.<locals>.<genexpr>   s     ;ann;s   r-   	callbacks)	get_childextendra   invokerM   r^   
isinstancer   r   r`   parse)r1   	questionsr.   r   _run_managerrs   docsquestionr/   resultmarginalfinisheds               r!   _do_generationzFlareChain._do_generation   s     !**,	! 	9HKK--h78	9++;d;;$$++("$
 )$
 fi(^^F!//55f=(!!r#   c                   |D cg c]  }|||d
 }}|j                         }t        | j                  t              rG| j                  j	                  ||      }	|	D 
cg c]  }
|
| j                  j
                  d        }}
n| j                  j                  |d|i      }|j                  d| dd	       | j                  ||||      S c c}w c c}
w )
N)r.   current_responseuncertain_span)rs   r   rs   )configzGenerated Questions: yellow
colorrX   )	rt   rw   r]   r   applyrk   batchon_textr   )r1   low_confidence_spansrz   r.   r   initial_responsespanquestion_gen_inputsrs   question_gen_outputsoutputry   s               r!   _do_retrievalzFlareChain._do_retrieval   s    -
 	 )$4"&
 
 !**,	d33X>#'#@#@#F#F#y $G $ 
 3 t44@@CDI 
 55;;#[),D < I 	#I;/xT 	 	
 ""9j(LQQ1
s   C#CNc           	        |xs t        j                         }|| j                  d      }d}t        | j                        D ]  }|j                  d| dd       |d|d}t        | j                  j                  |d|j                         i            \  }}	t        ||	| j                  | j                  | j                        }
|j                         d	z   dj                  |      z   }|
s6|}| j                   j#                  |      \  }}|r| j$                  d   |ic S | j'                  |
||||      \  }}|j                         d	z   |z   }|s n | j$                  d   |iS )
Nr   rA   zCurrent Response: bluer   r   r-   rs    )r
   get_noop_managerr2   rangerg   r   r"   r^   rv   rt   rZ   rN   rO   rP   striprM   r`   rx   rk   r   )r1   inputsrun_managerrz   r.   r   rU   _inputr   r    r   r   final_responser   r~   s                  r!   _callzFlareChain._call   s   
 #S&@&Q&Q&SDOOA./
t}}% "	A  $XJ/v4 !  %/28TF =##**[,*@*@*BC!FI
 $9""##$   (~~/#5G'++/+=+=+C+CH+M( ,,Q/@@!%!3!3$ "Hh  ~~'#-8HE"	F   #X..r#   c                    	 ddl m}  ||dd      }t        |z  }t        |z  t               z  } | d||d|S # t        $ r t        d      w xY w)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-openaiT)max_completion_tokensr   temperature)r]   r^   r(   )langchain_openair   rE   r   r   r   )r)   llmmax_generation_lenkwargsr   r^   question_gen_chains          r!   from_llmzFlareChain.from_llm   s    	3 "4tQR
  #6<?PP 
%7)
 
 	
  	/ 	s	   ; Ar5   )
ry   r6   r.   strr   r   rz   r
   r3   Tuple[str, bool])r   r6   rz   r
   r.   r   r   r   r   r   r3   r   rn   )r   Dict[str, Any]r   z$Optional[CallbackManagerForChainRun]r3   r   )    )r   r   r   rd   r   r   r3   r\   )r7   r8   r9   r:   r;   r   r   r`   rN   rO   rP   rg   rh   r=   r2   rk   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J =A././ :./ 
	./` ?A
#
9<
MP
	
 
r#   r\   )r   r   r3   zTuple[List[str], List[float]])r   zSequence[str]r    zSequence[float]rN   rb   rO   rd   rP   rd   r3   r6   )*
__future__r   loggingrJ   typingr   r   r   r   r   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   rF   r"   r%   rZ   r\   r(   r#   r!   <module>r      s    "  	 = = = - 9 5 3 -  ' 
 *			8	$5X 5 #@#@#@ #@ 	#@
 #@ #@Ln
 n
r#   