Skip to content

评估 (Evaluation)

评估指标选择

评估是衡量 LangChain 4J 应用性能的重要环节。常用的评估指标包括:

准确性指标

  • 正确率:正确回答的比例
  • F1 分数:精确率和召回率的调和平均
  • BLEU 分数:机器翻译评估指标,衡量生成文本与参考文本的相似度
  • ROUGE 分数:文本摘要评估指标

性能指标

  • 响应时间:从请求到响应的时间
  • 吞吐量:单位时间内处理的请求数
  • 内存使用:应用程序的内存消耗
  • 成本:API 调用成本

用户体验指标

  • 用户满意度:用户对响应的满意度
  • 任务完成率:成功完成任务的比例
  • 交互次数:完成任务所需的交互次数

评估流程

基本评估流程

  1. 准备测试数据:创建测试用例集合
  2. 执行测试:使用应用程序处理测试用例
  3. 收集结果:记录应用程序的响应
  4. 分析结果:计算评估指标
  5. 优化改进:根据评估结果优化应用程序

示例评估流程

java
import dev.langchain4j.evaluation.Evaluator;
import dev.langchain4j.evaluation.Metric;
import dev.langchain4j.evaluation.EvaluationResult;

// 准备测试数据
List<TestCase> testCases = Arrays.asList(
        new TestCase("北京今天的天气怎么样?", "北京今天天气晴朗,温度 25 度"),
        new TestCase("如何学习 Java?", "学习 Java 的步骤:1. 学习基本语法 2. 练习编程 3. 学习面向对象编程 4. 构建项目"),
        new TestCase("什么是量子计算?", "量子计算是利用量子力学原理进行计算的技术")
);

// 创建评估器
Evaluator evaluator = new BasicEvaluator();

// 执行评估
List<EvaluationResult> results = new ArrayList<>();
for (TestCase testCase : testCases) {
    String response = agent.execute(testCase.getQuestion());
    EvaluationResult result = evaluator.evaluate(testCase.getQuestion(), testCase.getExpectedAnswer(), response);
    results.add(result);
}

// 分析结果
double accuracy = results.stream()
        .mapToDouble(EvaluationResult::score)
        .average()
        .orElse(0.0);

System.out.println("准确率:" + accuracy);

模型性能优化

基于评估结果的优化

  1. 提示词优化

    • 改进提示词结构
    • 添加示例
    • 明确任务要求
  2. 模型选择

    • 根据任务复杂度选择合适的模型
    • 考虑模型的推理能力和响应速度
  3. 参数调优

    • 调整温度参数
    • 调整最大令牌数
    • 调整其他模型参数
  4. 工具优化

    • 添加更适合任务的工具
    • 改进工具描述
    • 优化工具参数
  5. 记忆优化

    • 调整记忆大小
    • 选择合适的记忆类型
    • 优化记忆管理

优化示例

java
// 优化前
OpenAiChatModel originalModel = OpenAiChatModel.builder()
        .apiKey(System.getenv("OPENAI_API_KEY"))
        .modelName("gpt-3.5-turbo")
        .temperature(0.7)
        .build();

// 优化后
OpenAiChatModel optimizedModel = OpenAiChatModel.builder()
        .apiKey(System.getenv("OPENAI_API_KEY"))
        .modelName("gpt-3.5-turbo")
        .temperature(0.5) // 降低温度,提高确定性
        .maxTokens(1000) // 增加最大令牌数
        .build();

// 评估优化效果
double originalAccuracy = evaluateModel(originalModel);
double optimizedAccuracy = evaluateModel(optimizedModel);

System.out.println("优化前准确率:" + originalAccuracy);
System.out.println("优化后准确率:" + optimizedAccuracy);

自定义评估器

您可以通过实现 Evaluator 接口来创建自定义评估器:

基本自定义评估器

java
import dev.langchain4j.evaluation.Evaluator;
import dev.langchain4j.evaluation.EvaluationResult;

