classRelevancyEvaluator(BaseEvaluator):""" Relenvancy evaluator. Evaluates the relevancy of retrieved contexts and response to a query. This evaluator considers the query string, retrieved contexts, and response string. Args: raise_error(Optional[bool]): Whether to raise an error if the response is invalid. Defaults to False. eval_template(Optional[Union[str, BasePromptTemplate]]): The template to use for evaluation. refine_template(Optional[Union[str, BasePromptTemplate]]): The template to use for refinement. """def__init__(self,llm:Optional[LLM]=None,raise_error:bool=False,eval_template:Optional[Union[str,BasePromptTemplate]]=None,refine_template:Optional[Union[str,BasePromptTemplate]]=None,)->None:"""Init params."""self._llm=llmorSettings.llmself._raise_error=raise_errorself._eval_template:BasePromptTemplateifisinstance(eval_template,str):self._eval_template=PromptTemplate(eval_template)else:self._eval_template=eval_templateorDEFAULT_EVAL_TEMPLATEself._refine_template:BasePromptTemplateifisinstance(refine_template,str):self._refine_template=PromptTemplate(refine_template)else:self._refine_template=refine_templateorDEFAULT_REFINE_TEMPLATEdef_get_prompts(self)->PromptDictType:"""Get prompts."""return{"eval_template":self._eval_template,"refine_template":self._refine_template,}def_update_prompts(self,prompts:PromptDictType)->None:"""Update prompts."""if"eval_template"inprompts:self._eval_template=prompts["eval_template"]if"refine_template"inprompts:self._refine_template=prompts["refine_template"]asyncdefaevaluate(self,query:str|None=None,response:str|None=None,contexts:Sequence[str]|None=None,sleep_time_in_seconds:int=0,**kwargs:Any,)->EvaluationResult:"""Evaluate whether the contexts and response are relevant to the query."""delkwargs# UnusedifqueryisNoneorcontextsisNoneorresponseisNone:raiseValueError("query, contexts, and response must be provided")docs=[Document(text=context)forcontextincontexts]index=SummaryIndex.from_documents(docs)query_response=f"Question: {query}\nResponse: {response}"awaitasyncio.sleep(sleep_time_in_seconds)query_engine=index.as_query_engine(llm=self._llm,text_qa_template=self._eval_template,refine_template=self._refine_template,)response_obj=awaitquery_engine.aquery(query_response)raw_response_txt=str(response_obj)if"yes"inraw_response_txt.lower():passing=Trueelse:ifself._raise_error:raiseValueError("The response is invalid")passing=FalsereturnEvaluationResult(query=query,response=response,passing=passing,score=1.0ifpassingelse0.0,feedback=raw_response_txt,contexts=contexts,)
asyncdefaevaluate(self,query:str|None=None,response:str|None=None,contexts:Sequence[str]|None=None,sleep_time_in_seconds:int=0,**kwargs:Any,)->EvaluationResult:"""Evaluate whether the contexts and response are relevant to the query."""delkwargs# UnusedifqueryisNoneorcontextsisNoneorresponseisNone:raiseValueError("query, contexts, and response must be provided")docs=[Document(text=context)forcontextincontexts]index=SummaryIndex.from_documents(docs)query_response=f"Question: {query}\nResponse: {response}"awaitasyncio.sleep(sleep_time_in_seconds)query_engine=index.as_query_engine(llm=self._llm,text_qa_template=self._eval_template,refine_template=self._refine_template,)response_obj=awaitquery_engine.aquery(query_response)raw_response_txt=str(response_obj)if"yes"inraw_response_txt.lower():passing=Trueelse:ifself._raise_error:raiseValueError("The response is invalid")passing=FalsereturnEvaluationResult(query=query,response=response,passing=passing,score=1.0ifpassingelse0.0,feedback=raw_response_txt,contexts=contexts,)