欣淇
发布于 2026-05-18 / 0 阅读
0
0

🎯 LangExtract:Google 出品 36k Stars,用 LLM 从非结构化文本中提取结构化数据,精确到字符位置

🎯 LangExtract:Google 出品 36k Stars,用 LLM 从非结构化文本中提取结构化数据,精确到字符位置

项目地址:https://github.com/google/langextract | ⭐ 36,478 Stars | 🛠 Python | 📜 Apache-2.0

老实说,搞 NLP 的谁没被「从文本里抽结构化数据」这事恶心过?正则写到怀疑人生,规则引擎改到想吐,Fine-tune 一个 BERT 模型花了三天结果换个领域又废了。Google 刚开源的 LangExtract 直接告诉你:别折腾了,让 LLM 来干。

这玩意儿解决了什么问题?

一句话:你把非结构化文本扔进去,给几个例子,它给你吐出精确到字符位置的 JSON 结构化数据。

核心能力:

  • Source Grounding — 每个提取结果都映射到原文的精确字符位置,不是瞎编的。你点一下就能看到原文上下文,方便验证
  • Few-shot 驱动 — 不用训练模型,给 2-3 个高质量例子它就懂了
  • 长文档优化 — 自动分块 + 并行处理 + 多轮提取,完整处理一本《罗密欧与朱丽叶》不在话下
  • 可视化一把梭 — 一行代码生成交互式 HTML 报告,提取结果在原文中高亮显示
  • 多模型支持 — Gemini、GPT、本地 Ollama(gemma2:2b 都能用)

上手:5 行代码跑起来

pip install langextract

设置 API key(用 Gemini 的话去 AI Studio 搞一个免费的):

export LANGEXTRACT_API_KEY="your-api-key-here"

然后写 5 行代码:

import langextract as lx

result = lx.extract(
    text_or_documents="Lady Juliet gazed longingly at the stars, her heart aching for Romeo",
    prompt_description="Extract characters and emotions from the text",
    examples=[lx.data.ExampleData(
        text="ROMEO. But soft! What light through yonder window breaks?",
        extractions=[
            lx.data.Extraction(extraction_class="character", extraction_text="ROMEO"),
            lx.data.Extraction(extraction_class="emotion", extraction_text="But soft!"),
        ]
    )],
    model_id="gemini-2.5-flash",
)

看结果:

for e in result.extractions:
    print(f"  {e.extraction_class}: '{e.extraction_text}' @ {e.char_interval}")
# character: 'Lady Juliet' @ [0:12]
# emotion: 'longingly' @ [18:27]

每个结果都带着 char_interval,精确定位到原文的哪个字符区间。想只看有原文定位的结果?一行过滤:

grounded = [e for e in result.extractions if e.char_interval]

骚操作:整本小说提取 + 可视化

不用分块写脚本,LangExtract 内置了长文档并行处理:

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,         # 并行处理
)

然后一键生成交互式 HTML 可视化,所有提取的实体在原文中高亮显示,鼠标移上去就看属性——说实话我第一次看到这效果还是有点惊艳的。

本地也能跑:Ollama 加持

不想用云端 API?Ollama 用户直接用:

result = lx.extract(
    text_or_documents=input_text,
    prompt_description="Extract information...",
    examples=[...],
    model_id="gemma2:2b",        # 自动识别为 Ollama provider
    model_url="http://localhost:11434",
)

先装好 Ollama、拉模型、跑 ollama serve,齐活。

跟传统方案比怎么样?

  • 正则表达式 — 维护成本高,改一次崩一片,换领域要重写
  • 训练 NER 模型 — 标注 + 训练成本高,换领域得重新标注
  • LangExtract — 维护成本低,换领域换 prompt 再加 2 个例子就搞定

最骚的是,它的 Source Grounding 机制让你敢用——不像裸调 LLM 那样一脸懵逼地信它。每个提取值都能追溯回原文,错了你知道是哪错。

要点总结:

  • pip install langextract 就能用,支持 Gemini/GPT/Ollama
  • Few-shot 示例驱动,换领域只换例子不换代码
  • Source Grounding 精确到字符级别,结果可追溯可验证
  • 内置长文档并行处理 + 交互式可视化
  • 医疗/法律/金融等结构化提取场景直接抄作业

评论