
    Ng2!                       d dl mZ d dlZd dlmZmZmZmZmZm	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m Z m!Z! d dl"m#Z# d#dZ$ G d de#          Z%d$d Z& G d! d"e          Z'dS )%    )annotationsN)AnyDictListOptionalSequenceTuple)CallbackManagerForChainRun)BaseLanguageModel)	AIMessage)StrOutputParser)BasePromptTemplate)BaseRetriever)Runnable)Field)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       W/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/chains/flare/base.py_extract_tokens_and_log_probsr$      se    FI+J7	B + +eGn%%%y)****9    c                  T    e Zd ZU dZeZded<   	 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_keys/   s     5444r%   N)r   r)   r   r.   )__name__
__module____qualname____doc__r   r(   __annotations__classmethodr-   propertyr6   r+   r%   r#   r'   r'   %   sn         >>!:F::::(   [ 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                    t          j        t          j        |          |k               d         } 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   c                J    g | ]}t          j        d |                   | S )z\w)research).0ir!   s     r#   
<listcomp>z)_low_confidence_spans.<locals>.<listcomp>=   s.    BBBQbivay&A&ABqBBBr%      c                P    g | ]"\  }}d                      ||                   #S ) )join)rJ   startendr!   s      r#   rL   z)_low_confidence_spans.<locals>.<listcomp>G   s2    ???:5#BGGF59%&&???r%   )npwhereexplen	enumerater    )r!   r"   rA   rC   rE   _low_idxlow_idxspansrK   idxrS   s   `          r#   _low_confidence_spansr]   5   s     xy))H455a8HBBBB(BBBG
7||q	aj'!*~59:;EGABBK(( % %3N"Q&m++E"IaLLLL#s$$$$????????r%   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 ):
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?rB   rA      rD   rC      rE   
   max_iterTr)   start_with_retrievalr   r.   c                    dgS )r0   r2   r+   r4   s    r#   r6   zFlareChain.input_keysd   s     ~r%   c                    dgS )zOutput keys for the chain.r   r+   r4   s    r#   output_keyszFlareChain.output_keysi   s     |r%   	questionsr2   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)rJ   ds     r#   	<genexpr>z,FlareChain._do_generation.<locals>.<genexpr>y   s$      ;;an;;;;;;r%   r1   	callbacks)	get_childextendrd   invokerQ   ra   
isinstancer   r   rc   parse)r5   rm   r2   r   ro   rw   docsquestionr3   resultmarginalfinisheds               r#   _do_generationzFlareChain._do_generationn   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 ))r2   current_responseuncertain_spanr+   )rJ   spanr   r2   s     r#   rL   z,FlareChain._do_retrieval.<locals>.<listcomp>   s;     
 
 
 	 )$4"& 
 
 
r%   )rw   c                @    g | ]}|j         j        d                   S )r   )r`   rl   )rJ   outputr5   s     r#   rL   z,FlareChain._do_retrieval.<locals>.<listcomp>   s9        t4@CD  r%   rw   )configzGenerated Questions: yellow
colorrS   )rx   r{   r`   r   applybatchon_textr   )
r5   r   ro   r2   r   r   question_gen_inputsrw   question_gen_outputsrm   s
   `  ` `    r#   _do_retrievalzFlareChain._do_retrieval   s   
 
 
 
 
 -
 
 
 !**,,	d3X>> 	#'#@#F#F#y $G $ $    2  II
 5;;#[),D <  I 	/I//xT 	 	
 	
 	
 ""9j(LQQQr%   NinputsDict[str, Any]run_manager$Optional[CallbackManagerForChainRun]c           	        |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   rP   zCurrent Response: bluer   r   r1   rw    )r
   get_noop_managerr6   rangerh   r   r$   ra   rz   rx   r]   rA   rC   rE   striprQ   rc   r|   rl   r   )r5   r   r   ro   r2   r   rK   _inputr!   r"   r   r   final_responser   r   s                  r#   _callzFlareChain._call   s   
 #S&@&Q&S&SDOA./
t}%% "	 "	A  /X//v4 !    %/28TTF =#**[,*@*@*B*BC ! !FI
 $9"#$ $   (~~//#5G' ++/+=+C+CH+M+M( A ,Q/@@@@!%!3!3$ " "Hh  ~~''#-8H  #X..r%       llmr   max_generation_lenkwargsr   c                    	 ddl m} n# t          $ r t          d          w xY w ||d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-openaiT)
max_tokensr   temperature)r`   ra   r+   )langchain_openair   ImportErrorr   r   r   )r,   r   r   r   r   ra   question_gen_chains          r#   from_llmzFlareChain.from_llm   s    	3333333 	 	 	/  	 j$6STUUU#6<?P?PPs 
%7)
 
 
 
 	
s   	 #r7   )
rm   r.   r2   rn   r   rn   ro   r
   r   rp   )r   r.   ro   r
   r2   rn   r   rn   r   rn   r   rp   rs   )r   r   r   r   r   r   )r   )r   r   r   rD   r   r   r   r_   )r8   r9   r:   r;   r<   r   r   rc   rA   rC   rE   rh   ri   r>   r6   rl   r   r   r   r=   r   r+   r%   r#   r_   r_   J   s          '&&&>E*/%@T*U*U*UMUUUU?HHJMDN?H'!%%%%%*   X    X" " " "2 R  R  R  RJ =A./ ./ ./ ./ ./` ?A
 
 
 
 [
 
 
r%   r_   )r   r   r   r   )r!   r?   r"   r@   rA   rB   rC   rD   rE   rD   r   r.   )(
__future__r   rH   typingr   r   r   r   r   r	   numpyrT   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   r$   r'   r]   r_   r+   r%   r#   <module>r      s   " " " " " " 				 = = = = = = = = = = = = = = = =          = < < < < < - - - - - - 9 9 9 9 9 9 5 5 5 5 5 5 3 3 3 3 3 3 - - - - - -       ' ' ' ' ' '         
 * ) ) ) ) )   5 5 5 5 5X 5 5 5 @ @ @ @*l
 l
 l
 l
 l
 l
 l
 l
 l
 l
r%   