AI热点 17小时前 61 浏览次数 0 评论

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

AI中国
AI中国

发布了 8252 文章

项目简介


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(line
import langextract as lx
import 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(line
pip install langextract


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


ounter(lineounter(lineounter(line
python -m venv langextract_env
source langextract_env/bin/activate  # Windows: langextract_env\Scripts\activate
pip install langextract




从源码安装


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


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


ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
git clone https://github.com/google/langextract.git
cd langextract


# 基本安装:
pip install -e .


# 开发安装(包含代码检查工具):
pip install -e ".[dev]"


# 测试安装(包含 pytest):
pip install -e ".[test]"





Docker


ounter(lineounter(line
docker 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(line
export 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-here
EOF


# 保护 API 密钥安全
echo ".env" >> .gitignore









在 Python 代码中:


ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
import 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(line
result = 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(line
from 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=Trueuse_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”。


AI中国

AI中国

8252 文章 1320437 浏览次数 950300 粉丝

评论 (0)

睡觉动画