§
    ™Štj]$  ã                  óÜ   — d 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mZmZ dd
lmZ ddlmZ dd„Z edddd¬¦  «         G d„ de¦  «        ¦   «         ZdS )zLCombine documents by doing a first pass and then refining on more documents.é    )Úannotations)ÚAny)Ú
deprecated)Ú	Callbacks)ÚDocument)ÚBasePromptTemplateÚformat_document©ÚPromptTemplate)Ú
ConfigDictÚFieldÚmodel_validator)ÚBaseCombineDocumentsChain)ÚLLMChainÚreturnr   c                 ó&   — t          dgd¬¦  «        S )NÚpage_contentz{page_content})Úinput_variablesÚtemplater
   © ó    úo/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_classic/chains/combine_documents/refine.pyÚ_get_default_document_promptr      s   € Ý¨>Ð*:ÐEUÐVÑVÔVÐVr   z0.3.1z2.0.0zlangchain.agents.create_agentzuBuild new RAG flows with `create_agent` and a retrieval tool. See https://docs.langchain.com/oss/python/langchain/rag)ÚsinceÚremovalÚalternativeÚaddendumc                  ót  ‡ — e Zd ZU dZded<   	 ded<   	 ded<   	 ded<   	  ee¬¦  «        Zd	ed
<   	 dZded<   	 e	d-ˆ fd„¦   «         Z
 edd¬¦  «        Z ed¬¦  «        ed.d„¦   «         ¦   «         Z ed¬¦  «        ed.d„¦   «         ¦   «         Z	 d/d0d"„Z	 d/d0d#„Zd1d&„Zd2d*„Zd3d+„Ze	d4d,„¦   «         Zˆ xZS )5ÚRefineDocumentsChainaƒ  Combine documents by doing a first pass and then refining on more documents.

    This algorithm first calls `initial_llm_chain` on the first document, passing
    that first document in with the variable name `document_variable_name`, and
    produces a new variable with the variable name `initial_response_name`.

    Then, it loops over every remaining document. This is called the "refine" step.
    It calls `refine_llm_chain`,
    passing in that document with the variable name `document_variable_name`
    as well as the previous response with the variable name `initial_response_name`.

    Example:
        ```python
        from langchain_classic.chains import RefineDocumentsChain, LLMChain
        from langchain_core.prompts import PromptTemplate
        from langchain_openai import OpenAI

        # This controls how each document will be formatted. Specifically,
        # it will be passed to `format_document` - see that function for more
        # details.
        document_prompt = PromptTemplate(
            input_variables=["page_content"], template="{page_content}"
        )
        document_variable_name = "context"
        model = OpenAI()
        # The prompt here should take as an input variable the
        # `document_variable_name`
        prompt = PromptTemplate.from_template("Summarize this content: {context}")
        initial_llm_chain = LLMChain(llm=model, prompt=prompt)
        initial_response_name = "prev_response"
        # The prompt here should take as an input variable the
        # `document_variable_name` as well as `initial_response_name`
        prompt_refine = PromptTemplate.from_template(
            "Here's your first summary: {prev_response}. "
            "Now add to it based on the following context: {context}"
        )
        refine_llm_chain = LLMChain(llm=model, prompt=prompt_refine)
        chain = RefineDocumentsChain(
            initial_llm_chain=initial_llm_chain,
            refine_llm_chain=refine_llm_chain,
            document_prompt=document_prompt,
            document_variable_name=document_variable_name,
            initial_response_name=initial_response_name,
        )
        ```
    r   Úinitial_llm_chainÚrefine_llm_chainÚstrÚdocument_variable_nameÚinitial_response_name)Údefault_factoryr   Údocument_promptFÚboolÚreturn_intermediate_stepsr   ú	list[str]c                óH   •— t          ¦   «         j        }| j        rg |¢d‘}|S )zExpect input key.Úintermediate_steps)ÚsuperÚoutput_keysr(   )ÚselfÚ_output_keysÚ	__class__s     €r   r-   z RefineDocumentsChain.output_keysa   s3   ø€ õ ‘w”wÔ*ˆØÔ)ð 	AØ@˜\Ð@Ð+?Ð@ˆLØÐr   TÚforbid)Úarbitrary_types_allowedÚextraÚbefore)ÚmodeÚvaluesÚdictr   c                ó*   — d|v r|d         |d<   |d= |S )zFor backwards compatibility.Úreturn_refine_stepsr(   r   )Úclsr6   s     r   Úget_return_intermediate_stepsz2RefineDocumentsChain.get_return_intermediate_stepsn   s.   € ð ! FÐ*Ð*Ø28Ð9NÔ2OˆFÐ.Ñ/ØÐ,Ð-Øˆr   c                ó
  — d|vrd}t          |¦  «        ‚|d         j        j        }d|vr0t          |¦  «        dk    r|d         |d<   n8d}t          |¦  «        ‚|d         |vrd|d         › d|› �}t          |¦  «        ‚|S )	z4Get default document variable name, if not provided.r    z"initial_llm_chain must be providedr#   é   r   zWdocument_variable_name must be provided if there are multiple llm_chain input_variableszdocument_variable_name z- was not found in llm_chain input_variables: )Ú
