§
    è˜ºh†*  ã                  ó  — d Z ddlmZ ddlZddlZddlmZ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mZ ddlmZ dd„Zdd„Z G d„ deee¦  «        Z  G d„ deee¦  «        Z! G d„ de!¦  «        Z"dS )z-LLM Chains for evaluating question answering.é    )ÚannotationsN)ÚAnyÚListÚOptionalÚSequenceÚTuple)ÚBaseLanguageModel)ÚPromptTemplate)ÚExtra)Ú	Callbacks)ÚLLMChain)ÚCONTEXT_PROMPTÚ
COT_PROMPTÚPROMPT)ÚLLMEvalChainÚStringEvaluator)ÚRUN_KEYÚtextÚstrÚreturnúOptional[Tuple[str, int]]c                ó¢  — t          j        d|                      ¦   «         t           j        ¦  «        }|rZ|                     d¦  «                             ¦   «         dk    rdS |                     d¦  «                             ¦   «         dk    rdS 	 |                      ¦   «                              ¦   «         d                              t           	                    ddt          j        ¦  «        ¦  «        }|                     ¦   «         dk    rdS |                     ¦   «         dk    rdS |                      ¦   «                              ¦   «         d	                              t           	                    ddt          j        ¦  «        ¦  «        }|                     ¦   «         dk    rdS |                     ¦   «         dk    rdS n# t          $ r Y nw xY wd S )
Nzgrade:\s*(correct|incorrect)é   ÚCORRECT)r   r   Ú	INCORRECT)r   r   r   Ú éÿÿÿÿ)ÚreÚsearchÚstripÚ
IGNORECASEÚgroupÚupperÚsplitÚ	translater   Ú	maketransÚstringÚpunctuationÚ
IndexError)r   ÚmatchÚ
first_wordÚ	last_words       új/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain/evaluation/qa/eval_chain.pyÚ
_get_scorer.      s•  € ÝŒIÐ5°t·z²z±|´|ÅRÄ]ÑSÔS€EØð "Ø�;Š;�q‰>Œ>×ÒÑ!Ô! YÒ.Ð.Ø�<Ø�[Š[˜‰^Œ^×!Ò!Ñ#Ô# {Ò2Ð2Ø!�>ðà�JŠJ‰LŒL×ÒÑ Ô  Ô#×-Ò-­c¯mªm¸BÀÅFÔDVÑ.WÔ.WÑXÔXð 	ð ×ÒÑÔ Ò*Ð*Ø�<Ø×ÒÑÔ ;Ò.Ð.Ø!�>à�JŠJ‰LŒLßŠU‰WŒW�RôçŠY•s—}’} R¨­VÔ-?Ñ@Ô@ÑAÔAð 	ð
 �?Š?ÑÔ 	Ò)Ð)Ø�<Ø�_Š_ÑÔ +Ò-Ð-Ø!�>ð .øåð ð ð Øˆðøøøàˆ4s&   ÂA;F? ÄF? Ä'A;F? Æ$F? Æ?
GÇGÚdictc                ón   — |                       ¦   «         }t          |¦  «        }|€d\  }}n|\  }}|||dœS )z‚Parse the output text.

    Args:
        text (str): The output text to parse.

    Returns:
        Any: The parsed output.
    N)NN)Ú	reasoningÚvalueÚscore)r    r.   )r   r1   Úparsed_scoresr2   r3   s        r-   Ú_parse_string_eval_outputr5   0   sP   € ð —
