classSemanticSimilarityEvaluator(BaseEvaluator):"""Embedding similarity evaluator. Evaluate the quality of a question answering system by comparing the similarity between embeddings of the generated answer and the reference answer. Inspired by this paper: - Semantic Answer Similarity for Evaluating Question Answering Models https://arxiv.org/pdf/2108.06130.pdf Args: similarity_threshold (float): Embedding similarity threshold for "passing". Defaults to 0.8. """def__init__(self,embed_model:Optional[BaseEmbedding]=None,similarity_fn:Optional[Callable[...,float]]=None,similarity_mode:Optional[SimilarityMode]=None,similarity_threshold:float=0.8,)->None:self._embed_model=embed_modelorSettings.embed_modelifsimilarity_fnisNone:similarity_mode=similarity_modeorSimilarityMode.DEFAULTself._similarity_fn=lambdax,y:similarity(x,y,mode=similarity_mode)else:ifsimilarity_modeisnotNone:raiseValueError("Cannot specify both similarity_fn and similarity_mode")self._similarity_fn=similarity_fnself._similarity_threshold=similarity_thresholddef_get_prompts(self)->PromptDictType:"""Get prompts."""return{}def_update_prompts(self,prompts:PromptDictType)->None:"""Update prompts."""asyncdefaevaluate(self,query:Optional[str]=None,response:Optional[str]=None,contexts:Optional[Sequence[str]]=None,reference:Optional[str]=None,**kwargs:Any,)->EvaluationResult:delquery,contexts,kwargs# UnusedifresponseisNoneorreferenceisNone:raiseValueError("Must specify both response and reference")response_embedding=awaitself._embed_model.aget_text_embedding(response)reference_embedding=awaitself._embed_model.aget_text_embedding(reference)similarity_score=self._similarity_fn(response_embedding,reference_embedding)passing=similarity_score>=self._similarity_thresholdreturnEvaluationResult(score=similarity_score,passing=passing,feedback=f"Similarity score: {similarity_score}",)