o
    ZhX                     @  s  d dl mZ d dlZd dlZd dlmZ d dlmZ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 d d
lmZ d dlmZmZ d dlmZmZmZ d dlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' d dl(m)Z) e*e+Z,eG dd dZ-ej.e/e-e/f Z0G dd deZ1eG dd dZ2eG dd de2Z3eG dd de2Z4eG dd de4Z5eG dd de4Z6eG dd de4Z7e3 Z8e5 Z9e6 Z:e7 Z;dS )    )annotationsN)abstractmethod)	dataclassfield)	BaseModel)MaxRetriesExceeded)BaseRagasLLM)json_loader)Prompt)	RunConfig)DocumentStoreNode)EvolutionFilter
NodeFilterQuestionFilter)compress_question_promptconditional_question_promptfind_relevant_context_promptmulti_context_question_promptquestion_answer_promptquestion_rewrite_promptreasoning_question_promptseed_question_prompt)rngc                   @  s(   e Zd ZU ded< eedZded< dS )CurrentNodesr   	root_nodedefault_factoryzt.List[Node]nodesN)__name__
__module____qualname____annotations__r   listr    r$   r$   O/var/www/html/lang_env/lib/python3.10/site-packages/ragas/testset/evolutions.pyr   !   s   
 r   c                   @  s<   e Zd ZU ded< ded< ejZded< ded< ded	< d
S )DataRowstrquestionzt.List[str]contextszt.Union[str, float]ground_truthevolution_typezt.List[dict]metadataN)r   r    r!   r"   npnanr*   r$   r$   r$   r%   r&   +   s   
 r&   c                   @  s0  e Zd ZU eedZded< dZded< dZ	ded< dZ
ded	< ed
d dZded< edd dZded< edd dZded< dZded< dZded< edHddZdIdJd!d"ZdKd$d%Z	dLdMd*d+ZdNd/d0Zd1d2 ZdOd4d5ZdPd7d8ZedQd9d:Zd;d< ZdRd>d?ZdSdTdDdEZdSdUdFdGZdS )V	EvolutionNr   generator_llmzt.Optional[DocumentStore]docstorezt.Optional[NodeFilter]node_filterzt.Optional[QuestionFilter]question_filterc                   C     t S N)r   r$   r$   r$   r%   <lambda>:       zEvolution.<lambda>r   r
   r   c                   C  r4   r5   )r   r$   r$   r$   r%   r6   =   r7   r   c                   C  r4   r5   )r   r$   r$   r$   r%   r6   @   r7   rewrite_invalid_question_prompt   int	max_triesTboolis_asyncr   r   returnr   c                 C  s   t dddd | jD dd | jD d}| jd jd ur&t| jd jnd }|rAtd	d | jD d
|}tj|dd|_|S )NZmerged
c                 s  s    | ]}|j V  qd S r5   page_content.0nr$   r$   r%   	<genexpr>L   s    z(Evolution.merge_nodes.<locals>.<genexpr>c                 S  s   g | ]
}|j D ]}|qqS r$   )
keyphrases)rC   rD   phraser$   r$   r%   
<listcomp>M   s    z)Evolution.merge_nodes.<locals>.<listcomp>)Zdoc_idrA   rF   r   c                 S     g | ]}|j qS r$   )	embeddingrB   r$   r$   r%   rH   V       )Zaxis)	r   joinr   rJ   lenr-   arrayZreshapeZaverage)r   new_nodeZ	embed_dimZnode_embeddingsr$   r$   r%   merge_nodesE   s   zEvolution.merge_nodes
run_configt.Optional[RunConfig]c                 C  s"   || _ |d u r
t }| | d S r5   )r=   r   set_run_configselfr=   rR   r$   r$   r%   init\   s   zEvolution.initr   c                 C  sP   | j r	| j | | jr| j| | jr| j| | jr&| j| d S d S r5   )r1   rT   r0   r2   r3   )rV   rR   r$   r$   r%   rT   b   s   zEvolution.set_run_configcurrent_triescurrent_nodesupdate_countEvolutionOutputc                   s>   |r|d7 }t d| || jkrt| | ||I d H S )N   zretrying evolution: %s times)loggerinfor;   r   _aevolve)rV   rX   rY   rZ   r$   r$   r%   aretry_evolvel   s   
zEvolution.aretry_evolvepromptr(   r'   c                   sH   | j d us
J d| j j|j|d| jdI d H }|jd d j S )Ngenerator_llm cannot be None)r(   ra   r=   r   )r0   generateformatr=   generationstextstrip)rV   ra   r(   resultsr$   r$   r%   _transform_questionz   s   zEvolution._transform_questionc                 C  s2   | j d us	J d| j jddd }t||gdS )Ndocstore cannot be Noner\   kr   r   r   )r1   get_random_nodesr   )rV   rP   r$   r$   r%   _get_new_random_node   s   zEvolution._get_new_random_noder&   c                   s4   d}|  ||I d H \}}}| j|||dI d H S )Nr   )r(   rY   r+   )r_   generate_datarow)rV   rY   rX   Zevolved_questionr+   r$   r$   r%   evolve   s   zEvolution.evolvefeedbackc                   st   |j j}|dur6|jd| ||_ | jj|| |j|d}| jj	|| j
dI dH }|jd d j }||fS )zF
        if the question is invalid, get more nodes and retry
        Nr   )r(   contextrs   rc   )r   prevr   insertr8   re   rQ   rA   r0   rd   r=   rf   rg   rh   )rV   r(   rY   rs   Z	prev_nodera   ri   r$   r$   r%   fix_invalid_question   s   
zEvolution.fix_invalid_questionc                      d S r5   r$   )rV   rX   rY   r$   r$   r%   r_      s   zEvolution._aevolvec                   rx   r5   r$   )rV   r(   r$   r$   r%   filter_and_retry   s   zEvolution.filter_and_retryr+   c                   s  | j d us
J ddd t jD }| j j| jj||ddI d H }tj|jd d j	
 | j dI d H }t|trB|dd nd }|d u rQt j jd	}n fd
