
    -j)                        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mZ d dlmZmZ d d	lmZ d d
lmZ d dlmZmZmZmZmZ d dlmZ d dlmZ ej         rd dl!m"Z"m#Z#  G d dee          Z$dS )    )annotationsN)Chain)RUN_KEY)
ChatOpenAI)OpenAIEmbeddings)EvaluationResultRunEvaluator)ExampleRun)LangchainEmbeddingsWrapper)LangchainLLMWrapper)EvaluationModeMetricMetricWithEmbeddingsMetricWithLLMget_required_columns)	RunConfig)EVALMODE_TO_COLUMNS)AsyncCallbackManagerForChainRunCallbackManagerForChainRunc                       e Zd ZU dZded<   d* fdZed+d	            Zed+d
            Z	 d,d-dZ		 d,d.dZ
	 	 	 d/d0dZed1d"            Zd2d'Z	 d,d3d)Z xZS )4EvaluatorChainzB
    Wrapper around ragas Metrics to use them with langsmith.
    r   metrickwargst.Anyc                b   ||d<    t                      j        di | d|v r	|d         }nt                      }t          | j        t
                    rS|                    dt                                }t          |          t          j
        t
          | j                  _        t          | j        t                    rS|                    dt                                }t          |          t          j
        t          | j                  _        | j                            |           d S )Nr   
run_configllm
embeddings )super__init__r   
isinstancer   r   getr   r   tcastr   r   r   r   r   init)selfr   r   r   r   r   	__class__s         f/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/ragas/integrations/langchain.pyr"   zEvaluatorChain.__init__&   s   !x""6"""6!!-JJ"Jdk=11 	N**UJLL11C5H5M5MAF=$+..2dk#788 	BL2B2D2DEEJ 6jAA F$dk $$$$$    return	list[str]c                4    t          | j        j                  S N)r   r   evaluation_moder(   s    r*   
input_keyszEvaluatorChain.input_keys7   s    #DK$?@@@r+   c                    | j         j        gS r/   )r   namer1   s    r*   output_keyszEvaluatorChain.output_keys;   s     !!r+   Ninputsdict[str, t.Any]run_manager&t.Optional[CallbackManagerForChainRun]c                   |                      |           |pt          j                    }|                                }|                    ddg          }|                    dd          }|                    dd          }|                    dd          }| j                            ||||d|          }	| j        j        |	iS ),
        Call the evaluation chain.
        contexts ground_truthquestionanswerr?   r@   r<   r>   	callbacks)	_validater   get_noop_manager	get_childr$   r   scorer4   )
