长文档提取示例 📚
LangExtract 可以直接从 URL 处理完整文档,通过并行处理和增强敏感度特性高精度处理大型文本。
处理方式
LangExtract 自动处理长文档:
- 将文本分割成可管理的块
- 并行从每个块提取
- 聚合并去重结果
代码示例:《罗密欧与朱丽叶》全文
WARNING
运行此示例会处理大型文档(约 44,000 tokens),将产生 API 费用。对于大规模使用,建议申请 Tier 2 Gemini 配额。
python
import langextract as lx
import textwrap
# 定义全面的 prompt 和示例
prompt = textwrap.dedent("""\
从给定文本中提取角色、情感和关系。
为每个实体提供有意义的属性以增加上下文和深度。
重要:使用输入中的精确文本作为 extraction_text,不要改写。
按出现顺序提取实体,文本范围不重叠。
注意:在剧本中,说话者名字以全大写字母出现,后跟句点。""")
examples = [
lx.data.ExampleData(
text=textwrap.dedent("""\
ROMEO. But soft! What light through yonder window breaks?
It is the east, and Juliet is the sun.
JULIET. O Romeo, Romeo! Wherefore art thou Romeo?"""),
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", "character": "Romeo"}
),
lx.data.Extraction(
extraction_class="relationship",
extraction_text="Juliet is the sun",
attributes={"type": "metaphor", "character_1": "Romeo", "character_2": "Juliet"}
),
lx.data.Extraction(
extraction_class="character",
extraction_text="JULIET",
attributes={"emotional_state": "yearning"}
),
lx.data.Extraction(
extraction_class="emotion",
extraction_text="Wherefore art thou Romeo?",
attributes={"feeling": "longing question", "character": "Juliet"}
),
]
)
]
# 直接从 Project Gutenberg 处理《罗密欧与朱丽叶》
print("正在从 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 # 较小的上下文提高准确性
)
print(f"从 {len(result.text):,} 个字符中提取了 {len(result.extractions)} 个实体")
# 保存并可视化结果
lx.io.save_annotated_documents([result], output_name="romeo_juliet_extractions.jsonl", output_dir=".")
# 生成交互式可视化
html_content = lx.visualize("romeo_juliet_extractions.jsonl")
with open("romeo_juliet_visualization.html", "w") as f:
if hasattr(html_content, 'data'):
f.write(html_content.data)
else:
f.write(html_content)
print("交互式可视化已保存至 romeo_juliet_visualization.html")长文档关键特性
- URL 处理: 直接从 URL 处理文档
- 多次提取: 多次提取提高复杂文本的召回率
- 并行处理:
max_workers参数用于并发块处理 - 最优分块:
max_char_buffer控制上下文大小以提高准确性 - JSONL 输出: 便携且可互操作的数据格式
- 交互式可视化: 大规模地在上下文中探索实体