
    ih[                        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       G d de             Zy)    )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)sincealternativeremovalc                      e Zd ZU dZded<   	  e ed            Zded<   	 d	Zd
ed<   	 dZ	d
ed<   	 dZ
ded<   	 e	 d	 	 	 	 	 	 	 dd       Zedd       Zedd       Zedd       Z	 d	 	 	 	 	 ddZy)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  )chunk_overlap)defaultr   text_splittertextstr	input_key	questions
output_keyNzOptional[int]kc                b    |xs t        j                  |      }t        ||      } | 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
        )llmpromptr    )r   
get_promptr   )clsr"   r#   kwargs_promptchains         a/var/www/html/dev/engine/venv/lib/python3.12/site-packages/langchain/chains/qa_generation/base.pyfrom_llmzQAGenerationChain.from_llmO   s8    $ ;O66s;S1-U-f--    c                    t         N)NotImplementedErrorselfs    r*   _chain_typezQAGenerationChain._chain_typee   s    !!r,   c                    | j                   gS r.   )r   r0   s    r*   
input_keyszQAGenerationChain.input_keysi   s    r,   c                    | j                   gS r.   )r   r0   s    r*   output_keyszQAGenerationChain.output_keysm   s      r,   c                d   | j                   j                  || j                     g      }| j                  j	                  |D cg c]  }d|j
                  i c}|      }|j                  D cg c]$  }t        j                  |d   j                        & }}| j                  |iS c c}w c c}w )Nr   )run_managerr   )r   create_documentsr   r   generatepage_contentgenerationsjsonloadsr   r   )r1   inputsr8   docsdresultsresqas           r*   _callzQAGenerationChain._callq   s    
 !!22F4>>4J3KL..))/34!fann%4+ * 
 291D1DE#djjQ%EE$$ 5Es   B(/)B-r.   )r"   r
   r#   zOptional[BasePromptTemplate]r'   r   returnr   )rF   r   )rF   z	List[str])r?   zDict[str, Any]r8   z$Optional[CallbackManagerForChainRun]rF   zDict[str, List])__name__
__module____qualname____doc____annotations__r   r   r   r   r   r    classmethodr+   propertyr2   r4   r6   rE   r$   r,   r*   r   r      s    %N I"'.SA#M<  ;Is(!J!)A}* 04.. -. 	.
 
. .* " "     ! ! =A
%
% :
% 
	
%r,   r   )
__future__r   r=   typingr   r   r   r   langchain_core._apir   langchain_core.callbacksr	   langchain_core.language_modelsr
   langchain_core.promptsr   langchain_text_splittersr   r   pydanticr   langchain.chains.baser   langchain.chains.llmr   %langchain.chains.qa_generation.promptr   r   r$   r,   r*   <module>rY      s]    "  , , * ? < 5 Q  ' ) A 
	w a% a%a%r,   