Appearance
评估 (Evaluation)
评估指标选择
评估是衡量 LangChain 4J 应用性能的重要环节。常用的评估指标包括:
准确性指标
- 正确率:正确回答的比例
- F1 分数:精确率和召回率的调和平均
- BLEU 分数:机器翻译评估指标,衡量生成文本与参考文本的相似度
- ROUGE 分数:文本摘要评估指标
性能指标
- 响应时间:从请求到响应的时间
- 吞吐量:单位时间内处理的请求数
- 内存使用:应用程序的内存消耗
- 成本:API 调用成本
用户体验指标
- 用户满意度:用户对响应的满意度
- 任务完成率:成功完成任务的比例
- 交互次数:完成任务所需的交互次数
评估流程
基本评估流程
- 准备测试数据:创建测试用例集合
- 执行测试:使用应用程序处理测试用例
- 收集结果:记录应用程序的响应
- 分析结果:计算评估指标
- 优化改进:根据评估结果优化应用程序
示例评估流程
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);模型性能优化
基于评估结果的优化
提示词优化:
- 改进提示词结构
- 添加示例
- 明确任务要求
模型选择:
- 根据任务复杂度选择合适的模型
- 考虑模型的推理能力和响应速度
参数调优:
- 调整温度参数
- 调整最大令牌数
- 调整其他模型参数
工具优化:
- 添加更适合任务的工具
- 改进工具描述
- 优化工具参数
记忆优化:
- 调整记忆大小
- 选择合适的记忆类型
- 优化记忆管理
优化示例
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());最佳实践
建立评估基准:
- 创建标准化的测试数据集
- 定义明确的评估指标
- 建立性能基准线
定期评估:
- 定期执行评估
- 监控性能变化
- 及时发现问题
A/B 测试:
- 对比不同配置的性能
- 选择最佳配置
- 持续优化
用户反馈:
- 收集用户反馈
- 分析用户满意度
- 基于反馈优化
全面评估:
- 评估不同场景下的性能
- 考虑边缘情况
- 评估长期性能
自动化评估:
- 实现自动化评估流程
- 集成到 CI/CD pipeline
- 定期生成评估报告
持续改进:
- 根据评估结果持续优化
- 尝试新的模型和方法
- 保持性能提升