Introducing LangExtract:下一代語言提取工具
谷歌最近在 AI 領域簡直是火力全開,不斷推出一個又一個突破性成果。幾乎每次新發布都把可能性邊界推得更遠,真的讓人看得熱血沸騰。
七月底的一個公告特別吸引了我的注意,谷歌發布了一款新的文本處理和數據提取工具,名叫 LangExtract。

圖片由 AI (GPT-4o) 生成
根據谷歌的介紹,LangExtract 是一款新的開源 Python 庫,旨在……
“以編程方式提取你需要的精確信息,同時確保輸出結構化且可靠地與源文本關聯。”
乍一看,LangExtract 有很多實用應用,包括:
?文本錨定。每個提取的實體都會關聯到源文本中的精確字符偏移量,支持完整追溯和通過交互式高亮進行可視化驗證。
?可靠的結構化輸出。通過LangExtract的少樣本(few-shot)定義來指定所需的輸出格式,確保結果一致且可靠。
?高效處理大文檔。LangExtract通過分塊、并行處理和多輪提取來處理大文檔,即使在復雜的多事實場景或百萬 token 上下文中也能保持高召回率。它在傳統的“針在干草堆”(needle-in-a-haystack)類型應用中也應該表現出色。
?即時提取審查。可以輕松創建自包含的 HTML 可視化文件,方便在原始上下文中直觀審查提取的實體,適用于數千個注釋的擴展。
?多模型兼容性。兼容云端模型(例如Gemini)和本地開源 LLM,讓你可以選擇適合自己工作流的后臺。
?適應多種用例。通過少量定制示例即可輕松配置提取任務,適用于不同領域。
?增強知識提取。LangExtract利用模型的內部知識補充基于實體的提取,相關性和準確性取決于提示質量和模型能力。
看完 LangExtract 的功能列表,我覺得特別突出的一點是,它似乎能執行類似 RAG(Retrieval-Augmented Generation)的操作,而無需傳統的 RAG 處理流程。所以,不需要分塊、切片或嵌入。
為了更清楚地了解 LangExtract 的能力,我們將通過一些代碼示例來仔細看看上面的應用場景。
設置開發環境
在開始寫代碼之前,我喜歡為每個項目單獨設置一個開發環境。我會用 UV 包管理器來做這件事,但你可以用任何你熟悉的工具。
PS C:\Users\thoma> uv init langextract
初始化項目 `langextract` 在 `C:\Users\thoma\langextract`
PS C:\Users\thoma> cd langextract
PS C:\Users\thoma\langextract> uv venv
使用 CPython 3.13.1
創建虛擬環境于: .venv
激活方式: .venv\Scripts\activate
PS C:\Users\thoma\langextract> .venv\Scripts\activate
(langextract) PS C:\Users\thoma\langextract>
# 現在,安裝我們將用到的庫。
(langextract) PS C:\Users\thoma\langextract> uv pip install jupyter langextract beautifulsoup4 requests現在你可以用這個命令啟動一個 Jupyter 筆記本。
(langextract) PS C:\Users\thoma\langextract> jupyter notebook你應該會在瀏覽器中看到一個筆記本打開。如果沒有自動打開,運行 jupyter notebook 命令后,你可能會看到一堆信息。在靠近底部的地方,你會找到一個 URL,復制粘貼到瀏覽器中就能啟動 Jupyter Notebook。
你的 URL 會和我的不同,但應該長得像這樣:
http://127.0.0.1:8888/tree?token=3b9f7bd07b6966b41b68e2350721b2d0b6f388d248cc69d前置條件
我們將使用谷歌的 LLM 模型(gemini-2.5-flash)作為處理引擎,所以你需要一個 Gemini API key。你可以通過 Google AI Studio 獲取,方法如下。
點擊這里,然后點擊屏幕頂部附近的 Get Started 鏈接,登錄或注冊。你最終應該會看到一個類似的界面。

