o
    `+ iO                     @  s   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 d dlmZ eddddG dd deZdS )    )annotationsN)AnyOptional)
deprecated)CallbackManagerForChainRun)BaseLanguageModel)BasePromptTemplate)RecursiveCharacterTextSplitterTextSplitter)Field)Chain)LLMChain)PROMPT_SELECTORz0.2.7zexample in API reference with more detail: https://api.python.langchain.com/en/latest/chains/langchain.chains.qa_generation.base.QAGenerationChain.htmlz1.0)ZsincealternativeZremovalc                   @  s   e Zd ZU dZded< 	 eed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Zed+ddZed+dd Z	d(d,d&d'ZdS )-QAGenerationChaina  Base class for question-answer generation chains.

    This class is deprecated. See below for an alternative implementation.

    Advantages of this implementation include:

    - Supports async and streaming;
    - Surfaces prompt and text splitter for easier customization;
    - Use of JsonOutputParser supports JSONPatch operations in streaming mode,
      as well as robustness to markdown.

        .. code-block:: python

            from langchain.chains.qa_generation.prompt import CHAT_PROMPT as prompt
            # Note: import PROMPT if using a legacy non-chat model.
            from langchain_core.output_parsers import JsonOutputParser
            from langchain_core.runnables import (
                RunnableLambda,
                RunnableParallel,
                RunnablePassthrough,
            )
            from langchain_core.runnables.base import RunnableEach
            from langchain_openai import ChatOpenAI
            from langchain_text_splitters import RecursiveCharacterTextSplitter

            llm = ChatOpenAI()
            text_splitter = RecursiveCharacterTextSplitter(chunk_overlap=500)
            split_text = RunnableLambda(
                lambda x: text_splitter.create_documents([x])
            )

            chain = RunnableParallel(
                text=RunnablePassthrough(),
                questions=(
                    split_text | RunnableEach(bound=prompt | llm | JsonOutputParser())
                )
            )
    r   	llm_chaini  )Zchunk_overlap)defaultr
   text_splittertextstr	input_keyZ	questions
output_keyNzOptional[int]kllmr   promptOptional[BasePromptTemplate]kwargsr   returnc                 K  s,   |pt |}t||d}| dd|i|S )z
        Create a QAGenerationChain from a language model.

        Args:
            llm: a language model
            prompt: a prompt template
            **kwargs: additional arguments

        Returns:
            a QAGenerationChain class
        )r   r   r   N )r   Z
get_promptr   )clsr   r   r   Z_promptchainr   r   o/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/langchain/chains/qa_generation/base.pyfrom_llmO   s   zQAGenerationChain.from_llmc                 C  s   t N)NotImplementedErrorselfr   r   r!   _chain_typee   s   zQAGenerationChain._chain_type	list[str]c                 C     | j gS r#   )r   r%   r   r   r!   
input_keysi      zQAGenerationChain.input_keysc                 C  r)   r#   )r   r%   r   r   r!   output_keysm   r+   zQAGenerationChain.output_keysinputsdict[str, Any]run_manager$Optional[CallbackManagerForChainRun]dict[str, list]c                 C  sH   | j || j g}| jjdd |D |d}dd |jD }| j|iS )Nc                 S  s   g | ]}d |j iqS )r   )Zpage_content).0dr   r   r!   
<listcomp>x   s    z+QAGenerationChain._call.<locals>.<listcomp>)r/   c                 S  s   g | ]
}t |d  jqS )r   )jsonloadsr   )r2   resr   r   r!   r4   {   s    )r   Zcreate_documentsr   r   generateZgenerationsr   )r&   r-   r/   docsresultsZqar   r   r!   _callq   s   
zQAGenerationChain._callr#   )r   r   r   r   r   r   r   r   )r   r   )r   r(   )r-   r.   r/   r0   r   r1   )__name__
__module____qualname____doc____annotations__r   r	   r   r   r   r   classmethodr"   propertyr'   r*   r,   r;   r   r   r   r!   r      s2   
 	'r   )
__future__r   r5   typingr   r   Zlangchain_core._apir   Zlangchain_core.callbacksr   Zlangchain_core.language_modelsr   Zlangchain_core.promptsr   Zlangchain_text_splittersr	   r
   Zpydanticr   Zlangchain.chains.baser   Zlangchain.chains.llmr   Z%langchain.chains.qa_generation.promptr   r   r   r   r   r!   <module>   s$    