用 LangExtract 把任何长文本变成可检索的结构化数据——零门槛上手指南

谷歌开源了一个能从非结构化信息中提取结构化信息的 Python 库 LangExtract
每一条提取结果都能映射到原文的具体位置
针对长文本做了优化,大幅提升召回率和处理效率
云端模型和本地模型都支持
一键生成 HTML 文件,直观展示千上万条提取实体
只需少量示例即可适配任意领域

阅读预期:30 分钟可完成首次运行,2 小时可独立完成一次完整提取任务


目录

  1. 我为什么需要 LangExtract?
  2. 它到底能做什么?
  3. 5 分钟完成第一次提取
  4. 处理超长文档的实用技巧
  5. 医疗、剧本、报告三大场景示例
  6. 常见问题答疑(FAQ)
  7. 进阶:本地部署与贡献代码

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 时需要)

  1. 打开 AI Studio → 创建 Key
  2. 在项目根目录新建 .env

    LANGEXTRACT_API_KEY=你的真实key
    
  3. .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 流程

  1. Fork 仓库
  2. 新建分支 feature/你的功能
  3. 写测试 → 跑 pytest → 通过
  4. 阅读并签署 CLA
  5. 提交 PR,等待 Code Review

结束语

LangExtract 把“写正则、训模型、拼算力”的繁琐流程简化成“一段提示 + 几条示例”,让任何有 Python 基础的同学都能在午餐前完成一次高质量的结构化提取。
下次拿到 20 万字的文本时,不妨打开本文,复制粘贴 10 行代码,看看它能不能帮你省下三天工作量。

Happy Extracting!