o
    /if                     @  sV  d Z ddlmZ ddlZddlZddlZddl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 ejrOdd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ee Z!dd e" D ZeddZ#	d.d/ddZ$eG dd deZ%eG dd de%Z&eG dd de%Z'G d d! d!Z(	#d0d1d)d*Z)d2d,d-Z*e( Z+dS )3z
Q - question
A - answer: generated_text from RAG pipeline
C - contexts: context used for generation
G - ground_truth: ground truth answer
    )annotationsN)ABCabstractmethod)Counter)	dataclass)Enum)	new_group)	RunConfig)	Callbacks)BaseRagasEmbeddings)BaseRagasLLM)	Segmenter)LANGUAGE_CODESc                 C  s   i | ]
\}}|j  |qS  )__name__lower).0kvr   r   K/var/www/html/corbot_env/lib/python3.10/site-packages/ragas/metrics/base.py
<dictcomp>!       r   EvaluationModezqac qa qc gc ga qga qcgeval_modignore_columnst.Optional[t.List[str]]returnt.List[str]c                   s   | t jkr
g d}n;| t jkrddg}n1| t jkrddg}n'| t jkr(ddg}n| t jkr2ddg}n| t jkr<g d}n	| t jkrEg d} pHg   fdd	|D S )
N)questionanswercontextsr   r   r    ground_truth)r   r    r   r!   )r   r    r!   c                   s   g | ]}| vr|qS r   r   r   r   r   r   r   
<listcomp>9   s    z(get_required_columns.<locals>.<listcomp>)r   qacqaqcgcgaqgaqcg)r   r   keysr   r#   r   get_required_columns&   s    












r-   c                   @  s~   e Zd Zeed%ddZeed&ddZed'd
dZd(d)ddZd(d*ddZ	d(d+ddZ
	d,d-d!d"Zed.d#d$ZdS )/Metricr   strc                 C     d S Nr   selfr   r   r   name>      zMetric.namer   c                 C  r0   r1   r   r2   r   r   r   evaluation_modeC   r5   zMetric.evaluation_mode
run_configr	   c                 C  s   dS )z=
        This method will lazy initialize the model.
        Nr   r3   r7   r   r   r   initH   s   zMetric.initNlanguage	cache_dirt.Optional[str]Nonec                 C     t d| j)z;
        Adapt the metric to a different language.
        (adapt() is not implemented for {} metricNotImplementedErrorformatr4   )r3   r:   r;   r   r   r   adaptO      
zMetric.adaptc                 C  r>   )z,
        Save the metric to a path.
        r?   r@   )r3   r;   r   r   r   saveW   rD   zMetric.saver3   t.Selfrowt.Dict	callbacksr
   floatc              
   C  s~   |pg }t | j||dd\}}zt| j||dd}W n ty2 } z
|js,|| |d }~ww |js=|d|i |S )NFinputsrI   is_asyncrG   rI   rM   output)	r   r4   asynciorun_ascore	Exceptionendedon_chain_erroron_chain_end)r3   rG   rI   rmgroup_cmscoreer   r   r   rY   _   s"   


zMetric.scoreTrM   boolc              
     s   |pg }t | j||dd\}}z| j|||dI d H }W n ty3 } z
|js-|| |d }~ww |js>|d|i |S )NTrK   rN   rO   )r   r4   rR   rS   rT   rU   rV   )r3   rG   rI   rM   rW   rX   rY   rZ   r   r   r   ascoreq   s    


zMetric.ascorec                   s   d S r1   r   )r3   rG   rI   rM   r   r   r   rR      s   zMetric._ascore)r   r/   )r   r   r7   r	   r1   )r:   r/   r;   r<   r   r=   )r;   r<   r   r=   )r3   rF   rG   rH   rI   r
   r   rJ   )NT)
r3   rF   rG   rH   rI   r
   rM   r[   r   rJ   )rG   rH   rI   r
   rM   r[   r   rJ   )r   
__module____qualname__propertyr   r4   r6   r9   rC   rE   rY   r\   rR   r   r   r   r   r.   <   s     r.   c                   @  $   e Zd ZU dZded< dddZdS )	MetricWithLLMNzt.Optional[BaseRagasLLM]llmr7   r	   c                 C  ,   | j du rtd| j d| j | dS )
        Init any models in the metric, this is invoked before evaluate()
        to load all the models
        Also check if the api key is valid for OpenAI and AzureOpenAI
        NMetric 'zc' has no valid LLM provided (self.llm is None). Please initantiate a the metric with an LLM to run.)rc   
ValueErrorr4   set_run_configr8   r   r   r   r9      
   
zMetricWithLLM.initr]   )r   r^   r_   rc   __annotations__r9   r   r   r   r   rb         
 rb   c                   @  ra   )	MetricWithEmbeddingsNzt.Optional[BaseRagasEmbeddings]
embeddingsr7   r	   c                 C  rd   )re   Nrf   zx' has no valid embeddings provided (self.embeddings is None). Please initantiate a the metric with an embeddings to run.)rm   rg   r4   rh   r8   r   r   r   r9      ri   zMetricWithEmbeddings.initr]   )r   r^   r_   rm   rj   r9   r   r   r   r   rl      rk   rl   c                   @  s   e Zd ZdZd	ddZdS )
EnsemberzN
    Combine multiple llm outputs for same input (n>1) to a single output
    rL   list[list[t.Dict]]	attributer/   c                   s   t tsgtfddD std d S t fddD s4td  d d S tdkr>d S g }ttd D ].d  } fd	d
ttD }tt|	 }t|
 d | < || qH|S )z
        Simple majority voting for binary values, ie [0,0,1] -> 0
        inputs: list of list of dicts each containing verdict for a single input
        c                 3  s$    | ]}t |t  d  kV  qdS )r   N)len)r   item)rL   r   r   	<genexpr>   s   " z)Ensember.from_discrete.<locals>.<genexpr>z$All inputs must have the same lengthr   c                 3  s"    | ]}|D ]} |v V  qqd S r1   r   )r   inputrr   )rp   r   r   rs      s     zAll inputs must have z
 attribute   c                   s   g | ]
}|    qS r   r   r"   rp   irL   r   r   r$      r   z*Ensember.from_discrete.<locals>.<listcomp>)
isinstancelistallloggerwarningrq   rangedictr   most_commonr,   append)r3   rL   rp   verdict_aggrr   verdictsverdict_countsr   rv   r   from_discrete   s$   

zEnsember.from_discreteN)rL   ro   rp   r/   )r   r^   r_   __doc__r   r   r   r   r   rn      s    rn   englishFr:   r/   cleanr[   	char_spanc                 C  s:   |   } | tvrtd|  dt  tt|  ||dS )z7
    Get a sentence segmenter for a given language
    z
Language 'z&' not supported. Supported languages: r:   r   r   )r   r   rg   r,   r   r   r   r   r   get_segmenter   s   
r   metricc                 C  s
   t | dS )N_reproducibility)hasattr)r   r   r   r   is_reproducable   s   
r   r1   )r   r   r   r   r   r   )r   FF)r:   r/   r   r[   r   r[   )r   r.   r   r[   ),r   
__future__r   rP   loggingtypingtabcr   r   collectionsr   dataclassesr   enumr   ragas.callbacksr   ragas.run_configr	   TYPE_CHECKINGlangchain_core.callbacksr
   ragas.embeddingsr   
ragas.llmsr   pysbdr   pysbd.languagesr   	getLoggerr   r{   itemsr   r-   r.   rb   rl   rn   r   r   	ensemblerr   r   r   r   <module>   sB    

K%

