引言

你知道吗?大部分有价值的信息仍存在于非结构化文本中。例如研究论文、临床病历、财务报告等。从这些文本中提取可靠的结构化信息一直是一项挑战。LangExtract 是谷歌推出的开源 Python 库,它利用大语言模型(LLMs)解决了这一问题。你只需通过简单提示词和几个示例定义要提取的内容,它就会借助大语言模型(如谷歌 Gemini、OpenAI 模型或本地模型)从任意长度的文档中提取目标信息。它的另一大优势是支持超长文档(通过分块和多轮处理)以及结果的交互式可视化。让我们更详细地探索这个库。
1. 安装与环境配置
要在本地安装 LangExtract,首先需确保已安装 Python 3.10 及以上版本。该库已发布至 PyPI,在终端或虚拟环境中运行以下命令即可安装:
plaintext
pip install langextract
若需隔离环境,可先创建并激活虚拟环境:
plaintext
python -m venv langextract_env
source langextract_env/bin/activate # Windows 系统:.\langextract_env\Scripts\activate
pip install langextract
此外还有从源码安装和使用 Docker 的方式,你可点击此处查看详情。
2. 配置 API 密钥(适用于云模型)
LangExtract 本身是免费开源的,但如果使用云托管大语言模型(如谷歌 Gemini 或 OpenAI GPT 模型),则必须提供 API 密钥。你可以设置 LANGEXTRACT_API_KEY 环境变量,或在工作目录的 .env 文件中存储该密钥。例如:
plaintext
export LANGEXTRACT_API_KEY="你的 API 密钥"
或在 .env 文件中添加:
plaintext
cat >> .env << 'EOF'
LANGEXTRACT_API_KEY=你的 API 密钥
EOF
echo '.env' >> .gitignore
通过 Ollama 或其他本地后端运行的设备端大语言模型无需 API 密钥。若要启用 OpenAI 模型,需运行 pip install langextract[openai],设置 OPENAI_API_KEY 并指定 OpenAI 的 model_id。面向企业用户的 Vertex AI 支持服务账号认证。
3. 定义提取任务
LangExtract 的使用逻辑是由你明确提取目标。你需要编写清晰的提示词描述,并提供一个或多个 ExampleData 标注,展示在示例文本上的正确提取结果。例如,要从文学语句中提取人物、情感和关系,可编写如下代码:
plaintext
import langextract as lx
prompt = """
按出现顺序提取人物、情感和关系。
提取内容使用原文,不得释义或出现实体重叠。
为每个实体添加有意义的属性以补充上下文。"""
examples = [
lx.data.ExampleData(
text="罗密欧:轻声!那边窗子里亮起来的是什么光?……",
extractions=[
lx.data.Extraction(
extraction_class="character",
extraction_text="罗密欧",
attributes={"emotional_state": "好奇"}
),
lx.data.Extraction(
extraction_class="emotion",
extraction_text="轻声!",
attributes={"feeling": "柔和的惊叹"}
)
]
)
]
这些示例(源自 LangExtract 的官方文档)会明确告知模型期望的结构化输出格式。你可以为特定领域创建类似示例。
4. 执行提取操作
定义好提示词和示例后,只需调用 lx.extract() 函数即可。核心参数如下:
text_or_documents:输入文本、文本列表,甚至是 URL 字符串(LangExtract 可从古腾堡计划等 URL 中获取并处理文本)。prompt_description:提取指令(字符串格式)。examples:展示目标输出的ExampleData列表。model_id:使用的大语言模型标识符(例如谷歌 Gemini Flash 为"gemini-2.5-flash",Ollama 模型如"gemma2:2b",OpenAI 模型如"gpt-4o")。
其他可选参数包括 extraction_passes(为超长文本提高召回率而重复提取)、max_workers(分块并行处理)、fence_output、use_schema_constraints 等。
示例代码如下:
plaintext
input_text = '''朱丽叶:哦,罗密欧,罗密欧!你为什么偏偏是罗密欧呢?
否认你的父亲,抛弃你的姓名吧;
要是你不愿意,只要你宣誓做我的爱人,
我就不再姓凯普莱特了。
罗密欧:我还要听下去吗?还是现在就对她说话?
朱丽叶:只有你的姓名才是我的仇敌;
你即使不姓蒙太古,仍然是你自己。
姓名算什么?我们所称的玫瑰,
换个名字也同样芬芳。'''
result = lx.extract(
text_or_documents=input_text,
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-flash"
)
该函数会将提示词、示例和文本发送至选定的大语言模型,并返回一个 Result 对象。LangExtract 会自动将超长文本分词为块、批量并行调用模型,并合并输出结果。
5. 输出处理与可视化
lx.extract() 的输出是一个包含提取实体及属性的 Python 对象(通常命名为 result)。你可以通过编程方式查看该对象,或保存供后续使用。LangExtract 还提供了结果保存辅助函数:例如将结果写入 JSONL(JSON 行)文件(每行一个文档),并生成交互式 HTML 报告。示例代码如下:
plaintext
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl", output_dir=".")
html = lx.visualize("extraction_results.jsonl")
with open("viz.html", "w") as f:
f.write(html if isinstance(html, str) else html.data)
上述代码会生成 extraction_results.jsonl 文件和交互式 viz.html 文件。JSONL 格式便于处理大型数据集和后续加工,HTML 文件则会在上下文中高亮显示每个提取片段(按类别彩色编码),方便人工检查,效果如下:

6. 支持的输入格式
LangExtract 对输入格式兼容性强,可接收以下类型:
- 纯文本字符串:任何加载到 Python 中的文本(如来自文件或数据库)均可处理。
- URL:如前文所示,可直接传入 URL(例如古腾堡计划链接),格式为
text_or_documents="https://www.gutenberg.org/files/1513/1513-0.txt",LangExtract 会下载并提取该文档内容。 - 文本列表:传入 Python 字符串列表,可一次性处理多个文档。
- 富文本或 Markdown:由于 LangExtract 基于文本层面工作,若输入 Markdown 或 HTML,需先将其预处理为纯文本(LangExtract 本身不解析 PDF 或图片,需提前提取文本)。
7. 结语
LangExtract 简化了非结构化文本到结构化数据的转换过程。它具备高准确率、清晰的来源映射和简洁的自定义方式,在基于规则的方法难以奏效时表现出色。该工具特别适用于复杂或特定领域的数据提取场景。尽管仍有改进空间,但在 2025 年,LangExtract 已成为提取有依据信息的强大工具。
原文链接:https://www.kdnuggets.com/beginners-guide-to-data-extraction-with-langextract-and-llms
