使用 Google 開源 AI 工具 LangExtract 進行結構化信息抽取

導讀:本文介紹科技大廠 Google 2025年 7 月最新開源的 Python 庫:LangExtract,用于從非結構文本提取結構化數據,以及非官方的 JavascriptRust 語言實現版本。

文章目錄

  • 一、關于 LangExtract
    • 1.1 需求痛點
    • 1.2 LangExtract
    • 1.3 參考文章
  • 二、小試牛刀
    • 2.1 安裝依賴
    • 2.2 簡單的人物信息抽取
    • 2.3 提取公共資源交易信息
      • 2.3.1 準備示例
      • 2.3.2 運行結果
  • 三、JavaScript 版本
  • 四、Rust 版本
    • 4.1 程序跑不起來😔
    • 4.2 成功運行🎉
    • 4.3 未來展望 🚀
  • Java 版本

一、關于 LangExtract

1.1 需求痛點

很多時候,我們需要在一堆非標準的文本里面提取特定的字段(比如提取人名電話地址等),形成結構化的數據,如保存到 Excel 。數據量不大的情況下,人工就能勝任。如果量很大,就得借助程序(使用規則匹配)來清洗,這種方式比人工高效,但出錯率也高。因為程序是非常死板的,只認設定好的規則(不會變通),而人工可以在各種未預見的情況下,依然能找到正確的數據,程序則由于不理解自然語言與答案失之交臂😂。

1.2 LangExtract

LangExtract : A Python library for extracting structured information from unstructured text using LLMs with precise source grounding and interactive visualization.

一個 Python 庫,用于使用具有精確源基礎和交互式可視化的 LLM 從非結構化文本中提取結構化信息。

這個庫是 Google 在 2025 年 7 月底發布,目前最新版本是 1.0.8(截至2025-08-22),具有以下特點:

  • 精確的源頭定位:能將每次提取的內容映射到源文本中的確切位置,可通過可視化突出顯示進行追溯和驗證。
  • 可靠的結構化輸出:基于少量示例強制執行一致的輸出模式,利用Gemini等支持模型中的受控生成來保證強大的結構化結果,輸出可直接接入數據庫等下游流程。
  • 針對長文檔優化:通過優化文本分塊、并行處理和多次傳遞的策略,克服大型文檔提取中的困難,提高召回率,能處理完整的小說級別的文檔。
  • 交互式可視化:可即時生成一個獨立的交互式HTML文件,以可視化和審查數千個提取的實體及其原始上下文,方便審核和錯誤分析。
  • 靈活的LLM支持:支持用戶偏好的模型,從Google Gemini系列等基于云的LLM到通過內置Ollama接口的本地開源模型都可使用。
  • 適應任何領域:只需幾個示例,即可為任何領域定義提取任務,無需進行模型微調就能適應用戶需求。

LangExtract 在醫療、金融、法律、科研等領域都有廣泛的應用前景,例如從臨床記錄中提取藥物名稱、劑量,從合同中提取責任條款、風險項等。

1.3 參考文章

  • 谷歌出品!詳解“小而美” 的LangExtract:輕量卻強大的結構化信息提取神器。
  • 谷歌開源LangExtract:三行代碼把“文本礦山”變結構化黃金,AI信息抽取從未如此簡單!

二、小試牛刀

本文我們將使用豆包大模型進行實踐😄。

2.1 安裝依賴

mkdir langextract
# 創建虛擬環境
python -m venv .env
source .env/bin/activate  # On Windows: .env\Scripts\activate
# 安裝依賴
pip install langextract openai

2.2 簡單的人物信息抽取

