4、用 Easy Dataset 制作问答数据
独立扩展:手里有文档,还没有问答样本时阅读。 继续关键词主线的读者,可直接进入第 5 节“关键词数据清洗与划分”。本节制作的问答仅用于数据制作练习,不混入后续关键词训练。
假设你要为“青禾文档台”制作客服问答数据,现在手里只有一份产品说明。下面用 Easy Dataset 从说明中生成问题和答案,对照原文审核,最后导出一份 JSONL 文件。
这是一个虚构产品。以下使用 Easy Dataset 1.7.3 演示,随附结果包含 6 条审核后的问答;自己跟做时,生成的问法和数量可能不同。
4.1 文档准备与任务说明
在本地课程目录中找到并阅读 案例与源码-4-微调/document-qa-demo/product-manual.md,稍后将这份文件上传到 Easy Dataset。
文档只有成员管理、文件上传、删除恢复、任务导出和汇总通知五部分。跟做时只需准备这一份文档,问题和答案会在 Easy Dataset 中生成。
以扫描件的上传要求为例,我们希望从文档中整理出这样的问答:
问题:扫描版 PDF 上传前需要做什么?
答案:先完成 OCR,检查识别出的文字是否准确,再上传处理。换成自己的文档时,先去掉重复页眉、导航等无关内容,保留数值、单位、权限和例外条件。扫描件先做 OCR 并检查文字;内部资料还需确认是否允许发送给所用的模型服务。
4.2 创建项目并配置模型
先打开工具。 本节使用 Easy Dataset 1.7.3 的浏览器界面。已有工具可直接创建项目;首次使用可从官方发布页选择适合自己系统的桌面客户端,或按下面的步骤从源码运行。
先确认本机已安装 Git、Node.js 和 npm,在准备存放工具源码的位置打开终端。
下面按 Easy Dataset 官方安装说明安装 1.7.3 标签的源码。示例环境为 macOS(Apple Silicon)、Node.js 20.20.2、npm 10.8.2;先用 node -v、npm -v 查看自己的版本。
git clone --branch 1.7.3 --depth 1 https://github.com/ConardLi/easy-dataset.git
cd easy-dataset
git describe --tags --exact-match
npm install依赖安装完成后,执行构建:
npm run build如果首次初始化数据库时只显示 Error: Schema engine error:,可以在同一目录开启数据库引擎日志后重试:
RUST_LOG=info npm run buildRUST_LOG=info 设置数据库引擎的日志级别,便于获取更多报错信息;它不是数据库修复开关。重试后仍然失败时,根据新的日志排查,不要反复执行或删除已有数据库。
构建成功后,再启动服务:
npm run start -- --hostname 127.0.0.1终端出现 Ready 后,保持终端运行,在同一台电脑的浏览器打开 http://127.0.0.1:1717。--hostname 127.0.0.1 让这套练习服务只接受本机连接。
再创建项目。 创建“青禾文档台 · 文档问答练习”项目,在描述中写清资料来源和用途。

点击页面顶部的 「更多 → 项目设置」,再切换到 「模型配置」,填写服务提供的接口地址、API Key 和模型 ID。保存后,打开 「更多 → 模型测试」,选中刚配置的模型,发送一个简单问题。

测试时选中已配置的模型,收到正常回答后再继续制作数据。若报鉴权失败、模型不存在或连接失败,先修正接口配置。
这里配置的模型负责生成问答草稿,可以与后续微调的模型不同。API Key 不要放进截图或课程文件;生成费用按所用服务计收。没有可用接口时,可以先对照随文结果学习。

图中的接口类型与模型名称仅用于演示配置位置。OpenAI 标签表示接口类型,不等于模型由 OpenAI 提供;跟做时填写自己服务支持的模型 ID。收到回答只能确认接口能用,生成的问答仍要对照原文审核。
4.3 导入文档并检查分块
打开顶部的 「数据源 → 文件处理」,在「上传新文件」区域点击「选择文件」,选中 product-manual.md,再点击「上传并处理文件」。

工具会把文档处理成供模型阅读的文本块,也就是一段相对完整的资料。处理完成后,右侧出现已上传的文档,下方显示文本块 product-manual-part-1,页面计数为 471 字。
点击文本块卡片右下角的蓝色眼睛图标,鼠标停上去会显示「查看详情」,点击后可以阅读处理后的完整正文。

