Ë
    ´Œj"%  ã                  óê   — d Z ddlm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 ddlmZ ddl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lmZ  eddd¬«       G d„ de«      «       Z y)zOCombining documents by mapping a chain over them first, then reranking results.é    )Úannotations)ÚSequence)ÚAnyÚOptionalÚUnionÚcast)Ú
deprecated)Ú	Callbacks)ÚDocument)ÚRunnableConfig)Úcreate_model)Ú	BaseModelÚ
ConfigDictÚmodel_validator)ÚSelf)ÚBaseCombineDocumentsChain)ÚLLMChain)ÚRegexParserz0.3.1z1.0z¯This class is deprecated. Please see the migration guide here for a recommended replacement: https://python.langchain.com/docs/versions/migrating_chains/map_rerank_docs_chain/)ÚsinceÚremovalÚmessagec                  óJ  ‡ — e Zd ZU dZded<   	 ded<   	 ded<   	 ded<   	 dZd	ed
<   	 dZded<   	  edd¬«      Z	 d	 	 	 dd„Z	e
dˆ fd„«       Z ed¬«      dd„«       Z ed¬«      ed d„«       «       Z	 d	 	 	 	 	 	 	 d!d„Z	 d	 	 	 	 	 	 	 d!d„Z	 	 	 	 	 	 d"d„Ze
d#d„«       Zˆ xZS )$ÚMapRerankDocumentsChaina  Combining documents by mapping a chain over them, then reranking results.

    This algorithm calls an LLMChain on each input document. The LLMChain is expected
    to have an OutputParser that parses the result into both an answer (`answer_key`)
    and a score (`rank_key`). The answer with the highest score is then returned.

    Example:
        .. code-block:: python

            from langchain.chains import MapRerankDocumentsChain, LLMChain
            from langchain_core.prompts import PromptTemplate
            from langchain_community.llms import OpenAI
            from langchain.output_parsers.regex import RegexParser

            document_variable_name = "context"
            llm = OpenAI()
            # The prompt here should take as an input variable the
            # `document_variable_name`
            # The actual prompt will need to be a lot more complex, this is just
            # an example.
            prompt_template = (
                "Use the following context to tell me the chemical formula "
                "for water. Output both your answer and a score of how confident "
                "you are. Context: {context}"
            )
            output_parser = RegexParser(
                regex=r"(.*?)
Score: (.*)",
                output_keys=["answer", "score"],
            )
            prompt = PromptTemplate(
                template=prompt_template,
                input_variables=["context"],
                output_parser=output_parser,
            )
            llm_chain = LLMChain(llm=llm, prompt=prompt)
            chain = MapRerankDocumentsChain(
                llm_chain=llm_chain,
                document_variable_name=document_variable_name,
                rank_key="score",
                answer_key="answer",
            )
    r   Ú	llm_chainÚstrÚdocument_variable_nameÚrank_keyÚ
