← 大模型应用基础

如何用大模型做可靠的结构化信息抽取?

高频 中等 结构化信息抽取 · 第 1 / 3 问 更新于 2026/10/05
大模型信息抽取JSON Schema数据质量
本题落地项目AI智能客服与工单处理系统

简化版

可靠抽取要先定义字段语义、类型、必填性、枚举、单位以及“缺失”和“无法判断”的表示,再使用结构化输出生成候选。服务端依次做 Schema、跨字段业务规则和来源证据校验;模型不得为凑齐字段猜值。长文要分块抽取、按实体键合并并处理冲突,最终保留字段级证据和置信状态,低可信记录转人工。

详细版

流程通常是:文档解析与版面恢复 → Schema 定义 → 候选抽取 → 字段标准化 → 规则验证 → 跨块合并 → 人工或回退。日期、金额和实体名称应同时保留原始文本与规范值,例如 raw: "下周五"、normalized: "2026-09-18",避免无法追溯转换。

{"value": 199.0, "currency": "CNY",
 "source": {"page": 3, "span": "L18-L20"},
 "status": "extracted|missing|ambiguous"}

评测按字段分别计算 precision、recall、F1 和 exact match,并单测表格、OCR 错误、多实体、否定、跨页与冲突。结构合法率不能代替字段准确率;高风险字段如金额、账号和日期应使用规则或权威系统复核。

完整版教学

一、Schema 的难点首先是语义

date 到底是签署日、生效日还是到期日?amount 是否含税、使用什么币种?如果字段定义模糊,模型即使稳定返回 JSON,数据也无法使用。

Schema 文档应为每个字段写定义、允许来源、格式、单位、是否可空和冲突策略,并提供正反例。多种日期不能挤进一个笼统字段。

记忆钩子:先把人之间的字段含义说清,再要求模型稳定抽取;JSON 只能固定形状,不能消除概念歧义。

二、缺失、空值和歧义必须区分

文档没提到电话号码,与文档明确写“无联系电话”不同;出现两个无法判断主次的号码,也不是缺失。可使用状态枚举表达。

状态含义是否可填默认值
extracted有明确证据不需要
missing文档未提供通常不可以
explicit_none明确表示无按业务映射
ambiguous多个候选无法选择转人工或保留候选

强迫所有字段非空会诱导模型编造。业务确有默认值时,应由规则层填充并标注来源为 default,而不是伪装成文档抽取。

三、保留原值、规范值和证据

抽取“1.2 万元”时,规范值可能是 12000,但仍要保留原始文本、币种和位置。若单位转换错,可直接回到证据修正。

{"raw":"1.2万元","normalized":12000,
 "unit":"CNY","page":2,"start":418,"end":423}

证据区间还支持界面高亮和字段级审核。没有证据的规范值应降低信任或拒绝入库。

四、长文分块要保护实体边界

合同条款可能跨页,表头可能只出现在上一块。固定字符切分会让金额离开所属项目。应利用标题、段落、表格和页面布局切块,并设置有限重叠。

每块抽取时携带文档 ID、页码和局部实体上下文。合并阶段使用稳定实体键,而不是把所有块结果简单拼接。

假设 20 页文档分 10 块,每块重叠 10%,会增加约 10% token;若因此把跨块漏召回从 12% 降到 3%,通常值得,但要用数据验证。

五、跨块合并需要冲突策略

同一合同金额可能在封面、正文和附件各出现一次,且版本不同。合并时考虑字段来源优先级、生效范围、版本和时间,不能多数票决定。

对实体列表先做去重,再处理字段级冲突。冲突无法自动解决时保留所有候选及证据,状态设为 ambiguous。

规则示例:正文签章页优先于目录摘要,最新补充协议覆盖原合同,但只覆盖明确修改的字段。

六、验证分为结构、字段和关系

Schema 检查类型与枚举;字段规则检查日期格式、金额范围和校验码;跨字段规则检查开始日期早于结束日期、明细之和等于总额。

若明细为 100、200、300,总额抽成 650,所有字段都能通过类型验证,但关系校验发现 100+200+300 != 650。此时应核对证据,而不是任意改一个数字使其相等。

高风险字段可以双通道抽取或与 OCR/规则结果交叉比对,分歧时转人工。

七、指标要按字段和状态计算

整体记录准确率很严格,但能反映能否直接入库;字段 F1 则帮助定位问题。对可重复实体使用集合级 precision/recall,对规范化字段同时统计原文定位和标准值准确率。

100 个应抽字段中返回 90 个,其中 81 个正确,则 precision=81/90=90%,recall=81/100=81%。只报 90% 精确率会掩盖漏掉 19 个字段。

还要单独统计 hallucinated field rate、ambiguous 识别率和证据定位准确率。

八、人机协作聚焦高风险与低置信

审核界面展示原文高亮、抽取值、规范值、规则错误和冲突候选,让人快速判断。不要只给一张脱离文档的 JSON 表单。

主动学习可把经常被修正的样本加入回归集,但人工修正需经过质量检查,避免把操作错误当标签。高风险字段可全审,普通字段按置信与抽样审核。

上线后监控文档类型变化、OCR 质量、字段缺失率和人工修改率;这些漂移可能比模型版本更影响结果。

