基于证据生成 SFT 数据

FinFlow 可从本机已校验的 v7 证据发布包生成三类中文文本 SFT:

配方 输入 产物与检查
document_qa 审核通过的原文片段 问题、答案、精确引文;独立审核事实与可回答性
extraction 审核通过的原文片段 JSON 字段抽取;字段值必须直接出现在引用证据中
table_calculation 已通过图表候选审核的表格 OCR、上下文与原图 两个操作数的计算;程序重算,审核模型对照原图核对取数与单位

文本 SFT 的训练输入包含材料和问题,表格原图用于审核。图表多模态 SFT 将原图加入训练输入。模型训练使用单卡 SFT 入口。

1. 配置模型

使用现有项目环境,无新增依赖。凭证只填本机 .env:

FIN_DOC_SFT_GENERATE_API_URL=https://your-provider.example/v1
FIN_DOC_SFT_GENERATE_API_KEY=YOUR_LOCAL_KEY
FIN_DOC_SFT_GENERATE_MODEL=YOUR_GENERATION_MODEL
FIN_DOC_SFT_REVIEW_API_URL=https://your-provider.example/v1
FIN_DOC_SFT_REVIEW_API_KEY=YOUR_LOCAL_KEY
FIN_DOC_SFT_REVIEW_MODEL=YOUR_REVIEW_MODEL

两者均为兼容 Chat Completions 的接口;生成与审核是分开的调用。 启用 table_calculation 时,审核模型需要支持图片输入。 可选 *_MODEL_VERSION、*_TIMEOUT、*_MAX_TOKENS 见 .env.example。 不会自动借用已有 CPT 模型凭证。

复制配方并做本地检查:

cp -n config/sft.json config/sft.local.json
python -m training.sft_cli --config config/sft.local.json preflight

预检不请求模型,也不验证服务连通性或实际视觉能力。 独立 SFT 入口不要求重新配置 OCR 或 CPT tokenizer,但需要本机原数据目录、数据库和 v7 发布包。

2. 生成一个数据集

从每日飞轮 JSON 摘要的 release.release_id 获取发布包 ID。 当前 config/flywheel.json 中相应来源的 source_policy.<source_name>.training 必须仍为 approved。 如果使用本机飞轮配方,通过全局参数 --flywheel-config config/flywheel.local.json 指定。

python -m training.sft_cli \
  --config config/sft.local.json \
  --flywheel-config config/flywheel.local.json \
  --data-root data \
  build --dataset-id sft-001 --release YOUR_V7_RELEASE_ID

所有全局参数放在 build 前。只有 v7 发布包内、且当前数据库仍批准的候选可作为输入; 候选审核发生变化时,需要先发布新的 v7 包。独立复制来的包若没有本机对应的血缘数据库,不能直接生成。

生成流程:

  1. 校验发布文件、候选和证据的 checksum,复查来源准入及最新候选决定。
  2. 固定同源文档和完全相同上下文的训练/验证划分。
  3. 按任务配方生成候选;校验 JSON、精确引用、抽取值和计算表达式。
  4. 独立模型检查事实、问题可回答性、单位、日期与指令遵循;表格任务附原图。
  5. 仅导出 accepted 样本,记录拒绝、待复核、跳过与失败原因。

短文本可能没有足够信息,允许生成零个样本。超出字符上限的材料会排除并记录原因, 不会截断表格或将一条问答拆成多个训练样本。

3. 配方与计算范围

config/sft.json 默认启用三种文本任务,每个证据/任务最多生成两条样本:

  • max_jobs:每次最多完成的新生成任务数,已完成缓存不占名额。
  • max_model_requests:单次 SFT 调用次数上限;命中缓存不计数,与 CPT 限额独立。
  • max_seconds:开始下一次模型请求前检查时间;正在进行的请求可延续至该角色的 timeout。
  • max_evidence_chars、max_question_chars、max_answer_chars:字符上限。
  • validation_fraction:首次分配比例;已冻结或已由 CPT 分配的文档保持原划分。
  • generation_prompt_version、review_prompt_version:提示词修订标识。

