王剑编程网

分享专业编程知识与实战技巧

JAVA程序员自救之路——SpringAI评估

背景

我们用SpringAI做了大模型的调用,RAG的实现。但是我们做的东西是否能满足我们业务的要求呢。比如我们问了一个复杂的问题,大模型能否快速准确的回答出来?是否会出现幻觉?这就需要我们构建一个完善的评估策略。

Evaluation

SpringAI为我们提供了Evaluation接口来实现这些功能,并且内置了一些简单的实现。当然,我们根据自己的业务也可以实现一些自定义的评估方式。下面,我们简单介绍一下内置的两个实现:RelevancyEvaluator和FactCheckingEvaluator。

RelevancyEvaluator

RelevancyEvaluator是一个简单的评估实现,它利用自身的大模型,来去重新评估这次推断的相关性。

我们用junit开发一个单元测试,代码如下:

        // 用户的提问
        String question = "迟到15分钟怎么办?";
        // 大模型影响
        ChatResponse response = chatClientBuilder.build().prompt()
                .advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.builder().filterExpression("label == 'hr'").query(question).similarityThreshold(0.5d).topK(5).build()))
                .user(question)
                .call()
                .chatResponse();

        String responseContent = response.getResult().getOutput().getText();
        // 定义一个相关性评估器
        var relevancyEvaluator = new RelevancyEvaluator(chatClientBuilder);
        // 将 用户提问 + 模型的响应,一并发给大模型进行评估
        EvaluationRequest evaluationRequest = new EvaluationRequest(question,
                (List<Document>) response.getMetadata().get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS), responseContent);
        // 返回评估结果
        EvaluationResponse evaluationResponse = relevancyEvaluator.evaluate(evaluationRequest);
        // 断言是否大模型是否满足性能需求
        assertTrue(evaluationResponse.isPass(), "Response is not relevant to the question");

这里我们还是利用了之前RAG的数据。然后构建一个评估器进行评估。

FactCheckingEvaluator

FactCheckingEvaluator是一个简单的评估实现,它利用自身的大模型,来去重新评估这次推断的准确性。它和RelevancyEvaluator的不同,主要是prompt的区别。

源码上,二者的prompt如下:

RelevancyEvaluator:

	private static final String DEFAULT_EVALUATION_PROMPT_TEXT = """
				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: "
			""";

FactCheckingEvaluator:

	private static final String DEFAULT_EVALUATION_PROMPT_TEXT = """
				Evaluate whether or not the following claim is supported by the provided document.
				Respond with "yes" if the claim is supported, or "no" if it is not.
				Document: \\n {document}\\n
				Claim: \\n {claim}
			""";

我们用junit开发一个单元测试,代码如下:

// 用户的提问
        String question = "迟到15分钟怎么办?";
        // 大模型影响
        ChatResponse response = chatClientBuilder.build().prompt()
                .advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.builder().filterExpression("label == 'hr'").query(question).similarityThreshold(0.5d).topK(5).build()))
                .user(question)
                .call()
                .chatResponse();

        String responseContent = response.getResult().getOutput().getText();
        // 定义一个相关性评估器
        var factCheckingEvaluator = new FactCheckingEvaluator(chatClientBuilder);
        // 将 用户提问 + 模型的响应,一并发给大模型进行评估
        EvaluationRequest evaluationRequest = new EvaluationRequest(question,
                (List<Document>) response.getMetadata().get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS), responseContent);
        // 返回评估结果
        EvaluationResponse evaluationResponse = factCheckingEvaluator.evaluate(evaluationRequest);
        // 断言是否大模型是否满足性能需求
        assertTrue(evaluationResponse.isPass(), "Response is not relevant to the question");

这里我们还是利用了之前RAG的数据。然后构建一个评估器进行评估。

Minicheck

但是这个有时候并不一定可以准确的评估出我们RAG的准确性。所以我们需要一个更专业更高效的模型去评估。所以出现了BespokeMinicheckMinicheck 是一种专门设计用于事实核查的小型高效模型,它通过分析事实信息片段和生成的输出,验证声明是否与文档相符。

我们可以用Ollama搭建一个bespoke-minicheck模型。然后在代码中使用BESPOKE_MINICHECK创建一个model,并用FactCheckingEvaluator加载。

  // Set up the Ollama API
  OllamaApi ollamaApi = new OllamaApi("http://localhost:11434");

  ChatModel chatModel = new OllamaChatModel(ollamaApi,
				OllamaOptions.builder().model(BESPOKE_MINICHECK).numPredict(2).temperature(0.0d).build())


  // Create the FactCheckingEvaluator
  var factCheckingEvaluator = new FactChecking
(ChatClient.builder(chatModel));

这样一个简单的AI评估就实现完成了。这对于我们做评估,调试,ABTest等有很大的帮助。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言