o
    粪gj                     @  s   d Z ddlmZ ddlZddlmZmZ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mZ dd
lmZ ddlmZ ddlmZmZmZmZ ddlmZ dddZe
ddddG dd deZ dS ) z4Chain for question-answering with self-verification.    )annotationsN)AnyDictListOptional)
deprecated)CallbackManagerForChainRun)BaseLanguageModel)PromptTemplate)
ConfigDictmodel_validator)Chain)LLMChain)CHECK_ASSERTIONS_PROMPTCREATE_DRAFT_ANSWER_PROMPTLIST_ASSERTIONS_PROMPTREVISED_ANSWER_PROMPT)SequentialChainllmr	   create_draft_answer_promptr
   list_assertions_promptcheck_assertions_promptrevised_answer_promptreturnr   c                 C  s\   t | |dd}t | |dd}t | |dd}t | |dd}||||g}	t|	dgdgdd}
|
S )	N	statement)r   prompt
output_key
assertionschecked_assertionsrevised_statementquestionT)chainsinput_variablesoutput_variablesverbose)r   r   )r   r   r   r   r   create_draft_answer_chainlist_assertions_chaincheck_assertions_chainrevised_answer_chainr!   $question_to_checked_assertions_chain r*   ]/var/www/html/chatdoc2/venv/lib/python3.10/site-packages/langchain/chains/llm_checker/base.py*_load_question_to_checked_assertions_chain   s@   r,   z0.2.13zSee LangGraph guides for a variety of self-reflection and corrective strategies for question-answering and other tasks: https://langchain-ai.github.io/langgraph/tutorials/rag/langgraph_self_rag/z1.0)sincemessageremovalc                   @  s   e Zd ZU dZded< dZded< 	 eZded< 	 eZ	ded	< 	 e
Zded
< 	 eZded< 	 dZded< dZded< edddZedded.ddZed/ddZed/dd Z	d0d1d&d'Zed2d(d)Zeeee
efd3d,d-ZdS )4LLMCheckerChaina<  Chain for question-answering with self-verification.

    Example:
        .. code-block:: python

            from langchain_community.llms import OpenAI
            from langchain.chains import LLMCheckerChain
            llm = OpenAI(temperature=0.7)
            checker_chain = LLMCheckerChain.from_llm(llm)
    r   r)   NzOptional[BaseLanguageModel]r   r
   r   r   r   r   querystr	input_keyresultr   Tforbid)arbitrary_types_allowedextrabefore)modevaluesr   r   r   c              	   C  sf   d|v r1t d d|vr1|d d ur1t|d |dt|dt|dt|dt}||d< |S )Nr   zDirectly instantiating an LLMCheckerChain with an llm is deprecated. Please instantiate with question_to_checked_assertions_chain or using the from_llm class method.r)   r   r   r   r   )warningswarnr,   getr   r   r   r   )clsr:   r)   r*   r*   r+   raise_deprecationl   s&   


z!LLMCheckerChain.raise_deprecation	List[str]c                 C     | j gS )z?Return the singular input key.

        :meta private:
        )r3   selfr*   r*   r+   
input_keys      zLLMCheckerChain.input_keysc                 C  rA   )z@Return the singular output key.

        :meta private:
        )r   rB   r*   r*   r+   output_keys   rE   zLLMCheckerChain.output_keysinputsDict[str, Any]run_manager$Optional[CallbackManagerForChainRun]Dict[str, str]c                 C  s:   |pt  }|| j }| jd|i| d}| j|d iS )Nr    )	callbacksr   )r   get_noop_managerr3   r)   	get_childr   )rC   rG   rI   _run_managerr    outputr*   r*   r+   _call   s   
zLLMCheckerChain._callc                 C  s   dS )Nllm_checker_chainr*   rB   r*   r*   r+   _chain_type   s   zLLMCheckerChain._chain_typer	   kwargsc                 K  s"   t |||||}| dd|i|S )Nr)   r*   )r,   )r>   r   r   r   r   r   rT   r)   r*   r*   r+   from_llm   s   	zLLMCheckerChain.from_llm)r:   r   r   r   )r   r@   )N)rG   rH   rI   rJ   r   rK   )r   r2   )r   r	   r   r
   r   r
   r   r
   r   r
   rT   r   r   r0   )__name__
__module____qualname____doc____annotations__r   r   r   r   r   r   r   r   r   r3   r   r   model_configr   classmethodr?   propertyrD   rF   rQ   rS   rU   r*   r*   r*   r+   r0   C   sH   
 

r0   )r   r	   r   r
   r   r
   r   r
   r   r
   r   r   )!rY   
__future__r   r;   typingr   r   r   r   langchain_core._apir   langchain_core.callbacksr   langchain_core.language_modelsr	   langchain_core.promptsr
   pydanticr   r   langchain.chains.baser   langchain.chains.llmr   #langchain.chains.llm_checker.promptr   r   r   r   langchain.chains.sequentialr   r,   r0   r*   r*   r*   r+   <module>   s(    
*	