d|D }	|	rdt|	d |	d	n }| |}
| j j| jj||
jddI d H }t|jd d j	
 | j I d H }t|tr|ni }td| |ddkrtjn|dtj}t|
ddd |jD ||dd |jD dS )Nrb   c                 S  s$   g | ]\}}|d   d|j  qS )r\   	r@   )rC   irD   r$   r$   r%   rH      s    z.Evolution.generate_datarow.<locals>.<listcomp>)r(   r)   ra   r   )llmZrelevant_contextsrn   c                   s,   g | ]}|d  t  jk r j|d   qS )r\   )rN   r   )rC   r{   rY   r$   r%   rH      s
    r(   rt   zanswer generated: %sZverdictz-1answer"c                 S  rI   r$   r@   rB   r$   r$   r%   rH      rK   c                 S  rI   r$   )r,   rB   r$   r$   r%   rH      rK   )r(   r)   r*   r+   r,   )r0   	enumerater   rd   r   re   r	   Z	safe_loadrf   rg   rh   
isinstancedictgetr   r   rQ   r   rA   r]   debugr-   r.   r&   )rV   r(   rY   r+   Znode_contentri   Zrelevant_contexts_resultZrelevant_context_indicesZrelevant_contextZselected_nodesZmerged_nodesr   r$   r~   r%   rq      s`   


 zEvolution.generate_datarowlanguage	cache_dirt.Optional[str]Nonec                 C  s   | j dus	J d| jdusJ d| j|| j|| _| j|| j|| _| j|| j|| _| j || | j|| dS )z;
        Adapt the filter to a different language.
        Nnode filter cannot be Nonequestion_filter cannot be None)r2   r3   r   adaptr0   r   r8   rV   r   r   r$   r$   r%   r      s   zEvolution.adaptc                 C  sX   | j dus	J d| jdusJ d| j| | j| | j | | j| dS )z4
        Save the filter prompts to a path.
        Nr   r   )r2   r3   r   saver   rV   r   r$   r$   r%   r   	  s   zEvolution.save)r   r   r>   r   TNr=   r<   rR   rS   )rR   r   )T)rX   r:   rY   r   rZ   r<   r>   r[   )ra   r
   r(   r'   r>   r'   )rY   r   r>   r&   )r(   r'   rY   r   rs   r'   rX   r:   rY   r   r>   r[   )r(   r'   rY   r   r+   r'   r5   r   r'   r   r   r>   r   r   r   r>   r   ) r   r    r!   tcastr   r0   r"   r1   r2   r3   r   r   r   r8   r;   r=   staticmethodrQ   rW   rT   r`   rj   rp   rr   rw   r   r_   ry   rq   r   r   r$   r$   r$   r%   r/   3   s@   
 




?r/   c                      Z   e Zd ZU edd dZded< dddZdd Zdd fddZdd fddZ	  Z
S )SimpleEvolutionc                   C  r4   r5   )r   r$   r$   r$   r%   r6     r7   zSimpleEvolution.<lambda>r   r
   r   rX   r:   rY   r   r>   r[   c           
        sj  | j d us
J d| jd usJ d| jd usJ d| jd us%J d| |}| j|I d H }|d sF|  }| j||ddI d H S t	d|j
 | jj| jj|jtjt|j
