長文件擷取範例 📚
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 輸出: 可攜式且可互通的資料格式
- 互動式視覺化: 大規模地在上下文中探索實體