导读:最近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扮演着"第一道防线"的角色:
1.提供质量基础:无论多么先进的LLM,如果输入的文本分段混乱,提取质量都会显著下降。SAT确保了高质量的输入。
2.减轻LLM负担:通过预先处理好的段落结构,LLM可以专注于提取而不是理解文档结构,这不仅提高了准确率,还降低了token使用量。
3.增强系统稳定性:不同来源和格式的文档在进入提取流程前被标准化,使整个系统更加健壮,减少了特殊情况处理的复杂性。
4.提升引用精度:精确的段落划分使得提取的内容可以准确映射回原文,这对需要追溯依据的应用(如法律文件分析)至关重要。
虽然SAT并非ContextGem唯一的核心技术,但它与Document模型、Concept类型系统和LLM集成机制一起,构成了框架的"四大支柱"。在实际应用中,您可能会发现,仅仅启用SAT分段就能显著提升提取质量。这是框架的亮点,也可以单独抽取出来抽象到您的Agent设计中。之前我有不少类似的文章,您可以看下《可自定义的推理框架SoT-Agent,通过小路由模型自适应推理,更灵活,更经济 | 最新》或者您也可以使用更大的SAT模型来提高分割精度,或者使用更强大的LLM进行提取,具体您可以看下作者关于优化准确性的介绍https://contextgem.dev/optimizations/optimization_accuracy.html
SAT的技术架构与工作原理
SAT模型基于Transformer架构,采用了编码器-解码器设计:
1.文本编码:首先,输入文本通过多头注意力机制被转换为上下文敏感的表示。每个词元(token)都被赋予一个能够捕捉其上下文关系的向量表示。
2.语义识别:然后,模型学习识别语义完整的单元,而不仅仅依赖于句号、换行符等表面标记。它能够理解"这段文本应该在一起"的隐含语义关系。
3.边界预测:最后,模型通过二分类任务预测每个位置是否应该作为段落边界,使用软性判断(概率分数)而非硬性规则。
与传统分段方法的关键对比
文档处理工作流程图
下图展示了ContextGem的完整文档处理工作流程,包括SAT分段在整个流程中的关键位置:
如图所示,SAT分段在文档预处理阶段扮演着至关重要的角色,为后续的结构化提取奠定基础,使ContextGem能够从非结构化文本中提取更精准的结构化数据。
Document:结构化核心
在ContextGem中,Document是一切操作的核心,它不仅是文本的容器,更是一个结构化的信息中心。您可以通过多种方式创建Document对象:
• 直接从原始文本创建
• 直接从DOCX文件转换,而不是仅仅
• 以图像为中心构建视觉文档
Document对象自动处理文本分段,将原始内容组织为层级结构。
Document模型结构图
以下是ContextGem的Document模型结构,展示了从原始文档到结构化数据的转换流程:
Document模型将原始文档转换为结构化层次,包括段落、句子、概念和方面等组件,为精准提取奠定了坚实基础。这种层次化设计使LLM能够更好地理解文档内容的上下文和结构关系。
核心组件:Aspect与Concept
ContextGem采用两种核心组件来组织和提取信息:
Aspect(方面)
代表文档中的特定主题或类别,是组织提取内容的结构化方式。可以将Aspect视为文档的"分类目录",例如在合同中创建"付款条款"、"保密条款"等方面。
特点:
• 支持嵌套结构(最多一级嵌套)
• 允许构建层次化的分析框架
• 提供引用功能,精确追踪每个提取项与源文档的对应关系
Concept(概念)
专门负责提取特定类型的信息,确保结果的一致性和可靠性。
ContextGem提供多种专用概念类型:
这种丰富的类型体系满足几乎所有数据提取场景,为复杂信息提供精准建模。
工作流:Pipeline与LLM集成
DocumentPipeline(文档管道)
用于创建可重用的提取配置。您可以将一组方面和概念组织成一个管道,然后应用于多个文档,确保一致的提取逻辑。
优势:
• 在处理大量相似文档时特别有用
• 极大提高工作效率
• 使用深度复制确保每个文档提取状态相互独立
• 避免交叉污染
🧠 LLM集成
ContextGem的另一大亮点,支持各种云端服务和本地模型:
1.DocumentLLM:
• 与单个LLM交互的主要接口
• 提供丰富配置选项
• 负责处理API调用、提示构建、上下文管理和响应解析
2.DocumentLLMGroup:
• 组织多个LLM协同工作
• 每个LLM负责特定角色任务
• 支持四种专用角色:
• extractor_text(文本提取)
• reasoner_text(文本推理)
• extractor_vision(图像提取)
• reasoner_vision(图像推理)
这种灵活的集成机制让您可以根据任务复杂度和成本考虑选择最合适的模型组合。如果用于Agent开发您可以看下《忘掉那个「4+4」吧!Agent开发你至少看过这4个PDF+4个开源项目。 | 万字长文》
不是 RAG 框架
ContextGem 专注于深入的单文档分析,利用 LLM 的长上下文窗口来实现最大的准确性和精确度。它不提供用于跨文档查询或语料库范围信息检索的 RAG 功能。对于这些用例,传统的 RAG 系统(如 LlamaIndex)仍然更合适。
不是Agent框架
ContextGem 并非设计为Agent框架。根据作者对实际提取工作流程的研究,作者认为使用非代理 LLM 工作流程可以更有效地处理深入的单文档数据提取。对于需要代理的使用案例,作者建议使用 LangChain 等框架。由于其简单的 API 和清晰的输出结构,ContextGem 仍然可以作为工具轻松集成到代理框架中,使其成为基于代理的大型系统中文档提取任务的绝佳选择。
文档处理生态:转换器与多模态
DocxConverter
ContextGem提供的专用转换器,能将Microsoft Word文档转换为LLM就绪的Document对象。
特点:
• 提取包括错位表格、注释、脚注、文本框、页眉页脚在内的全面内容
• 保留文档结构和丰富元数据
• 支持嵌入图像的提取
• 使用简单的converter.convert("文档.docx")即可完成转换
图像处理能力
除了文本,ContextGem还提供强大的图像处理能力:
• 支持jpg、jpeg、png和webp格式图像
• 图像分析通过专门的视觉LLM角色进行
• 系统将图像转换为base64 URL发送给支持视觉功能的LLM
• 能够处理纯图像文档或图文混合文档,极大扩展应用范围
灵活的架构设计
虽然ContextGem只内置了DOCX转换器,但其灵活的架构设计允许处理各种来源的文档内容:
• Document类不限定特定输入格式
• 对于PDF、TXT、Markdown或Excel等其他格式,您可以使用OCR或者适当的其它第三方库提取内容
• 然后创建Document对象,或实现自定义转换器扩展框架
ContextGem的优势与应用场景
相比其他开源LLM框架,ContextGem提供了更完整的文档处理解决方案,具有多项独特优势:
广泛的应用场景
这些优势使ContextGem适用于广泛的应用场景,几乎覆盖所有需要从文档中提取结构化信息的领域:
• 法律合同分析
• 财务报告解读
• 学术文献研究
• 内容管理
• 市场调研
• 客户反馈分析
性能与扩展性
ContextGem在性能与扩展性方面也做了充分设计,能够处理从单个文档到大规模文档库的各种场景:
• 内置的并发I/O处理
• 可序列化结果模型
• 灵活的LLM配置
• 备用重试逻辑
这些特性确保了系统在各种规模需求下的可靠性和高效性。
最后,重新定义文档数据提取
ContextGem彻底改变了从文档中提取结构化数据的方式,将复杂的提取任务转变为简单直观的声明式定义。它消除了传统方法的痛点,提供了一套全面而强大的工具,让开发者能够专注于业务逻辑而非底层实现细节。
无论您是处理法律合同、研究报告还是客户反馈,ContextGem都能帮助您更快、更准确地获取所需信息,释放文档数据的全部价值。
未来已来,关注我一起同行!
转载请与我联系
让我们一起创造更多美好!
如果您觉得这篇文章对您有帮助
感谢您为我【点赞】、【在看】
微信号:xiumaoprompt
添加请注明来意!
领取专属 10元无门槛券
私享最新 技术干货