![[Open Source] LangExtract神器,已準備就緒,提取時代即將到來! [Open Source] LangExtract神器,已準備就緒,提取時代即將到來!](https://i0.wp.com/raw.githubusercontent.com/google/langextract/main/docs/_static/romeo_juliet_basic.gif?ssl=1)
用 LangExtract 輕鬆搞定文字資料整理:給台灣初學者的 LLM 提取神器
網址:https://github.com/google/langextract
你有大量的文字資料需要整理嗎?不管是臨床筆記、報告、合約,還是劇本,總是覺得手動整理費時又費力? 沒關係,今天要介紹的 LangExtract,就是一個能讓你輕鬆從文字中提取結構化資訊的 Python 函式庫,而且特別適合初學者! 透過簡單的設定,就能利用 LLM(大型語言模型)的力量,自動從非結構化的文字資料中抓取出你想要的資訊,像是人物、情感、關係等等,讓你省下大量時間,專注在更重要的工作上。
什麼是 LangExtract? 為什麼要用它?
LangExtract 是一個基於 Python 的函式庫,它利用 LLM 的強大能力,來從非結構化的文字文件中提取結構化資訊。你可以把它想像成一個文字資料的「解碼器」,只要你告訴它你想要抓取什麼資訊,它就能自動幫你從文字中找出並整理出來。
LangExtract 的優點:
- 精準的來源定位: LangExtract 會將提取出的資訊,對應到原始文本的確切位置。這表示你可以很容易地追蹤和驗證資訊,並且透過視覺化的方式,在原始文本中高亮顯示提取的資訊,方便你快速確認。
-
可靠的結構化輸出: 你可以透過幾個例子來定義你想要的輸出格式,讓 LangExtract 產生一致的結構化結果。這可以確保你的資料整理結果更可靠,方便後續的分析和應用。
-
針對長文檔優化: 處理大型文件時,傳統的提取方法往往會遇到「大海撈針」的困境。LangExtract 透過文本分塊、並行處理等多種策略,有效地解決了這個問題,確保了提取的準確性和完整性。
-
互動式視覺化: LangExtract 可以生成一個自包含的、互動式的 HTML 檔案,讓你方便地視覺化和審閱提取出的資訊。 你可以輕鬆地在上下文中查看提取到的所有實體,這對於理解資料和驗證結果非常有用。
-
靈活的 LLM 支援: 支援多種 LLM 模型,包括 Google 的 Gemini 系列雲端模型,以及透過內建的 Ollama 介面使用的本地開源模型。 你可以根據自己的需求和預算,選擇最適合的模型。
-
適用於任何領域: 你只需要提供幾個例子,就能為任何領域定義提取任務。 無需對模型進行任何微調,LangExtract 就能快速適應你的需求。
-
善用 LLM 的世界知識: 通過精確的提示和少量示例,你可以影響提取任務利用 LLM 的知識。 提取信息的準確性和對任務規格的遵守程度,取決於所選 LLM、任務的複雜性、提示指令的清晰度和提示示例的性質。
快速開始:輕鬆上手 LangExtract
現在,讓我們來看看如何使用 LangExtract,只需幾行程式碼就能提取結構化資訊!
重要提醒: 使用 Gemini 等雲端模型,你需要先申請 API 金鑰。 稍後我們會介紹如何設定 API 金鑰。
步驟 1:定義你的提取任務
首先,你需要建立一個提示(prompt),清楚地描述你想要提取什麼資訊。 接著,提供一個高品質的例子來引導模型。
import langextract as lx
import textwrap
# 1. 定義提示和提取規則
prompt = textwrap.dedent("""\
提取人物、情感和關係,按照出現的順序排列。
使用確切的文字進行提取。請勿轉述或重疊實體。
為每個實體提供有意義的屬性以增加上下文。""")
# 2. 提供一個高品質的例子來引導模型
examples = [
lx.data.ExampleData(
text="羅密歐。 哎呀! 什麼光芒穿過那邊的窗戶? 那是東方,茱麗葉是太陽。",
extractions=[
lx.data.Extraction(
extraction_class="character",
extraction_text="羅密歐",
attributes={"emotional_state": "wonder"}
),
lx.data.Extraction(
extraction_class="emotion",
extraction_text="哎呀!",
attributes={"feeling": "gentle awe"}
),
lx.data.Extraction(
extraction_class="relationship",
extraction_text="茱麗葉是太陽",
attributes={"type": "metaphor"}
),
]
)
]
提示: 例子是引導模型行為的關鍵。 每個 extraction_text 理想情況下都應該與例子中的 text 完全相同(不要改寫),並按照出現的順序排列。 如果例子沒有遵循這種模式,LangExtract 預設會發出 Prompt alignment 警告 — 為了獲得最佳結果,請解決這些問題。
步驟 2:執行提取
將你的輸入文本和提示資訊提供給 lx.extract 函數。
# 待處理的輸入文本
input_text = "茱麗葉女士深情地凝視著星星,她的心為羅密歐而痛。"
# 執行提取
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 配額以提高吞吐量並避免速率限制。有關詳細資訊,請參閱速率限制文件。
模型生命週期: 請注意,Gemini 模型具有定義的生命週期和退休日期。 建議使用者查閱官方模型版本文件,以隨時了解最新的穩定版本和舊版本。
步驟 3:視覺化結果
提取出的資訊可以儲存為 .jsonl 檔案,這是一種常用於處理語言模型資料的格式。 然後,LangExtract 可以從這個檔案生成一個互動式的 HTML 視覺化,以查看上下文中的實體。
# 將結果保存到 JSONL 檔案
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl", output_dir=".")
# 從檔案生成視覺化
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 知識的利用: 這個例子展示了提取與文本證據密切相關的資訊 — 提取「longing」作為 Lady Juliet 的情感狀態,並從「gazed longingly at the stars」中識別「yearning」。 該任務可以修改為生成更多地從 LLM 的世界知識中提取的屬性(例如,添加 “identity”: “Capulet family daughter” 或 “literary_context”: “tragic heroine”)。 文本證據和知識推論之間的平衡由你的提示指令和示例屬性控制。
處理更長的文件
對於較大的文本,你可以直接從 URL 處理整個文件,並進行並行處理和增強的敏感度:
# 從 Project Gutenberg 直接處理 Romeo & Juliet
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, # 透過多個 passes 來改善 recall
max_workers=20, # 並行處理以加快速度
max_char_buffer=1000 # 更小的上下文以獲得更好的準確性
)
這種方法可以從完整的長篇小說中提取數百個實體,同時保持高度的準確性。 互動式視覺化可以無縫處理大型結果集,讓你輕鬆探索來自輸出 JSONL 檔案的數百個實體。 查看完整的 Romeo and Juliet 提取範例 →,以獲取詳細的結果和效能見解。
Vertex AI 批量處理
通過啟用 Vertex AI 批處理 API,可以節省大規模任務的成本:language_model_params={"vertexai": True, "batch": {"enabled": True}}。
請參閱此範例中 Vertex AI 批處理 API 的用法範例。
安裝:輕鬆啟動 LangExtract
安裝 LangExtract 非常簡單,你可以選擇以下幾種方式:
1. 從 PyPI 安裝 (推薦)
這是大多數使用者的推薦方式,使用 pip 就能輕鬆安裝。
pip install langextract
對於隔離的環境,請考慮使用虛擬環境:
python -m venv langextract_env
source langextract_env/bin/activate # 在 Windows 上:langextract_env\Scripts\activate
pip install langextract
2. 從原始碼安裝
LangExtract 使用現代 Python 封裝,並使用 pyproject.toml 進行依賴項管理:
使用 -e 進行安裝,將套件置於開發模式,允許你修改程式碼而無需重新安裝。
git clone https://github.com/google/langextract.git
cd langextract
# 基礎安裝:
pip install -e .
# 開發安裝(包含 linting 工具):
pip install -e ".[dev]"
# 測試安裝(包含 pytest):
pip install -e ".[test]"
3. 使用 Docker
docker build -t langextract .
docker run --rm -e LANGEXTRACT_API_KEY="你的-api-金鑰" langextract python 你的_script.py
設定 API 金鑰:讓雲端模型動起來
如果你選擇使用 Gemini 或 OpenAI 等雲端模型,就需要設定 API 金鑰。 本地模型則不需要。 對於使用本地 LLM 的開發人員,LangExtract 提供了對 Ollama 的內建支援,並且可以通過更新推理端點來擴展到其他第三方 API。
API 金鑰的獲取:
- AI Studio 用於 Gemini 模型
- Vertex AI 用於企業用途
- OpenAI Platform 用於 OpenAI 模型
設定 API 金鑰:
選項 1:環境變數
export LANGEXTRACT_API_KEY="你的-api-金鑰-在這裡"
選項 2:.env 檔案 (推薦)
將你的 API 金鑰添加到 .env 檔案中:
# 將 API 金鑰添加到 .env 檔案中
cat >> .env << 'EOF'
LANGEXTRACT_API_KEY=你的-api-金鑰-在這裡
EOF
# 保護你的 API 金鑰
echo '.env' >> .gitignore
在你的 Python 程式碼中:
import langextract as lx
result = lx.extract(
text_or_documents=input_text,
prompt_description="提取信息...",
examples=[...],
model_id="gemini-2.5-flash"
)
選項 3:直接提供 API 金鑰(不建議用於生產)
你也可以在你的程式碼中直接提供 API 金鑰,但這不建議用於生產:
result = lx.extract(
text_or_documents=input_text,
prompt_description="提取信息...",
examples=[...],
model_id="gemini-2.5-flash",
api_key="你的-api-金鑰-在這裡" # 僅用於測試/開發
)
選項 4:Vertex AI (服務帳戶)
使用 Vertex AI 進行服務帳戶身份驗證:
result = lx.extract(
text_or_documents=input_text,
prompt_description="提取信息...",
examples=[...],
model_id="gemini-2.5-flash",
language_model_params={
"vertexai": True,
"project": "你的-專案-ID",
"location": "全球" # 或區域端點
}
)
更多範例:看看 LangExtract 的實戰應用
LangExtract 提供了許多範例,讓你更容易理解它的功能,以及如何在不同的情境中使用它。
羅密歐與茱麗葉 全文提取
LangExtract 可以直接處理來自 URL 的完整文件。 這個範例展示了從 Project Gutenberg 中提取 羅密歐與茱麗葉 的全文 (147,843 個字元),展示了並行處理、連續提取 pass,以及針對長文件處理的效能優化。
用藥提取
免責聲明: 此示範僅用於說明 LangExtract 的基本功能。 它不代表已完成或批准的產品,不適用於診斷或建議任何疾病或狀況的治療,也不應被用作醫療建議。
LangExtract 在從臨床文本中提取結構化醫療資訊方面表現出色。 這些範例展示了基本實體識別(藥物名稱、劑量、途徑)和關係提取(將藥物與其屬性連結),展示了 LangExtract 在醫療保健應用程式中的有效性。
放射學報告結構化:RadExtract
探索 RadExtract,一個在 HuggingFace Spaces 上的現場互動演示,展示了 LangExtract 如何自動構建放射學報告。 在你的瀏覽器中直接試用它,無需任何設置。
貢獻與開發:一起讓 LangExtract 更好!
如果你對 LangExtract 有興趣,並且想貢獻程式碼,或者提出建議,都非常歡迎! 參考 CONTRIBUTING.md 了解如何開始開發、測試和提交 Pull Request。 在提交修補程式之前,你必須簽署 Contributor License Agreement。
測試:確保程式碼的品質
為了確保程式碼的品質,LangExtract 包含了測試程式,你可以依照以下步驟在本地運行測試:
# 克隆儲存庫
git clone https://github.com/google/langextract.git
cd langextract
# 安裝測試依賴項
pip install -e ".[test]"
# 運行所有測試
pytest tests
或者使用 tox 在本地重現完整的 CI 矩陣:
tox # 在 Python 3.10 和 3.11 上運行 pylint + pytest
Ollama 整合測試
如果你在本地安裝了 Ollama,你可以運行整合測試:
# 測試 Ollama 整合(需要 Ollama 運行 gemma2:2b 模型)
tox -e ollama-integration
此測試將自動偵測 Ollama 是否可用並運行真實的推理測試。
結語:開啟你的文字資料處理新篇章!
LangExtract 是一個功能強大且易於使用的工具,能幫助你輕鬆地從文字資料中提取結構化資訊。 無論你是資料科學家、研究人員,還是只需要整理大量文本資料的人,LangExtract 都能幫助你節省時間,提高效率。
現在就開始嘗試 LangExtract,讓你的文字資料整理工作更輕鬆、更有效率吧!
祝你提取愉快!
參考閱讀
https://github.com/google/langextract