使用-Google-的-LangExtract-和-Gemma-进行结构化数据提取
使用 Google 的 LangExtract 和 Gemma 进行结构化数据提取
原文:
towardsdatascience.com/using-googles-langextract-and-gemma-for-structured-data-extraction/
重要细节(例如,保险单中的覆盖范围和义务)隐藏在密集的非结构化文本中,这对普通人来说难以筛选和消化。
大型语言模型(LLMs),以其多功能性而闻名,作为强大的工具来穿透这种复杂性,提取关键事实,将混乱的文档转化为清晰、结构化的信息。
在本文中,我们探讨了 Google 的LangExtract框架及其开源 LLM,Gemma 3,它们共同使从非结构化文本中提取结构化信息既准确又高效。
为了让这一功能变得生动,我们将通过解析保险单的演示来展示如何有效地呈现像排除条款这样的细节。
目录
(1) 理解 LangExtract 和 Gemma
(2) LangExtract 内部结构
(3) 示例演示
伴随的 GitHub 仓库可以在这里找到。
(1) 理解 LangExtract 和 Gemma
(i) LangExtract
LangExtract是一个开源的 Python 库(在 Google 的 GitHub 上发布),它使用 LLMs 根据用户定义的指令从混乱的非结构化文本中提取结构化信息。
它使 LLMs 能够擅长命名实体识别(例如覆盖范围、排除条款和条款)以及关系提取(逻辑上链接每个条款及其条件),通过有效地分组相关实体。
它的流行源于其简单性,只需几行代码就足以执行结构化信息提取。除了简单性之外,几个关键特性使LangExtract脱颖而出:
-
精确源对齐:每个提取的项目都会链接回原始文本中的精确位置,确保完全可追溯。
-
专为长文档设计:通过智能分块、并行处理和迭代遍历来处理“大海捞针”的问题,最大化召回率以找到额外的实体。
-
广泛模型兼容性:与不同 LLMs 无缝协作,从基于云的模型如 Gemini 到本地开源选项。
-
领域无关:只需少量示例即可适应任何领域,无需昂贵的微调。
-
一致的格式化输出: 使用少量示例和受控生成(仅适用于某些 LLM,如 Gemini)来强制执行稳定的输出模式并产生可靠、结构化的结果。
-
交互式可视化: 生成交互式 HTML 文件以在原始上下文中可视化和审查提取的实体。

(ii) Gemma 3
Gemma 是来自 Google 的 轻量级、最先进的开放 LLM 系列,由创建 Gemini 模型的相同研究构建。
Gemma 3 是 Gemma 系列的最新发布版本,并提供五种参数大小:270M、1B、4B、12B 和 27B。它也被声称是 当前在单个 GPU 上运行的最强大模型。
它可以处理高达 128K 个标记的提示输入,使我们能够在单个提示中处理许多多页文章(或数百张图片)。
在本文中,我们将使用 Gemma 3 4B 模型(4 亿参数变体),通过 Ollama 本地部署。
(2) LangExtract 的内部机制
LangExtract 携带了许多现代 LLM 框架中预期的标准功能,例如文档摄取、预处理(例如,标记化)、提示管理以及输出处理。
吸引我注意的是 支持优化长上下文信息提取的三个能力:
-
智能块化
-
并行处理
-
多次提取过程
为了了解这些是如何实现的,我深入研究了源代码,并追踪了它们在底层是如何工作的。
(i) 块化策略
LangExtract 使用智能 块化策略 来提高对大型文档单次推理过程中的提取质量。
目标是将文档分割成更小、更专注的、可管理的上下文块,以便以良好的格式和易于理解的方式保留相关文本。
它不会无意识地根据字符限制进行切割,而是尊重句子、段落和新行。
下面是块化策略中的关键行为摘要:
-
句子和段落感知: 尽可能从整个句子中形成块(通过尊重文本分隔符,如段落分隔),以便上下文保持完整。
-
处理长句子: 如果句子太长,它将在自然点(如换行符)处断裂。只有在必要时,它才会在一个句子内部进行分割。
-
边缘情况处理: 如果单个单词或标记的长度超过限制,它将成为一个块以避免错误。
-
基于标记的分割: 所有切割都尊重标记边界,因此单词永远不会在中间被分割。
-
上下文保留: 每个块都携带元数据(标记和字符位置),将其映射回源文档。
-
高效处理:可以将块分组到批次中并行处理,因此质量提升不会增加额外的延迟。
因此,LangExtract 创建了结构良好的块,尽可能多地打包上下文,同时避免混乱的分割,这有助于 LLM 在大型文档中保持提取质量。
(ii) 并行处理
LangExtract 在 LLM 推理中的并行处理支持(如 模型提供者脚本 所见)使得在长文档中提取质量可以很高(即良好的实体覆盖和属性分配)而不会显著增加整体延迟。
当给定文本块列表时,max_workers 参数控制可以并行运行多少个任务。这些工作器同时将多个块发送给 LLM,最多可以并行处理 max_workers 个块。
(iii) 多次提取步骤
迭代提取步骤的目的是通过捕捉在单次运行中可能被遗漏的实体来提高召回率。
实质上,它采用了一种 多样本合并 策略,其中提取独立运行多次,依靠 LLM 的随机性来揭示运行中可能被遗漏的实体。
之后,将所有步骤的结果合并。如果两次提取覆盖了相同的文本区域,则保留较早步骤的版本。
此方法通过在运行中捕获额外的实体来提高召回率,并通过 首次通过获胜 规则解决冲突。缺点是它会多次重新处理标记,这可能会增加成本。
(3) 示例说明
让我们用 LangExtract 和 Gemma 在一份公开的样本汽车保险政策文件上进行测试,该文件可在 MSIG 新加坡网站找到。
查看附带的 GitHub 仓库 以了解详情。

