最近ContextGem很火。它既不是RAG也不是Agent,而是专注于\”结构化提取\”的框架,它像一个\”文档理解层\”,通过文档中心设计和神经网络技术(SAT)将非结构化文档转化为精确的结构化数据。它可作为RAG的前置处理器、Agent的感知模块,也可独立使用。本质上,它是\”结构化提取即服务\”的实现,解决了文档数据难提取的行业痛点,更解决了LLM提取的\”垃圾进,垃圾出\”行业难题。也是一个从论文里走出来的具体经典应用,值得深入实践
📦 GitHub: https://github.com/shcherbak-ai/contextgem
🔍 为什么结构化数据提取是难题?
在日常工作中,您是否曾面对堆积如山的文档,里面藏着重要信息,却只能手动复制粘贴或写复杂规则来提取?
- 合同中的付款条款
- 研究报告中的关键发现
- 法律文件中的权利义务
这些结构化信息被埋在非结构化文本的海洋中,传统提取方法要么精度不足,要么开发成本高昂,要么难以应对格式变化。当文档数量从几份增长到几百份时,这个问题会变得异常棘手,不仅耗费大量时间,还容易出错且难以扩展。
💎 ContextGem:为LLM提取而生
ContextGem是一个免费开源的LLM框架,由作者Sergii Shcherbak开发。专为文档中的结构化数据提取而设计,它以\”零样板代码\”的理念彻底改变了数据提取的工作方式。
与其他需要编写大量重复代码的LLM框架不同,ContextGem提供了直观且强大的抽象层,让您只需定义\”要提取什么\”,而不是\”如何提取\”。它采用文档为中心的架构,整合了自动动态提示生成、精确引用映射、类型验证等多种创新功能,使得复杂文档分析变得简单而可靠。
🔄 ContextGem核心组件关系图
下图展示了ContextGem的核心架构和各组件之间的关系,清晰呈现了其文档为中心的设计理念:
这一架构设计使得ContextGem能够以最小的代码量处理复杂的文档提取任务,同时保持高度的灵活性和可扩展性。所有组件围绕Document模型展开,形成一个完整的提取生态系统。
🚀 从安装到使用,一气呵成
安装ContextGem的过程异常简单,只需一行命令:
pip install -U contextgem
即可获得这个强大工具的全部功能。ContextGem兼容Python 3.10及以上版本,依赖项已经在安装过程中自动处理,无需额外配置。安装完成后,您可以立即开始构建提取管道,整个过程流畅自然,没有繁琐的环境准备工作。
⚡ 一键上手:快速开始
使用ContextGem极其简单,让我们通过一个实际例子演示:假设您需要从合同中提取异常内容。
1.导入必要组件:
from contextgem import Document, DocumentLLM, StringConcept
2.创建文档对象:
doc = Document(raw_text=\”合同内容…\”)
3.定义提取概念:
doc.concepts = [
StringConcept(
name=\”异常\”,
description=\”文档中的异常内容\”,
add_references=True
)
]
4.配置LLM:
llm = DocumentLLM(
model=\”openai/deepseek-chat\”, #或者其他模型
api_key=\”您的密钥\”
5.执行提取:
doc = llm.extract_all(doc)
结果存储在doc.concepts[0].extracted_items中,整个过程只需几行代码!
📝 实战案例:产品评测数据提取
为了直观展示ContextGem的强大能力,让我们通过一个完整实例来演示如何从产品评测报告中提取结构化数据。以下是一个智能手表产品评测报告的示例文档:
document_text = \”\”\”
# 产品评测报告:智能手表XYZ-200
## 产品概述
智能手表XYZ-200是2023年推出的新一代智能穿戴设备,售价为1299元,由科技公司Alpha推出。该设备配备了1.5英寸AMOLED显示屏,续航时间约为7天。
## 主要功能
1. 健康监测:心率监测、血氧监测、睡眠分析
2. 运动追踪:支持30种运动模式,包括跑步、游泳、骑行等
3. 智能助手:语音控制、消息通知、天气预报
4. 支付功能:支持NFC支付
## 总结评分
总体评分:8.5/10
性价比:9/10
功能丰富度:8/10
用户体验:8.5/10
硬件质量:9/10
## 购买建议
如果您注重电池续航和基本健康监测功能,XYZ-200是一个很好的选择。但如果您需要丰富的第三方应用支持或独立GPS功能,可能需要考虑其他产品。
\”\”\”
使用ContextGem的声明式API,我们可以轻松定义要提取的结构化数据并配置LLM模型:
# 定义要提取的概念
doc.concepts = [
StringConcept(
name=\”产品名称\”,
description=\”产品的完整名称\”,
add_references=True
),
StringConcept(
name=\”制造商\”,
description=\”产品的制造公司或品牌名称\”,
add_references=True
),
NumericalConcept(
name=\”价格\”,
description=\”产品的售价,以人民币为单位\”,
add_references=True,
numeric_type=\”int\”
),
JsonObjectConcept(
name=\”规格参数\”,
description=\”产品的技术规格参数\”,
add_references=True,
structure={
\”屏幕尺寸\”: str,
\”电池续航\”: str,
\”防水深度\”: str
}
),
NumericalConcept(
name=\”总体评分\”,
description=\”产品的总体评分,满分为10分\”,
add_references=True,
numeric_type=\”float\”
),
BooleanConcept(
name=\”推荐购买\”,
description=\”基于评测是否推荐购买该产品\”,
add_references=True
)
]
# 配置LLM并执行提取
llm = DocumentLLM(
model=\”deepseek/deepseek-chat\”,
api_key=\”您的API密钥\”,
api_base=\”https://api.deepseek.com\”,
temperature=0.1
)
doc = llm.extract_all(doc)
运行后,ContextGem成功提取了所有结构化数据:
这个实战案例展示了ContextGem的核心优势:
- 声明式API
- 自动提示生成
- 类型验证
- 引用跟踪
- 多样化概念类型
通过简短的几十行代码,我们完成了从非结构化文本到结构化数据的全流程转换,无需编写任何解析逻辑或后处理代码。
🧠 SAT智能分段:理解文档的关键
在处理复杂文档时,准确的文本分段是提取质量的关键前提。ContextGem引入了业界领先的SAT(Segment Any Text)神经网络模型,彻底改变了文档分析的基础工作。SAT模型在Hugging Face🤗上作为开源模型提供,在上面的运行日志中,您可以清晰的看到在第二步,这个框架需要拉取一个大概1G左右名为sat-3l-sm的模型,框架工作的时候它会下载到本地。关于这个模型您可以从下面的论文中获取所有您想了解的更多信息和模型下载地址以及代码,此处简要介绍。
再次运行实例时,您可能会注意到日志中的Loading SaT model sat-3l-sm…,这正是ContextGem在背后自动加载强大的分段引擎。
论文地址:https://arxiv.org/abs/2406.16678
题目:Segment Any Text: A Universal Approach for Robust, Efficient and Adaptable Sentence Segmentation
🏗️ SAT在ContextGem框架中的核心地位
SAT模型可以说是ContextGem最重要的技术基础之一,它解决了LLM提取的\”垃圾进,垃圾出\”问题。在整个提取流程中,SAT扮演着\”第一道防线\”的角色:
- 提供质量基础:无论多么先进的LLM,如果输入的文本分段混乱,提取质量都会显著下降。SAT确保了高质量的输入。
- 减轻LLM负担:通过预先处理好的段落结构,LLM可以专注于提取而不是理解文档结构,这不仅提高了准确率,还降低了token使用量。
- 增强系统稳定性:不同来源和格式的文档在进入提取流程前被标准化,使整个系统更加健壮,减少了特殊情况处理的复杂性。
- 提升引用精度:精确的段落划分使得提取的内容可以准确映射回原文,这对需要追溯依据的应用(如法律文件分析)至关重要。
虽然SAT并非ContextGem唯一的核心技术,但它与Document模型、Concept类型系统和LLM集成机制一起,构成了框架的\”四大支柱\”。在实际应用中,您可能会发现,仅仅启用SAT分段就能显著提升提取质量。这是框架的亮点,也可以单独抽取出来抽象到您的Agent设计中。之前我有不少类似的文章,您可以看下《可自定义的推理框架SoT-Agent,通过小路由模型自适应推理,更灵活,更经济 | 最新》或者您也可以使用更大的SAT模型来提高分割精度,或者使用更强大的LLM进行提取,具体您可以看下作者关于优化准确性的介绍
https://contextgem.dev/optimizations/optimization_accuracy.html
🔧 SAT的技术架构与工作原理
SAT模型基于Transformer架构,采用了编码器-解码器设计:
- 文本编码:首先,输入文本通过多头注意力机制被转换为上下文敏感的表示。每个词元(token)都被赋予一个能够捕捉其上下文关系的向量表示。
- 语义识别:然后,模型学习识别语义完整的单元,而不仅仅依赖于句号、换行符等表面标记。它能够理解\”这段文本应该在一起\”的隐含语义关系。
- 边界预测:最后,模型通过二分类任务预测每个位置是否应该作为段落边界,使用软性判断(概率分数)而非硬性规则。
📋 与传统分段方法的关键对比