评估测试

测试 AI 应用程序需要评估生成的內容,以确保 AI 模型没有产生幻觉响应。

评估响应的一种方法是使用 AI 模型本身进行评估。选择最适合评估的 AI 模型,该模型可能与用于生成响应的模型不同。

Spring AI 用于评估响应的接口是 Evaluator,定义为

@FunctionalInterface
public interface Evaluator {
    EvaluationResponse evaluate(EvaluationRequest evaluationRequest)
}

评估的输入是 EvaluationRequest,定义为

public class EvaluationRequest {

	private final String userText;

	private final List<Content> dataList;

	private final ChatResponse chatResponse;

	public EvaluationRequest(String userText, List<Content> dataList, ChatResponse chatResponse) {
		this.userText = userText;
		this.dataList = dataList;
		this.chatResponse = chatResponse;
	}

  ...
}
  • userText:来自用户的原始输入。

  • dataList:上下文数据,例如来自检索增强生成,附加到原始输入。

  • chatResponse:AI 模型的响应。

RelevancyEvaluator

一种实现是 RelevancyEvaluator,它使用 AI 模型进行评估。更多实现将在未来的版本中提供。

RelevancyEvaluator 使用输入 (userText) 和 AI 模型的输出 (chatResponse) 来提出问题

Your task is to evaluate if the response for the query
is in line with the context information provided.\n
You have two options to answer. Either YES/ NO.\n
Answer - YES, if the response for the query
is in line with context information otherwise NO.\n
Query: \n {query}\n
Response: \n {response}\n
Context: \n {context}\n
Answer: "

以下是一个 JUnit 测试的示例,它对加载到向量存储中的 PDF 文档执行 RAG 查询,然后评估响应是否与用户文本相关。

@Test
void testEvaluation() {

    dataController.delete();
    dataController.load();

    String userText = "What is the purpose of Carina?";

    ChatResponse response = ChatClient.builder(chatModel)
            .build().prompt()
            .advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()))
            .user(userText)
            .call()
            .chatResponse();

    var relevancyEvaluator = new RelevancyEvaluator(ChatClient.builder(chatModel));

    EvaluationRequest evaluationRequest = new EvaluationRequest(userText,
            (List<Content>) response.getMetadata().get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS), response);

    EvaluationResponse evaluationResponse = relevancyEvaluator.evaluate(evaluationRequest);

    assertTrue(evaluationResponse.isPass(), "Response is not relevant to the question");

}

上面的代码来自示例应用程序,位于 这里