langextract

2026-02-12

ai

一个钟头有六十分钟,一天就超过了一千分钟。明白这个道理后,就知道人可做出多少贡献。——歌德

LangExtract:把“非结构化文本”变成“有证据的结构化数据”

当我们处理临床记录、技术报告、长篇文档或业务邮件时,信息常常沉在“非结构化文本”的海洋里。你需要的不只是抽取实体,更需要“抽取结果与原文位置一一对应”,能够直观看到每个字段来自哪里,并且用交互式可视化批量审阅。Google 开源的 LangExtract 就是为此而生:它用 LLM 做结构化抽取,同时做到“精准溯源、强约束输出、长文档优化”和“一键可视化”。

  • 仓库与文档:google/langextract · PyPI
  • 概述(仓库描述):A Python library for extracting structured information from unstructured text using LLMs with precise source grounding and interactive visualization.
  • 许可:Apache 2.0
  • 技术栈:Python,支持 Gemini、OpenAI、Ollama 等多种模型提供方
  • 定位:以“少样本”定义抽取任务,保证输出结构一致,并生成交互式审阅页面

为什么是 LangExtract:七个关键点

  • 精准溯源(Precise Source Grounding)
    每个抽取项都有在原文中的准确位置,可视化高亮,审查与回溯一目了然。

  • 结构化约束(Reliable Structured Outputs)
    通过少样本示例定义输出模式,并在支持的模型(如 Gemini)里启用“受控生成”,确保 JSON 等结构稳定可用。

  • 长文档优化(Optimized for Long Documents)
    针对“长文本中的针”问题,结合分块、并行与多轮抽取策略,提升召回与效率。

  • 交互式可视化(Interactive Visualization)
    直接从 JSONL 生成自包含 HTML,支持动画与高亮,适合在大批量结果中审阅。

  • 灵活模型支持(Flexible LLM Support)
    同时支持云端模型(Gemini 家族、OpenAI)与本地模型(Ollama),在不同场景按需切换。

  • 面向任意领域(Adaptable to Any Domain)
    用少量示例就能定义抽取任务,医疗、法律、文学、研发、客服等领域皆可用。

  • 世界知识可控(Leverages LLM World Knowledge)
    通过提示词与示例的属性字段来调节“基于文本证据”与“基于模型知识”的平衡。


三步上手:定义任务 → 运行抽取 → 生成可视化

下面的代码片段来自官方 README,完整可运行,适合快速试用。

  • 第一步:定义抽取任务与示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import langextract as lx
import textwrap

# 1. Define the prompt and extraction rules
prompt = textwrap.dedent("""\
Extract characters, emotions, and relationships in order of appearance.
Use exact text for extractions. Do not paraphrase or overlap entities.
Provide meaningful attributes for each entity to add context.""")

# 2. Provide a high-quality example to guide the model
examples = [
lx.data.ExampleData(
text="ROMEO. But soft! What light through yonder window breaks? It is the east, and Juliet is the sun.",
extractions=[
lx.data.Extraction(
extraction_class="character",
extraction_text="ROMEO",
attributes={"emotional_state": "wonder"}
),
lx.data.Extraction(
extraction_class="emotion",
extraction_text="But soft!",
attributes={"feeling": "gentle awe"}
),
lx.data.Extraction(
extraction_class="relationship",
extraction_text="Juliet is the sun",
attributes={"type": "metaphor"}
),
]
)
]
  • 第二步:运行抽取
1
2
3
4
5
6
7
8
9
10
# The input text to be processed
input_text = "Lady Juliet gazed longingly at the stars, her heart aching for Romeo"

# Run the extraction
result = lx.extract(
text_or_documents=input_text,
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-flash",
)
  • 第三步:保存与可视化
1
2
3
4
5
6
7
8
9
10
# Save the results to a JSONL file
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl", output_dir=".")

# Generate the visualization from the file
html_content = lx.visualize("extraction_results.jsonl")
with open("visualization.html", "w") as f:
if hasattr(html_content, 'data'):
f.write(html_content.data) # For Jupyter/Colab
else:
f.write(html_content)