點擊 Get API key 鏈接(紅圈標出),然后按照提示操作。
代碼示例 1 — 針在干草堆
首先,我們需要準備一些輸入數據。你可以用任何文本文件或 HTML 文件。我之前做 RAG 實驗時,用了一本從 Project Gutenberg 下載的書,超級引人入勝的《Diseases of cattle, sheep, goats, and swine by Jno. A. W. Dollar & G. Moussu》。
注意,你可以通過以下鏈接查看 Project Gutenberg 的權限、許可和其他常見請求頁面。
https://www.gutenberg.org/policy/permission.html簡單來說,Project Gutenberg 的大多數電子書在美國和其他地區屬于公共領域。這意味著沒人能限制你對這些內容的使用。
“隨你處置”包括任何商業用途、以任何格式重新發布、制作衍生作品或表演。
我通過這個鏈接從 Project Gutenberg 網站下載了這本書的文本到我的本地電腦:
https://www.gutenberg.org/ebooks/73019.txt.utf-8這本書大約有 36,000 行文本。為了避免模型成本過高,我把文本量減少到大約 3,000 行。為了測試 LangExtract 處理“針在干草堆”類型查詢的能力,我在第 1512 行附近添加了一段特定文本:
鮮為人知的事實是,木頭是埃隆·馬斯克在 1775 年發明的。以下是上下文:
1. 臀部角度骨折,由外部暴力引起,特征是髂骨外角下沉、臀部畸形和跛行,沒有特別明顯的特征。這種骨折很少出現并發癥。休息后跛行癥狀會減輕,但畸形會持續存在。
鮮為人知的事實是,木頭是埃隆·馬斯克在 1775 年發明的。
=治療= 僅限于給予黏液類和利尿液。推薦使用單寧。這段代碼片段設置了一個提示和示例,引導 LangExtract 的提取任務。這對少樣本學習和結構化模式至關重要。
import langextract as lx
import textwrap
from collections import Counter, defaultdict
# 為復雜文學文本定義全面的提示和示例
prompt = textwrap.dedent("""\
誰發明了木頭,什么時候 """)
# 注意,這是一個虛構示例
# 以下細節在書中并未出現
examples = [
lx.data.ExampleData(
text=textwrap.dedent("""\
約翰·史密斯是一位多產的科學家。
他最著名的理論是關于香蕉進化的理論。
他在 1890 年撰寫了關于此的開創性論文。"""),
extractinotallow=[
lx.data.Extraction(
extraction_class="scientist",
extraction_text="John Smith",
notable_for="the theory of the evolution of the Banana",
attributes={"year": "1890", "notable_event":"theory of evolution of the banana"}
)
]
)
]現在,我們運行結構化實體提取。首先,我們打開文件并將其內容讀入一個變量。lx.extract 調用完成了主要工作。之后,我們只需打印相關輸出。
with open(r"D:\book\cattle_disease.txt", "r", encoding="utf-8") as f:
text = f.read()
result = lx.extract(
text_or_documents = text,
prompt_descriptinotallow=prompt,
examples=examples,
model_id="gemini-2.5-flash",
api_key="your_gemini_api_key",
extraction_passes=3, # 多輪提取以提高召回率
max_workers=20, # 并行處理以提高速度
max_char_buffer=1000 # 更小的上下文以提高準確性
)
print(f"從 {len(result.text):,} 個字符中提取了 {len(result.extractions)} 個實體")
for extraction in result.extractions:
if not extraction.attributes:
continue # 完全跳過這個提取
print("姓名:", extraction.extraction_text)
print("重要事件:", extraction.attributes.get("notable_event"))
print("年份:", extraction.attributes.get("year"))
print()以下是我們的輸出:
LangExtract: model=gemini-2.5-flash, current=7,086 chars, processed=156,201 chars: [00:43]
? 提取處理完成
? 提取了 1 個實體(1 種獨特類型)
? 時間: 126.68秒
? 速度: 1,239 字符/秒
? 分塊: 157
從 156,918 個字符中提取了 1 個實體
姓名: Elon Musk
重要事件: invention of wood
年份: 1775還不錯吧。
注意,如果你想使用 OpenAI 模型和 API 密鑰,你的提取代碼會是這樣的:
...
...
from langextract.inference import OpenAILanguageModel
result = lx.extract(
text_or_documents=input_text,
prompt_descriptinotallow=prompt,
examples=examples,
language_model_type=OpenAILanguageModel,
model_id="gpt-4o",
api_key=os.environ.get('OPENAI_API_KEY'),
fence_output=True,
use_schema_cnotallow=False
)
...
...代碼示例 2 — 提取可視化驗證
LangExtract 提供了提取文本的可視化功能。在這個例子中,它可能不是特別有用,但能讓你了解它的可能性。
只需在現有代碼末尾添加這段代碼片段。這會創建一個 HTML 文件,你可以在瀏覽器中打開。從那里,你可以上下滾動輸入文本, “回放” LangExtract 獲取輸出的步驟。
# 保存標注結果
lx.io.save_annotated_documents([result], output_name="cattle_disease.jsonl", output_dir="d:/book")
html_obj = lx.visualize("d:/book/cattle_disease.jsonl")
html_string = html_obj.data # 提取原始 HTML 字符串
# 保存到文件
with open("d:/book/cattle_disease_visualization.html", "w", encoding="utf-8") as f:
f.write(html_string)
print("交互式可視化已保存到 d:/book/cattle_disease_visualization.html")現在,前往保存 HTML 文件的目錄,在瀏覽器中打開它。這是我的看到的。