’
‘”€IÝ˜yÑ)Ô)€MØÐØ!‰ˆˆuˆuà$‰ˆˆuàØØðð ð ó    c                  óþ   — e Zd ZU dZdZded<    G d„ d¦  «        Zed.d	„¦   «         Ze	d/d
„¦   «         Z
e	d.d„¦   «         Ze	d.d„¦   «         Ze	 d0d1d„¦   «         Z	 	 	 d2ddœd3d"„Zd4d$„Zdddd%d&œd5d,„Zdddd%d&œd5d-„ZdS )6ÚQAEvalChainz,LLM Chain for evaluating question answering.Úresultsr   Ú
output_keyc                  ó    — e Zd ZdZej        ZdS )úQAEvalChain.Configú"Configuration for the QAEvalChain.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚignoreÚextra© r6   r-   ÚConfigr<   K   ó   € € € € € Ø0Ð0à”ˆˆˆr6   rF   r   Úboolc                ó   — dS ©NFrE   ©Úclss    r-   Úis_lc_serializablezQAEvalChain.is_lc_serializableP   ó   € àˆur6   c                ó   — dS )NÚcorrectnessrE   ©Úselfs    r-   Úevaluation_namezQAEvalChain.evaluation_nameT   s   € àˆ}r6   c                ó   — dS ©NTrE   rQ   s    r-   Úrequires_referencezQAEvalChain.requires_referenceX   ó   € àˆtr6   c                ó   — dS rU   rE   rQ   s    r-   Úrequires_inputzQAEvalChain.requires_input\   rW   r6   NÚllmr	   ÚpromptúOptional[PromptTemplate]Úkwargsr   c                ó–   — |pt           }h d£}|t          |j        ¦  «        k    rt          d|› d|j        › �¦  «        ‚ | d||dœ|¤ŽS )aÒ  Load QA Eval Chain from LLM.

        Args:
            llm (BaseLanguageModel): the base language model to use.

            prompt (PromptTemplate): A prompt template containing the input_variables:
            'input', 'answer' and 'result' that will be used as the prompt
            for evaluation.
            Defaults to PROMPT.

            **kwargs: additional keyword arguments.

        Returns:
            QAEvalChain: the loaded QA eval chain.
        >   ÚqueryÚanswerÚresultúInput variables should be ú
, but got ©rZ   r[   rE   )r   ÚsetÚinput_variablesÚ
ValueError)rL   rZ   r[   r]   Úexpected_input_varss        r-   Úfrom_llmzQAEvalChain.from_llm`   sƒ   € ð, Ð!�6ˆØ;Ð;Ð;ÐØ¥# fÔ&<Ñ"=Ô"=Ò=Ð=Ýð4Ð-@ð 4ð 4Ø!Ô1ð4ð 4ñô ð ð ˆsÐ4�s 6Ð4Ð4¨VÐ4Ð4Ð4r6   r_   r`   ra   ©Ú	callbacksÚexamplesúSequence[dict]ÚpredictionsÚquestion_keyÚ
answer_keyÚprediction_keyrk   r   ú
List[dict]c               ót   ‡‡‡‡— ˆˆˆˆfd„t          |¦  «        D ¦   «         }|                      ||¬¦  «        S )ú5Evaluate question answering examples and predictions.c                óR   •— g | ]#\  }}|‰         |‰         ‰|         ‰         d œ‘Œ$S )©r_   r`   ra   rE   )Ú.0ÚiÚexamplerp   rq   rn   ro   s      €€€€r-   ú
<listcomp>z(QAEvalChain.evaluate.<locals>.<listcomp>Š   sR   ø€ ð 
ð 
ð 
ñ ��7ð	 ! Ô.Ø! *Ô-Ø% aœ.¨Ô8ðð ð
ð 
ð 
r6   rj   ©Ú	enumerateÚapply)rR   rl   rn   ro   rp   rq   rk   Úinputss     ````  r-   ÚevaluatezQAEvalChain.evaluate   ó_   øøøø€ ð
ð 
ð 
ð 
ð 
ð 
ð 
õ (¨Ñ1Ô1ð
ñ 
ô 
ˆð �zŠz˜&¨IˆzÑ6Ô6Ð6r6   r/   c                óv   — t          || j                 ¦  «        }t          |v r|t                   |t          <   |S ©N©r5   r:   r   ©rR   ra   Úparsed_results      r-   Ú_prepare_outputzQAEvalChain._prepare_output•   ó5   € Ý1°&¸¼Ô2IÑJÔJˆÝ�fÐÐØ%+­G¤_ˆM�'Ñ"ØÐr6   F©Ú	referenceÚinputrk   Úinclude_run_infoÚ
predictionr‰   úOptional[str]rŠ   r‹   c               óP   —  | |||dœ||¬¦  «        }|                       |¦  «        S )aÎ  Evaluate Chain or LLM output, based on optional input and label.

        Args:
            prediction (str): the LLM or chain prediction to evaluate.
            reference (Optional[str], optional): the reference label
                to evaluate against.
            input (Optional[str], optional): the input to consider during evaluation
            callbacks (Callbacks, optional): the callbacks to use for tracing.
            include_run_info (bool, optional): whether to include run info in the
                returned results.
            **kwargs: additional keyword arguments, including callbacks, tags, etc.
        Returns:
            dict: The evaluation results containing the score or value.
        rv   ©rk   r‹   ©r†   ©rR   rŒ   r‰   rŠ   rk   r‹   r]   ra   s           r-   Ú_evaluate_stringszQAEvalChain._evaluate_strings›   sK   € ð0 �àØ#Ø$ðð ð
  Ø-ð