import langextract as lx# 定義示例
examples = [lx.data.ExampleData(text = "梁思成(1901年4月20日-1972年1月9日),籍貫廣東新會,生于日本東京。畢生致力于中國古代建筑的研究和保護,是建筑歷史學家、建筑教育家和建筑師,被譽為中國近代建筑之父。",extractions=[lx.data.Extraction(extraction_class="姓名", extraction_text="梁思成"),lx.data.Extraction(extraction_class="出生日期", extraction_text="1901年4月20日"),lx.data.Extraction(extraction_class="逝世日期", extraction_text="1972年1月9日"),lx.data.Extraction(extraction_class="出生地", extraction_text="日本東京"),lx.data.Extraction(extraction_class="職業", extraction_text="建筑歷史學家、建筑教育家、建筑師"),lx.data.Extraction("榮譽", "中國近代建筑之父")]),lx.data.ExampleData(text = "林徽因(1904年6月10日-1955年4月1日),原名“徽音”,漢族,祖籍福建閩侯(今福建福州),出生于浙江杭州。為中國近現代建筑學家、文學家,清華大學建筑系教授。",extractions=[lx.data.Extraction(extraction_class="姓名", extraction_text="林徽因"),lx.data.Extraction(extraction_class="出生日期", extraction_text="1904年6月10日"),lx.data.Extraction(extraction_class="逝世日期", extraction_text="1955年4月1日"),lx.data.Extraction(extraction_class="出生地", extraction_text="浙江杭州"),lx.data.Extraction(extraction_class="職業", extraction_text="建筑學家、文學家"),lx.data.Extraction("榮譽", "")])
]# 配置模型并調用解析程序
result = lx.extract(text_or_documents="古龍(1938年6月7日一1985年9月21日),原名熊耀華,籍貫江西南昌,漢族。1938年6月7日出生于香港。武俠小說家,新派武俠小說泰斗,與金庸、梁羽生、溫瑞安并稱為中國武俠小說四大宗師。",prompt_description="從人物簡要介紹中提取姓名、出生日期、逝世日期(如有)、出生地、職業、榮耀/成就",examples = examples,config= lx.factory.ModelConfig(model_id="doubao-seed-1-6-flash-250615",provider="OpenAILanguageModel",provider_kwargs={"temperature"   : 0.1,"max_tokens"    : 2048,"base_url"      : "https://ark.cn-beijing.volces.com/api/v3","api_key"       : ""})
)for entity in result.extractions:position_info = ""if entity.char_interval:start, end = entity.char_interval.start_pos, entity.char_interval.end_posposition_info = f" (位置: {start}-{end})"print(f"? {entity.extraction_class.capitalize()}: {entity.extraction_text}{position_info}")

我們執行python index.py,大概 5 秒就能看到結果。

2.3 提取公共資源交易信息

我之前寫過一篇Chrome插件 | 公共資源交易平臺中標公示數據采集工具(僅作技術交流學習)的文章,里面就涉及結構化信息提取,當時用的是專家規則+正則表達式從文本中匹配結果,現在讓我們試下 langextract 是否能做的更好😄。

2.3.1 準備示例

2.3.2 運行結果


從上面的結果來看,提取的數據是準確的(耗時大概10秒),不過還多了一個結果(數據基本是空白),可以在程序中控制只要第一個結果即可😄。

借助 AI 理解自然語言,從中提取出想要的信息,是一條比專家規則更合適的路,雖然目前在時效上會久些,不過不是什么嚴重問題。


三、JavaScript 版本

在 github 上有一個 typescript 版本的實現:kmbro/langextract-typescript。

A TypeScript translation of the original Python LangExtract library by Google LLC. This library provides structured information extraction from text using Large Language Models (LLMs) with full TypeScript support, comprehensive visualization tools, and a powerful CLI interface.

import { extract } from "langextract"/**@type {Array<import("langextract").ExampleData>} */
const examples = [{text:"梁思成(1901年4月20日-1972年1月9日),籍貫廣東新會,生于日本東京。畢生致力于中國古代建筑的研究和保護,是建筑歷史學家、建筑教育家和建筑師,被譽為中國近代建筑之父。",extractions:[{ extractionClass:"姓名", extractionText:"梁思成"},{ extractionClass:"出生日期", extractionText:"1901年4月20日"},{ extractionClass:"逝世日期", extractionText:"1972年1月9日"},{ extractionClass:"出生地", extractionText:"日本東京"},{ extractionClass:"職業", extractionText:"建筑歷史學家、建筑教育家、建筑師"},{ extractionClass:"榮譽", extractionText:"中國近代建筑之父"}]},{text:"林徽因(1904年6月10日-1955年4月1日),原名“徽音”,漢族,祖籍福建閩侯(今福建福州),出生于浙江杭州。為中國近現代建筑學家、文學家,清華大學建筑系教授。",extractions:[{ extractionClass:"姓名", extractionText:"林徽因" },{ extractionClass:"出生日期", extractionText:"1904年6月10日"},{ extractionClass:"逝世日期", extractionText:"1955年4月1日"},{ extractionClass:"出生地", extractionText:"浙江杭州"},{ extractionClass:"職業", extractionText:"建筑學家、文學家"},{ extractionClass:"榮譽", extractionText:""}]}
]extract("古龍(1938年6月7日一1985年9月21日),原名熊耀華,籍貫江西南昌,漢族。1938年6月7日出生于香港。武俠小說家,新派武俠小說泰斗,與金庸、梁羽生、溫瑞安并稱為中國武俠小說四大宗師。",{promptDescription   :"從人物簡要介紹中提取姓名、出生日期、逝世日期(如有)、出生地、職業、榮耀/成就",examples,modelType           : 'openai',modelId             : 'doubao-seed-1-6-flash-250615',baseURL             : 'https://ark.cn-beijing.volces.com/api/v3',apiKey              : '',temperature         : 0.1,debug               : true}
)
.then(result=>{console.debug(`documentId=${result.documentId}`)console.debug(result.extractions)
})
.catch(e=>console.debug(e))

