
    h$                    @   d dl mZ 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 d dlmZmZmZ d dlm Z   ejB                  e"      Z#ddZ$ G d de       Z%	 	 	 	 	 	 	 	 	 	 	 	 ddZ& G d de      Z'y)    )annotationsN)Sequence)AnyOptional)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       Y/var/www/html/eduruby.in/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_keys2   s
     54r    N)returnboolr0   	list[str])__name__
__module____qualname____doc__r   r#   __annotations__classmethodr'   propertyr/   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_idxrE   idxlog_probilow_idxspansendstarts                  r   _low_confidence_spansrW   8   ss   
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%&??3  
	
 	 "+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?floatrK      intrL      rM   
   max_iterTr1   start_with_retrievalc                    dgS )r)   r+   r%   r-   s    r   r/   zFlareChain.input_keysy   s     ~r    c                    dgS )zOutput keys for the chain.r   r%   r-   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extendr^   invokerJ   r[   
isinstancer	   r   r]   parse)r.   	questionsr+   r   _run_managerrp   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)rp   r   rp   )configzGenerated Questions: yellow
colorrU   )	rq   rt   rZ   r   applyrh   batchon_textr}   )r.   low_confidence_spansrw   r+   r   initial_responsespanquestion_gen_inputsrp   question_gen_outputsoutputrv   s               r   _do_retrievalzFlareChain._do_retrieval   s    -
 	 )$4"&
 
 !**,	d33X>#'#@#@#F#F## $G $  3 t44@@CDI 
 55;;##Y/ < I 	#I;/ 	 	

 ""9j(LQQ9
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   r>   zCurrent Response: bluer   r   r*   rp    )r   get_noop_managerr/   rangerd   r   r   r[   rs   rq   rW   rK   rL   rM   striprJ   r]   ru   rh   r   )r.   inputsrun_managerrw   r+   r   _i_inputr   r   r   r   final_responser|   r{   s                  r   _callzFlareChain._call   s   
 #S&@&Q&Q&SDOOA./
& %	B  $XJ/ ! 
 %/28TF =##** ,"8"8":;!FI $9""##$   (~~/#5G'++/+=+=+C+CH+M( ,,Q/@@!%!3!3$ "Hh  ~~'#-8HK%	L   #X..r    c                    	 ddl m}  ||dd      }t        |z  }t        |z  t               z  } | d||d|S # t        $ r}d}t        |      |d}~w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-openaiNT)max_completion_tokensr   temperature)rZ   r[   r%   )langchain_openair   rB   r   r   r
   )	r&   llmmax_generation_lenkwargsr   emsgr[   question_gen_chains	            r   from_llmzFlareChain.from_llm   s    "	*3 "4

  #6<?PP 
%7)
 
 	
  	*/ 
 c")	*s   ; 	AAAr2   )
rv   r3   r+   strr   r   rw   r   r0   tuple[str, bool])r   r3   rw   r   r+   r   r   r   r   r   r0   r   rk   )r   dict[str, Any]r   z$Optional[CallbackManagerForChainRun]r0   r   )    )r   r   r   ra   r   r   r0   rY   )r4   r5   r6   r7   r8   r   r   r]   rK   rL   rM   rd   re   r:   r/   rh   r}   r   r   r9   r   r%   r    r   rY   rY   _   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    rY   )r   r	   r0   ztuple[list[str], list[float]])r   zSequence[str]r   zSequence[float]rK   r_   rL   ra   rM   ra   r0   r3   )(
__future__r   loggingrG   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   	getLoggerr4   rC   r   r"   rW   rY   r%   r    r   <module>r      s    "  	 $   = - 9 5 3 -  ' 
 *			8	$5X 5 $@$@$@ $@ 	$@
 $@ $@N{
 {
r    