ñ 
ô 
ˆð ×#Ò# FÑ+Ô+Ð+r6   c             ‹  ót   K  — |                       |||dœ||¬¦  «        ƒ d {V —†}|                      |¦  «        S )Nrv   ©r~   rk   r‹   ©Úacallr†   r‘   s           r-   Ú_aevaluate_stringszQAEvalChain._aevaluate_strings¾   sg   è è € ð —z’zØ"¨iÀ:ÐNÐNØØ-ð "ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð
 ×#Ò# FÑ+Ô+Ð+r6   ©r   rH   ©r   r   r‚   )rZ   r	   r[   r\   r]   r   r   r8   rv   )rl   rm   rn   rm   ro   r   rp   r   rq   r   rk   r   r   rr   ©ra   r/   r   r/   ©rŒ   r   r‰   r�   rŠ   r�   rk   r   r‹   rH   r]   r   r   r/   )r?   r@   rA   rB   r:   Ú__annotations__rF   ÚclassmethodrM   ÚpropertyrS   rV   rY   ri   r   r†   r’   r—   rE   r6   r-   r8   r8   F   s   € € € € € € Ø6Ð6à€JÐÐÐÑðð ð ð ð ñ ô ð ð
 ðð ð ñ „[ðð ðð ð ñ „Xðð ðð ð ñ „Xðð ðð ð ñ „Xðð ð ,0ð5ð 5ð 5ð 5ñ „[ð5ðD $Ø"Ø&ð7ð  $ð7ð 7ð 7ð 7ð 7ð 7ð,ð ð ð ð $(Ø#Ø#Ø!&ð!,ð !,ð !,ð !,ð !,ð !,ðN $(Ø#Ø#Ø!&ð,ð ,ð ,ð ,ð ,ð ,ð ,ð ,r6   r8   c                  ó  — e Zd ZdZed.d„¦   «         Zed.d„¦   «         Zed.d„¦   «         Z G d„ d¦  «        Z	ed/d„¦   «         Z
ed0d„¦   «         Ze	 d1d2d„¦   «         Z	 	 	 d3ddœd4d"„Zd5d$„Zdddd%d&œd6d,„Zdddd%d&œd6d-„ZdS )7ÚContextQAEvalChainz3LLM Chain for evaluating QA w/o GT based on contextr   rH   c                ó   — dS rJ   rE   rK   s    r-   rM   z%ContextQAEvalChain.is_lc_serializableÓ   rN   r6   c                ó   — dS )z.Whether the chain requires a reference string.TrE   rQ   s    r-   rV   z%ContextQAEvalChain.requires_reference×   ó	   € ð ˆtr6   c                ó   — dS )z+Whether the chain requires an input string.TrE   rQ   s    r-   rY   z!ContextQAEvalChain.requires_inputÜ   r£   r6   c                  ó    — e Zd ZdZej        ZdS )úContextQAEvalChain.Configr=   Nr>   rE   r6   r-   rF   r¦   á   rG   r6   rF   r[   r
   ÚNonec                ór   — h d£}|t          |j        ¦  «        k    rt          d|› d|j        › �¦  «        ‚d S )N>   r_   ra   Úcontextrb   rc   )re   rf   rg   )rL   r[   rh   s      r-   Ú_validate_input_varsz'ContextQAEvalChain._validate_input_varsæ   s`   € à<Ð<Ð<ÐØ¥# fÔ&<Ñ"=Ô"=Ò=Ð=Ýð4Ð-@ð 4ð 4Ø!Ô1ð4ð 4ñô ð ð >Ð=r6   r   c                ó   — dS )NzContextual AccuracyrE   rQ   s    r-   rS   z"ContextQAEvalChain.evaluation_nameï   s   € à$Ð$r6   NrZ   r	   r\   r]   r   c                óT   — |pt           }|                      |¦  «          | d||dœ|¤ŽS )aÚ  Load QA Eval Chain from LLM.

        Args:
            llm (BaseLanguageModel): the base language model to use.

            prompt (PromptTemplate): A prompt template containing the input_variables:
            'query', 'context' and 'result' that will be used as the prompt
            for evaluation.
            Defaults to PROMPT.

            **kwargs: additional keyword arguments.

        Returns:
            ContextQAEvalChain: the loaded QA eval chain.
        rd   rE   )r   rª   ©rL   rZ   r[   r]   s       r-   ri   zContextQAEvalChain.from_llmó   s?   € ð, Ð)�>ˆØ× Ò  Ñ(Ô(Ð(ØˆsÐ4�s 6Ð4Ð4¨VÐ4Ð4Ð4r6   r_   r©   ra   rj   rl   rr   rn   ro   Úcontext_keyrq   rk   r   c               ót   ‡‡‡‡— ˆˆˆˆfd„t          |¦  «        D ¦   «         }|                      ||¬¦  «        S )rt   c                óR   •— g | ]#\  }}|‰         |‰         ‰|         ‰         d œ‘Œ$S )©r_   r©   ra   rE   )rw   rx   ry   r®   rq   rn   ro   s      €€€€r-   rz   z/ContextQAEvalChain.evaluate.<locals>.<listcomp>  sR   ø€ ð 
