a
    ag[                     @  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d dddZed
dddZeddddZeddddZd&dd 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]kr	   zOptional[BasePromptTemplate]r   )llmpromptkwargsreturnc                 K  s,   |pt |}t||d}| f 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   )r   Z
get_promptr   )clsr   r   r   Z_promptchain r!   q/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain/chains/qa_generation/base.pyfrom_llmO   s    zQAGenerationChain.from_llm)r   c                 C  s   t d S N)NotImplementedErrorselfr!   r!   r"   _chain_typee   s    zQAGenerationChain._chain_typez	List[str]c                 C  s   | j gS r$   )r   r&   r!   r!   r"   
input_keysi   s    zQAGenerationChain.input_keysc                 C  s   | j gS r$   )r   r&   r!   r!   r"   output_keysm   s    zQAGenerationChain.output_keyszDict[str, Any]z$Optional[CallbackManagerForChainRun]zDict[str, List])inputsrun_managerr   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       z+QAGenerationChain._call.<locals>.<listcomp>)r,   c                 S  s   g | ]}t |d  jqS )r   )jsonloadsr   )r-   resr!   r!   r"   r/   z   r0   )r   Zcreate_documentsr   r   generateZgenerationsr   )r'   r+   r,   docsresultsZqar!   r!   r"   _callq   s    zQAGenerationChain._call)N)N)__name__
__module____qualname____doc____annotations__r   r   r   r   r   r   classmethodr#   propertyr(   r)   r*   r7   r!   r!   r!   r"   r      s&   
	'  r   )
__future__r   r1   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"   