o
    /if92                     @   s   d 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 ddlmZ ddlmZ d	efd
dZG dd de
ZG dd de
ZG dd de
ZG dd de
ZG dd de
ZG dd de
ZdS )z&An implementation of the Ragas metric
    )OptionalUnionAny)BaseChatModel)
Embeddings)
BaseMetric)LLMTestCase)GPTModel)capture_metric_typenamec                 C   s
   |  dS )Nz (ragas) )r   r   r   O/var/www/html/corbot_env/lib/python3.10/site-packages/deepeval/metrics/ragas.pyformat_ragas_metric_name   s   
r   c                   @   j   e Zd ZdZ			ddedeeeef  de	fdd	Z
d
efddZd
efddZdd Zedd Z dS )RAGASContextualPrecisionMetricz7This metric checks the contextual precision using Ragas333333?gpt-3.5-turboT	thresholdmodel_trackc                 C   *   || _ || _|| _t|tr|| _d S d S Nr   r   r   
isinstancestrevaluation_modelselfr   r   r   r   r   r   __init__      

z'RAGASContextualPrecisionMetric.__init__	test_casec           
      C     zddl m} ddlm} W n ty   tdw zddlm} W n ty-   tdw t| jt	r=t
| jd }n| j}|jg|jg|jgd}||}t| j| jd	  |||g|d
}|d }	|	| jk| _|	| _| jW  d    S 1 s|w   Y  d S )Nr   evaluate)context_precision=Please install ragas to use this metric. `pip install ragas`.DatasetPlease install datasetr   )contextsquestionground_truthr   metricsllmr$   )ragasr#   ragas.metricsr$   ModuleNotFoundErrordatasetsr'   r   r   r   r	   
load_modelretrieval_contextinputexpected_output	from_dictr
   __name__r   r   successscore)
r   r    r#   r$   r'   
chat_modeldatadatasetscorescontext_precision_scorer   r   r   measure!   s<   
$z&RAGASContextualPrecisionMetric.measurec                       |  |S r   rB   r   r    r   r   r   	a_measureJ      
z(RAGASContextualPrecisionMetric.a_measurec                 C      | j S r   r;   r   r   r   r   is_successfulM      z,RAGASContextualPrecisionMetric.is_successfulc                 C      t dS )NzContextual Precisionr   rJ   r   r   r   r:   P      z'RAGASContextualPrecisionMetric.__name__Nr   r   T)r:   
__module____qualname____doc__floatr   r   r   r   boolr   r   rB   rF   rK   propertyr   r   r   r   r      s"    
)r   c                   @   r   )RAGASContextualRelevancyMetricz7This metric checks the contextual relevancy using Ragasr   r   Tr   r   r   c                 C   r   r   r   r   r   r   r   r   X   r   z'RAGASContextualRelevancyMetric.__init__r    c                    rC   r   rD   rE   r   r   r   rF   d   rG   z(RAGASContextualRelevancyMetric.a_measurec           
      C   s   zddl m} ddlm} W n ty   tdw zddlm} W n ty-   tdw t| jt	r=t
| jd }n| j}|jg|jgd}||}t| j| jd	  |||g|d
}|d }	|	| jk| _|	| _| jW  d    S 1 syw   Y  d S )Nr   r"   )context_relevancyr%   r&   r(   r)   )r*   r+   r-   r.   rX   )r1   r#   r2   rX   r3   r4   r'   r   r   r   r	   r5   r6   r7   r9   r
   r:   r   r   r;   r<   )
r   r    r#   rX   r'   r=   r>   r?   r@   context_relevancy_scorer   r   r   rB   g   s:   
$z&RAGASContextualRelevancyMetric.measurec                 C   rH   r   rI   rJ   r   r   r   rK      rL   z,RAGASContextualRelevancyMetric.is_successfulc                 C   rM   )NzContextual RelevancyrN   rJ   r   r   r   r:      rO   z'RAGASContextualRelevancyMetric.__name__NrP   r:   rQ   rR   rS   rT   r   r   r   r   rU   r   r   rF   rB   rK   rV   r   r   r   r   rW   U   s"    
)rW   c                	   @   st   e Zd ZdZ				ddedeeeef  dee	 d	e
fd
dZdefddZdefddZdd Zedd Z dS )RAGASAnswerRelevancyMetricz3This metric checks the answer relevancy using Ragasr   r   NTr   r   
embeddingsr   c                 C   s,   || _ || _|| _t|tr|| _|| _d S r   )r   r   r   r   r   r   r\   )r   r   r   r\   r   r   r   r   r      s   

z#RAGASAnswerRelevancyMetric.__init__r    c                    rC   r   rD   rE   r   r   r   rF      rG   z$RAGASAnswerRelevancyMetric.a_measurec           
      C   s
  zddl m} ddlm} W n ty   tdw zddlm} W n ty-   tdw t| jt	r=t
| jd }n| j}|jg|jg|jgd}||}t| j| jd	" |||g|| jd
}|d }	|	| jk| _|	| _| jW  d    S 1 s~w   Y  d S )Nr   r"   )answer_relevancyr%   r&   r(   r)   )r+   answerr*   r-   )r/   r0   r\   r]   )r1   r#   r2   r]   r3   r4   r'   r   r   r   r	   r5   r7   actual_outputr6   r9   r
   r:   r   r\   r   r;   r<   )
