评估测试

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

测试 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 String responseContent;

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

  ...
}
  • `userTex`t:用户的原始输入(字符串形式)

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

  • responseContent:AI 模型的响应内容(字符串形式)

RelevancyEvaluator

RelevancyEvaluator(相关性评估器)是 Evaluator 接口的实现,用于评估 AI 生成响应与提供上下文的相关性。该评估器通过判定 AI 模型响应是否关联用户输入及检索上下文,帮助评估 RAG 流程质量。

评估基于用户输入、AI 模型响应和上下文信息,通过提示词模板询问 AI 模型该响应是否关联用户输入及上下文。

以下是 RelevancyEvaluator 使用的默认提示词模板:

Your task is to evaluate if the response for the query
is in line with the context information provided.

You have two options to answer. Either YES or NO.

Answer YES, if the response for the query
is in line with context information otherwise NO.

Query:
{query}

Response:
{response}

Context:
{context}

Answer:
你可通过 .promptTemplate() Builder 方法提供自定义 PromptTemplate 对象来修改提示模板。详见 自定义模板 章节。

集成测试中的使用

以下是集成测试中使用 RelevancyEvaluator 验证 RetrievalAugmentationAdvisor 的 RAG 流程结果的示例:

@Test
void evaluateRelevancy() {
    String question = "Where does the adventure of Anacletus and Birba take place?";

    RetrievalAugmentationAdvisor ragAdvisor = RetrievalAugmentationAdvisor.builder()
        .documentRetriever(VectorStoreDocumentRetriever.builder()
            .vectorStore(pgVectorStore)
            .build())
        .build();

    ChatResponse chatResponse = ChatClient.builder(chatModel).build()
        .prompt(question)
        .advisors(ragAdvisor)
        .call()
        .chatResponse();

    EvaluationRequest evaluationRequest = new EvaluationRequest(
        // The original user question
        question,
        // The retrieved context from the RAG flow
        chatResponse.getMetadata().get(RetrievalAugmentationAdvisor.DOCUMENT_CONTEXT),
        // The AI model's response
        chatResponse.getResult().getOutput().getText()
    );

    RelevancyEvaluator evaluator = new RelevancyEvaluator(ChatClient.builder(chatModel));

    EvaluationResponse evaluationResponse = evaluator.evaluate(evaluationRequest);

    assertThat(evaluationResponse.isPass()).isTrue();
}

你可在 Spring AI 项目中找到多个使用 RelevancyEvaluator 测试 QuestionAnswerAdvisor(参见 测试)和 RetrievalAugmentationAdvisor(参见 测试)功能的集成测试。

自定义模板

RelevancyEvaluator 使用默认模板提示 AI 模型进行评估。你可通过 .promptTemplate() Builder 方法提供自定义 PromptTemplate 对象来修改该行为。

自定义 PromptTemplate 可采用任何 TemplateRenderer 实现(默认使用基于 StringTemplate 引擎的 StPromptTemplate)。关键要求是模板必须包含以下占位符:

  • query 占位符:用于接收用户问题。

  • response 占位符:用于接收 AI 模型的响应。

  • context 占位符:用于接收上下文信息。

FactCheckingEvaluator

FactCheckingEvaluatorEvaluator 接口的另一实现,用于根据提供的上下文评估 AI 生成响应的事实准确性。该评估器通过验证给定陈述(声明)是否被上下文(文档)逻辑支持,帮助检测和减少 AI 输出中的幻觉。

将 'claim'(声明)和 'document'(文档)提交给 AI 模型进行评估。为此专门优化的更小型高效模型(如 Bespoke 的 Minicheck)可降低核查成本(相比 GPT-4 等旗舰模型)。Minicheck 也可通过 Ollama 使用。

用法

FactCheckingEvaluator 构造函数接收 ChatClient.Builder 作为参数:

public FactCheckingEvaluator(ChatClient.Builder chatClientBuilder) {
  this.chatClientBuilder = chatClientBuilder;
}

该评估器使用以下提示模板进行事实核查:

Document: {document}
Claim: {claim}

其中 {document} 为上下文信息,{claim} 是待评估的 AI 模型响应。

示例

以下是使用基于 Ollama 的 ChatModel(具体采用 Bespoke-Minicheck 模型)进行 FactCheckingEvaluator 评估的示例

@Test
void testFactChecking() {
  // 设置 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())


  // 创建 FactCheckingEvaluator
  var factCheckingEvaluator = new FactCheckingEvaluator(ChatClient.builder(chatModel));

  // Example context and claim
  String context = "The Earth is the third planet from the Sun and the only astronomical object known to harbor life.";
  String claim = "The Earth is the fourth planet from the Sun.";

  // Create an EvaluationRequest
  EvaluationRequest evaluationRequest = new EvaluationRequest(context, Collections.emptyList(), claim);

  // Perform the evaluation
  EvaluationResponse evaluationResponse = factCheckingEvaluator.evaluate(evaluationRequest);

  assertFalse(evaluationResponse.isPass(), "The claim should not be supported by the context");

}