很遺憾,這個代碼執行后沒有任何結果😔,感覺是對大模型的兼容性還不夠高。


四、Rust 版本

目前我在 github 找到兩個 Rust 的實現:modularflow/langextract-rust、daleione/langextract。

從文檔的質量及 crates.io 下載量來看,langextract-rust 更勝一籌,所以我選擇了它😎。

另外提一句,daleione/langextract 提交到 crates.io 的庫應該是搞錯了,依賴下載后是貨不對板的一個示例函數(間下圖),估計是作者沒上傳最新的版本。

4.1 程序跑不起來😔

按照文檔寫了一段代碼,還是上面一樣的人物信息識別,不出意外報錯了。 報的是ConfigurationError("Custom provider inference not yet implemented"),我在 github 上提了 issue,希望能夠得到解決。

4.2 成功運行🎉

經過排查,發現上述的錯誤是因為代碼本身并沒有實現Custom provider inference

那要怎么樣才能使用豆包大模型呢?

一番努力后,終于被我找到了破解之法。

use langextract_rust::{extract, ExtractConfig,data::{ExampleData, Extraction},providers::ProviderConfig,
};#[tokio::main]
async fn main()-> Result<(), Box<dyn std::error::Error>> {// 獲取環境變量,不存在會返回 Errlet api_key = std::env::var("API_KEY").expect("請設置 API_KEY 環境變量");// 提取示例let examples = vec![ExampleData::new("梁思成(1901年4月20日-1972年1月9日),籍貫廣東新會,生于日本東京。畢生致力于中國古代建筑的研究和保護,是建筑歷史學家、建筑教育家和建筑師,被譽為中國近代建筑之父。".to_string(),vec![Extraction::new("姓名".to_string(), "梁思成".to_string()),Extraction::new("出生日期".to_string(), "1901年4月20日".to_string()),Extraction::new("逝世日期".to_string(), "1972年1月9日".to_string()),Extraction::new("出生地".to_string(), "日本東京".to_string()),Extraction::new("職業".to_string(), "建筑歷史學家、建筑教育家、建筑師".to_string()),Extraction::new("榮譽".to_string(), "中國近代建筑之父".to_string())]),ExampleData::new("林徽因(1904年6月10日-1955年4月1日),原名“徽音”,漢族,祖籍福建閩侯(今福建福州),出生于浙江杭州。為中國近現代建筑學家、文學家,清華大學建筑系教授。".to_string(),vec![Extraction::new("姓名".to_string(), "林徽因".to_string()),Extraction::new("出生日期".to_string(), "1904年6月10日".to_string()),Extraction::new("逝世日期".to_string(), "1955年4月1日".to_string()),Extraction::new("出生地".to_string(), "浙江杭州".to_string()),Extraction::new("職業".to_string(), "建筑學家、文學家".to_string()),Extraction::new("榮譽".to_string(), "".to_string())])];// 配置大模型let custom_config = ProviderConfig::openai_compatible("https://ark.cn-beijing.volces.com/api/v3","doubao-seed-1-6-flash-250615",Some(api_key.clone()));let extract_config = ExtractConfig {language_model_params:{let mut params = std::collections::HashMap::new();params.insert("provider_config".to_string(), serde_json::to_value(&custom_config)?);params},debug: false,..Default::default()};let result = extract("古龍(1938年6月7日一1985年9月21日),原名熊耀華,籍貫江西南昌,漢族。1938年6月7日出生于香港。武俠小說家,新派武俠小說泰斗,與金庸、梁羽生、溫瑞安并稱為中國武俠小說四大宗師。",Some("從人物簡要介紹中提取姓名、出生日期、逝世日期(如有)、出生地、職業、榮耀/成就"),&examples,extract_config).await?;println!("? Extracted {} items", result.extraction_count());// Show extractions with character positionsif let Some(extractions) = &result.extractions {for extraction in extractions {println!("? [{}] '{}' at {:?}",extraction.extraction_class,extraction.extraction_text,extraction.char_interval);}}Ok(())
}

運行代碼,得到以下的結果?。個人覺得我設置了 debug=false ,應該不顯示運行時日志才對,就跟 python 版本一樣默默返回結果。

