o
    `+ iW                     @  s   d Z ddlmZ ddl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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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  sX   t | |dd}t | |dd}t | |dd}t | |dd}||||g}	t|	dgdgddS )	NZ	statement)r   prompt
output_keyZ
assertionsZchecked_assertionsrevised_statementquestionT)chainsZinput_variablesZoutput_variablesverbose)r   r   )
r   r   r   r   r   Zcreate_draft_answer_chainZlist_assertions_chainZcheck_assertions_chainZrevised_answer_chainr    r   m/home/app/PaddleOCR-VL-test/.venv_paddleocr/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)ZsincemessageZ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   $question_to_checked_assertions_chainNzOptional[BaseLanguageModel]r   r   r   r   r   r   querystr	input_keyresultr   TZforbid)Zarbitrary_types_allowedextrabefore)modevaluesdictr   r   c              	   C  sj   d|v r3t jddd d|vr3|d d ur3t|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.   )
stacklevelr#   r   r   r   r   )warningswarnr    getr   r   r   r   )clsr+   r#   r   r   r   raise_deprecationk   s*   


z!LLMCheckerChain.raise_deprecation	list[str]c                 C     | j gS )z?Return the singular input key.

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

        :meta private:
        )r   r6   r   r   r   output_keys   r9   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   Zget_noop_managerr&   r#   Z	get_childr   )r7   r;   r=   Z_run_managerr   outputr   r   r   _call   s   
zLLMCheckerChain._callc                 C  s   dS )NZllm_checker_chainr   r6   r   r   r   _chain_type   s   zLLMCheckerChain._chain_typer   kwargsc                 K  s"   t |||||}| dd|i|S )Nr#   r   )r    )r2   r   r   r   r   r   rD   r#   r   r   r   from_llm   s   	zLLMCheckerChain.from_llm)r+   r,   r   r   )r   r4   )N)r;   r<   r=   r>   r   r?   )r   r%   )r   r   r   r   r   r   r   r   r   r   rD   r   r   r"   )__name__
__module____qualname____doc____annotations__r   r   r   r   r   r   r   r   r   r&   r   r	   Zmodel_configr
   classmethodr3   propertyr8   r:   rB   rC   rE   r   r   r   r   r"   B   sH   
 

r"   )r   r   r   r   r   r   r   r   r   r   r   r   )rI   
__future__r   r/   typingr   r   Zlangchain_core._apir   Zlangchain_core.callbacksr   Zlangchain_core.language_modelsr   Zlangchain_core.promptsr   Zpydanticr	   r
   Zlangchain.chains.baser   Zlangchain.chains.llmr   Z#langchain.chains.llm_checker.promptr   r   r   r   Zlangchain.chains.sequentialr   r    r"   r   r   r   r   <module>   s(    
)	