强类型知识提取
定义
强类型知识提取,是指把 LLM 从非结构化文本中抽出的内容,约束到一个预先定义好的固定 schema 中,产出字段明确、语义稳定的知识对象,而不是只输出一段“看起来像答案”的自由文本。
这里所说的“强类型”,重点不在编程语言层面的静态类型,而在知识抽取结果本身具有明确的数据结构约束:
- 输出字段是固定的,而不是模型临时组织的自然语言段落。
- 字段含义是稳定的,能够区分对象属性、实体关系、时间、地点等不同语义槽位。
- 结果可以被验证、序列化、保存、搜索、合并和可视化,而不是一次性阅读后即失效的文本结果。
因此,它解决的不是“模型能不能读懂文本”这个问题,而是“模型读懂后,能不能把结果落到一个可持续使用的知识结构里”。
在本文语境中的含义
在 Hyper-Extract 的语境中,强类型知识提取 的目标,是把研究报告、新闻文章、合同、病历、历史资料等高度非结构化文本,转成持久化、可预测的 Knowledge Abstracts,也就是强类型知识摘要对象。
它强调两点:
- 第一,输出不是松散描述,而是固定 schema 的对象实例。
- 第二,这个对象实例不是提取流程的临时中间结果,而是后续可继续操作、扩展和演进的知识载体。
这意味着系统不是简单地“让模型总结一下”,而是让模型按指定结构提取,并在结果生成后继续支持查询、展示、存储与增量补充。
两大类结构:记录型与图结构
本文中的强类型体系由 8 类 Auto-Types 构成,分成两大类:Record Types(记录型结构)与 Graph Types(图结构)。
记录型结构
记录型结构用于不强调实体关系、而强调结果本身组织形式的场景。
AutoModel
AutoModel 用于提取单个结构化对象。它适合“这篇文本最后要落成一个对象”的任务,例如公司财报摘要、产品规格、单个病例摘要等。
它的特点是:
- 输出是一个固定字段的 Pydantic 模型。
- 字段集合在 schema 中事先定义。
- 结果对应一个对象,而不是对象列表或关系网络。
AutoList
AutoList 用于提取有序集合。它适合排行榜、步骤序列、事件顺序、流程分解这类“顺序本身有意义”的任务。
它与普通列表型输出的区别在于:
- 顺序被明确保留。
- 结果仍受 schema 约束,而不是任意文本条目。
- 后续处理时可以依赖原始顺位,而不是再从文本中猜测先后关系。
AutoSet
AutoSet 用于提取去重集合,例如关键词集合、唯一实体列表、标签集合等。
它与 AutoList 的关键差异不是“都能放多个元素”,而是:
- AutoList 保留顺序。
- AutoSet 负责去重。
也就是说,如果任务要求结果中的重复项自动折叠,且元素顺序不构成核心语义,AutoSet 比 AutoList 更合适。
图结构:把关系也纳入类型系统
Graph Types 用于实体之间存在明确关系的场景。相比记录型结构,它不仅表示“有哪些对象”,还表示“对象之间如何关联”。
AutoGraph
AutoGraph 用于二元关系知识图谱,典型结构是“实体-关系-实体”。
它适合经典知识图谱抽取任务,例如人物与机构、公司与产品、疾病与症状、技术与应用场景之间的二元连接。
其核心边界是:
- 一条关系通常连接两个实体。
- 重点是标准 KG 风格的关系表示。
- 当关系参与方不止两个时,就不再是它的最佳表达方式。
AutoHypergraph
AutoHypergraph 用于 3 个及以上实体共同参与的复杂关系,也就是超图结构。
它要解决的问题是:很多真实世界关系并不是简单二元边。例如多方协作、合同多方当事人、带角色分工的联合事件,都无法用单条“实体-关系-实体”完整表达。
它支持的关系表达方式包括:
- 扁平列表式多实体参与。
- 按角色分组的嵌套结构。
因此,AutoHypergraph 不是 AutoGraph 的“更大号版本”,而是面向复杂关系语义的单独类型。
AutoTemporalGraph
AutoTemporalGraph 在图关系上补充时间维度,用于事件时间线或具有明确时序属性的关系抽取。
它不是简单给实体加一个日期字段,而是把时间作为关系建模的重要组成部分,使系统能够表达“谁在什么时候与谁发生了什么关系”。
AutoSpatialGraph
AutoSpatialGraph 在图关系上补充空间或地理位置信息。
它适合地点、区域、空间分布、活动位置等信息对理解关系本身有决定性作用的场景。也就是说,位置不再只是备注字段,而是结构的一部分。
AutoSpatioTemporalGraph
AutoSpatioTemporalGraph 同时在图关系上加入时间与空间维度,形成完整的“谁、何事、何时、何地”上下文。
这是本文语境下表达能力最完整的一类图结构,适合需要同时保留事件主体、关系、时间线与地理上下文的复杂知识抽取任务。
为什么称为“强类型”
本文中的强类型设计建立在 Pydantic 之上。Pydantic 在这里承担的不是装饰性封装,而是整个知识对象体系可预测性的基础。
它至少提供了两类关键能力:
- 字段验证:确保提取结果满足预定义字段与类型约束,降低“模型输出格式看似正确、实际不可用”的问题。
- JSON 序列化:使结果天然可保存、可加载、可传输、可持久化,而不是只能停留在内存中的临时对象。
在这个前提下,Knowledge Abstract 不再只是一次提取时产生的回答文本,而是可持久化的结构化资产。
关键机制:类型、模板、方法三层解耦
从实现上看,强类型知识提取 并不是只靠一个 schema 文件完成的,而是由三层结构共同支撑:
1. Auto-Types 负责数据层
8 类 Auto-Types 位于数据层,定义结果对象长什么样、能做什么操作、如何验证、如何合并。
这一层直接决定:
- 提取结果是记录型还是图结构。
- 是否保留顺序、是否去重。
- 是否需要处理节点、边、超边。
- 是否需要引入时间字段或位置字段。
图类型还需要处理节点、边、超边的管理逻辑;Temporal、Spatial 及 SpatioTemporal 类型则在关系结构上补充专用字段与标识逻辑,例如 identifiers 中的 time_field、location_field。
2. Methods 负责算法层
算法层负责真正的提取执行,包含 RAG 类方法与 Typical 类方法。
这层与强类型的关系是:模型并不是直接随意输出,而是被方法层驱动去生成符合类型目标的结构,再交给 Auto-Type 实例做验证与后处理。
其中:
- RAG 方法用于增强长文档和大规模语境处理的准确性。