r(   r6   r8   _run_managerrC   cgqarG   s
             r*   _callzEvaluatorChain._call?   s     	v"S&@&Q&S&S **,,	JJzB4((JJ~r**JJz2&&JJx$$!! !	    " 
 
  %((r+   t.Dict[str, t.Any]+t.Optional[AsyncCallbackManagerForChainRun]c                  K   |                      |           |pt          j                    }|                                 |                    ddg          }|                    dd          }|                    dd          }|                    dd          }| j                            ||||dg            d{V }| j        j        |iS )	r;   r<   r=   r>   r?   r@   rA   rB   N)rD   r   rE   rF   r$   r   ascorer4   )	r(   r6   r8   rH   rI   rJ   rK   rL   rG   s	            r*   _acallzEvaluatorChain._acallZ   s       	v"X&E&V&X&X   JJzB4((JJ~r**JJz2&&JJx$$k(( !	   ) 
 
 
 
 
 
 
 
  %((r+   r?   r@   r<   inputquestion_keystrprediction_keycontext_keyNonec                r   t           | j        j                 }d|v r$||vr t          d| d| j        j         d          d|v r$||vr t          d| d| j        j         d          d|v r$||vr t          d| d| j        j         d          d	|v r!d	|vrt          d
| j        j         d          d S d S )Nr?   "z," is required in each examplefor the metric[z] you have chosen.r@   z/" is required in each predictionfor the metric[r<   z0" is required in each prediction for the metric[r>   z="ground_truth" is required in each prediction for the metric[)r   r   r0   
ValueErrorr4   )r(   rS   rT   rV   rW   required_columnss         r*   rD   zEvaluatorChain._validatev   sh    /t{/JK)))l%.G.GGL G G"&+"2G G G   '''N%,G,GGN G G"&+"2G G G   )))k.F.F?K ? ?+*? ? ?   ---.2M2M?+*? ? ?   .-2M2Mr+   keys_to_checklistdict_to_checkdictc                     fd| D             S )Nc                    g | ]}|v|	S r    r    ).0kr_   s     r*   
<listcomp>z4EvaluatorChain._keys_are_present.<locals>.<listcomp>   s#    CCCaA],B,B,B,B,Br+   r    )r]   r_   s    `r*   _keys_are_presentz EvaluatorChain._keys_are_present   s    CCCC=CCCCr+   runr   examplet.Optional[Example]c                   |t          d          |j        t          d          |j        t          d          d|j        vs	d|j        vr3t          dd |j                                        D                        |j        
J d            t	          | j        j        ddg          }|                     ||j                  }|r3t          dd	 |j                                        D                        d S )
Nzeexpected example to be provided. Please check langsmith dataset and ensure valid dataset is uploaded.zlexpected example.inputs to be provided. Please check langsmith dataset and ensure valid dataset is uploaded.r?   r>   z7Expected 'question' and 'ground_truth' in example.Got: c                    g | ]}|S r    r    rc   rd   s     r*   re   z;EvaluatorChain._validate_langsmith_eval.<locals>.<listcomp>   s    :::q:::r+   zUthe current run has no outputs. The chain should output 'answer' and 'contexts' keys.z5Expected 'answer' and 'contexts' in run.outputs.Got: c                    g | ]}|S r    r    rl   s     r*   re   z;EvaluatorChain._validate_langsmith_eval.<locals>.<listcomp>   s    777q777r+   )r[   r6   outputskeysr   r   r0   rf   )r(   rg   rh   r5   missing_keyss        r*   _validate_langsmith_evalz'EvaluatorChain._validate_langsmith_eval   sY   ?w   >!~   ?"~   W^++~W_/T/T=::GN$7$7$9$9:::= =  
 K##b $##*K'*n)E
 
 --k3;GG 	:77CK$4$4$6$6777: :  	 	r+   r   c                :   |                      ||           |j        J |J |j        J |j        J |j        }|j        d         |d<   | j        j        t
          j        t
          j        t
          j        t
          j	        fv r/|j        	d|j        vrt          d          |j        d         |d<   |                     |d          }t          | j        j        || j        j                           }t          |v r|t                   |j        t          <   |S )z*
        Evaluate a langsmith run
        Nr?   r>   z+expected `ground_truth` in example outputs.T)include_run_info)keyrG   )rq   rn   r6   r   r0   r   gcgaqcgqgar[   invoker   r4   r   evaluator_info)r(   rg   rh   
chain_evaleval_outputevaluation_results         r*   evaluate_runzEvaluatorChain.evaluate_run   s3    	%%c7333 {&&&"""~)))***[
!(
!;
:;&	+
 
 
 &.*O*O !NOOO)0)HJ~&kk*tkDD, DK4D(E
 
 
 k!!8CG8L,W5  r+   )r   r   r   r   )r,   r-   r/   )r6   r7   r8   r9   r,   r7   )r6   rN   r8   rO   r,   rN   )r?   r@   r<   )
rS   r7   rT   rU   rV   rU   rW   rU   r,   rX   )r]   r^   r_   r`   r,   r-   )rg   r   rh   ri   r,   rX   )rg   r   rh   ri   r,   r   )__name__
__module____qualname____doc____annotations__r"   propertyr2   r5   rM   rR   rD   staticmethodrf   rq   r~   __classcell__)r)   s   @r*   r   r      sR          NNN% % % % % %" A A A XA " " " X" ?C) ) ) ) )< DH) ) ) ) )> '&%    < D D D \D   @ 8<!! !! !! !! !! !! !! !! !!r+   r   )%
__future__r   typingr%   langchain.chains.baser   langchain.schemar   langchain_openai.chat_modelsr   langchain_openai.embeddingsr   langsmith.evaluationr   r	   langsmith.schemasr
   r   ragas.embeddingsr   
ragas.llmsr   ragas.metrics.baser   r   r   r   r   ragas.run_configr   ragas.validationr   TYPE_CHECKINGlangchain.callbacks.managerr   r   r   r    r+   r*   <module>r      s   " " " " " "     ' ' ' ' ' ' $ $ $ $ $ $ 3 3 3 3 3 3 8 8 8 8 8 8 ? ? ? ? ? ? ? ? * * * * * * * * 7 7 7 7 7 7 * * * * * *              ' & & & & & 0 0 0 0 0 0?        y! y! y! y! y!UL y! y! y! y! y!r+   