谷歌开源高效文本提取 Python 库LangExtract


项目简介

LangExtract 是一个 Python 库,利用大型语言模型(LLMs)从非结构化文本中提取结构化信息,基于用户定义的指令。它可以处理临床笔记或报告等材料,识别并组织关键细节,同时确保提取的数据与源文本对应。

为什么选择 LangExtract?

  1. 精确的源文本定位:将每次提取映射到源文本中的确切位置,支持可视化高亮,便于追溯和验证。
  2. 可靠的结构化输出:基于少量示例强制执行一致的输出模式,利用支持的模型(如 Gemini)的受控生成功能,确保结果稳健且结构化。
  3. 针对长文档优化:通过优化的文本分块、并行处理和多轮提取策略,解决大文档提取中的“大海捞针”问题,提高召回率。
  4. 交互式可视化:即时生成独立的交互式 HTML 文件,用于在原始上下文中查看和审查数千个提取实体。
  5. 灵活的 LLM 支持:支持从云端 LLM(如 Google Gemini 系列)到本地开源模型(通过内置的 Ollama 接口)的多种模型。
  6. 适应任何领域:仅需少量示例即可定义任何领域的提取任务,无需微调模型。
  7. 利用 LLM 世界知识:通过精确的提示词和少量示例,引导模型在提取任务中利用其知识。推断信息的准确性及其对任务规范的遵循程度取决于所选 LLM、任务的复杂性、提示指令的清晰度以及示例的性质。

快速开始

注意:使用云端托管模型(如 Gemini)需要 API 密钥。请参阅 API 密钥设置[1] 部分了解如何获取和配置密钥。

仅需几行代码即可提取结构化信息。

1. 定义提取任务

首先,创建一个清晰描述提取内容的提示,然后提供高质量的示例以引导模型。

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineimport langextract as lximport textwrap
# 1. 定义提示和提取规则prompt = textwrap.dedent("""\    按出现顺序提取角色、情感和关系。    使用精确文本进行提取,不要改写或重叠实体。    为每个实体提供有意义的属性以添加上下文。""")
# 2. 提供高质量示例以引导模型examples = [    lx.data.ExampleData(        text="罗密欧:轻声!那边窗子里亮起来的是什么光?那就是东方,朱丽叶就是太阳。",        extractions=[            lx.data.Extraction(                extraction_class="角色",                extraction_text="罗密欧",                attributes={"情感状态""惊叹"}            ),            lx.data.Extraction(                extraction_class="情感",                extraction_text="轻声!",                attributes={"感受""温柔的敬畏"}            ),            lx.data.Extraction(                extraction_class="关系",                extraction_text="朱丽叶就是太阳",                attributes={"类型""隐喻"}            ),        ]    )]

2. 运行提取

将输入文本和提示材料提供给 lx.extract 函数。

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 待处理的输入文本input_text = "朱丽叶夫人凝视着星空,心中对罗密欧充满渴望"
# 运行提取result = lx.extract(    text_or_documents=input_text,    prompt_description=prompt,    examples=examples,    model_id="gemini-2.5-flash",)

模型选择:推荐默认使用 gemini-2.5-flash,它在速度、成本和质量之间提供了最佳平衡。对于需要深度推理的复杂任务,gemini-2.5-pro 可能表现更优。对于大规模或生产环境,建议使用 Tier 2 Gemini 配额以提高吞吐量并避免速率限制。详情请参阅 速率限制文档[2]

模型生命周期:请注意,Gemini 模型有生命周期和定义的退役日期。用户应查阅 官方模型版本文档[3] 以了解最新稳定版和旧版信息。

3. 可视化结果

提取结果可以保存为 .jsonl 文件(一种常用的语言模型数据格式),然后生成交互式 HTML 可视化文件以在上下文中审查实体。

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 将结果保存到 JSONL 文件lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl", output_dir=".")
# 从文件生成可视化html_content = lx.visualize("extraction_results.jsonl")with open("visualization.html""w"as f:    f.write(html_content)

这将生成一个动态交互式 HTML 文件:

罗密欧与朱丽叶基础可视化

关于 LLM 知识利用的说明:此示例展示了基于文本证据的提取——提取朱丽叶夫人的情感状态“渴望”并从“凝视着星空”中识别“向往”。任务可以修改为生成更多依赖 LLM 世界知识的属性(例如添加 "身份": "卡普莱特家族的女儿" 或 "文学背景": "悲剧女主角")。文本证据与知识推断之间的平衡由提示指令和示例属性控制。