此处先看“查看详情”入口。首次导入后,卡片可以尚无问题;图中的“已生成 6 个问题”属于后续生成状态,不是本步骤的完成条件。

这份说明很短,五部分内容保留在同一个块里即可。长文档则尽量按完整小节拆分,别把“支持 PDF”和“单文件不超过 20 MB”等关联条件拆散,否则生成的答案容易漏掉限制。
4.4 生成问题和答案
打开 「更多 → 项目设置 → 任务配置」,找到「问题生成设置」,将第一个滑块调整到 「100 个字符生成一个问题」,将下方的 「并发限制数量」设为 2,最后到页面底部点击「保存任务配置」。

问题生成密度用于控制希望生成多少问题;并发为 2 表示最多同时处理两项任务。实际使用时,可根据文档长度和模型服务的限制调整。
回到文本块列表,勾选 product-manual-part-1,点击「批量生成问题」。进入「问题」页,可以查看生成的问题及其来源文本块。下面这 6 题分别涉及成员人数、文件限制、回收站、任务导出、邮件汇总和扫描件处理。

先删除重复或偏离文档的问题,再点击每题右侧的「生成数据集」,为问题生成答案。这里每题生成一次即可;任务尚未完成时先查看状态,不要连续重复点击。
4.5 对照原文审核答案
进入「数据集 → 单轮问答数据集」,打开一条记录的「查看详情」,通过「文本块」入口回看原文。重点检查答案有没有改数字、漏条件,或添加没有依据的结论。例如,“最多 5 人,包含所有者”不能变成“所有者之外再加 5 人”。
下面这份扫描件问答草稿多写了一句:
……才能确保后续的处理和问答能够正常进行。
原文只要求先做 OCR、检查识别文字、再上传,并没有作出这个保证。点击答案旁的编辑图标,将答案改为:
扫描版 PDF 上传前,先完成 OCR(光学字符识别),检查识别出的文字是否准确,再上传处理。
保存后点击「确认保留」。修改后的答案如下:

其他答案也按同样方式核对。完成后回到列表,本例 6 条问答都显示「已确认」,可以进入导出步骤。

“已确认”是人工审核状态,不是自动质量评分。正式业务数据应由熟悉业务的人核对。
4.6 导出并检查问答数据
点击数据集列表上方的「导出」,选择 JSONL 和 ShareGPT,勾选「仅导出已确认数据」,取消「包含思维链」,系统提示词先留空。本例只保留问题和审核后的答案,不导出模型生成答案时的分析文字。

点击「确认导出」,浏览器会下载一个 .jsonl 文件。课程保存的 案例与源码-4-微调/document-qa-demo/product_qa_reviewed.jsonl 可供对照。
在编辑器中打开文件。本例共 6 行,每行是一组问答;为了看清字段,下面将扫描件这一行展开显示,文件中仍是一行一条记录:
{
"messages": [
{ "role": "user", "content": "扫描版PDF在上传处理前需要完成哪些操作?" },
{
"role": "assistant",
"content": "扫描版 PDF 上传前,先完成 OCR(光学字符识别),检查识别出的文字是否准确,再上传处理。"
}
]
}这里的 messages 保存一组对话,role 表示角色,content 保存内容:user 对应问题,assistant 对应审核后的答案。与关键词文件的 conversations 相比,消息列表的字段名不同,里面仍然是角色和正文;交给训练工具时,需要登记实际使用的字段名。
导出后检查三件事:
- 条数是否对应。 本例确认保留了 6 条,文件中也应有 6 条;自己跟做时,以实际保留的数量为准。
- 问答是否完整。 每条记录都有问题和答案,角色没有写反,内容没有空缺。
- 修改是否保存。 找到刚才修改的扫描件答案,确认文件里是修改后的文字,没有未保存的旧答案,也没有额外的思维链内容。
如果文件还是修改前的答案,回到工具中检查是否保存、确认了该条记录,再重新导出;条数不符时,检查「已确认」状态和导出筛选条件。
至此,文档问答练习的产物是审核后的 JSONL。继续本课时,回到关键词 small 文件完成下一节;这份问答文件单独保留,后续关键词训练仍使用关键词数据。
<span id="keywords-cleaning"></span>