LangExtract:用Python提取大模型结构化数据的利器

LangExtract 是一个 Python 库,它利用大语言模型(LLM)根据用户指令从非结构化文本中提取结构化信息。它的核心优势在于能够将提取的每个数据点精确地映射回原文位置、保证输出格式的可靠性,并为处理长文档进行了优化。此外,它还支持交互式可视化、兼容多种云端及本地模型,并且能够通过简单的示例适应任何领域的提取任务。

LangExtract 的核心优势

    • 精确的源定位:将每一次提取都精确映射到源文本中的具体位置,并支持可视化高亮,方便用户追溯和验证。
    • 可靠的结构化输出:基于您提供的少量示例,强制执行一致的输出格式。在支持的模型(如 Gemini)中,通过受控生成来确保结果的稳健性。
    • 针对长文档的优化:通过文本分块、并行处理和多轮提取等优化策略,克服了在大型文档中提取信息的“大海捞针”难题,有效提升召回率。
    • 交互式可视化:能够即时生成一个独立的交互式 HTML 文件,让您在原文语境中直观地审查数千个提取出的实体。
    • 灵活的 LLM 支持:支持您偏好的模型,无论是像 Google Gemini 家族这样的云端大模型,还是通过内置的 Ollama 接口运行的本地开源模型。
    • 适应任何领域:仅需提供几个示例,即可为任何领域定义提取任务,无需对模型进行微调。
    • 利用 LLM 的知识:您可以通过精确的提示词和示例来引导模型在多大程度上利用其“世界知识”。

提取的准确性取决于所选的 LLM、任务的复杂性、提示指令的清晰度以及示例的质量。

快速上手

使用云端托管模型(如 Gemini)需要 API 密钥。以下示例展示了如何用几行代码完成结构化信息提取。

1. 定义提取任务

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

import langextract as lx

import textwrap

1. 定义提示和提取规则

prompt = textwrap.dedent("""\

按出现顺序提取人物、情感和关系。

提取时使用原文,不要转述或重叠。

为每个实体提供有意义的属性以增加上下文。""")

2. 提供一个高质量的示例来引导模型

examples = [

lx.data.ExampleData(

text="ROMEO. 但是别作声!那边窗子里亮起来的是什么光?那就是东方,朱丽叶就是太阳。",

extractions=[

lx.data.Extraction(

extraction_class="人物",

extraction_text="ROMEO",

attributes={"情绪状态": "惊叹"}

),

lx.data.Extraction(

extraction_class="情感",

extraction_text="但是别作声!",

attributes={"感受": "轻柔的敬畏"}

),

lx.data.Extraction(

extraction_class="关系",

extraction_text="朱丽叶就是太阳",

attributes={"类型": "隐喻"}

),

]

)

]

2. 运行提取

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

    • 模型选择:推荐使用 gemini-1.5-flash,它在速度、成本和质量之间取得了很好的平衡。对于需要更深层推理的复杂任务,gemini-1.5-pro 可能会提供更好的结果。

# 需要处理的输入文本

input_text = "朱丽叶小姐渴望地凝视着星星,她的心因罗密欧而疼痛"

运行提取

result = lx.extract(

text_or_documents=input_text,

prompt_description=prompt,

examples=examples,

model_id="gemini-1.5-flash",

)

3. 可视化结果

提取结果可以保存为 .jsonl 文件,这是一种常用于处理语言模型数据的格式。然后,LangExtract 可以从这个文件生成一个交互式 HTML 可视化界面,方便您审查。

# 将结果保存到 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)

处理长文档

对于像小说这样的长文本,您可以直接从 URL 处理整个文档,并启用并行处理以提高效率。

# 直接从古腾堡计划处理《罗密欧与朱丽叶》全文

result = lx.extract(

text_or_documents="https://www.gutenberg.org/files/1513/1513-0.txt",

prompt_description=prompt,

examples=examples,

model_id="gemini-1.5-flash",

extraction_passes=3, # 通过多次扫描提高召回率

max_workers=20, # 并行处理以加快速度

max_char_buffer=1000 # 使用较小的上下文以提高准确性

)

这种方法可以从整本小说中提取数百个实体,同时保持高准确性。

安装指南

  • 从 PyPI 安装 (推荐)

    建议在虚拟环境中使用:

    python -m venv langextract_env

    source langextract_env/bin/activate # Windows: langextract_env\Scripts\activate

    pip install langextract

  • 从源码安装

    bash

    git clone https://github.com/google/langextract.git

    cd langextract

    pip install -e .

API 密钥设置

使用云端模型(如 Gemini)时,需要设置 API 密钥。本地模型则不需要。

  • 选项 1:环境变量

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

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

    在您的项目根目录创建一个 .env 文件,并添加您的密钥:

    LANGEXTRACT_API_KEY=your-api-key-here

  • 选项 3:直接在代码中提供 (不推荐用于生产)

    您可以在调用函数时直接传入密钥,但这仅建议用于测试或开发。

    python

    result = lx.extract(

    # ...,

    api_key="your-api-key-here"

    )

更多示例

    • 《罗密欧与朱丽叶》全文提取:展示了如何处理长达 14.7 万字符的完整文档,并进行了性能优化。
    • 药物信息提取:展示了如何从临床文本中提取药物名称、剂量等结构化医疗信息。
    • 放射学报告结构化 (RadExtract):一个在 HuggingFace Spaces 上的实时交互式演示,展示了 LangExtract 如何自动结构化放射学报告。

免责声明

这不是一个官方支持的 Google 产品。在健康相关应用中使用 LangExtract 时,需遵守相关的使用条款。该工具仅用于演示其基础能力,不构成任何医疗建议。