answer_keyNzOptional[list[str]]Úmetadata_keysFÚboolÚreturn_intermediate_stepsTÚforbid)Úarbitrary_types_allowedÚextrac                óþ   — | j                   t        d fi}| j                  rt        t           d f|d<   | j                  r5|j                  t        j                  | j                  t        d f«      «       t        di |¤ŽS )NÚintermediate_steps)ÚMapRerankOutput)
Ú
output_keyr   r!   Úlistr   ÚupdateÚdictÚfromkeysr   r   )ÚselfÚconfigÚschemas      úw/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain/chains/combine_documents/map_rerank.pyÚget_output_schemaz)MapRerankDocumentsChain.get_output_schema^   so   € ð
 �O‰Oœc 4˜[ð"
ˆð ×)Ò)Ü,0´©I°tÐ+<ˆFÐ'Ñ(Ø×ÒØ�M‰Mœ$Ÿ-™-¨×(:Ñ(:¼SÀ$¸KÓHÔIäÑ8°Ñ8Ð8ó    c                óv   •— t         ‰| �  }| j                  rg |¢d‘}| j                  �|| j                  z  }|S )z2Expect input key.

        :meta private:
        r&   )ÚsuperÚoutput_keysr!   r   )r-   Ú_output_keysÚ	__class__s     €r0   r5   z#MapRerankDocumentsChain.output_keysl   sJ   ø€ ô ‘wÑ*ˆØ×)Ò)Ø@˜\Ð@Ð+?Ð@ˆLØ×ÑÐ)Ø˜D×.Ñ.Ñ.ˆLØÐr2   Úafter)Úmodec                óN  — | j                   j                  j                  }t        |t        «      sd|› �}t        |«      ‚|j                  }| j                  |vrd| j                  › d|› d�}t        |«      ‚| j                  |vrd| j                  › d|› d�}t        |«      ‚| S )z5Validate that the combine chain outputs a dictionary.z8Output parser of llm_chain should be a RegexParser, got zGot zF as key to rank on, but did not find it in the llm_chain output keys (Ú)zE as key to return, but did not find it in the llm_chain output keys ()	r   ÚpromptÚoutput_parserÚ
isinstancer   Ú
ValueErrorr5   r   r   )r-   r=   Úmsgr5   s       r0   Úvalidate_llm_outputz+MapRerankDocumentsChain.validate_llm_outputy   sÈ   € ð Ÿ™×-Ñ-×;Ñ;ˆÜ˜-¬Ô5ðØ%�ð(ð ô ˜S“/Ð!Ø#×/Ñ/ˆØ�=‰= Ñ+à�t—}‘}�oð &4Ø4?°=ÀðCð ô ˜S“/Ð!Ø�?‰? +Ñ-à�t—‘Ð'ð (4Ø4?°=ÀðCð ô ˜S“/Ð!Øˆr2   Úbeforec                óæ   — d|vrd}t        |«      ‚|d   j                  j                  }d|vr%t        |«      dk(  r
|d   |d<   |S d}t        |«      ‚|d   |vrd|d   › d|› �}t        |«      ‚|S )	z4Get default document variable name, if not provided.r   z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: )r?   r<   Úinput_variablesÚlen)ÚclsÚvaluesr@   Úllm_chain_variabless       r0   Ú"get_default_document_variable_namez:MapRerankDocumentsChain.get_default_document_variable_name’   sº   € ð ˜fÑ$Ø.ˆCÜ˜S“/Ð!à$ [Ñ1×8Ñ8×HÑHÐØ#¨6Ñ1ÜÐ&Ó'¨1Ò,Ø3FÀqÑ3I�Ð/Ñ0ð ˆð9ð ô ! “oÐ%ØÐ,Ñ-Ð5HÑHà)¨&Ð1IÑ*JÐ)Kð L;Ø;NÐ:OðQð ô ˜S“/Ð!Øˆr2   c                ó¶   — | j                   j                  |D �cg c]  }| j                  |j                  i|¥‘Œ c}|¬«      }| j	                  ||«      S c c}w )á.  Combine documents in a map rerank manner.

        Combine by mapping first chain over all documents, then reranking the results.

        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.
        ©Ú	callbacks)r   Úapply_and_parser   Úpage_contentÚ_process_results©r-   ÚdocsrN   ÚkwargsÚdÚresultss         r0   Úcombine_docsz$MapRerankDocumentsChain.combine_docs¬   sa   € ð( —.‘.×0Ñ0áNRÓSÉdÈˆd×)Ñ)¨1¯>©>ÐD¸VÒDÈdÑSØð 1ó 
ˆð
 ×$Ñ$ T¨7Ó3Ð3ùò Ts   š!Ac              ‹  óÒ   K  — | j                   j                  |D �cg c]  }| j                  |j                  i|¥‘Œ c}|¬«      ƒ d{  –—† }| j	                  ||«      S c c}w 7 Œ­w)rL   rM   N)r   Úaapply_and_parser   rP   rQ   rR   s         r0   Úacombine_docsz%MapRerankDocumentsChain.acombine_docsÇ   so   è ø€ ð( Ÿ™×7Ñ7áNRÓSÉdÈˆd×)Ñ)¨1¯>©>ÐD¸VÒDÈdÑSØð 8ó 