public class CustomEvaluator implements Evaluator {
    @Override
    public EvaluationResult evaluate(String input, String expectedOutput, String actualOutput) {
        // 计算相似度
        double similarity = calculateSimilarity(expectedOutput, actualOutput);
        
        // 确定是否正确
        boolean isCorrect = similarity > 0.7;
        
        return EvaluationResult.builder()
                .input(input)
                .expectedOutput(expectedOutput)
                .actualOutput(actualOutput)
                .score(similarity)
                .isCorrect(isCorrect)
                .build();
    }
    
    private double calculateSimilarity(String expected, String actual) {
        // 实现相似度计算逻辑
        // 例如使用余弦相似度、编辑距离等
        return 0.0;
    }
}

高级自定义评估器

java
public class AdvancedEvaluator implements Evaluator {
    private final EmbeddingModel embeddingModel;
    
    public AdvancedEvaluator(EmbeddingModel embeddingModel) {
        this.embeddingModel = embeddingModel;
    }
    
    @Override
    public EvaluationResult evaluate(String input, String expectedOutput, String actualOutput) {
        // 使用嵌入模型计算语义相似度
        List<Double> expectedEmbedding = embeddingModel.embed(expectedOutput);
        List<Double> actualEmbedding = embeddingModel.embed(actualOutput);
        
        double semanticSimilarity = calculateCosineSimilarity(expectedEmbedding, actualEmbedding);
        
        // 计算文本相似度
        double textSimilarity = calculateTextSimilarity(expectedOutput, actualOutput);
        
        // 综合评分
        double score = (semanticSimilarity + textSimilarity) / 2;
        boolean isCorrect = score > 0.7;
        
        return EvaluationResult.builder()
                .input(input)
                .expectedOutput(expectedOutput)
                .actualOutput(actualOutput)
                .score(score)
                .isCorrect(isCorrect)
                .build();
    }
    
    private double calculateCosineSimilarity(List<Double> embedding1, List<Double> embedding2) {
        // 实现余弦相似度计算
        return 0.0;
    }
    
    private double calculateTextSimilarity(String text1, String text2) {
        // 实现文本相似度计算
        return 0.0;
    }
}

评估工具集成

与 LangSmith 集成

LangSmith 是 LangChain 的评估和监控平台:

java
import dev.langchain4j.evaluation.langsmith.LangSmithEvaluator;

// 创建 LangSmith 评估器
LangSmithEvaluator evaluator = LangSmithEvaluator.builder()
        .apiKey(System.getenv("LANGSMITH_API_KEY"))
        .projectName("my-project")
        .build();

// 执行评估
EvaluationResult result = evaluator.evaluate(
        "北京今天的天气怎么样?",
        "北京今天天气晴朗,温度 25 度",
        "北京今天天气很好,阳光明媚,温度适宜"
);

System.out.println("评估结果:" + result.score());

与 Hugging Face 评估集成

java
import dev.langchain4j.evaluation.huggingface.HuggingFaceEvaluator;

// 创建 Hugging Face 评估器
HuggingFaceEvaluator evaluator = HuggingFaceEvaluator.builder()
        .modelId("bert-base-uncased")
        .build();

// 执行评估
EvaluationResult result = evaluator.evaluate(
        "北京今天的天气怎么样?",
        "北京今天天气晴朗,温度 25 度",
        "北京今天天气很好,阳光明媚,温度适宜"
);

System.out.println("评估结果:" + result.score());

最佳实践

  1. 建立评估基准

    • 创建标准化的测试数据集
    • 定义明确的评估指标
    • 建立性能基准线
  2. 定期评估

    • 定期执行评估
    • 监控性能变化
    • 及时发现问题
  3. A/B 测试

    • 对比不同配置的性能
    • 选择最佳配置
    • 持续优化
  4. 用户反馈

    • 收集用户反馈
    • 分析用户满意度
    • 基于反馈优化
  5. 全面评估

    • 评估不同场景下的性能
    • 考虑边缘情况
    • 评估长期性能
  6. 自动化评估

    • 实现自动化评估流程
    • 集成到 CI/CD pipeline
    • 定期生成评估报告
  7. 持续改进

    • 根据评估结果持续优化
    • 尝试新的模型和方法
    • 保持性能提升