
    hO                        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       G d de             Zy)    )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)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/eduruby.in/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   r.   s    r(   
input_keyszQAGenerationChain.input_keysi   s    r*   c                    | j                   gS r,   )r   r.   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   )r/   inputsr6   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 Fs   B(/)B-r,   )r    r   r!   zOptional[BasePromptTemplate]r%   r   returnr   )rD   r   )rD   z	list[str])r=   zdict[str, Any]r6   z$Optional[CallbackManagerForChainRun]rD   zdict[str, list])__name__
__module____qualname____doc____annotations__r   r
   r   r   r   r   classmethodr)   propertyr0   r2   r4   rC   r"   r*   r(   r   r      s    %N I"'.SA#M<  ;Is(!J!)A}* 04.. -. 	.
 
. .* " "     ! ! =A%% :% 
	%r*   r   )
__future__r   r;   typingr   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>rW      sZ    "    * ? < 5 Q  ' ) A 
	w b% b%b%r*   