使用 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…