扩展到长文档

对于更长的文本,可以直接从 URL 并行处理整个文档,并提高敏感度:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 直接从古登堡计划处理《罗密欧与朱丽叶》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    # 较小的上下文以提高准确性)

此方法可以从完整小说中提取数百个实体,同时保持高准确性。交互式可视化无缝处理大量结果集,便于从输出 JSONL 文件中探索数百个实体。查看完整的《罗密欧与朱丽叶》提取示例 →[4] 了解详细结果和性能分析。

安装

通过 PyPI 安装

ounter(linepip install langextract

推荐大多数用户使用。对于隔离环境,建议使用虚拟环境:

ounter(lineounter(lineounter(linepython -m venv langextract_envsource langextract_env/bin/activate  # Windows: langextract_env\Scripts\activatepip install langextract

从源码安装

LangExtract 使用现代 Python 打包工具 pyproject.toml 管理依赖:

使用 -e 参数安装为开发模式,允许修改代码而无需重新安装。

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linegit clone https://github.com/google/langextract.gitcd langextract
# 基本安装:pip install -e .
# 开发安装(包含代码检查工具):pip install -e ".[dev]"
# 测试安装(包含 pytest):pip install -e ".[test]"

Docker

ounter(lineounter(linedocker build -t langextract .docker run --rm -e LANGEXTRACT_API_KEY="your-api-key" langextract python your_script.py

云模型 API 密钥设置

使用云端托管模型(如 Gemini 或 OpenAI)时,需要设置 API 密钥。本地 LLM 不需要 API 密钥。对于使用本地 LLM 的开发者,LangExtract 内置了对 Ollama 的支持,并可通过更新推理端点扩展到其他第三方 API。

API 密钥来源

从以下平台获取 API 密钥:

  • AI Studio[5] 用于 Gemini 模型
  • Vertex AI[6] 用于企业用途
  • OpenAI Platform[7] 用于 OpenAI 模型

在环境中设置 API 密钥

选项 1:环境变量

ounter(lineexport LANGEXTRACT_API_KEY="your-api-key-here"

选项 2:.env 文件(推荐)

将 API 密钥添加到 .env 文件:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 将 API 密钥添加到 .env 文件cat >> .env << 'EOF'LANGEXTRACT_API_KEY=your-api-key-hereEOF
# 保护 API 密钥安全echo '.env' >> .gitignore

在 Python 代码中:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineimport langextract as lx
result = lx.extract(    text_or_documents=input_text,    prompt_description="提取信息...",    examples=[...],    model_id="gemini-2.5-flash")

选项 3:直接提供 API 密钥(不推荐用于生产)

也可以在代码中直接提供 API 密钥,但不推荐用于生产环境:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineresult = lx.extract(    text_or_documents=input_text,    prompt_description="提取信息...",    examples=[...],    model_id="gemini-2.5-flash",    api_key="your-api-key-here"  # 仅用于测试/开发)

使用 OpenAI 模型

LangExtract 也支持 OpenAI 模型。OpenAI 配置示例:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linefrom langextract.inference import OpenAILanguageModel
result = lx.extract(    text_or_documents=input_text,    prompt_description=prompt,    examples=examples,    language_model_type=OpenAILanguageModel,    model_id="gpt-4o",    api_key=os.environ.get('OPENAI_API_KEY'),    fence_output=True,    use_schema_constraints=False)

注意:OpenAI 模型需要设置 fence_output=True 和 use_schema_constraints=False,因为 LangExtract 尚未为 OpenAI 实现模式约束。

项目地址

https://github.com/google/langextract/blob/main/README.md

参考资料

[1] 

API 密钥设置: #云模型-api-密钥设置

[2] 

速率限制文档: https://ai.google.dev/gemini-api/docs/rate-limits#tier-2

[3] 

官方模型版本文档: https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions

[4] 

查看完整的《罗密欧与朱丽叶》提取示例 →: https://github.com/google/langextract/blob/main/docs/examples/longer_text_example.md

[5] 

AI Studio: https://aistudio.google.com/app/apikey

[6] 

Vertex AI: https://cloud.google.com/vertex-ai/generative-ai/docs/sdks/overview

[7] 

OpenAI Platform: https://platform.openai.com/api-keys




扫码加入技术交流群,备注「开发语言-城市-昵称

(文:GitHubStore)

发表评论