ValueErrorÚpromptr   Úlen)r:   r6   ÚmsgÚllm_chain_variabless       r   Ú"get_default_document_variable_namez7RefineDocumentsChain.get_default_document_variable_namew   sÏ   € ð  fÐ,Ð,Ø6ˆCÝ˜S‘/”/Ð!à$Ð%8Ô9Ô@ÔPÐØ#¨6Ð1Ð1ÝÐ&Ñ'Ô'¨1Ò,Ð,Ø3FÀqÔ3I�Ð/Ñ0Ð0ð9ð õ ! ‘o”oÐ%ØÐ,Ô-Ð5HÐHÐHðQ¨&Ð1IÔ*Jð Qð QØ;NðQð Qð õ ˜S‘/”/Ð!Øˆr   NÚdocsúlist[Document]Ú	callbacksr   Úkwargsútuple[str, dict]c                ó  —  | j         |fi |¤Ž} | j        j        dd|i|¤Ž}|g}|dd…         D ]G}|                      ||¦  «        }i |¥|¥} | j        j        dd|i|¤Ž}|                     |¦  «         ŒH|                      ||¦  «        S )aõ  Combine by mapping first chain over all, then stuffing into final chain.

        Args:
            docs: List of documents to combine
            callbacks: Callbacks to be passed through
            **kwargs: additional parameters to be passed to LLM calls (like other
                input variables besides the documents)

        Returns:
            The first element returned is the single string output. The second
            element returned is a dictionary of other keys to return.
        rF   r=   Nr   )Ú_construct_initial_inputsr    ÚpredictÚ_construct_refine_inputsr!   ÚappendÚ_construct_result©	r.   rD   rF   rG   ÚinputsÚresÚrefine_stepsÚdocÚbase_inputss	            r   Úcombine_docsz!RefineDocumentsChain.combine_docs‘   sÍ   € ð$ 0�Ô/°Ð?Ð?¸Ð?Ð?ˆØ,ˆdÔ$Ô,ÐKÐK°yÐKÀFÐKÐKˆØ�uˆØ˜˜˜”8ð 	%ð 	%ˆCØ×7Ò7¸¸SÑAÔAˆKØ.˜Ð. vÐ.ˆFØ/�$Ô'Ô/ÐNÐN¸)ÐNÀvÐNÐNˆCØ×Ò Ñ$Ô$Ð$Ð$Ø×%Ò% l°CÑ8Ô8Ð8r   c              ‹  ó8  K  —  | j         |fi |¤Ž} | j        j        dd|i|¤Žƒ d{V —†}|g}|dd…         D ]M}|                      ||¦  «        }i |¥|¥} | j        j        dd|i|¤Žƒ d{V —†}|                     |¦  «         ŒN|                      ||¦  «        S )aù  Combine by mapping a first chain over all, then stuffing into a final chain.

        Args:
            docs: List of documents to combine
            callbacks: Callbacks to be passed through
            **kwargs: additional parameters to be passed to LLM calls (like other
                input variables besides the documents)

        Returns:
            The first element returned is the single string output. The second
            element returned is a dictionary of other keys to return.
        rF   Nr=   r   )rJ   r    ÚapredictrL   r!   rM   rN   rO   s	            r   Úacombine_docsz"RefineDocumentsChain.acombine_docs­   sõ   è è € ð$ 0�Ô/°Ð?Ð?¸Ð?Ð?ˆØ3�DÔ*Ô3ÐRÐR¸iÐRÈ6ÐRÐRÐRÐRÐRÐRÐRÐRˆØ�uˆØ˜˜˜”8ð 	%ð 	%ˆCØ×7Ò7¸¸SÑAÔAˆKØ.˜Ð. vÐ.ˆFØ6˜Ô-Ô6ÐUÐUÀÐUÈfÐUÐUÐUÐUÐUÐUÐUÐUˆCØ×Ò Ñ$Ô$Ð$Ð$Ø×%Ò% l°CÑ8Ô8Ð8r   rR   rQ   c                ó&   — | j         rd|i}ni }||fS )Nr+   )r(   )r.   rR   rQ   Úextra_return_dicts       r   rN   z&RefineDocumentsChain._construct_resultÉ   s-   € ØÔ)ð 	#Ø!5°|Ð DÐÐà "ÐØÐ%Ð%Ð%r   rS   r   údict[str, Any]c                óH   — | j         t          || j        ¦  «        | j        |iS ©N)r#   r	   r&   r$   )r.   rS   rQ   s      r   rL   z-RefineDocumentsChain._construct_refine_inputsÐ   s)   € àÔ'­¸¸dÔ>RÑ)SÔ)SØÔ&¨ð
