
    Ig2!                        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'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       X/var/www/html/answerous/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_keys/   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           	        t        j                  t        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 c c}w c c}
}w )Nr   z\w    )	npwhereexpresearchlen	enumerater   join)r   r    min_probmin_token_gapnum_pad_tokens_low_idxilow_idxspansidxendstarts               r!   _low_confidence_spansrT   5   s    xxy)H45a8H"BQbiivay&AqBGB
7|q	aj'!*~59:;EGABK( %3N"Q&m+E"IaLLL#s$% :??:5#BGGF5%&?? C @s   C%C%C*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?floatrJ      intrK      rL   
   max_iterTr4   start_with_retrievalc                    dgS )r,   r.   r(   r0   s    r!   r2   zFlareChain.input_keysd   s     ~r#   c                    dgS )zOutput keys for the chain.r   r(   r0   s    r!   output_keyszFlareChain.output_keysi   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>y   s     ;ann;s   r-   	callbacks)	get_childextendr[   invokerI   rX   
isinstancer   r   rZ   parse)r1   	questionsr.   r   _run_managerrm   docsquestionr/   resultmarginalfinisheds               r!   _do_generationzFlareChain._do_generationn   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)rm   r   rm   )configzGenerated Questions: yellow
colorrR   )	rn   rq   rW   r   applyre   batchon_textrz   )r1   low_confidence_spansrt   r.   r   initial_responsespanquestion_gen_inputsrm   question_gen_outputsoutputrs   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-   rm    )r
   get_noop_managerr2   rangera   r   r"   rX   rp   rn   rT   rJ   rK   rL   striprI   rZ   rr   re   r   )r1   inputsrun_managerrt   r.   r   rN   _inputr   r    r   r   final_responsery   rx   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_tokensr   temperature)rW   rX   r(   )langchain_openair   ImportErrorr   r   r   )r)   llmmax_generation_lenkwargsr   rX   question_gen_chains          r!   from_llmzFlareChain.from_llm   s}    	3 $6STU#6<?PP 
%7)
 
 	
  	/ 	s	   ; Ar5   )
rs   r6   r.   strr   r   rt   r
   r3   Tuple[str, bool])r   r6   rt   r
   r.   r   r   r   r   r   r3   r   rh   )r   Dict[str, Any]r   z$Optional[CallbackManagerForChainRun]r3   r   )    )r   r   r   r^   r   r   r3   rV   )r7   r8   r9   r:   r;   r   r   rZ   rJ   rK   rL   ra   rb   r=   r2   re   rz   r   r   r<   r   r(   r#   r!   rV   rV   J   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#   rV   )r   r   r3   zTuple[List[str], List[float]])r   zSequence[str]r    zSequence[float]rJ   r\   rK   r^   rL   r^   r3   r6   )(
__future__r   rE   typingr   r   r   r   r   r	   numpyrB   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%   rT   rV   r(   r#   r!   <module>r      s    " 	 = =  = - 9 5 3 -  ' 
 *5X 5 @@@ @ 	@
 @ @*l
 l
r#   