用 LangExtract 把任何长文本变成可检索的结构化数据——零门槛上手指南
谷歌开源了一个能从非结构化信息中提取结构化信息的 Python 库 LangExtract
每一条提取结果都能映射到原文的具体位置
针对长文本做了优化,大幅提升召回率和处理效率
云端模型和本地模型都支持
一键生成 HTML 文件,直观展示千上万条提取实体
只需少量示例即可适配任意领域
阅读预期:30 分钟可完成首次运行,2 小时可独立完成一次完整提取任务
目录
-
我为什么需要 LangExtract? -
它到底能做什么? -
5 分钟完成第一次提取 -
处理超长文档的实用技巧 -
医疗、剧本、报告三大场景示例 -
常见问题答疑(FAQ) -
进阶:本地部署与贡献代码
1. 我为什么需要 LangExtract?
想象一下:
-
你手里有一本 15 万字的小说,老板要求“把所有人物关系整理成表格”; -
放射科每天产出上百份自由文本报告,你希望自动生成结构化数据; -
客服聊天记录散落在 200 份 PDF 里,你想快速提取“用户情绪+投诉产品”。
传统做法是写正则或训练专属模型,成本高、周期长。
LangExtract 只用“一段提示 + 几条示例”就帮你完成这件事——无需微调模型,也无需写正则。
2. 它到底能做什么?
功能 | 一句话解释 | 典型场景 |
---|---|---|
精确溯源 | 每个字段都能定位到原文 | 审计、合规 |
结构稳定 | 输出 JSON Schema 保持一致 | 数据入库 |
长文本优化 | 自动切块、并行、多轮 | 书籍、病历 |
一键可视化 | 生成可交互 HTML | 产品演示 |
多模型支持 | Gemini、Ollama、自托管 | 成本可控 |
零样本适应 | 不给示例也能跑,给几条示例更准确 | 任何垂直领域 |
3. 5 分钟完成第一次提取
3.1 安装
# 推荐虚拟环境
python -m venv lx_env
source lx_env/bin/activate # Windows 用 lx_env\Scripts\activate
pip install langextract
3.2 获取并配置 API Key(仅使用 Gemini 时需要)
-
打开 AI Studio → 创建 Key -
在项目根目录新建 .env
LANGEXTRACT_API_KEY=你的真实key
-
把 .env
加入.gitignore
,防止误提交。
3.3 写第一段代码
import langextract as lx
import textwrap
# 告诉模型要做什么
prompt = textwrap.dedent("""\
提取角色、情绪、关系,按出场顺序。
使用原文,不改动措辞,不重叠实体。
给每个实体加有意义的属性。""")
# 给模型看一个高质量示例
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="角色",
extraction_text="ROMEO",
attributes={"情绪": "惊叹"}
),
lx.data.Extraction(
extraction_class="情绪",
extraction_text="But soft!",
attributes{"感受": "温柔的震撼"}
),
lx.data.Extraction(
extraction_class="关系",
extraction_text="Juliet is the sun",
attributes{"类型": "比喻"}
)
]
)
]
# 输入待处理文本
input_text = "Lady Juliet gazed longingly at the stars, her heart aching for Romeo"
# 运行
result = lx.extract(
text_or_documents=input_text,
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-flash" # 默认推荐,性价比高
)
3.4 结果保存与可视化
# 保存为 JSONL
lx.io.save_annotated_documents([result], "demo.jsonl")
# 生成交互式网页
html = lx.visualize("demo.jsonl")
open("demo.html", "w", encoding="utf-8").write(html)
用浏览器打开 demo.html
,即可看到原文高亮与实体卡片。
4. 处理超长文档的实用技巧
4.1 直接读取网络文本
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, # 多轮提高召回
max_workers=20, # 并行加速
max_char_buffer=1000 # 每块长度,调小可提升精度
)
4.2 运行时间对照表(本地实测,供参考)
文本长度 | 并行块数 | extraction_passes | 耗时 | 提取实体数 |
---|---|---|---|---|
14 万字符 | 20 | 3 | ≈ 90 秒 | 600+ |
3 万字符 | 8 | 2 | ≈ 25 秒 | 150+ |
5 千字符 | 1 | 1 | ≈ 5 秒 | 30+ |
5. 三大场景完整示例
5.1 剧本人物关系——《罗密欧与朱丽叶》全文
-
原文:Project Gutenberg 版全文 -
提取目标:人物、情绪、关系 -
结果:JSONL 可直接导入 Neo4j 构建知识图谱 -
官方完整示例
5.2 医疗场景——用药信息提取
免责声明:仅用于演示 LangExtract 能力,非医疗建议。
prompt = "抽取药品名称、剂量、给药途径、频次。"
examples = [lx.data.ExampleData(
text="患者每日口服阿司匹林 100 mg 两次",
extractions=[
lx.data.Extraction("药品", "阿司匹林", {"剂量": "100 mg", "途径": "口服", "频次": "bid"})
]
)]
输出字段可直接对接医院信息系统。
官方示例与更多医学用例
5.3 放射科报告结构化——RadExtract 在线演示
无需安装,浏览器打开即可体验:
HuggingFace Spaces: RadExtract
6. 常见问题答疑(FAQ)
提问 | 回答 |
---|---|
没有 GPU 能跑吗? | 用 Gemini 这类云端模型即可,本地零 GPU。 |
数据会上传谷歌吗? | 使用 Gemini 时文本会发送到谷歌 API;用 Ollama 本地模型则完全本地。 |
如何换中文模型? | 目前 Gemini 支持中文,示例里的提示词直接写中文即可。 |
结果格式能改吗? | 在 extraction_class 里自定义类别,输出 JSON Schema 自动匹配。 |
可以离线用吗? | 可以,通过 Ollama 拉起本地 LLM,再修改 inference endpoint。 |
需要多少示例? | 0 条也能跑,3~5 条高质量示例可显著提升一致性。 |
多语言支持? | 提示词与示例用什么语言,模型就按该语言输出。 |
7. 进阶:本地部署与贡献代码
7.1 从源码安装(含测试、开发工具)
git clone https://github.com/google/langextract.git
cd langextract
# 基础安装
pip install -e .
# 带开发工具
pip install -e ".[dev]"
# 带测试套件
pip install -e ".[test]"
7.2 运行测试
pytest tests
# 或完整 CI 矩阵
tox
7.3 提交 PR 流程
-
Fork 仓库 -
新建分支 feature/你的功能
-
写测试 → 跑 pytest
→ 通过 -
阅读并签署 CLA -
提交 PR,等待 Code Review
结束语
LangExtract 把“写正则、训模型、拼算力”的繁琐流程简化成“一段提示 + 几条示例”,让任何有 Python 基础的同学都能在午餐前完成一次高质量的结构化提取。
下次拿到 20 万字的文本时,不妨打开本文,复制粘贴 10 行代码,看看它能不能帮你省下三天工作量。
Happy Extracting!