简介
LangExtract 是一个 Python 库,利用大语言模型(LLMs)根据用户定义的指令,从非结构化的文本文件中提取结构化信息。它能够处理临床记录、报告等材料,识别并组织关键细节,同时确保提取的数据与源文本一致。
为什么选择 LangExtract?
•精准的源文本映射 :将每次提取与源文本中的准确位置进行映射,支持可视化高亮,便于追溯和验证。•可靠的结构化输出 :基于少量示例强制输出一致的模式,利用像 Gemini 等支持的模型的控制生成特性,确保提取结果结构化且可靠。•优化长文档处理 :通过文本分块、并行处理和多轮传递等优化策略,解决大文档提取中的“干草堆中的针”问题,提升召回率。•交互式可视化 :即时生成自包含的 HTML 文件,方便查看和审查数千个提取的实体及其原始上下文。•灵活支持 LLM 模型 :支持你选择的模型,从基于云的 LLM(如 Google Gemini 系列)到通过内置 Ollama 接口的本地开源模型。•适应任意领域 :仅需少量示例即可定义任何领域的提取任务,LangExtract 无需对模型进行微调,灵活适应各种需求。•利用 LLM 的世界知识 :通过精准的提示词和少量示例,引导模型在任务中使用其已知的世界知识。提取结果的准确性和符合任务规范的程度取决于所选 LLM、任务的复杂性、提示指令的清晰度和示例的质量。
快速开始
注意 :使用像 Gemini 这样的云托管模型需要 API 密钥。请参API 密钥设置部分了解如何获取和配置密钥。
只需几行代码即可提取结构化信息。
1. 定义你的提取任务
首先,创建一个清晰描述你希望提取内容的提示词。然后,提供一个高质量的示例,帮助模型理解。
import langextract as lx
import textwrap
# 1. 定义提示词和提取规则
prompt = textwrap.dedent("""\
提取按出现顺序排列的人物、情感和关系。
使用准确的文本进行提取,不要进行意译或重叠实体。
为每个实体提供有意义的属性以增加上下文信息。""")
# 2. 提供一个高质量的示例来引导模型
examples =[
lx.data.ExampleData(
text="ROMEO. But soft! What light through yonder window breaks? It is the east, and Juliet is the sun.",
extractions=[
lx.data.Extraction(
extraction_class="character",
extraction_text="ROMEO",
attributes={"emotional_state":"wonder"}
),
lx.data.Extraction(
extraction_class="emotion",
extraction_text="But soft!",
attributes={"feeling":"gentle awe"}
),
lx.data.Extraction(
extraction_class="relationship",
extraction_text="Juliet is the sun",
attributes={"type":"metaphor"}
),
]
)
]
2. 运行提取
将输入文本和提示材料传递给 lx.extract 函数进行处理。
# 要处理的输入文本
input_text ="Lady Juliet gazed longingly at the stars, her heart aching for Romeo"
# 运行提取
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 配额 以提高吞吐量并避免达到速率限制。有关详细信息,请参阅速率限制文档[1]。
模型生命周期:请注意,Gemini 模型具有生命周期,并且会有明确的退休日期。用户应查看官方的模型版本文档[2],以便随时了解最新的稳定版本和遗留版本。
3. 可视化结果
提取的结果可以保存为 .jsonl 文件,这是处理语言模型数据的常用格式。然后,LangExtract 可以从该文件生成一个交互式 HTML 可视化,帮助你在上下文中审查提取的实体。
# 将提取结果保存为 JSONL 文件
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl", output_dir=".")
从文件生成可视化
python
复制代码
# 从文件生成可视化内容
html_content = lx.visualize("extraction_results.jsonl")
with open("visualization.html","w")as f:
if hasattr(html_content,'data'):
f.write(html_content.data)# 对于 Jupyter/Colab
else:
f.write(html_content)
这将创建一个动画和交互式的 HTML 文件:
关于 LLM 知识利用的说明:本示例展示了紧贴文本证据的提取——提取了朱丽叶的情感状态“渴望”,并从“长时间凝视星空”中识别出了“渴望”。该任务可以通过修改为生成更多依赖 LLM 世界知识的属性来进行调整(例如,添加“身份”: "Capulet 家族的女儿"或 “文学背景”: "悲剧女主角")。文本证据与知识推断之间的平衡由你的提示指令和示例属性控制。
扩展到更长的文档
对于较大的文本,你可以直接从 URL 处理整个文档,使用并行处理和增强的灵敏度:
# 从 Project Gutenberg 直接处理《罗密欧与朱丽叶》
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 文件的数百个实体。查看完整的《罗密欧与朱丽叶》提取示例 [3]→ 以了解详细的结果和性能见解。
Vertex AI 批处理
通过启用 Vertex AI 批处理 API 来节省大规模任务的成本:language\_model\_params={"vertexai": True, "batch": {"enabled": True}}。
查看此示例中 Vertex AI 批处理 API 的使用示例[4]。
安装
从 PyPI 安装
pip install langextract
推荐大多数用户使用此方式安装。如果你需要在隔离环境中安装,建议使用虚拟环境:
python -m venv langextract_env
source langextract_env/bin/activate # 在 Windows 上:langextract_env\Scripts\activate
pip install langextract
从源码安装
LangExtract 使用现代 Python 打包方式,通过 pyproject.toml 进行依赖管理:
使用 -e 安装包时,会将包置于开发模式,允许你在不重新安装的情况下修改代码。
git clone https://github.com/google/langextract.git
cd langextract
# 基本安装:
pip install -e .
# 开发安装(包括 lint 工具):
pip install -e ".[dev]"
# 测试安装(包括 pytest):
pip install -e ".[test]"
Docker 安装
docker build -t langextract .
docker run --rm -e LANGEXTRACT_API_KEY="your-api-key" langextract python your_script.py
云模型的 API 密钥设置
在使用 LangExtract 和云托管模型(如 Gemini 或 OpenAI)时,你需要设置 API 密钥。而对于本地模型(On-device models),则不需要 API 密钥。对于使用本地 LLM 的开发者,LangExtract 提供了对 Ollama 的内置支持,并且可以通过更新推理端点来扩展对其他第三方 API 的支持。
云模型的 API 密钥设置
在使用 LangExtract 和云托管模型(如 Gemini 或 OpenAI)时,你需要设置 API 密钥。对于本地模型(On-device models),则不需要 API 密钥。对于使用本地 LLM 的开发者,LangExtract 提供了对 Ollama 的内置支持,并且可以通过更新推理端点来扩展对其他第三方 API 的支持。
获取 API 密钥的来源
你可以从以下地方获取 API 密钥:
•AI Studio[5]:用于 Gemini 模型•Vertex AI[6]:用于企业级使用•OpenAI 平台[7]:用于 OpenAI 模型
在环境中设置 API 密钥
选项 1:环境变量
export LANGEXTRACT\_API\_KEY="your-api-key-here"
选项 2:.env 文件(推荐)
将 API 密钥添加到 .env 文件中:
# 将 API 密钥添加到 .env 文件
cat >>.env <<'EOF'
LANGEXTRACT_API_KEY=your-api-key-here
EOF
# 确保 API 密钥的安全
echo '.env'>>.gitignore
在你的 Python 代码中:
import langextract as lx
result = lx.extract(
text_or_documents=input_text,
prompt_description="Extract information...",
examples=[...],
model_id="gemini-2.5-flash"
)
选项 3:直接在代码中提供 API 密钥(不推荐用于生产环境)
你也可以直接在代码中提供 API 密钥,但不建议在生产环境中使用此方法:
result = lx.extract(
text_or_documents=input_text,
prompt_description="Extract information...",
examples=[...],
model_id="gemini-2.5-flash",
api_key="your-api-key-here"# 仅用于测试/开发
)
选项 4:Vertex AI(服务账户)
使用 Vertex AI [8]通过服务账户进行身份验证:
result = lx.extract(
text_or_documents=input_text,
prompt_description="Extract information...",
examples=[...],
model_id="gemini-2.5-flash",
language_model_params={
"vertexai":True,
"project":"your-project-id",
"location":"global"# 或者使用区域端点
}
)
添加自定义模型提供者
LangExtract 支持通过轻量级插件系统添加自定义 LLM 提供者。你可以在不修改核心代码的情况下,为新模型提供支持。
•独立于核心库添加新模型支持•将你的提供者作为独立的 Python 包进行分发•保持自定义依赖项的隔离•通过基于优先级的解析,覆盖或扩展内置提供者
有关如何操作的详细指南,请参见 提供者系统文档[9],了解如何:
•使用 @registry.register(...) 注册提供者•发布入口点供发现•可选地使用 get\_schema\_class() 提供结构化输出的模式•通过 create\_model(...) 集成到工厂中
使用 OpenAI 模型
LangExtract 支持 OpenAI 模型(需要可选的依赖项:pip install langextract[openai]):
import langextract as lx
result = lx.extract(
text_or_documents=input_text,
prompt_description=prompt,
examples=examples,
model_id="gpt-4o",# 自动选择 OpenAI 提供者
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 实现模式约束。
使用本地 LLM(Ollama)
LangExtract 支持使用 Ollama 进行本地推理,让你可以在不使用 API 密钥的情况下运行模型:
import langextract as lx
result = lx.extract(
text_or_documents=input_text,
prompt_description=prompt,
examples=examples,
model_id="gemma2:2b",# 自动选择 Ollama 提供者
model_url="http://localhost:11434",
fence_output=False,
use_schema_constraints=False
)
快速设置 :从 ollama.com[10] 安装 Ollama,运行 ollama pull gemma2:2b,运行 ollama serve。
有关详细的安装、Docker 设置和示例,请查看 examples/ollama/目录。
更多示例
以下是 LangExtract 在实际应用中的更多示例:
《罗密欧与朱丽叶》全文提取
LangExtract 可以直接从 URL 处理完整文档。本示例展示了从 Project Gutenberg 提取《罗密欧与朱丽叶》全文(147,843 个字符),展示了并行处理、顺序提取轮次以及长文档处理的性能优化。
查看《罗密欧与朱丽叶》全文提取示例 →[11]
药物提取
免责声明 :此演示仅用于展示 LangExtract 的基础能力。它不代表完成的或批准的产品,不用于诊断或建议任何疾病或病情的治疗,也不应作为医疗建议使用。
LangExtract 在从临床文本中提取结构化医疗信息方面表现出色。以下示例展示了基本的实体识别(药物名称、剂量、给药途径)和关系提取(将药物与其属性关联),展示了 LangExtract 在医疗应用中的有效性。
查看药物提取示例 →[12]
放射学报告结构化:RadExtract
探索 RadExtract ,一个在 HuggingFace Spaces 上的实时互动演示,展示了 LangExtract 如何自动化地将放射学报告进行结构化处理。你可以直接在浏览器中尝试,无需任何设置。
查看 RadExtract 演示 →[13]
好了,今天的内容就分享到这里了,下期见!
https://github.com/google/langextract?tab=readme-ov-file#api-key-setup-for-cloud-models
References
[1] 速率限制文档:https://ai.google.dev/gemini-api/docs/rate-limits?hl=zh-cn#tier-2
[2]官方的模型版本文档:https://docs.cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions?hl=zh-cn
[3]查看完整的《罗密欧与朱丽叶》提取示例 :https://github.com/google/langextract/blob/main/docs/examples/longer\_text\_example.md
[4]使用示例:https://github.com/google/langextract/blob/main/docs/examples/batch\_api\_example.md
[5]AI Studio:https://aistudio.google.com/app/api-keys
[6]Vertex AI:https://docs.cloud.google.com/vertex-ai/generative-ai/docs/sdks/overview?hl=zh-cn
[7]OpenAI 平台:https://platform.openai.com/api-keys
[8]Vertex AI :https://docs.cloud.google.com/vertex-ai/docs/start/introduction-unified-platform?hl=zh-cn
[9]提供者系统文档:https://github.com/google/langextract/blob/main/langextract/providers/README.md
[10]ollama.com:https://ollama.com/
[11]查看《罗密欧与朱丽叶》全文提取示例 →:https://github.com/google/langextract/blob/main/docs/examples/longer\_text\_example.md
[12]查看药物提取示例 →:https://github.com/google/langextract/blob/main/docs/examples/medication\_examples.md
[13]查看 RadExtract 演示