(i) 初始设置
LangExtract 可以通过 PyPI 安装,使用以下命令:
pip install langextract
然后,我们下载并使用 Ollama 在本地运行 Gemma 3(4B 模型)。
Ollama 是一个开源工具,它简化了在计算机或本地服务器上运行 LLM 的过程。它允许我们无需互联网连接或依赖云服务即可与这些模型交互。
要安装 Ollama,请访问 下载页面 并选择适合您操作系统的安装程序。完成后,通过在终端中运行 ollama --version 验证安装。
重要:确保您的本地设备有 GPU 访问权限用于 Ollama,因为这会显著加速性能。
安装 Ollama 后,我们可以通过打开应用程序(macOS 或 Windows)或输入 ollama serve 命令来运行 Linux 上的服务。
要本地下载 Gemma 3 (4B)(大小为 3.3GB),我们运行以下命令:ollama pull gemma3:4b,之后运行 ollama list 以验证 Gemma 是否已在本系统上本地下载。

(ii) PDF 解析和处理
第一步是阅读 PDF 政策文件,并使用 PyMuPDF(通过 pip install PyMuPDF 安装)解析内容。
我们创建了一个存储文本及其相关元数据的 Document 类,以及一个用于整体文档解析的 PDFProcessor 类。
以下是上述代码的解释:
-
load_documents:遍历每一页,提取文本块,并将它们保存为Document对象。每个块包括文本和元数据(例如,页码、与页面宽度/高度的坐标)。坐标捕获文本在页面上的位置,保留布局信息,例如是否为标题、正文文本或页脚。
-
get_all_text:将所有提取的文本合并为一个字符串,页面之间有清晰的标记分隔。 -
get_page_text:仅获取特定页面的文本。
(iii) 提示工程
下一步是提供指令,通过 LangExtract 引导 LLM 在提取过程中的操作。
我们从一个系统提示开始,该提示指定了我们想要提取的结构化信息,重点关注政策排除条款。
在上述提示中,我明确指定了 JSON 输出作为预期的响应格式。如果没有这个,我们可能会遇到 <a href="https://github.com/google/langextract/issues/127" rel="noreferrer noopener" target="_blank">langextract.resolver.ResolverParsingError</a> 错误。
问题在于 Gemma 并 不 包含内置的结构化输出强制执行,因此默认情况下,它以自然语言输出非结构化文本。它可能无意中包含额外的文本或格式错误的 JSON,这可能会破坏 LangExtract 中的严格 JSON 解析器。
然而,如果我们使用具有 schema-constrained decoding(即,可配置为结构化输出)的 LLM,如 Gemini,那么提示的第 11-21 行可以省略。
接下来,我们通过提供一个保险背景下排除条款含义的示例来介绍 few-shot prompting。
LangExtract 的 ExampleData 类作为一个模板,展示了 LLM 的工作示例,说明了文本应该如何映射到结构化输出,并告知它 要提取什么 以及 如何格式化。
它包含一个 Extraction 对象列表,代表所需的输出,其中每个对象都是一个包含单个提取信息属性的容器类。
(iv) 提取运行
在设置好我们的 PDF 解析器和提示后,我们就可以使用 LangExtract 的 extract 方法进行提取:
以下是上述参数的解释:
-
我们将输入文本、提示和几个少样本示例分别传递给
text_or_documents、prompt_description和examples参数 -
我们将模型版本
gemma3:4b传递给model_id -
model_url默认为 Ollama 的本地端点 (http://localhost:11434)。请确保 Ollama 服务已在您的本地机器上运行 -
我们将
fence_output和use_schema_constraint设置为False,因为 Gemma 并非为结构化输出而设计,LangExtract 也尚未支持 Ollama 的模式约束 -
max_char_buffer设置推理的最大字符数。较小的值可以提高准确性(通过减少上下文大小),但会增加 LLM 调用的次数 -
extraction_passes设置提取过程中的提取次数,以改善召回率
在我的 8GB VRAM GPU 上,10 页文档完成解析和提取只需 <10 分钟。
(v) 保存和后处理输出
我们最终使用 LangExtract 的 io 模块保存输出:
自定义后处理随后被应用以美化结果,便于查看,以下是输出片段:
我们可以看到,LLM 的回复包含了从原始文本中提取的结构化信息,按类别(特别是排除项)分组,并提供源文本行和简单的英文解释。
这种格式使得复杂的保险条款更容易理解,在正式政策语言和简单摘要之间提供了清晰的映射。
(4) 总结
在本文中,我们探讨了 LangExtract 的分块、并行处理和迭代遍历如何与 Gemma 3 的功能结合,从而从长文档中可靠地提取结构化数据。
这些技术展示了如何通过合适的模型和提取策略的组合,将长篇复杂的文档转化为准确、可追溯且可用于实际应用的结构化洞察。
在您离开之前
我邀请您关注我的 GitHub 和 LinkedIn 页面,获取更多有趣和实用的内容。同时,享受使用 LangExtract 和 Gemma 3 提取结构化信息的乐趣!

浙公网安备 33010602011771号