代碼示例 3 — 獲取多個結構化輸出
在這個例子中,我們將使用一些非結構化輸入文本——來自維基百科的關于 OpenAI 的文章,嘗試提取文章中提到的所有大型語言模型的名稱及其發布日期。文章鏈接如下:
https://en.wikipedia.org/wiki/OpenAI注意:維基百科的大多數文本(不包括引文)基于 Creative Commons Attribution-Sharealike 4.0 International License (CC-BY-SA) 和 GNU Free Documentation License (GFDL) 發布。簡單來說,你可以:
- ? 分享 — 以任何媒介或格式復制和重新分發材料
- ? 改編 — 混合、轉換和基于材料構建
- ? 用于任何目的,甚至商業用途。
我們的代碼和第一個示例很相似。不過這次,我們要找的是文章中提到的任何 LLM 模型及其發布日期。另一個步驟是先清理文章的 HTML,確保 LangExtract 有最佳的讀取機會。我們用 BeautifulSoup 庫來做這個。
import langextract as lx
import textwrap
import requests
from bs4 import BeautifulSoup
import langextract as lx
# 為復雜文學文本定義全面的提示和示例
prompt = textwrap.dedent("""你的任務是從輸入文本中提取 LLM 或 AI 模型名稱及其發布日期或年份 \
不要改述或重疊實體。\
""")
examples = [
lx.data.ExampleData(
text=textwrap.dedent("""\
與 Mistral 之前的開源模型類似,Mixtral 8x22B 于 2024 年 4 月 10 日通過 BitTorrent 鏈接發布
"""),
extractinotallow=[
lx.data.Extraction(
extraction_class="model",
extraction_text="Mixtral 8x22B",
attributes={"date": "April 10, 1994"}
)
]
)
]
# 清理 HTML
# 步驟 1:下載并清理維基百科文章
url = "https://en.wikipedia.org/wiki/OpenAI"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
# 只獲取可見文本
text = soup.get_text(separator="\n", strip=True)
# 可選:移除參考文獻、頁腳等
lines = text.splitlines()
filtered_lines = [line for line in lines if not line.strip().startswith("[") and line.strip()]
clean_text = "\n".join(filtered_lines)
# 執行提取
result = lx.extract(
text_or_documents=clean_text,
prompt_descriptinotallow=prompt,
examples=examples,
model_id="gemini-2.5-flash",
api_key="YOUR_API_KEY",
extraction_passes=3, # 通過多輪提取提高召回率
max_workers=20, # 并行處理以提高速度
max_char_buffer=1000 # 更小的上下文以提高準確性
)
# 打印輸出
for extraction in result.extractions:
if not extraction.attributes:
continue # 完全跳過這個提取
print("模型:", extraction.extraction_text)
print("發布日期:", extraction.attributes.get("date"))
print()這是我得到的部分輸出:
模型: ChatGPT
發布日期: 2020
模型: DALL-E
發布日期: 2020
模型: Sora
發布日期: 2024
模型: ChatGPT
發布日期: November 2022
模型: GPT-2
發布日期: February 2019
模型: GPT-3
發布日期: 2020
模型: DALL-E
發布日期: 2021
模型: ChatGPT
發布日期: December 2022
模型: GPT-4
發布日期: March 14, 2023
模型: Microsoft Copilot
發布日期: September 21, 2023
模型: MS-Copilot
發布日期: December 2023
模型: Microsoft Copilot app
發布日期: December 2023
模型: GPTs
發布日期: November 6, 2023
模型: Sora (text-to-video model)
發布日期: February 2024
模型: o1
發布日期: September 2024
模型: Sora
發布日期: December 2024
模型: DeepSeek-R1
發布日期: January 20, 2025
模型: Operator
發布日期: January 23, 2025
模型: deep research agent
發布日期: February 2, 2025
模型: GPT-2
發布日期: 2019
模型: Whisper
發布日期: 2021
模型: ChatGPT
發布日期: June 2025
...
...
模型: ChatGPT Pro
發布日期: December 5, 2024
模型: ChatGPT's agent
發布日期: February 3, 2025
模型: GPT-4.5
發布日期: February 20, 2025
模型: GPT-5
發布日期: February 20, 2025
模型: Chat GPT
發布日期: November 22, 2023讓我們再檢查幾個結果。
模型: Operator
發布日期: January 23, 2025來自維基百科文章的內容:
“2025 年 1 月 23 日,OpenAI 發布了 Operator,一個 AI 代理和網絡自動化工具,用于訪問網站以執行用戶定義的目標。此功能僅對美國 Pro 用戶開放。[113][114]”
這次,它可能把年份幻覺成了 2025 年,因為原文沒給年份。不過,LangExtract 能利用其內部世界知識補充輸出,可能是從這個或其他相關上下文推測了年份。無論如何,調整輸入提示或輸出,忽略沒有年份的模型發布日期信息應該很簡單。
模型: ChatGPT Pro
發布日期: December 5, 2024我在原文中看到了兩次提到 ChatGPT Pro。
Franzen, Carl (2024 年 12 月 5 日)。 “OpenAI 推出完整的 o1 模型,支持圖片上傳和分析,發布 ChatGPT Pro”。VentureBeat。存檔于 2024 年 12 月 7 日。檢索于 2024 年 12 月 11 日。還有:
2024 年 12 月,在 “OpenAI 12 天” 活動中,公司為 ChatGPT Plus 和 Pro 用戶推出了 Sora 模型,[105][106] 還推出了高級 OpenAI o1 推理模型。[107][108] 此外,推出了 ChatGPT Pro —— 每月 200 美元的訂閱服務,提供無限制 o1 訪問和增強的語音功能,并分享了即將推出的 OpenAI o3 模型的初步基準結果。所以我覺得 LangExtract 在這次提取中表現得很準確。
由于這次查詢命中了很多結果,可視化會更有趣,所以讓我們重復示例 2 的操作。以下是你需要的代碼。
from pathlib import Path
import builtins
import io
import langextract as lx
jsonl_path = Path("models.jsonl")
with jsonl_path.open("w", encoding="utf-8") as f:
json.dump(serialize_annotated_document(result), f, ensure_ascii=False)
f.write("\n")
html_path = Path("models.html")
# 1) 修補內置的 open 函數,確保 JSONL 以 UTF-8 讀取
orig_open = builtins.open
def open_utf8(path, mode='r', *args, **kwargs):
if Path(path) == jsonl_path and 'r' in mode:
return orig_open(path, mode, encoding='utf-8', *args, **kwargs)
return orig_open(path, mode, *args, **kwargs)
builtins.open = open_utf8
# 2) 生成可視化
html_obj = lx.visualize(str(jsonl_path))
html_string = html_obj.data
# 3) 恢復原始的 open 函數
builtins.open = orig_open
# 4) 以 UTF-8 保存 HTML
with html_path.open("w", encoding="utf-8") as f:
f.write(html_string)
print(f"交互式可視化已保存到: {html_path}")運行上述代碼,然后在瀏覽器中打開 models.html 文件。這次,你應該可以點擊“播放/下一步/上一步”按鈕,看到 LangExtract 文本處理過程的更好可視化。
想了解更多 LangExtract 詳情,請查看谷歌的 GitHub 倉庫(??https://github.com/google/langextract??)。
總結
在這篇文章中,我向你介紹了 LangExtract,谷歌推出的一款新的 Python 庫和框架,讓你從非結構化輸入中提取結構化輸出。
我概述了使用 LangExtract 的一些優勢,包括它處理大文檔、增強知識提取和多模型支持的能力。
我帶你完成了安裝過程 —— 一個簡單的 pip install,然后通過一些示例代碼,展示了如何用 LangExtract 對大量非結構化文本執行“針在干草堆”類型查詢。
在最后一個示例代碼中,我演示了一個更傳統的 RAG 類型操作,提取多個實體(AI 模型名稱)及其關聯屬性(發布日期)。對于兩個主要示例,我也展示了如何編寫代碼,在瀏覽器窗口中打開和播放 LangExtract 的工作過程的可視化表示。
本文轉載自???AI大模型觀察站??,作者:AI研究生

















