§
    è˜ºhœ#  ã                  ó²   — d Z ddlmZ ddlmZmZmZ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
lmZ dd„Z G d„ de¦  «        ZdS )zLCombine documents by doing a first pass and then refining on more documents.é    )Úannotations)ÚAnyÚDictÚListÚTuple)ÚDocument)ÚBasePromptTemplateÚformat_document©ÚPromptTemplate)ÚExtraÚFieldÚroot_validator)Ú	Callbacks)ÚBaseCombineDocumentsChain)ÚLLMChainÚreturnr   c                 ó&   — t          dgd¬¦  «        S )NÚpage_contentz{page_content})Úinput_variablesÚtemplater   © ó    úq/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain/chains/combine_documents/refine.pyÚ_get_default_document_promptr      s   € Ý¨>Ð*:ÐEUÐVÑVÔVÐVr   c                  ó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
 G d„ d¦  «        Z ed¬¦  «        d-d„¦   «         Z ed¬¦  «        d-d„¦   «         Z	 d.d/d!„Z	 d.d/d"„Zd0d%„Zd1d)„Zd2d*„Ze	d3d+„¦   «         Zˆ xZS )4Ú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:
        .. code-block:: python

            from langchain.chains import RefineDocumentsChain, LLMChain
            from langchain_core.prompts import PromptTemplate
            from langchain_community.llms 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"
            llm = 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=llm, 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=llm, 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|dgz   }|S )z2Expect input key.

        :meta private:
        Úintermediate_steps)ÚsuperÚoutput_keysr&   )ÚselfÚ_output_keysÚ	__class__s     €r   r+   z RefineDocumentsChain.output_keysZ   s1   ø€ õ ‘w”wÔ*ˆØÔ)ð 	AØ'Ð+?Ð*@Ñ@ˆLØÐr   c                  ó$   — e Zd ZdZej        ZdZdS )úRefineDocumentsChain.Configz'Configuration for this pydantic object.TN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚforbidÚextraÚarbitrary_types_allowedr   r   r   ÚConfigr0   e   s#   € € € € € Ø5Ð5à”ˆØ"&ÐÐÐr   r8   T)ÚpreÚvaluesr   c                ó*   — d|v r|d         |d<   |d= |S )zFor backwards compatibility.Úreturn_refine_stepsr&   r   )Úclsr:   s     r   Úget_return_intermediate_stepsz2RefineDocumentsChain.get_return_intermediate_stepsk   s.   € ð ! FÐ*Ð*Ø28Ð9NÔ2OˆFÐ.Ñ/ØÐ,Ð-Øˆr   c                óü   — d|vr@|d         j         j        }t          |¦  «        dk    r|d         |d<   nFt          d¦  «        ‚|d         j         j        }|d         |vrt          d|d         › d|› �¦  «        ‚|S )z4Get default document variable name, if not provided.r!   r   é   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: )Úpromptr   ÚlenÚ
ValueError)r=   r:   Úllm_chain_variabless      r   Ú"get_default_document_variable_namez7RefineDocumentsChain.get_default_document_variable_names   sÇ   € ð $¨6Ð1Ð1Ø"(Ð)<Ô"=Ô"DÔ"TÐÝÐ&Ñ'Ô'¨1Ò,Ð,Ø3FÀqÔ3I�Ð/Ñ0Ð0å ð9ñô ð ð
 #)Ð)<Ô"=Ô"DÔ"TÐØÐ.Ô/Ð7JÐJÐJÝ ðU¨fÐ5MÔ.Nð Uð UØ?RðUð Uñô ð ð ˆr   NÚdocsúList[Document]Ú	callbacksr   Úkwargsr   ú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.
        rH   r@   Nr   )Ú_construct_initial_inputsr   ÚpredictÚ_construct_refine_inputsr   ÚappendÚ_construct_result©	r,   rF   rH   rI   Ú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  Async 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.
        rH   Nr@   r   )rL   r   ÚapredictrN   r   rO   rP   rQ   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   rT   rS   c                ó&   — | j         rd|i}ni }||fS )Nr)   )r&   )r,   rT   rS   Úextra_return_dicts       r   rP   z&RefineDocumentsChain._construct_result»   s-   € ØÔ)ð 	#Ø!5°|Ð DÐÐà "ÐØÐ%Ð%Ð%r   rU   r   úDict[str, Any]c                óH   — | j         t          || j        ¦  «        | j        |iS ©N)r!   r
   r$   r"   )r,   rU   rS   s      r   rN   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,   rF   rI   Údocument_inforV   rR   rd   s         @r   rL   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ð
ˆð +�KÐ* 6Ð*ˆØˆr   c                ó   — dS )NÚrefine_documents_chainr   )r,   s    r   Ú_chain_typez RefineDocumentsChain._chain_typeÔ   s   € à'Ð'r   )r   r'   )r:   r   r   r   r_   )rF   rG   rH   r   rI   r   r   rJ   )rT   r'   rS   r    r   rJ   )rU   r   rS   r    r   r]   )rF   rG   rI   r   r   r]   )r   r    )r1   r2   r3   r4   Ú__annotations__r   r   r$   r&   Úpropertyr+   r8   r   r>   rE   rW   rZ   rP   rN   rL   rl   Ú__classcell__)r.   s   @r   r   r      sû  ø€ € € € € € ð0ð 0ðd  ÐÐÑØ/ØÐÐÑØ)ØÐÐÑðQàÐÐÑØLØ*/¨%Ø4ð+ñ +ô +€Oð ð ð ñ ð SØ&+ÐÐ+Ð+Ð+Ñ+Ø?àðð ð ð ð ñ „Xðð'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ð €^˜ÐÑÔðð ð ñ Ôðð €^˜ÐÑÔðð ð ñ Ôðð* <@ð9ð 9ð 9ð 9ð 9ð4 <@ð9ð 9ð 9ð 9ð 9ð4&ð &ð &ð &ð
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð ð(ð (ð (ñ „Xð(ð (ð (ð (ð (r   r   N)r   r   )r4   Ú
__future__r   Útypingr   r   r   r   Úlangchain_core.documentsr   Úlangchain_core.promptsr	   r
   Úlangchain_core.prompts.promptr   Úlangchain_core.pydantic_v1r   r   r   Úlangchain.callbacks.managerr   Ú'langchain.chains.combine_documents.baser   Úlangchain.chains.llmr   r   r   r   r   r   ú<module>ry      s6  ðØ RÐ Rà "Ð "Ð "Ð "Ð "Ð "à )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )à -Ð -Ð -Ð -Ð -Ð -Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ Cà 1Ð 1Ð 1Ð 1Ð 1Ð 1ðð ð ð ð ð ð *Ð )Ð )Ð )Ð )Ð )ðWð Wð Wð Wð(ð (ð (ð (ð (Ð4ñ (ô (ð (ð (ð (r   