4.3 未來展望 🚀

我計劃做一個帶 GUI 的結構化信息提取程序,基于 Tauri,所以有一個能用的 rust 版本 langextract 尤為重要😄。


Java 版本

目前我還沒有找到 Java 實現的版本,是不是一個機會😄?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93975.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93975.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

把 AI 變成「會說話的盲道」——基于骨傳導的地磚級語音導盲磚

標簽&#xff1a;城市無障礙、骨傳導、TinyML、語音導航、太陽能、離線推理、ESP32-C3、邊緣 AI ---- 1. 背景&#xff1a;為什么盲道要開口說話&#xff1f; 全國 1700 萬視障者&#xff0c;城市道路卻常出現&#xff1a; ? 盲道被違停車、廣告牌截斷&#xff1b; ? 傳統導…

解析三品汽車零部件PLM系統解決方案:如何助力行業解決研發管理難題

2024年&#xff0c;全球汽車零部件市場規模超1.5萬億美元&#xff0c;中國市場規模達4.6萬億元人民幣。產業繁榮高度依賴汽車產業的發展&#xff0c;2024年中國汽車產銷量均突破3100萬輛&#xff0c;新能源汽車銷量約1286萬輛&#xff0c;2019-2024年復合增長率達76.59%。當前行…

【RA-Eco-RA4E2-64PIN-V1.0 開發板】步進電機驅動

【RA-Eco-RA4E2-64PIN-V1.0 開發板】步進電機驅動 本文介紹了 RA-Eco-RA4E2-64PIN-V1.0 開發板驅動 28BYJ-48 步進電機的設計。 項目介紹 硬件連接&#xff1a;28BYJ-48 步進電機、ULN2003 驅動板、Jlink 調試器等&#xff1b;工程創建&#xff1a;GPIO 和 UART 的配置&#xf…

機器人爆發、汽車換代,速騰聚創開始講新故事

文&#xff5c;劉俊宏編&#xff5c;王一粟2025年智能汽車出貨量激增&#xff0c;堪稱“智駕安全帶”的激光雷達&#xff0c;迎來了自己的iPhone時刻。8月21日&#xff0c;速騰聚創發布了2025年第二季度及中期業績報告&#xff0c;激光雷達的中場戰事得以一并揭開。速騰聚創二季…

在Excel和WPS表格中如何隱藏單元格的公式

Excel和WPS表格中有數據、公式、圖表等以后&#xff0c;要發給他人查閱&#xff0c;如果不希望表格中的公式被查閱和修改&#xff0c;我們可以通過兩個步驟把公式隱藏起來。先設置有公式的單元格格式為隱藏&#xff0c;然后保護工作表即可。第一步&#xff1a;設置單元格格式為…

Eino 開源框架全景解析 - 以“大模型應用的搭積木指南”方式理解(一)

Eino 開源框架全景解析 - 大模型應用的搭積木指南 &#x1f3af; 什么是 Eino&#xff1f;一句話概括 Eino 是字節跳動開源的大語言模型應用開發框架&#xff0c;就像是一個專門為 AI 應用設計的"搭積木工具箱"&#xff0c;讓開發者能夠像搭樂高一樣輕松構建復雜的 A…

大語言模型原理(Transformer架構)

一、概覽1.1 定義大語言模型&#xff08;LLM&#xff09;是基于深度學習和神經網絡的自然語言處理技術&#xff0c;目前主要通過Transformer架構和大規模數據訓練來理解和生成語言。GPT不同架構的訓練參數&#xff1a;GPT-1(2018)&#xff1a;1.17億參數GPT-2(2018)&#xff1a…

Nginx npm + Node.js 簡單實踐

一、基本概念介紹 Nginx 是一款高性能的 Web 服務器和反向代理服務器&#xff0c;而 Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環境&#xff0c;可以讓JavaScript 在服務器端運行。npm 則是 Node.js 的默認包管理工具&#xff0c;類似手機的應用市場。主要功能事故…

Python 中 SQLAlchemy 和 MySQLdb 的關系

目錄1. 角色和定位2. 工作原理和交互方式使用純 MySQLdb使用 SQLAlchemy&#xff08;核心或 ORM&#xff09;3. 依賴關系總結與選擇 簡單來說&#xff0c;它們的關系是&#xff1a;SQLAlchemy 是一個高層抽象的對象關系映射器&#xff08;ORM&#xff09;和 SQL 工具包&#xf…

【CV】OpenCV①——圖形處理簡介