ð 
ð 
ñ ��7ð	 ! Ô.Ø" ;Ô/Ø% aœ.¨Ô8ðð ð
ð 
ð 
r6   rj   r{   )rR   rl   rn   ro   r®   rq   rk   r~   s     ````  r-   r   zContextQAEvalChain.evaluate  r€   r6   r/   c                óv   — t          || j                 ¦  «        }t          |v r|t                   |t          <   |S r‚   rƒ   r„   s      r-   r†   z"ContextQAEvalChain._prepare_output#  r‡   r6   Frˆ   rŒ   r‰   r�   rŠ   r‹   c               óP   —  | |||dœ||¬¦  «        }|                       |¦  «        S )Nr±   r�   r�   r‘   s           r-   r’   z$ContextQAEvalChain._evaluate_strings)  sK   € ð �àØ$Ø$ðð ð
  Ø-ð
ñ 
ô 
ˆð ×#Ò# FÑ+Ô+Ð+r6   c             ‹  ót   K  — |                       |||dœ||¬¦  «        ƒ d {V —†}|                      |¦  «        S )Nr±   r”   r•   r‘   s           r-   r—   z%ContextQAEvalChain._aevaluate_strings>  sg   è è € ð —z’zØ"¨yÀJÐOÐOØØ-ð "ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð
 ×#Ò# FÑ+Ô+Ð+r6   r˜   )r[   r
   r   r§   r™   r‚   )rZ   r	   r[   r\   r]   r   r   r    r±   )rl   rr   rn   rr   ro   r   r®   r   rq   r   rk   r   r   rr   rš   r›   )r?   r@   rA   rB   r�   rM   rž   rV   rY   rF   rª   rS   ri   r   r†   r’   r—   rE   r6   r-   r    r    Ð   s©  € € € € € Ø=Ð=àðð ð ñ „[ðð ðð ð ñ „Xðð ðð ð ñ „Xððð ð ð ð ñ ô ð ð
 ðð ð ñ „[ðð ð%ð %ð %ñ „Xð%ð ð ,0ð5ð 5ð 5ð 5ñ „[ð5ð: $Ø$Ø&ð7ð  $ð7ð 7ð 7ð 7ð 7ð 7ð,ð ð ð ð $(Ø#Ø#Ø!&ð,ð ,ð ,ð ,ð ,ð ,ð2 $(Ø#Ø#Ø!&ð,ð ,ð ,ð ,ð ,ð ,ð ,ð ,r6   r    c                  ó^   — e Zd ZdZedd„¦   «         Zedd„¦   «         Ze	 ddd„¦   «         ZdS )ÚCotQAEvalChainz=LLM Chain for evaluating QA using chain of thought reasoning.r   rH   c                ó   — dS rJ   rE   rK   s    r-   rM   z!CotQAEvalChain.is_lc_serializableS  rN   r6   r   c                ó   — dS )NzCOT Contextual AccuracyrE   rQ   s    r-   rS   zCotQAEvalChain.evaluation_nameW  s   € à(Ð(r6   NrZ   r	   r[   r\   r]   r   c                óT   — |pt           }|                      |¦  «          | d||dœ|¤ŽS )zLoad QA Eval Chain from LLM.rd   rE   )r   rª   r­   s       r-   ri   zCotQAEvalChain.from_llm[  s?   € ð Ð%�:ˆØ× Ò  Ñ(Ô(Ð(ØˆsÐ4�s 6Ð4Ð4¨VÐ4Ð4Ð4r6   r˜   r™   r‚   )rZ   r	   r[   r\   r]   r   r   r¶   )	r?   r@   rA   rB   r�   rM   rž   rS   ri   rE   r6   r-   r¶   r¶   P  s‚   € € € € € ØGÐGàðð ð ñ „[ðð ð)ð )ð )ñ „Xð)ð ð ,0ð	5ð 	5ð 	5ð 	5ñ „[ð	5ð 	5ð 	5r6   r¶   )r   r   r   r   )r   r   r   r/   )#rB   Ú
__future__r   r   r'   Útypingr   r   r   r   r   Úlangchain_core.language_modelsr	   Úlangchain_core.promptsr
   Úlangchain_core.pydantic_v1r   Úlangchain.callbacks.managerr   Úlangchain.chains.llmr   Ú#langchain.evaluation.qa.eval_promptr   r   r   Úlangchain.evaluation.schemar   r   Úlangchain.schemar   r.   r5   r8   r    r¶   rE   r6   r-   ú<module>rÄ      sÆ  ðØ 3Ð 3Ø "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø €€€Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à <Ð <Ð <Ð <Ð <Ð <Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø )Ð )Ð )Ð )Ð )Ð )Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ $Ð $Ð $Ð $Ð $Ð $ðð ð ð ð:ð ð ð ð,G,ð G,ð G,ð G,ð G,�(˜O¨\ñ G,ô G,ð G,ðT},ð },ð },ð },ð },˜ ?°Lñ },ô },ð },ð@5ð 5ð 5ð 5ð 5Ð'ñ 5ô 5ð 5ð 5ð 5r6   