概述
本教程介绍如何构建和评估LLM(大语言模型)的问答系统。主要包含三个核心部分:
- 创建问答应用
- 生成测试数据
- 自动化评估
一、创建基础问答应用
首先我们需要创建一个基础的问答应用:
import { RetrievalQA } from 'langchain/chains';
import { ChatOpenAI } from 'langchain/chat_models';
import { CSVLoader } from 'langchain/document_loaders';
import { VectorstoreIndexCreator } from 'langchain/indexes';
import { DocArrayInMemorySearch } from 'langchain/vectorstores';
// 加载CSV数据
const loader = new CSVLoader({
filePath: '../data/product_data.csv'
});
const data = await loader.load();
// 创建向量存储索引
const index = await VectorstoreIndexCreator.fromDocuments(
data,
new DocArrayInMemorySearch()
);
// 创建问答链
const llm = new ChatOpenAI({ temperature: 0 });
const qa = RetrievalQA.fromLLM({
llm,
retriever: index.asRetriever(),
verbose: true,
returnSourceDocuments: true
});
二、生成测试数据
测试数据可以通过两种方式生成:
1. 手动创建测试集
const examples = [
{
query: "高清电视机怎么进行护理?",
answer: "使用干布清洁。"
},
{
query: "旅行背包有内外袋吗?",
answer: "有。"
}
];
2. 自动生成测试集
import { QAGenerateChain } from 'langchain/chains';
import { ChatOpenAI } from 'langchain/chat_models';
class ChineseQAGenerateChain extends QAGenerateChain {
static async fromLLM(llm, options = {}) {
const prompt = `您是一位老师,正在为测验准备问题。
请根据以下文档生成问题和答案。
示例格式:
<开始文档>
...
<结束文档>
问题: 在此处提问
答案: 在此处回答
这些问题应该详细且明确基于文档中的信息。开始!
<开始文档>
{doc}
<结束文档>
请使用中文输出`;
return new ChineseQAGenerateChain({ llm, prompt, ...options });
}
}
const exampleGenChain = await ChineseQAGenerateChain.fromLLM(
new ChatOpenAI()
);
const newExamples = await exampleGenChain.apply(
data.slice(0,5).map(doc => ({ doc }))
);
三、评估系统
评估系统使用另一个LLM来判断答案的正确性:
import { QAEvalChain } from 'langchain/evaluation/qa';
// 关闭调试模式
langchain.debug = false;
// 获取预测结果
const predictions = await qa.apply(examples);
// 创建评估链
const llm = new ChatOpenAI({ temperature: 0 });
const evalChain = await QAEvalChain.fromLLM(llm);
// 评估结果
const gradedOutputs = await evalChain.evaluate(examples, predictions);
// 打印评估结果
examples.forEach((example, i) => {
console.log(`Example ${i}:`);
console.log(`Question: ${predictions[i].query}`);
console.log(`Real Answer: ${predictions[i].answer}`);
console.log(`Predicted Answer: ${predictions[i].result}`);
console.log(`Grade: ${gradedOutputs[i].results}\n`);
});
主要特点
-
自动化评估: 系统可以自动生成测试集、执行问答并评估结果。
-
双重LLM架构:
- 第一个LLM用于回答问题
- 第二个LLM用于评估答案质量
-
灵活性: 支持手动和自动生成的测试数据集
-
详细反馈: 提供每个问答的详细评估结果
使用建议
- 在开发初期使用较小的测试集进行快速迭代
- 结合手动和自动生成的测试数据以提高覆盖率
- 定期评估系统性能以监控质量变化
- 使用评估结果来指导模型优化
注意事项
- 自动生成测试集会消耗API tokens
- 评估结果仍需人工验证
- 确保测试数据的质量和多样性
- 注意处理评估过程中的异常情况
这个系统为LLM应用开发提供了一个完整的评估框架,可以帮助开发者快速验证和优化其问答系统。