o
    /ifY                     @  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$   Q/var/www/html/corbot_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 )N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)rD   rE   phraser$   r$   r%   
<listcomp>M   s    z)Evolution.merge_nodes.<locals>.<listcomp>)doc_idrB   rG   r   c                 S     g | ]}|j qS r$   )	embeddingrC   r$   r$   r%   rI   V       )axis)	r   joinr   rL   lenr-   arrayreshapeaverage)r   new_node	embed_dim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=   rY   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   r[   r0   r2   r3   )r]   rY   r$   r$   r%   r[   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)r]   r_   r`   ra   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(   rh   r=   r   )r0   generateformatr=   generationstextstrip)r]   rh   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 Nonerc   kr   r   r   )r1   get_random_nodesr   )r]   rU   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(   r`   r+   )rf   generate_datarow)r]   r`   r_   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(   contextr{   rj   )r   prevr   insertr8   rl   rX   rB   r0   rk   r=   rm   rn   ro   )r]   r(   r`   r{   	prev_noderh   rp   r$   r$   r%   fix_invalid_question   s   
zEvolution.fix_invalid_questionc                      d S r5   r$   )r]   r_   r`   r$   r$   r%   rf      s   zEvolution._aevolvec                   r   r5   r$   )r]   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rOd	d |D }|d u sU|s^t j jd
}n fdd|D }	|	rqt|	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 )Nri   c                 S  s$   g | ]\}}|d   d|j  qS )rc   	rA   )rD   irE   r$   r$   r%   rI      s    z.Evolution.generate_datarow.<locals>.<listcomp>)r(   r)   rh   r   )llmrelevant_contextsc                 S  s   g | ]	}t |tr|qS r$   )
isinstancer:   )rD   idxr$   r$   r%   rI      s
    
ru   c                   s,   g | ]}|d  t  jk r j|d   qS )rc   )rQ   r   )rD   r   r`   r$   r%   rI      s
    r(   r|   zanswer generated: %sverdictz-1answer"c                 S  rK   r$   rA   rC   r$   r$   r%   rI      rM   c                 S  rK   r$   )r,   rC   r$   r$   r%   rI      rM   )r(   r)   r*   r+   r,   )r0   	enumerater   rk   r   rl   r	   	safe_loadrm   rn   ro   r   dictgetr   r   rX   r   rB   rd   debugr-   r.   r&   )r]   r(   r`   r+   node_contentrp   relevant_contexts_resultrelevant_context_indicesrelevant_contextselected_nodesmerged_nodesr   r$   r   r%   rx      sh   


 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   r]   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   r]   r   r$   r$   r%   r     s   zEvolution.save)r   r   r>   r   TNr=   r<   rY   rZ   )rY   r   )T)r_   r:   r`   r   ra   r<   r>   rb   )rh   r
   r(   r'   r>   r'   )r`   r   r>   r&   )r(   r'   r`   r   r{   r'   r_   r:   r`   r   r>   rb   )r(   r'   r`   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=   staticmethodrX   r^   r[   rg   rq   rw   rz   r   r   rf   r   rx   r   r   r$   r$   r$   r%   r/   3   s@   
 




E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   r_   r:   r`   r   r>   rb   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 )Nrr   r   ri   r   scoreF)ra   zkeyphrases in merged node: %src   )sizer   )r|   	keyphraser   zseed question generated: %srewritten question: %ssimple)r1   r2   r0   r3   rX   filterrw   rg   rd   r   rG   rk   r   rl   rB   r   choicer-   rR   rm   rn   re   r   )
r]   r_   r`   merged_nodepassedrp   seed_questionis_valid_questionr{   _r$   r$   r%   rf     s@   

zSimpleEvolution._aevolvec                 C     t | jjS r5   hash	__class__r   r]   r$   r$   r%   __hash__H     zSimpleEvolution.__hash__Nr   r'   r   r   r   c                   &   t  || | j|| j|| _d S r5   )superr   r   r0   r   r   r$   r%   r   K     
zSimpleEvolution.adaptc                      t  | | j| d S r5   )r   r   r   r   r   r$   r%   r   Q     zSimpleEvolution.saver   r5   r   r   )r   r    r!   r   r   r"   rf   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   [  r7   zComplexEvolution.<lambda>r   r
   r   Tr=   r<   rY   rZ   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=   rY   )r0   r1   r2   r3   r   )r   r   r^   r   r   r0   r1   r2   r3   r   r   r   r[   r\   r   r$   r%   r^   ^  s   

zComplexEvolution.initr_   r:   r`   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 )Nri   r   simple evolution cannot be Nonez"[%s] simple question generated: %sr   r   r   r   rh   r(   z[%s] question compressed: %sevolution filter cannot be Nonez)evolution_filter failed, retrying with %s)r0   r3   r   rf   rd   r   r   r   rX   rk   rl   rB   rm   rn   ro   r   r   re   rw   rg   rq   r   r   rQ   r   )r]   r_   r`   r   simple_questionr   r   resultreasoning_questionr   r{   compressed_questionr$   r$   r%   _acomplex_evolutiont  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   )r_   r:   r`   r   r   r
   r5   r   r   )r   r    r!   r   r   r"   r   r   r^   r   r   r   r   r$   r$   r   r%   r   V  s   
 
;r   c                      r   )MultiContextEvolutionc                   C  r4   r5   )r   r$   r$   r$   r%   r6     r7   zMultiContextEvolution.<lambda>r   r
   r   r_   r:   r`   r   r>   rb   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 )Nrr   ri   r   r   z5[MultiContextEvolution] simple question generated: %src   )top_krs   r   ru   zsimilar_node must be a Node)r(   context1context2r   z;[MultiContextEvolution] multicontext question generated: %sr   r   z<[MultiContextEvolution] multicontext question compressed: %sr   multi_context)r1   r0   r3   r   rf   rd   r   rX   get_similarrv   r   rg   r   r   r   appendr   rl   rB   rk   rm   rn   ro   r   r   re   rw   rq   r   r   )r]   r_   r`   r   r   r   similar_nodenew_random_nodesrh   rp   r(   r   r{   r   r$   r$   r%   rf     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"   rf   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   r_   r:   r`   r   r>   rb   c                   *   |  ||| jI d H }|d |d dfS )Nr   rc   	reasoning)r   r   r]   r_   r`   r   r$   r$   r%   rf   $  
   
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   5  r   zReasoningEvolution.saver   r5   r   r   )r   r    r!   r   r   r"   rf   r   r   r   r   r$   r$   r   r%   r        
 
r   c                      r   )ConditionalEvolutionc                   C  r4   r5   )r   r$   r$   r$   r%   r6   =  r7   zConditionalEvolution.<lambda>r   r
   r   r_   r:   r`   r   r>   rb   c                   r   )Nr   rc   conditional)r   r   r   r$   r$   r%   rf   @  r   zConditionalEvolution._aevolvec                 C  r   r5   r   r   r$   r$   r%   r   H  r   zConditionalEvolution.__hash__Nr   r'   r   r   r   c                   r   r5   )r   r   r   r0   r   r   r$   r%   r   K  r   zConditionalEvolution.adaptc                   r   r5   )r   r   r   r   r   r$   r%   r   Q  r   zConditionalEvolution.saver   r5   r   r   )r   r    r!   r   r   r"   rf   r   r   r   r   r$   r$   r   r%   r   :  r   r   )<
__future__r   loggingtypingr   abcr   dataclassesr   r   numpyr-   langchain_core.pydantic_v1r   ragas.exceptionsr   
ragas.llmsr   ragas.llms.json_loadr	   ragas.llms.promptr
   ragas.run_configr   ragas.testset.docstorer   r   ragas.testset.filtersr   r   r   ragas.testset.promptsr   r   r   r   r   r   r   r   ragas.testset.utilsr   	getLoggerr   rd   r   Tupler'   rb   r&   r/   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   <module>   sL    (

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