d	d
d ddI d H }|jd d j}td| | j|I d H \}}|s| |||I d H \}}td| | j|I d H \}}	|s|  }| ||I d H S ||dfS )Nrk   r   rb   r   ZscoreF)rZ   zkeyphrases in merged node: %sr\   )sizer   )rt   Z	keyphraser|   zseed question generated: %srewritten question: %ssimple)r1   r2   r0   r3   rQ   filterrp   r`   r]   r   rF   rd   r   re   rA   r   choicer-   rO   rf   rg   r^   rw   )
rV   rX   rY   merged_nodeZpassedri   Zseed_questionis_valid_questionrs   _r$   r$   r%   r_     s@   

zSimpleEvolution._aevolvec                 C     t | jjS r5   hash	__class__r   rV   r$   r$   r%   __hash__B     zSimpleEvolution.__hash__Nr   r'   r   r   r   c                   &   t  || | j|| j|| _d S r5   )superr   r   r0   r   r   r$   r%   r   E     
zSimpleEvolution.adaptc                      t  | | j| d S r5   )r   r   r   r   r   r$   r%   r   K     zSimpleEvolution.saver   r5   r   r   )r   r    r!   r   r   r"   r_   r   r   r   __classcell__r$   r$   r   r%   r     s   
 
)r   c                      s   e Zd ZU edddZded< edddZded< edd	 d
Zded< d%d& fddZd'ddZ	d(d) fd!d"Z
d(d* fd#d$Z  ZS )+ComplexEvolutionNF)defaultreprzt.Optional[SimpleEvolution]sezt.Optional[EvolutionFilter]evolution_filterc                   C  r4   r5   )r   r$   r$   r$   r%   r6   U  r7   zComplexEvolution.<lambda>r   r
   r   Tr=   r<   rR   rS   c                   s   |d u rt  }t j||d | jd u r!t| j| j| j| jd| _| jd us*J d| j	d u r6t
| jj| _	| j| | j	| d S )N)r=   rR   )r0   r1   r2   r3   r   )r   r   rW   r   r   r0   r1   r2   r3   r   r   r}   rT   rU   r   r$   r%   rW   X  s   

zComplexEvolution.initrX   r:   rY   r   question_promptc                   s  | j d us
J d| jd usJ d| jd usJ d| j||I d H \}}}td| jj| | |}| j j	|j
||jddI d H }|jd d j }| j|I d H \}	}
|	s| |||
I d H \}}td| | j|I d H \}	}|	s| j }| ||I d H S | j| j|d	I d H }td
| jj| | jd usJ d| j||I d H r| j }tdt|j | ||I d H S ||fS )Nrb   r   simple evolution cannot be Nonez"[%s] simple question generated: %sr   r|   r   r   ra   r(   z[%s] question compressed: %sevolution filter cannot be Nonez)evolution_filter failed, retrying with %s)r0   r3   r   r_   r]   r   r   r   rQ   rd   re   rA   rf   rg   rh   r   rw   r^   rp   r`   rj   r   r   rN   r   )rV   rX   rY   r   simple_questionr   r   resultZreasoning_questionr   rs   compressed_questionr$   r$   r%   _acomplex_evolutionn  s^   



z$ComplexEvolution._acomplex_evolutionr   r'   r   r   r>   r   c                   sf   | j d us	J d| jd usJ dt || | j|| | j|| j|| _| j || d S Nr   r   )r   r   r   r   r   r0   r   r   r$   r%   r     s   zComplexEvolution.adaptc                   sX   | j d us	J d| jd usJ dt | | j| | j | | j| d S r   )r   r   r   r   r   r   r   r$   r%   r     s   zComplexEvolution.saver   r   )rX   r:   rY   r   r   r
   r5   r   r   )r   r    r!   r   r   r"   r   r   rW   r   r   r   r   r$   r$   r   r%   r   P  s   
 
