摘要:
LangExtract是一個Python庫,利用大語言模型(LLM)根據用戶定義指令從非結構化文本文檔中提取結構化信息。它具備精確源定位、可靠結構化輸出、長文檔優化、交互式可視化、靈活LLM支持、適應任意領域等特點。可通過幾行代碼快速開始提取,支持云模型和本地LLM,還提供多種安裝方式、API密鑰設置方法、自定義模型提供商方式等。有豐富示例,如羅密歐與朱麗葉全文提取、藥物提取等,且歡迎貢獻,有測試和開發相關流程。
LangExtract
簡介
LangExtract是一個Python庫,它使用大語言模型(LLM)根據用戶定義的指令從非結構化文本文檔中提取結構化信息。它能處理臨床筆記或報告等材料,識別并組織關鍵細節,同時確保提取的數據對應源文本。
為何選擇LangExtract?
- 精確的源定位:將每個提取內容映射到源文本中的準確位置,支持視覺突出顯示,便于追溯和驗證。
- 可靠的結構化輸出:基于少量示例強制實施一致的輸出架構,利用Gemini等支持模型的受控生成來保證可靠、結構化的結果。
- 適用于長文檔:通過文本分塊、并行處理和多次傳遞的優化策略,克服大文檔提取中“大海撈針”的挑戰,提高召回率。
- 交互式可視化:立即生成自包含的交互式HTML文件,可視化并查看數千個提取實體在原始上下文中的情況。
- 靈活的LLM支持:支持多種模型,從谷歌Gemini系列等云托管LLM到通過內置Ollama接口的本地開源模型。
- 適應任何領域:僅用少量示例就能為任何領域定義提取任務,無需模型微調即可適應需求。
- 利用LLM世界知識:利用精確的提示措辭和少量示例來影響提取任務對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
可能提供更優結果。對于大規模或生產使用,建議使用二級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/Colabelse:f.write(html_content)
這將創建一個動畫和交互式HTML文件:羅密歐與朱麗葉基本可視化。
關于LLM知識利用的說明:
此示例演示了與文本證據密切相關的提取:提取“longing”作為朱麗葉女士的情緒狀態,并從“gazed longingly at the stars”識別出“yearning”。可以修改任務以生成更多利用LLM世界知識的屬性(例如,添加“identity”: “Capulet family daughter”或“literary_context”: “tragic heroine”)。文本證據和知識推斷之間的平衡由提示指令和示例屬性控制。
擴展到更長文檔
對于較大的文本,可以直接通過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文件中的數百個實體變得容易。請參閱完整的羅密歐與朱麗葉提取示例以獲取詳細結果和性能見解。
安裝
從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 .# 開發安裝(包括代碼檢查工具):
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密鑰。設備上的模型不需要API密鑰。對于使用本地LLM的開發者,LangExtract內置支持Ollama,并可通過更新推理端點擴展到其他第三方API。
API密鑰來源
從以下地方獲取API密鑰:
- 用于Gemini模型的AI Studio
- 用于企業使用的Vertex AI
- 用于OpenAI模型的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 lxresult = 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" # 僅用于測試/開發
)
添加自定義模型提供商
LangExtract通過輕量級插件系統支持自定義LLM提供商。您可以在不更改核心代碼的情況下添加對新模型的支持。
- 獨立于核心庫添加新模型支持
- 將您的提供商作為單獨的Python包分發
- 隔離自定義依賴項
- 通過基于優先級的解析覆蓋或擴展內置提供商
請參閱提供商系統文檔中的詳細指南,了解如何:
- 使用@registry.register(…)注冊提供商
- 發布入口點以進行發現
- 可選地通過get_schema_class()提供具有結構化輸出的架構
- 通過create_model(…)與工廠集成
使用OpenAI模型
LangExtract支持OpenAI模型(需要可選依賴項:pip install langextract[openai]):
import langextract as lxresult = 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 lxresult = 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安裝Ollama,運行ollama pull gemma2:2b,然后ollama serve。
有關詳細安裝、Docker設置和示例,請參閱examples/ollama/。
更多示例
LangExtract的其他應用示例:
羅密歐與朱麗葉全文提取
LangExtract可以直接從URL處理完整文檔。此示例演示了從Project Gutenberg的羅密歐與朱麗葉全文(147,843個字符)中提取,展示了并行處理、順序提取傳遞和長文檔處理的性能優化。
查看羅密歐與朱麗葉全文示例→
藥物提取
免責聲明:此演示僅用于說明LangExtract的基線能力。它不代表已完成或批準的產品,不用于診斷或建議任何疾病或病癥的治療,也不應用于醫療建議。
LangExtract擅長從臨床文本中提取結構化醫療信息。這些示例演示了基本實體識別(藥物名稱、劑量、途徑)和關系提取(將藥物與其屬性連接),展示了LangExtract在醫療保健應用中的有效性。
查看藥物示例→
放射學報告結構化:RadExtract
探索RadExtract,這是一個在HuggingFace Spaces上的實時交互式演示,展示了LangExtract如何自動結構化放射學報告。無需設置即可直接在瀏覽器中嘗試。
查看RadExtract演示→
貢獻
歡迎貢獻!請參閱CONTRIBUTING.md以開始開發、測試和拉取請求。提交補丁前必須簽署貢獻者許可協議。
測試
要從源碼本地運行測試:
# 克隆倉庫
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集成(需要運行帶有gemma2:2b模型的Ollama)
tox -e ollama-integration
此測試將自動檢測Ollama是否可用并運行真實推理測試。
開發
代碼格式化
該項目使用自動化格式化工具來保持一致的代碼風格:
# 自動格式化所有代碼
./autoformat.sh# 或單獨運行格式化程序
isort langextract tests --profile google --line-length 80
pyink langextract tests --config pyproject.toml
預提交鉤子
用于自動格式化檢查:
pre-commit install # 一次性設置
pre-commit run --all-files # 手動運行