Ë
    ´ŒjÐ$  ã                  ó@  — 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       úe/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain/chains/flare/base.pyÚ_extract_tokens_and_log_probsr      sW   € à€FØ€IØ×+Ñ+¨JÑ7¸	ÔBˆØ�‰�e˜G‘nÔ%Ø×Ñ˜˜yÑ)Õ*ð Cð �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  € ð
Ûà—8‘8˜BŸF™F 9Ó-°Ñ8Ó9¸!Ñ<ˆñ  #ÓB™(�Q¤b§i¡i°°v¸a±yÕ&AŠq˜(€GÐBÜ
ˆ7ƒ|�qÒØˆ	Ø�a‰j˜' !™* ~Ñ5¸Ñ9Ð:Ð;€EÜ˜G A B˜KÖ(‰ˆˆ3Ø�NÑ" QÑ&ˆØ�˜‘Ñ˜mÒ+ØˆE�"‰I�aŠLà�L‰L˜#˜s˜Õ$ð )ñ :?Ô?¹©:¨5°#ˆB�G‰G�F˜5 Ð%Õ&¸Ò?Ð?øô3 ò 
Ü�‰ðô	
ó 	ô "+¨9Ô!5ô
á!5‘��XØ�x‰x˜Ó! HÒ,ò Ù!5ùó
ˆô 
ð
üò 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)%Ú
FlareChainz³Chain 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   è ø€ Ð;±d°˜aŸn�n±dù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¹   € ð !×*Ñ*Ó,ˆ	ØˆÛ!ˆHØ�K‰K˜Ÿ™×-Ñ-¨hÓ7Õ8ð "à—+‘+Ñ;±dÓ;Ó;ˆØ×$Ñ$×+Ñ+à(Ø"Ø$ñð
 ˜)Ð$ó
ˆô �fœiÔ(Ø—^‘^ˆFØ!×/Ñ/×5Ñ5°fÓ=Ñˆ�(Ø˜Ð!Ð!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Ñ3´XÔ>Ø#'×#@Ñ#@×#FÑ#FØ#Ø#ð $Gó $Ð ñ 3óá2�Fð �t×4Ñ4×@Ñ@ÀÑCÓDØ2ð ñ ð
 ×5Ñ5×;Ñ;Ø#Ø# YÐ/ð <ó ˆIð 	×ÑØ# I ;Ð/ØØð 	ô 	
ð
 ×"Ñ" 9¨j¸(ÀLÓQÐQùò9
ùò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ˆà˜DŸO™O¨AÑ.Ñ/ˆ
àˆä˜Ÿ™×&ˆBØ× Ñ Ø$ X JÐ/ØØð !ô ð
 %/¸2È8ÑTˆFÜ =Ø×#Ñ#×*Ñ*ØØ  ,×"8Ñ"8Ó":Ð;óó!ÑˆF�Iô $9ØØØ—‘Ø×"Ñ"Ø×#Ñ#ó$Ð ð  (Ÿ~™~Ó/°#Ñ5¸¿¹À»ÑGÐÙ'Ø+�Ø+/×+=Ñ+=×+CÑ+CÀHÓ+MÑ(� ÙØ ×,Ñ,¨QÑ/°Ð@Ò@Øà!%×!3Ñ!3Ø$ØØØØ ó"ÑˆH�hð  —~‘~Ó'¨#Ñ-°Ñ8ˆHÛÙð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Ô*U€MÐ'ÓUØ?ØÓØHØ€HˆeÓØJØ€M�3ÓØDØ€N�CÓØ?Ø€HˆcÓØ'Ø!%Ð˜$Ó%Ø*àòó ðð òó ðð"àð"ð ð"ð ð	"ð
 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Ó	$€óô5˜Xô 5ð $@Øð$@àð$@ð ð$@ð ð	$@ð
 ð$@ð ó$@ôN{
�õ {
r    