;r   c                      r   )MultiContextEvolutionc                   C  r4   r5   )r   r$   r$   r$   r%   r6     r7   zMultiContextEvolution.<lambda>r   r
   r   rX   r:   rY   r   r>   r[   c                   s  | j d us
J d| jd usJ d| jd usJ d| jd us%J d| j||I d H \}}}td| | |}| j j|dd}|s_| j j	dd}t
|d	 |d
}| ||I d H S t|d	 tsjJ d|j|d	  | jj||j|d	 jd}| jj|dI d H }	|	jd	 d	 j }
td|
 | j|
I d H \}}|s| |
||I d H \}
}td|
 | j|
I d H \}}|s| j }| ||I d H S | j| j|
dI d H }td| | jd usJ d| j||I d H r| j }| ||I d H S ||dfS )Nrk   rb   r   r   z5[MultiContextEvolution] simple question generated: %sr\   )Ztop_krl   r   rn   zsimilar_node must be a Node)r(   Zcontext1Zcontext2r|   z;[MultiContextEvolution] multicontext question generated: %sr   r   z<[MultiContextEvolution] multicontext question compressed: %sr   multi_context)r1   r0   r3   r   r_   r]   r   rQ   Zget_similarro   r   r`   r   r   r   appendr   re   rA   rd   rf   rg   rh   r   rw   r^   rp   rj   r   r   )rV   rX   rY   r   r   r   Zsimilar_nodeZnew_random_nodesra   ri   r(   r   rs   r   r$   r$   r%   r_     sj   



zMultiContextEvolution._aevolvec                 C  r   r5   r   r   r$   r$   r%   r   
  r   zMultiContextEvolution.__hash__Nr   r'   r   r   r   c                   r   r5   )r   r   r   r0   r   r   r$   r%   r     r   zMultiContextEvolution.adaptc                   r   r5   )r   r   r   r   r   r$   r%   r     r   zMultiContextEvolution.saver   r5   r   r   )r   r    r!   r   r   r"   r_   r   r   r   r   r$   r$   r   r%   r     s   
 
Fr   c                      r   )ReasoningEvolutionc                   C  r4   r5   )r   r$   r$   r$   r%   r6     r7   zReasoningEvolution.<lambda>r   r
   r   rX   r:   rY   r   r>   r[   c                   *   |  ||| jI d H }|d |d dfS )Nr   r\   	reasoning)r   r   rV   rX   rY   r   r$   r$   r%   r_     
   
zReasoningEvolution._aevolvec                 C  r   r5   r   r   r$   r$   r%   r   &  r   zReasoningEvolution.__hash__Nr   r'   r   r   r   c                   r   r5   )r   r   r   r0   r   r   r$   r%   r   )  r   zReasoningEvolution.adaptc                   r   r5   )r   r   r   r   r   r$   r%   r   /  r   zReasoningEvolution.saver   r5   r   r   )r   r    r!   r   r   r"   r_   r   r   r   r   r$   r$   r   r%   r        
 
r   c                      r   )ConditionalEvolutionc                   C  r4   r5   )r   r$   r$   r$   r%   r6   7  r7   zConditionalEvolution.<lambda>r   r
   r   rX   r:   rY   r   r>   r[   c                   r   )Nr   r\   conditional)r   r   r   r$   r$   r%   r_   :  r   zConditionalEvolution._aevolvec                 C  r   r5   r   r   r$   r$   r%   r   B  r   zConditionalEvolution.__hash__Nr   r'   r   r   r   c                   r   r5   )r   r   r   r0   r   r   r$   r%   r   E  r   zConditionalEvolution.adaptc                   r   r5   )r   r   r   r   r   r$   r%   r   K  r   zConditionalEvolution.saver   r5   r   r   )r   r    r!   r   r   r"   r_   r   r   r   r   r$   r$   r   r%   r   4  r   r   )<
__future__r   loggingtypingr   abcr   dataclassesr   r   numpyr-   Zlangchain_core.pydantic_v1r   Zragas.exceptionsr   Z
ragas.llmsr   Zragas.llms.json_loadr	   Zragas.llms.promptr
   Zragas.run_configr   Zragas.testset.docstorer   r   Zragas.testset.filtersr   r   r   Zragas.testset.promptsr   r   r   r   r   r   r   r   Zragas.testset.utilsr   	getLoggerr   r]   r   Tupler'   r[   r&   r/   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   <module>   sL    (

 b:mY
