LangChain评估

152 阅读2分钟

概述

本教程介绍如何构建和评估LLM(大语言模型)的问答系统。主要包含三个核心部分:

  1. 创建问答应用
  2. 生成测试数据
  3. 自动化评估

一、创建基础问答应用

首先我们需要创建一个基础的问答应用:

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`);
});

主要特点

  1. 自动化评估: 系统可以自动生成测试集、执行问答并评估结果。

  2. 双重LLM架构:

    • 第一个LLM用于回答问题
    • 第二个LLM用于评估答案质量
  3. 灵活性: 支持手动和自动生成的测试数据集

  4. 详细反馈: 提供每个问答的详细评估结果

使用建议

  1. 在开发初期使用较小的测试集进行快速迭代
  2. 结合手动和自动生成的测试数据以提高覆盖率
  3. 定期评估系统性能以监控质量变化
  4. 使用评估结果来指导模型优化

注意事项

  1. 自动生成测试集会消耗API tokens
  2. 评估结果仍需人工验证
  3. 确保测试数据的质量和多样性
  4. 注意处理评估过程中的异常情况

这个系统为LLM应用开发提供了一个完整的评估框架,可以帮助开发者快速验证和优化其问答系统。