导出保持完整 messages,目标训练程序负责 tokenizer、chat template、长度检查和 packing。

表格计算首版只支持同单位的两个操作数:

运算 公式
sum a + b
difference a − b
ratio a / b
percentage a / b × 100%
growth_rate (a − b) / b × 100%,要求 b > 0

金额与单位通过精确引文关联到原文。程序使用 Decimal 和四舍五入,支持 0–6 位小数;操作数为同单位金额数值。审核模型对照表格核对行列含义、报告期、口径与取数。

4. 输出、审核与血缘

输出目录:data/training/sft/datasets/<dataset-id>/。

文件 内容
train.jsonl、validation.jsonl 纯文本 sample_id 和 messages,可交给支持对话格式的训练程序
train.vision.jsonl、validation.vision.jsonl、images.jsonl 多模态导出及图片索引;仅文本配方时为空
samples.jsonl 完整样本:任务、划分、生成/审核工件、引文、计算依据
evidence.jsonl 使用的材料、来源、work ID、chunk/表格位置、上游决定
audit.jsonl 审核结果、确定性校验失败、排除与重复记录
jobs.jsonl 可追溯的生成任务与本机 checkpoint 索引
manifest.json、checksums.sha256 配方、模型身份、输入发布包、数量、状态、完整性摘要

文本训练文件中每条样本为三条消息:system、含材料和任务的 user、assistant。 sample_id 保存为元数据,训练输入使用 messages。

python -m training.sft_cli verify data/training/sft/datasets/sft-001
python -m workflow.flywheel_cli --data-root data trace --sample-id YOUR_SFT_SAMPLE_ID

trace 可追到生成/审核响应、上游候选、原文或表格及 OCR/PDF 血缘。 训练文件包含材料,可单独用于文本训练;完整审计引用原数据目录,归档时应同时保留该目录和发布包。

5. 断点续作与数据划分

响应和已完成任务按输入内容、模型身份与配方缓存。网络失败、请求数或时间达到上限时, 导出已有审核通过的数据,状态为 partial;退出码为 1,配置或致命错误为 2。 使用新 dataset ID、相同配方和发布包继续,会复用已有结果并处理剩余任务。

同一个 dataset ID 已存在时,只校验并返回历史快照,不向其中追加。 当前引擎/导出版本为 sft-v2,升级后配方身份改变,应使用新的 dataset ID;旧 v1 数据保留。 每个新导出是选定发布包与配方的累计结果,不要把多次续作快照直接拼接,否则会重复训练。 拒绝/待复核结果不会自动反复生成;调整提示词版本或模型后生成新配方,保留旧审计记录。 当前没有 SFT 人工批准命令,上游候选人工复核也不能直接批准 SFT 样本。

划分在生成前持久化:沿用已有 CPT 的 work 划分;完全相同上下文、相同图片字节与同一 work 的派生内容保持一致。 新的 CPT 构建也会读取该划分。历史数据冲突时排除相关 SFT 证据,记录 split_conflict。 导出使用 train/validation 两个划分,按逻辑作品、相同上下文和图片字节分组。

6. 每日自动生成

在本机飞轮配置中启用:

"sft": {"enabled": true, "config": "config/sft.local.json"}

相对路径以飞轮配置所在目录的上一级为基准,通常是项目根目录。 执行原来的每日命令即可:

python -m workflow.flywheel_cli --config config/flywheel.local.json run

SFT 在证据发布与 CPT 构建后执行,使用剩余飞轮时间和独立的 SFT 请求上限。 没有待生成工作时复用缓存;每日摘要和聊天渠道日报增加 sft_dataset。 SFT 失败会令本轮状态为 partial,已发布的 CPT 数据保留。 默认 enabled=false,设置为 true 后接入每日生成。

更多生成策略

默认使用 direct;可选 Self-Instruct、答案反推、Evol-Instruct 和 CodecLM 的证据适配流程。见生成方法及数据配比。