a
    agS!                     @  s  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dddZ$G dd de#Z%dddddddddZ&G d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)LLMChainr   zTuple[List[str], List[float]])responsereturnc                 C  s@   g }g }| j d d D ] }||d  ||d  q||fS )z>Extract tokens and log probabilities from chat model response.logprobscontenttokenZlogprob)Zresponse_metadataappend)r   tokens	log_probsr    r   i/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain/chains/flare/base.py_extract_tokens_and_log_probs   s    r    c                   @  sB   e Zd ZU dZeZded< eddddZe	ddd	d
Z
dS )QuestionGeneratorChainz4Chain that generates questions from uncertain spans.r   promptboolr   c                 C  s   dS )NFr   )clsr   r   r   is_lc_serializable+   s    z)QuestionGeneratorChain.is_lc_serializable	List[str]c                 C  s   g dS )Input keys for the chain.
user_inputcontextr   r   selfr   r   r   
input_keys/   s    z!QuestionGeneratorChain.input_keysN)__name__
__module____qualname____doc__r   r"   __annotations__classmethodr&   propertyr.   r   r   r   r   r!   %   s   
r!   zSequence[str]zSequence[float]floatintr'   )r   r   min_probmin_token_gapnum_pad_tokensr   c                   s   t t ||k d } fdd|D }t|dkr:g S |d |d | d gg}t|dd  D ]@\}}	|	| d }
|	||  |k r|
|d d< qd||	|
g qd fdd|D S )Nr   c                   s    g | ]}t d  | r|qS )z\w)research).0ir   r   r   
<listcomp>=       z)_low_confidence_spans.<locals>.<listcomp>   c                   s"   g | ]\}}d   || qS ) )join)r=   startendr?   r   r   r@   G   rA   )npwhereexplen	enumerater   )r   r   r8   r9   r:   Z_low_idxZlow_idxspansr>   idxrG   r   r?   r   _low_confidence_spans5   s    rO   c                   @  s   e Zd ZU dZded< ded< eed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ddZeddddZdddddd d!d"Zddddddd#d$d%Zd2d'd(d'd)d*d+Zed3d-dd.d d/d0d1Zd&S )4
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?r6   r8      r7   r9      r:   
   max_iterTr#   start_with_retrievalr'   r$   c                 C  s   dgS )r(   r*   r   r,   r   r   r   r.   d   s    zFlareChain.input_keysc                 C  s   dgS )zOutput keys for the chain.r   r   r,   r   r   r   output_keysi   s    zFlareChain.output_keysstrr	   zTuple[str, bool])	questionsr*   r   _run_managerr   c                 C  s~   |  }g }|D ]}|| j| qddd |D }| j|||dd|i}	t|	trf|	j}	| j	
|	\}
}|
|fS )Nz

c                 s  s   | ]}|j V  qd S )N)Zpage_content)r=   dr   r   r   	<genexpr>y   rA   z,FlareChain._do_generation.<locals>.<genexpr>r)   	callbacks)	get_childextendrU   invokerE   rR   
isinstancer   r   rT   parse)r-   r]   r*   r   r^   ra   docsquestionr+   resultmarginalfinishedr   r   r   _do_generationn   s     
zFlareChain._do_generation)low_confidence_spansr^   r*   r   initial_responser   c           
        s    fdd|D }|  }tjtrLjj||d}fdd|D }	njj|d|id}	|jd|	 dd	d
 |	||S )Nc                   s   g | ]} |d qS ))r*   Zcurrent_responseZuncertain_spanr   )r=   span)rn   r*   r   r   r@      s
   z,FlareChain._do_retrieval.<locals>.<listcomp>)ra   c                   s   g | ]}| j jd   qS )r   )rQ   r[   )r=   outputr,   r   r   r@      s   ra   )configzGenerated Questions: yellow
colorrG   )rb   re   rQ   r   applybatchon_textrl   )
r-   rm   r^   r*   r   rn   Zquestion_gen_inputsra   Zquestion_gen_outputsr]   r   )rn   r-   r*   r   _do_retrieval   s$    
zFlareChain._do_retrievalNzDict[str, Any]z$Optional[CallbackManagerForChainRun])inputsrun_managerr   c                 C  s  |p
t  }|| jd  }d}t| jD ]}|jd| ddd |d|d}t| j|d|	 i\}}	t
||	| j| j| j}
| d	 d| }|
s|}| j|\}}|r(| jd |i  S q(| |
||||\}}| d	 | }|r( qq(| jd |iS )
Nr   rD   zCurrent Response: bluers   rt   r)   ra    )r	   Zget_noop_managerr.   rangerY   rx   r    rR   rd   rb   rO   r8   r9   r:   striprE   rT   rf   r[   ry   )r-   rz   r{   r^   r*   r   r>   _inputr   r   rm   rn   Zfinal_responserk   rj   r   r   r   _call   sL    zFlareChain._call    r
   r   )llmmax_generation_lenkwargsr   c                 K  sd   zddl m} W n ty*   tdY n0 ||ddd}t|B }t|B t B }| f ||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)Zmax_completion_tokensr   Ztemperature)rQ   rR   )Zlangchain_openair   ImportErrorr   r   r   )r%   r   r   r   r   rR   Zquestion_gen_chainr   r   r   from_llm   s"    
zFlareChain.from_llm)N)r   )r/   r0   r1   r2   r3   r   r   rT   r8   r9   r:   rY   rZ   r5   r.   r[   rl   ry   r   r4   r   r   r   r   r   rP   J   s*   
% 0 rP   )(
__future__r   r;   typingr   r   r   r   r   r   numpyrH   Zlangchain_core.callbacksr	   Zlangchain_core.language_modelsr
   Zlangchain_core.messagesr   Zlangchain_core.output_parsersr   Zlangchain_core.promptsr   Zlangchain_core.retrieversr   Zlangchain_core.runnablesr   Zpydanticr   Zlangchain.chains.baser   Zlangchain.chains.flare.promptsr   r   r   Zlangchain.chains.llmr   r    r!   rO   rP   r   r   r   r   <module>   s$    