ð 	
r   c                óÐ   ‡— d|d         j         iŠ‰                     |d         j        ¦  «         ˆfd„| j        j        D ¦   «         }| j         | j        j        di |¤Ži}i |¥|¥S )Nr   r   c                ó"   •— i | ]}|‰|         “ŒS r   r   )Ú.0ÚkÚ	base_infos     €r   ú
<dictcomp>zBRefineDocumentsChain._construct_initial_inputs.<locals>.<dictcomp>Ý   s   ø€ ÐWÐWÐW¨Q˜˜I aœLÐWÐWÐWr   r   )r   ÚupdateÚmetadatar&   r   r#   Úformat)r.   rD   rG   Údocument_inforT   rb   s        @r   rJ   z.RefineDocumentsChain._construct_initial_inputsÖ   sˆ   ø€ ð
 $ T¨!¤WÔ%9Ð:ˆ	Ø×Ò˜˜aœÔ)Ñ*Ô*Ð*ØWÐWÐWÐW°$Ô2FÔ2VÐWÑWÔWˆàÔ'Ð)D¨Ô)=Ô)DÐ)UÐ)UÀ}Ð)UÐ)Uð
ˆð )�+Ð( Ð(Ð(r   c                ó   — dS )NÚrefine_documents_chainr   )r.   s    r   Ú_chain_typez RefineDocumentsChain._chain_typeã   s   € à'Ð'r   )r   r)   )r6   r7   r   r   r]   )rD   rE   rF   r   rG   r   r   rH   )rR   r)   rQ   r"   r   rH   )rS   r   rQ   r"   r   r[   )rD   rE   rG   r   r   r[   )r   r"   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r&   r(   Úpropertyr-   r   Úmodel_configr   Úclassmethodr;   rC   rU   rX   rN   rL   rJ   rj   Ú__classcell__)r0   s   @r   r   r      s  ø€ € € € € € ð-ð -ð^  ÐÐÑØ/ØÐÐÑØ)ØÐÐÑðQàÐÐÑØLØ*/¨%Ø4ð+ñ +ô +€Oð ð ð ñ ð SØ&+ÐÐ+Ð+Ð+Ñ+Ø?àðð ð ð ð ñ „Xðð �:Ø $Øðñ ô €Lð
 €_˜(Ð#Ñ#Ô#Øðð ð ñ „[ñ $Ô#ðð €_˜(Ð#Ñ#Ô#Øðð ð ñ „[ñ $Ô#ðð6  $ð9ð 9ð 9ð 9ð 9ð>  $ð9ð 9ð 9ð 9ð 9ð8&ð &ð &ð &ð
ð 
ð 
ð 
ð)ð )ð )ð )ð ð(ð (ð (ñ „Xð(ð (ð (ð (ð (r   r   N)r   r   )rn   Ú
__future__r   Útypingr   Úlangchain_core._apir   Úlangchain_core.callbacksr   Úlangchain_core.documentsr   Úlangchain_core.promptsr   r	   Úlangchain_core.prompts.promptr   Úpydanticr   r   r   Ú/langchain_classic.chains.combine_documents.baser   Úlangchain_classic.chains.llmr   r   r   r   r   r   ú<module>r~      sd  ðØ RÐ Rà "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð à *Ð *Ð *Ð *Ð *Ð *Ø .Ð .Ð .Ð .Ð .Ð .Ø -Ð -Ð -Ð -Ð -Ð -Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7ðð ð ð ð ð ð 2Ð 1Ð 1Ð 1Ð 1Ð 1ðWð Wð Wð Wð €Ø
ØØ/ð	>ðñ ô ðD(ð D(ð D(ð D(ð D(Ð4ñ D(ô D(ñô ðD(ð D(ð D(r   