一、OpenCV簡介 1. 圖像處理 1.1. 圖像起源 1.1.1. 圖像是什么1.1.2. 模擬圖像和數字圖像1.2. 數字圖像的表示 1.2.1. 位數1.2.2. 圖像分類 二值圖像灰度圖彩色圖

JAVA后端開發——API狀態字段設計規范與實踐

1. 引言在現代Web應用與API設計中&#xff0c;狀態&#xff08;Status&#xff09;字段的管理是一個普遍存在且至關重要的議題。狀態字段&#xff0c;如訂單狀態、任務執行狀態、模型運行狀態等&#xff0c;直接關系到系統的核心業務邏輯。不恰當的設計會導致API可讀性差、系統…

【MySQL的卸載】

MySQL的卸載卸載MySQL步驟1&#xff1a;停止MySQL服務步驟2&#xff1a;軟件的卸載卸載方式一&#xff1a;通過控制面板卸載軟件卸載方式二&#xff1a;通過360或電腦管家等軟件卸載卸載方式三&#xff1a;通過安裝包提供的卸載功能卸載步驟3&#xff1a;殘余文件的清理步驟4&a…

高效實時數據同步方案:秒級響應多字段搜索

目錄 1、其他 2、業務背景和目標 2.1 業務目標 2.2 核心痛點 3、技術選型 3.1 實時工具同步選型 3.2 OLAP數據庫選型 3.3 候選技術路線對比 3.4 技術難點 3.5 技術選型推薦 3.5.1、推薦的技術路線 3.5.2 架構示意圖 4 、可行性驗證方案?? ??4.1 測試用例設計? …

面試問題詳解七:Qt 信號與槽 + QML 的結合詳解

在現代 Qt 開發中&#xff0c;QML&#xff08;Qt Quick&#xff09;負責 UI 層&#xff0c;C 負責邏輯層或后端服務層 是一種非常流行的架構方式。 這一模式下&#xff0c;信號與槽機制在 QML 與 C 間的前后端通信中扮演橋梁角色&#xff0c;是實現數據驅動界面更新、事件響應、…

孔夫子舊書網 API 實戰:古籍與二手書數據獲取及接口調用方案

孔夫子舊書網作為國內知名的古籍、二手書交易平臺&#xff0c;其商品數據對于圖書收藏、學術研究及二手書電商系統具有重要價值。本文將詳細介紹孔夫子平臺接口的調用方法&#xff0c;涵蓋認證機制、搜索參數配置、數據解析及反爬策略&#xff0c;并提供可直接使用的 Python 代…

文件包含的學習筆記

面試問題 1&#xff0c;任意文件讀取&#xff0c;到底讀什么文件&#xff0c;有什么危害 權限是www 只能讀第一個&#xff0c;讀這個沒用&#xff0c;密碼在/etc/shadow中 其它沒有權限 my.cnf mysql密碼看不了 但是可以看見日志文件的目錄 sql注入時&#xff0c;你有注…

Linux 軟件包安裝和管理的相關操作及使用總結(未完成)

一、基礎知識1、軟件包分類源碼包&#xff08;Source Package&#xff09;&#xff1a;包含軟件的源代碼文件、編譯指令和配置文件。需要用戶自行編譯安裝&#xff0c;過程相對復雜&#xff0c;但靈活性高&#xff0c;可以定制安裝選項。文件格式通常為.tar.gz、.tar.bz2等壓縮…

【開發指南】飛凌i.MX9352核心板開發過程中的常見問題及排查思路

飛凌嵌入式作為NXP金牌合作伙伴&#xff0c;已基于i.MX系列應用處理器推出了多款嵌入式主控產品&#xff0c;除了最新發布的i.MX95xx系列核心板外&#xff0c;同為i.MX9系的i.MX93xx系列核心板也已上市多年并獲得了眾多客戶的認可和選擇。在長期的技術支持服務過程中&#xff0…

Windows應急響應一般思路(二)

進程排查 進程(Process)是計算機中的程序關于某數據集合上的一次運行活動&#xff0c;是系統進行資源分配和調度的基本單位&#xff0c;是操作系統結構的基礎 無論是在Windows系統還是Linux系統中&#xff0c;主機在感染惡意程序后&#xff0c;惡意程序都會啟動相應的進程&am…

FFmpeg03:多媒體文件處理基礎

日志系統 #include <libavutil/log.h>av_log_set_level(AV_LOG_DEBUG)av_log(NULL, AV_LOG_INFO, “…%s\n”, op) 常用日志級別 AV_LOG_ERROR AV_LOG_WARNING AV_LOG_INFO Demo log.cpp #include <iostream> extern "C" { #include <libavutil/log.h…