÷ 
ˆð
 ×$Ñ$ T¨7Ó3Ð3ùò Tð
ús   ‚A'œ!A ½A'Á	A%Á
A'c                ó  ‡ — t        t        t           |«      }t        t	        ||«      ˆ fd„¬«      }|d   \  }}i }‰ j
                  �#‰ j
                  D ]  }|j                  |   ||<   Œ ‰ j                  r||d<   |‰ j                     |fS )Nc                ó<   •— t        | d   ‰j                     «       S )Nr   )Úintr   )Úxr-   s    €r0   Ú<lambda>z:MapRerankDocumentsChain._process_results.<locals>.<lambda>ê   s   ø€ œ3˜q ™t D§M¡MÑ2Ó3Ñ3r2   )Úkeyr   r&   )	r   r)   r+   ÚsortedÚzipr   Úmetadatar!   r   )	r-   rS   rV   Útyped_resultsÚ
sorted_resÚoutputÚdocumentÚ
extra_infor`   s	   `        r0   rQ   z(MapRerankDocumentsChain._process_resultsâ   s™   ø€ ô
 œT¤$™Z¨Ó1ˆÜÜ�˜tÓ$Û3ô
ˆ
ð & a™=Ñˆ�Øˆ
Ø×ÑÐ)Ø×)Ô)�Ø"*×"3Ñ"3°CÑ"8�
˜3’ð *à×)Ò)Ø/6ˆJÐ+Ñ,Ø�d—o‘oÑ&¨
Ð2Ð2r2   c                 ó   — y)NÚmap_rerank_documents_chain© )r-   s    r0   Ú_chain_typez#MapRerankDocumentsChain._chain_typeõ   s   € à+r2   )N)r.   zOptional[RunnableConfig]Úreturnztype[BaseModel])rm   z	list[str])rm   r   )rH   r+   rm   r   )rS   úlist[Document]rN   r
   rT   r   rm   útuple[str, dict])rS   rn   rV   z/Sequence[Union[str, list[str], dict[str, str]]]rm   ro   )rm   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r!   r   Úmodel_configr1   Úpropertyr5   r   rA   ÚclassmethodrJ   rW   rZ   rQ   rl   Ú__classcell__)r7   s   @r0   r   r      sa  ø… ñ)ðV ÓØ7ØÓðIàƒMØ0ØƒOØ9Ø)-€MÐ&Ó-ØAØ&+Ð˜tÓ+ðUñ Ø $Øô€Lð ,0ð9à(ð9ð 
ó9ð ô
ó ð
ñ ˜'Ô"òó #ðñ0 ˜(Ô#Øòó ó $ðð6  $ð4àð4ð ð4ð ð	4ð
 
ó4ð<  $ð4àð4ð ð4ð ð	4ð
 
ó4ð63àð3ð Að3ð 
ó	3ð& ò,ó ô,r2   r   N)!rs   Ú
__future__r   Úcollections.abcr   Útypingr   r   r   r   Úlangchain_core._apir	   Úlangchain_core.callbacksr
   Úlangchain_core.documentsr   Úlangchain_core.runnables.configr   Úlangchain_core.utils.pydanticr   Úpydanticr   r   r   Útyping_extensionsr   Ú'langchain.chains.combine_documents.baser   Úlangchain.chains.llmr   Úlangchain.output_parsers.regexr   r   rk   r2   r0   Ú<module>r†      se   ðÙ Uå "å $ß -Ó -å *Ý .Ý -Ý :Ý 6ß ;Ñ ;Ý "å MÝ )Ý 6ñ Ø
Øð	]ô	ôY,Ð7ó Y,óñY,r2   