r   r    r#   r]   r'   r=   r>   r?   r@   answer_relevancy_scorer   r   r   rB      sB   
$z"RAGASAnswerRelevancyMetric.measurec                 C   rH   r   rI   rJ   r   r   r   rK      rL   z(RAGASAnswerRelevancyMetric.is_successfulc                 C   rM   )NzAnswer RelevancyrN   rJ   r   r   r   r:      rO   z#RAGASAnswerRelevancyMetric.__name__)r   r   NT)r:   rQ   rR   rS   rT   r   r   r   r   r   rU   r   r   rF   rB   rK   rV   r   r   r   r   r[      s(    
)r[   c                   @   sf   e Zd Z			ddedeeeef  defddZ	d	e
fd
dZd	e
fddZdd Zedd Z dS )RAGASFaithfulnessMetricr   r   Tr   r   r   c                 C   r   r   r   r   r   r   r   r      r   z RAGASFaithfulnessMetric.__init__r    c                    rC   r   rD   rE   r   r   r   rF      rG   z!RAGASFaithfulnessMetric.a_measurec           
      C   r!   )Nr   r"   )faithfulnessr%   r&   r(   r)   )r*   r+   r^   r-   r.   rb   )r1   r#   r2   rb   r3   r4   r'   r   r   r   r	   r5   r6   r7   r_   r9   r
   r:   r   r   r;   r<   )
r   r    r#   rb   r'   r=   r>   r?   r@   faithfulness_scorer   r   r   rB      8   
$zRAGASFaithfulnessMetric.measurec                 C   rH   r   rI   rJ   r   r   r   rK     rL   z%RAGASFaithfulnessMetric.is_successfulc                 C   rM   )NFaithfulnessrN   rJ   r   r   r   r:     rO   z RAGASFaithfulnessMetric.__name__NrP   )r:   rQ   rR   rT   r   r   r   r   rU   r   r   rF   rB   rK   rV   r   r   r   r   ra      s     
#ra   c                   @   r   )RAGASContextualRecallMetricz1This metric checks the context recall using Ragasr   r   Tr   r   r   c                 C   r   r   r   r   r   r   r   r     r   z$RAGASContextualRecallMetric.__init__r    c                    rC   r   rD   rE   r   r   r   rF   '  rG   z%RAGASContextualRecallMetric.a_measurec           
      C   r!   )Nr   r"   )context_recallr%   r&   r(   r)   )r+   r,   r*   r-   )r0   rg   )r1   r#   r2   rg   r3   r4   r'   r   r   r   r	   r5   r7   r8   r6   r9   r
   r:   r   r   r;   r<   )
r   r    r#   rg   r'   r=   r>   r?   r@   context_recall_scorer   r   r   rB   *  rd   z#RAGASContextualRecallMetric.measurec                 C   rH   r   rI   rJ   r   r   r   rK   M  rL   z)RAGASContextualRecallMetric.is_successfulc                 C   rM   )NzContextual RecallrN   rJ   r   r   r   r:   P  rO   z$RAGASContextualRecallMetric.__name__NrP   rZ   r   r   r   r   rf     s"    
#rf   c                   @   sn   e Zd ZdZ			ddedeeeef  dee	 fdd	Z
d
efddZd
efddZdd Zedd Z dS )RagasMetricz7This metric checks if the output is more than 3 lettersr   r   Nr   r   r\   c                 C   s&   || _ || _t|tr|| _|| _d S r   )r   r   r   r   r   r\   )r   r   r   r\   r   r   r   r   X  s
   

zRagasMetric.__init__r    c                    rC   r   rD   rE   r   r   r   rF   d  rG   zRagasMetric.a_measurec           	      C   s
  zddl m} W n ty   tdw zddlm} W n ty'   tdw i }t| jddt| jddt| jddt	| j| j
ddg}t| j0 |D ]}||}|||j< qNt| t| }|| jk| _|| _|| _| jW  d    S 1 s~w   Y  d S )	Nr   r"   r%   r&   r(   F)r   r   )r   r\   r   )r1   r#   r3   r4   r'   r   r   rf   ra   r[   r\   r
   r:   rB   sumvalueslenr   r;   r<   score_breakdown)	r   r    r#   r'   rm   r/   metricr<   ragas_scorer   r   r   rB   g  s<   
	
$zRagasMetric.measurec                 C   rH   r   rI   rJ   r   r   r   rK     rL   zRagasMetric.is_successfulc                 C   s   dS )NRAGASr   rJ   r   r   r   r:     s   zRagasMetric.__name__)r   r   N)r:   rQ   rR   rS   rT   r   r   r   r   r   r   r   rF   rB   rK   rV   r   r   r   r   ri   U  s"    
'ri   N)rS   typingr   r   r   langchain_core.language_modelsr   langchain_core.embeddingsr   deepeval.metricsr   deepeval.test_caser   deepeval.modelsr	   deepeval.telemetryr
   r   r   r   rW   r[   ra   rf   ri   r   r   r   r   <module>   s    CCE;=