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_envsource langextract_env/bin/activate # Windows: langextract_env\Scripts\activate
pip install langextract
从源码安装
bashgit 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:直接在代码中提供 (不推荐用于生产)
您可以在调用函数时直接传入密钥,但这仅建议用于测试或开发。
pythonresult = lx.extract(
# ...,
api_key="your-api-key-here"
)
更多示例
- 《罗密欧与朱丽叶》全文提取:展示了如何处理长达 14.7 万字符的完整文档,并进行了性能优化。
- 药物信息提取:展示了如何从临床文本中提取药物名称、剂量等结构化医疗信息。
- 放射学报告结构化 (RadExtract):一个在 HuggingFace Spaces 上的实时交互式演示,展示了 LangExtract 如何自动结构化放射学报告。
免责声明
这不是一个官方支持的 Google 产品。在健康相关应用中使用 LangExtract 时,需遵守相关的使用条款。该工具仅用于演示其基础能力,不构成任何医疗建议。