增量知识演进
定义
增量知识演进,是指在首次完成知识抽取之后,已有的 Knowledge Abstracts 还可以继续接收新的文档输入,把新增事实合并进原有知识对象中,而不是每来一批新材料就重新处理全部历史文本、重新从头生成一份结果。
在 Hyper-Extract 的语境里,这不是一个附属功能,而是被明确列为核心亮点之一。它强调的不是“再跑一次抽取”,而是“让已经存在的知识对象继续演化”。
在本文档中的语境
原文把 Hyper-Extract 描述为一个由 LLM 驱动的知识提取与演进框架,目标是把高度非结构化文本转成持久化、可预测、强类型的 Knowledge Abstracts。因此,抽取只是第一步;真正重要的是,这些抽取结果之后还能被保存、查询、展示、搜索,并在新材料到来时继续扩充。
这使 增量知识演进 与普通的一次性信息抽取有本质区别:
- 一次性抽取把输出看成某轮任务的最终结果。
- 增量知识演进 把知识对象看成可以持续维护、持续吸收新证据、持续扩展结构的长期资产。
原文还直接指出:知识在这种机制下可以被持久化、搜索和演化,这说明它服务的是长期知识积累,而不是单次文档处理。
依赖前提:可合并的强类型数据载体
增量知识演进 能成立,不是因为简单地把新文本再喂给模型,而是因为底层数据层先被设计成了稳定的、可合并的对象。
原文给出的关键前提是:Auto-Types 被设计为支持 merge 的强类型对象。
具体来说,Hyper-Extract 的数据层由 8 类 Auto-Types 构成,基于 Pydantic 实现,具备以下与增量更新直接相关的特征:
- 类型安全:输出不是松散文本,而是有字段约束的结构化对象。
- 可序列化:可以保存为持久化结果,便于之后继续读取和更新。
- 支持增量合并:类型本身内置
merge()能力,是 feed 新文档的基础。 - 可视化与搜索:更新后的对象仍可继续
search()、visualize()、save()。
原文在技术架构部分进一步明确写到:数据流最后会落到 Auto-Type 实例,并且“支持增量是因为 Auto-Types 设计为可合并的”。这句话基本说明了它的工程基础:没有可 merge 的强类型对象,就没有稳定的增量演进。
关键机制
1. 先有抽取结果,再做追加演进
增量知识演进 不是脱离初始抽取单独存在的。典型模式是先依据模板完成一次 parse,得到已有知识对象;之后再把新文档 feed 进去,让系统把新增内容并入现有结果。
因此它的对象不是“原始文本集合”,而是“已经生成的知识抽象”。增量的输入是新文档,增量的承载体是现有 Knowledge Abstracts。
2. 模板与类型共同约束合并行为
原文虽没有展开完整 merge 算法细节,但已经给出结构基础:
- 模板中的
output schema定义提取什么。 guideline定义如何高质量提取。identifiers用于确保实体或关系唯一性。- 图类型还会有时间、地点等专用标识逻辑,例如
time_field、location_field。
这意味着增量合并并不是完全无约束地堆叠文本,而是依赖既有 schema、标识规则和类型语义,把新信息并到已有对象里,避免每次更新都把知识结构打散重建。
3. 对不同类型结果都成立
原文把支持增量合并描述为 Auto-Types 的整体能力,而不是只属于某一种图类型。因此它适用的范围并不限于传统知识图谱,还覆盖记录型和图结构型两大类对象,例如:
- 记录型:
AutoModel、AutoList、AutoSet。 - 图结构型:
AutoGraph、AutoHypergraph、AutoTemporalGraph、AutoSpatialGraph、AutoSpatioTemporalGraph。
这点很重要,因为它说明 增量知识演进 不只是“图谱补边”,也可以是对单个结构化摘要、步骤列表、去重实体集合、时序关系或时空关系的持续扩充。
CLI 典型流程
原文给出了非常明确的命令行流程,可以概括为“先 parse,再 feed,再 show”。
第一步:先做初始抽取
先使用 he parse 基于模板和输入文本生成输出目录,例如:
he parse examples/en/tesla.md -t general/biography_graph -o ./output/ -l en
这里的重要点不是示例文件名本身,而是:抽取结果会被保存到一个输出位置,这个输出结果随后就成为可继续演进的已有知识对象。
第二步:对已有结果做增量补充
然后使用 he feed 把新文档增量并入已有结果:
he feed ./output/ examples/en/tesla_question.md
he feed 的语义不是重新对全部文本跑一次全量抽取,而是基于已有输出目录中的知识结果,吸收新文档中的新增信息。
第三步:查看更新后的效果
增量更新后,可以继续使用 he show 检查知识对象当前状态:
he show ./output/
原文示例甚至明确展示了更新前后都可 he show,也就是:
he show ./output/
he feed ./output/ examples/en/tesla_question.md
he show ./output/
这体现了一个重要特征:知识对象被保存下来并可反复操作,既不是一次性 stdout 输出,也不是只能在内存里短暂存在的中间结果。
Python API 对应流程
在 Python API 中,增量知识演进 的对应流程同样很直接:先创建模板实例,再 parse,然后对结果执行 feed。
原文示例流程如下:
import os
from dotenv import load_dotenv
from hyperextract import Template
load_dotenv()
ka = Template.create("general/biography_graph", language="en")
with open("examples/en/tesla.md", "r", encoding="utf-8") as f:
text = f.read()
result = ka.parse(text) # 提取
ka.show(result) # 可视化
ka.feed(result, new_text) # 增量
可见其核心顺序是:
Template.create(...)创建模板驱动的知识抽取器。ka.parse(text)先从已有文本生成初始结果。ka.feed(result, new_text)在已有result上合并新文本带来的新增知识。
这里的关键不是单独调用某个“更新模型”,而是在现有结果对象上继续演进。这与 CLI 中“对已有输出目录 feed 新文档”是同一个思想的 API 形式。
与一次性抽取的区别
一次性抽取的思路
一次性抽取通常把输入文档视为单轮任务,把输出视为这轮任务的终点:
- 输入一批文本。
- 生成一份结构化结果。
- 任务结束。