生成的 visualization.html 是一个可交互的页面,你可以在其中按原文高亮查看每个抽取项的证据。


面向长文本:URL 直读与并行处理

当面对完整书籍或冗长报告时,可以直接从 URL 读取并开启多轮抽取与并行加速:

1
2
3
4
5
6
7
8
9
10
# Process Romeo & Juliet directly from Project Gutenberg
result = lx.extract(
text_or_documents="https://www.gutenberg.org/files/1513/1513-0.txt",
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-flash",
extraction_passes=3, # Improves recall through multiple passes
max_workers=20, # Parallel processing for speed
max_char_buffer=1000 # Smaller contexts for better accuracy
)

这套策略在“长文档召回”与“速度”之间取得平衡,适合法律材料、医学影像报告、研发评审文档等长文本场景。


模型选择与密钥配置

  • 推荐默认模型:gemini-2.5-flash(速度、成本与质量的平衡)
    复杂推理可用 gemini-2.5-pro;大规模任务可考虑 Vertex AI Batch API 降成本。

  • API Key 设置

    • 从 AI Studio、Vertex AI 或 OpenAI 获取密钥
    • 通过环境变量或 .env 文件加载到运行环境
    • 本地模型无需密钥,支持 Ollama

扩展与插件:把你的模型也“接入进来”

LangExtract 支持“轻量插件”模式,让你无需改动核心库即可添加新的模型提供方。官方示例给出了“自定义 Provider 插件”的完整模版和入口点写法:

1
2
[project.entry-points."langextract.providers"]
custom_gemini = "langextract_provider_example:CustomGeminiProvider"

结合注册与 get_schema_class(),你可以让新模型也拥有“结构化输出约束”的能力,在抽取任务中保持 JSON 结构稳定。


与 OpenAI 与本地 LLM 的使用

  • OpenAI
    需要安装可选依赖 langextract[openai],当前不启用 schema 约束,需 fence_output=Trueuse_schema_constraints=False

  • 本地 LLM(Ollama)
    直接指定 model_id="gemma2:2b" 等本地模型、model_url 与可选 timeout 参数即可运行。官方还提供了 Docker Compose 与示例脚本,便于在本地与容器环境快速实验。


典型应用场景

  • 医疗文书抽取:药物名、剂量、途��、检查结果与结论的结构化抽取,带原文证据便于审阅与质控
  • 法律与合规:合同条款、风险点、关键条款关系的抽取与交互审阅
  • 研发与评审:设计文档中的需求、约束、接口、风险的结构化整理与溯源
  • 客服与运营:邮件或工单中的实体与意图抽取,借助可视化快速质检与回溯

最佳实践建议

  • 示例为王:少样本示例决定模型的“结构与约束”,请确保示例抽取项严格来自原文、按出现顺序列出
  • 证据优先:优先要求模型“贴文本”,在属性字段中再逐步引入世界知识,平衡可验证性与补充性
  • 长文档策略:开启多轮抽取与较小上下文缓存,结合并行提高召回与速度
  • 审阅闭环:用可视化产出的 HTML 做批量质检与复核,形成“抽取—审阅—修正”的迭代闭环
  • 成本与速率:批量任务用 Vertex AI Batch;本地试验与隐私场景用 Ollama

结语

从“抽取信息”到“抽取信息的证据链与可视化审阅”,LangExtract 把非结构化文本处理拉到了实用与工程化的层面。你可以在几行代码里定义任务、跑抽取、做可视化审阅;也可以在复杂项目里扩展模型提供方与约束,让结构化输出稳定可靠。
如果你正在为“文本里有宝藏但难以挖掘”而头疼,不妨试试 LangExtract:让抽取结果既能用、又可信。

  • 快速安装:pip install langextract
  • 推荐模型:gemini-2.5-flash
  • 可视化审阅:保存 JSONL → lx.visualize(...) → 生成自包含 HTML
1
2
3
4
# 结果转可视化
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl", output_dir=".")
html = lx.visualize("extraction_results.jsonl")
open("visualization.html", "w").write(getattr(html, "data", html))