o
    Zh[                     @  s   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 d dlmZ e	ddddG dd deZdS )    )annotationsN)AnyDictList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    Z/var/www/html/lang_env/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>)r1   c                 S  s   g | ]
}t |d  jqS )r   )jsonloadsr   )r4   resr    r    r#   r6   z   s    )r   Zcreate_documentsr   r   generateZgenerationsr   )r(   r/   r1   docsresultsZqar    r    r#   _callq   s   
zQAGenerationChain._callr%   )r   r	   r   r   r   r   r   r   )r   r   )r   r*   )r/   r0   r1   r2   r   r3   )__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   r7   typingr   r   r   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$    