许多业务自动化都从“读一份文件”开始:从合同中找出签约方和有效期,从简历中整理经历,从申请表中提取姓名与项目编号。Dify 可以把这个过程组织成 Workflow,但稳定的关键不是让模型输出一段漂亮总结,而是让输出具有明确结构并经过校验。

先写输出契约

以合同登记为例,可以先定义需要的字段:

{
  "contract_name": "合同名称",
  "party_a": "甲方",
  "party_b": "乙方",
  "effective_date": "YYYY-MM-DD 或 null",
  "expiry_date": "YYYY-MM-DD 或 null",
  "amount": "数字或 null",
  "currency": "币种或 null",
  "review_required": true
}

字段名、类型、空值和日期格式都应在搭建前确定。资料中没有的信息返回 null,不要要求模型补全。

最小链路

用户输入文件
  → 文档提取器
  → 参数提取器
  → 条件分支
  → 模板或代码节点
  → 输出

文档提取器先把 PDF、DOCX 等文件转换成模型可处理的文本。参数提取器再根据字段定义生成结构化结果。条件分支检查必填项:如果缺少合同主体或文本无法读取,就返回待人工补充;字段齐全时,再由模板节点整理展示,或由代码节点做确定性的格式转换。

不要让 LLM 承担精确计算。例如合同金额汇总、日期间隔和身份证号校验更适合放在代码节点或外部服务中。模型擅长理解表达差异,规则和代码更适合保证可重复结果。

处理长文档和复杂表格

文档提取并不等于版面理解。扫描件可能需要 OCR,复杂表格、页眉页脚和盖章区域也可能丢失结构。遇到长合同,可以先提取目录或关键条款所在页,再对目标文本做第二次处理;遇到关键金额和日期,应在输出中保留原文片段,方便人工核对。

如果输入文件包含个人信息、商业秘密或客户合同,应先确认模型供应商、插件和外部接口的数据处理边界。测试样本尽量脱敏,日志中不要保留完整敏感正文。

验收重点

准备正常文件、缺字段文件、扫描件、超长文件和故意格式异常的文件。逐字段比较期望值,统计缺失和误提取,而不是只看一次运行是否成功。任何会进入财务、法务或人事系统的数据,都应在第一版保留人工复核。

这个应用的终点不是生成 JSON,而是建立一条可追踪的数据入口:输入来自哪里、哪些字段由模型提取、哪些规则做过校验、谁最终确认,一目了然。