九、常见误区与追问

  • 误区:JSON Schema 通过就代表抽取准确。 Schema 只验证结构,无法证明值来自文档。
  • 误区:必填字段为空时让模型补一个最合理值。 这是生成,不是抽取,应标记缺失。
  • 误区:长文按固定 token 切分即可。 可能破坏表格、条款和实体边界。
  • 误区:重复候选取出现次数最多的值。 来源优先级与版本比数量更重要。
  • 误区:只看整体准确率就能定位问题。 应按字段、状态、文档类型和证据分别统计。
  • 追问:OCR 错误如何处理? 保存 OCR 置信与版面位置,关键字段回看图像或用规则交叉验证。
  • 追问:如何处理相对日期? 保留原文,并基于明确参考时间规范化;参考时间缺失则标歧义。
  • 追问:抽取结果怎样可审计? 每个字段保存文档版本、原始 span、规范化规则和处理版本。

十、加强记忆

结构化抽取记住“先定义、三态值、留证据、再合并、分层验”:先把字段含义和单位定义清楚,区分抽到、缺失和歧义;同时保存原文、规范值与位置;长文按结构切块,按实体和来源规则合并;最后依次做 Schema、字段和跨字段验证。评价用 precision 与 recall,而不是把 JSON 合法率当数据正确率。

项目实战落地

项目里怎么做的

《AI智能客服与工单处理系统》的 AI 工单分类,要从工单标题和内容里抽出分类、优先级、识别理由和处理建议四个字段:

  • 可选值交给模型。 Prompt 模板按编码 TICKET_CLASSIFY 读取;{question} 替换成工单标题和内容,{conversation} 替换成关联会话内容,后面再接上「可选工单分类」列表,只列启用状态的分类,每一行是「分类名称:分类说明」。
  • 必需字段先校验。 从回答里截出第一个 { 到最后一个 } 解析;category 或 priority 缺一个就报「AI 工单分类结果缺少分类或优先级」。
  • 取值归一。 优先级只认高、中、低三档,模型写成别的说法时按下面的规则收拢:
// 如果模型返回的是标准值,直接使用。
if ("高".equals(priority) || "中".equals(priority) || "低".equals(priority)) {
    return priority;
}
// 如果返回内容包含高,统一成高。
if (priority != null && priority.contains("高")) {
    return "高";
}
// 如果返回内容包含低,统一成低。
if (priority != null && priority.contains("低")) {
    return "低";
}
// 其他异常情况默认中。
return "中";
  • 分类对回系统数据。 模型返回的分类名和系统分类双向包含即算匹配;匹配上才更新工单的 category_id。
  • AI 结果单独存。 模型给出的分类名、优先级、理由、建议存进 ai_category_name、ai_priority、ai_reason、ai_suggestion,和工单最终的 category_id、priority 分开。

《AI Agent旅游行程智能规划平台》的一句话需求抽取走的是另一条思路:模板写明「用户没有说到的字段一律留空,不要替他决定人数、预算和日期」;提示词里带上今天的日期,把「下周」「国庆」换算成具体日期;返回后日期只认 yyyy-MM-dd,天数、人数、预算不是正数就置空,结果只回填表单,由用户确认后再保存。

《AI 多 Agent 长租公寓智能合租匹配平台》的画像师从租客的自我介绍、室友期望和动态原文里抽性格、生活方式、合住需求三类标签,每个标签都要在 evidence 里附上它依据的那段原文。代码逐条核对之后才落库:

  • 依据去掉所有空白之后,必须能在发给模型的档案和动态原文里找到,找不到的标签丢掉;
  • 单个标签超过 30 字、一类超过 6 个的,同样丢掉;丢了哪几个、为什么丢,写进这一轮的结论;
  • 三类标签一个都不剩,这一版画像不落库,不写一条空画像。

比对前两边都去空白,是因为模型抄原文时常常多一个换行、少一个空格,逐字比对会把正常的依据判成找不到。

《AI个人学习计划与资料助手》的知识点提取要求模型返回 JSON 数组,每个知识点四个字段:name、difficulty、description、reviewAdvice,逐条写进知识点表。解析时每个字段都用带默认值的读取方式,字段缺失、为 null 或被写成数组、对象时都取空串,不抛异常;整段不是 JSON 数组时报「AI未按JSON数组格式返回知识点」,并附上模型原文的前 200 字。

为什么这样取舍

  • 分类说明一起给。 把分类名称和分类说明一起交给模型,模型更容易选对。
  • 可选值放进提示词。 旅游平台的城市清单也是这样处理:出发城市和目的地只能从启用城市里选,从源头上减少匹配失败。

面试官还会追问

  • 工单没有会话记录时,替换进提示词的会话内容为什么不能写成「未关联」?
  • AI 分类结果回写工单时,客服处理和质检已经写进去的字段会不会被覆盖?

学完《AI智能客服与工单处理系统》,上面这些追问你都会迎刃而解。

本题落地项目登峰造极AI智能客服与工单处理系统基于RAG、意图识别和AI回复建议,实现知识库问答、客户会话、工单创建、优先级识别、人工处理、服务质检和统计分析,适合学习FAQ资料、客服业务闭环、满意度评价和过程追踪。SpringbootLangChain4JRAGPGVectorEmbedding源码+SQL喂饭学习教程配套面试文档环境安装文档项目运行文档 学习这个项目 也可以学AI Agent旅游行程智能规划平台地狱锤炼 查看项目 也可以学AI 多 Agent 长租公寓智能合租匹配平台地狱锤炼 查看项目 也可以学AI个人学习计划与资料助手小试牛刀 查看项目