Skip to content

长文档提取示例 📚

LangExtract 可以直接从 URL 处理完整文档,通过并行处理和增强敏感度特性高精度处理大型文本。

处理方式

LangExtract 自动处理长文档:

  1. 将文本分割成可管理的块
  2. 并行从每个块提取
  3. 聚合并去重结果

代码示例:《罗密欧与朱丽叶》全文

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 输出: 便携且可互操作的数据格式
  • 交互式可视化: 大规模地在上下文中探索实体

非官方指南。与 Google 无关。