
    3fiG                        d dl mZ d dl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 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  eddd       G d de             Zy)    )annotationsN)Any)
deprecated)CallbackManagerForChainRun)BaseLanguageModel)BasePromptTemplate)RecursiveCharacterTextSplitterTextSplitter)Field)override)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edd              Ze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.

        ```python
        from langchain_classic.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

        model = 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 | model | JsonOutputParser())
            ),
        )
        ```
    r   	llm_chaini  )chunk_overlap)defaultr
   text_splittertextstr	input_key	questions
output_keyNz
int | Nonekc                b    |xs t        j                  |      }t        ||      } | dd|i|S )zCreate 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         i/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_classic/chains/qa_generation/base.pyfrom_llmzQAGenerationChain.from_llmQ   s8    " ;O66s;S1-U-f--    c                    t         N)NotImplementedErrorselfs    r(   _chain_typezQAGenerationChain._chain_typef   s    !!r*   c                    | j                   gS r,   )r   r.   s    r(   
input_keyszQAGenerationChain.input_keysj   s     r*   c                    | j                   gS r,   )r   r.   s    r(   output_keyszQAGenerationChain.output_keyso   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._callt   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BasePromptTemplate | Noner%   r   returnr   )rD   r   )rD   z	list[str])r=   zdict[str, Any]r6   z!CallbackManagerForChainRun | NonerD   zdict[str, list])__name__
__module____qualname____doc____annotations__r   r	   r   r   r   r   classmethodr)   propertyr0   r   r2   r4   rC   r"   r*   r(   r   r      s   &P I"'.SA#M<  ;Is(!J!)Az* -1.. *. 	.
 
. .( " "      !  ! :>%% 7% 
	%r*   r   )
__future__r   r;   typingr   langchain_core._apir   langchain_core.callbacksr   langchain_core.language_modelsr   langchain_core.promptsr   langchain_text_splittersr	   r
   pydanticr   typing_extensionsr   langchain_classic.chains.baser   langchain_classic.chains.llmr   -langchain_classic.chains.qa_generation.promptr   r   r"   r*   r(   <module>rX      s]    "   * ? < 5 Q  & / 1 I 
	w d% d%d%r*   