面包屑图标 当前位置: 首页
AI资讯
热点详情

谷歌出品LangExtract:轻量级结构化信息提取神器

AI热点日报
AI热点日报时间:2026-05-29
热点解读

谷歌开源LangExtract工具,通过自然语言指令从非结构化文本中提取结构化信息,支持长文本处理、结果可追溯及交互式可视化,适用于医学报告等复杂场景,提升信息提取的稳定性与可控性。

在数据驱动的时代,大量有价值的信息其实都藏在非结构化文本里——想想看,临床记录、法律文件、客户反馈……多得数不清。问题在于,我们需要把这些文本变成结构化数据,才方便索引、统计、分析和交给软件去跑流程。但这事儿说起来容易做起来难。

好在,谷歌新开源了一款Python工具,叫LangExtract。它让大模型听你的自然语言指令,把非结构化文本转成结构清晰、来源可追溯的数据。说实话,这是我近期见过最“小而美”的工具之一:简洁、高效,而且真的能干活。

这篇文章会带你快速搞懂:

  • 它从哪来、要解决什么问题
  • 和直接让LLM输出JSON相比,它强在哪
  • 两个实战案例——医学报告和超长文本抽取
  • 以及未来能在哪些场景落地

01 起源与动机

从低密度的自然语言里做结构化信息抽取,一直是AI领域的硬骨头。传统方法要么靠正则表达式死磕,要么训练机器学习模型去认上下文特征,可真实语料千变万化,总有办法让规则失效。

LLM的出现给了新希望,但说实话,直接让大模型“读文本吐结构”,问题也不少:

  • 结果不稳定——同一段文本,换一次提示或者模型状态稍微变一下,输出就可能完全不同。
  • 缺乏溯源——生成的字段和原文对应不上,审核和验证起来让人头大。
  • 长文本乏力——文本一长(几万字甚至更多),模型就容易“迷失”,简单截断又可能漏掉关键信息。
  • 跨领域适应难——医疗、法律、金融、舆情……每个领域抽取的需求都不一样,让模型通吃不现实,微调又太贵。

LangExtract正是为了解决这些问题而生。它由谷歌开源,开发者只需要用自然语言指令加少量示例,就能定义并完成抽取任务。和普通LLM直接输出不同,它在后台搞了一套策略来强化结果的可靠性和可控性——把大模型从一个不可控的“黑盒”,变成了可定制、可追踪的工具。尤其对追求严格数据质量和合规性的企业来说,这种控制力正是最急需的。

02 区别于直接LLM输出的特点

和让LLM直接生成JSON相比,LangExtract提供了一整套机制来保证抽取结果的准确、稳定和易用。总结下来,这几个特点特别突出:

  • 领域适应性强——想换一个垂直领域?只需要改改提示和示例,不用微调底层模型。从司法文书的日期地点,到医学报告的数据结构,都能通过改Prompt搞定。
  • 精准定位来源——每个抽取结果都带着原文中的字符偏移索引,说白了就是能精准知道“这一段是从原文哪一句话里提取出来的”。审核和验证变得透明、可追溯。
  • 输出稳定可靠——通过提示词描述输出结构,再提供一组高质量的Few-Shot示例来定义Schema,模型会严格跟着预期格式走,复杂任务下输出依然一致。
  • 优化长文档处理——针对“海量文本、大海捞针”式的抽取难题,采用分区块+多线程并行+多轮抽取的策略。就算百万级字符的长文档,也能被有效“扫描”,不遗漏关键信息。
  • 交互式可视化——可以生成交互式的HTML报告,用颜色高亮每个提取实体在原文中的位置,还带导航控件。做人工复核或者演示汇报的时候,理解结果和评估质量都方便很多。
  • 善用LLM的通用知识——允许模型运用自身知识补充额外信息。比如让模型基于知识给抽取的人物加上身份或时代背景。当然,这部分准确性取决于模型能力和提示引导,但至少给结果增加了“推理”的味道。

这些特性让LangExtract把大模型从一个不可控的“黑盒”变成了开发者手中可定制、可追踪的工具。

03 实例演示:LangExtract抽取医学报告

LangExtract的核心思想最早正是用在医学信息抽取上——比如从临床笔记中自动识别药物名称、剂量、频率、适应症状,并构建信息之间的关系。下面用一个简单示例演示一下它在医疗领域的用法。

基本步骤分四步:

【基础抽取】

  • 定义抽取任务描述 (Prompt)——用自然语言写一段提示,说清楚要提取什么、遵循什么规则。
import textwrap
import langextract as lx
from langextract.factory import ModelConfig

# 提取指令
prompt_description = textwrap.dedent("""
提取药物信息,包括药物名称、剂量、给药途径、频率和持续时间,按照它们在文本中间出现的顺序提取。
""")
  • 提供高质量示例 (Few-shot Examples)——人工构造几个例子,告诉模型遇到类似文本时该怎么输出。
examples_ner = [
    lx.data.ExampleData(
        text="患者被给予250毫克静脉注射头孢唑啉,每日三次,持续一周。",
        extractions=[
            lx.data.Extraction(extraction_class="dosage", extraction_text="250毫克"),
            lx.data.Extraction(extraction_class="route", extraction_text="静脉注射"),
            lx.data.Extraction(extraction_class="medication", extraction_text="头孢唑啉"),
            lx.data.Extraction(extraction_class="frequency", extraction_text="每日三次"),
            lx.data.Extraction(extraction_class="duration", extraction_text="持续一周")
        ]
    )
]
  • 执行抽取 (Extraction)——调用接口,传入待处理的文本、提示描述、示例数据和底层模型配置。LangExtract会自动调用LLM分析并提取信息。
input_text = "患者服用了400毫克口服布洛芬,每4小时一次,持续两天。"

#配置模型 - 明确指定OpenAI提供者
model_config = ModelConfig(
    model_id="qwen3-14b",  
    provider="OpenAILanguageModel", 
    provider_kwargs={
        "temperature": 0.1,
        "max_tokens": 2048,
        "base_url": "your-base-url",
        "api_key": "your-api-key"
    }
)

result_ner = lx.extract(
    text_or_documents=input_text,
    prompt_description=prompt_description,
    examples=examples_ner,
    config=model_config,
    fence_output=True,
    use_schema_constraints=False,
    debug=False
)
  • 输出与可视化结果——可以直接打印解析结果,或者保存成JSONL文件,再用visualize方法生成交互式HTML。
print("提取的实体:")
for entity in result_ner.extractions:
    position_info = ""
    if entity.char_interval:
        start, end = entity.char_interval.start_pos, entity.char_interval.end_pos
        position_info = f" (位置: {start}-{end})"
    print(f"• {entity.extraction_class.capitalize()}: {entity.extraction_text}{position_info}")

# 保存结果
lx.io.sa ve_annotated_documents([result_ner], output_name="医疗_ner_提取.jsonl")
print("n基础NER结果已保存到 医疗_ner_提取.jsonl")    

html_content_ner = lx.visualization.visualize("./test_output/医疗_ner_提取.jsonl")
with open("医疗_ner_可视化.html", "w", encoding='utf-8') as f:
    f.write(html_content_ner)

LangExtract的解析结果是一个Extraction对象的列表,它包含了完整的信息结构:

  • 核心层——定义“是什么”(extraction_class、extraction_text)
  • 定位层——记录“在哪里”(char_interval、token_interval)
  • 组织层——管理“如何组织”(extraction_index、group_index、alignment_status)
  • 语义层——描述“更多信息”(description、attributes)

上面的简单示例只打印了类型和文本,但你也可以把结果可视化成一个HTML页面,直接看到提取实体在原文中的高亮位置(支持追溯)。

不过有一点要注意:目前LangExtract的可视化功能对中文支持还不够完善。如果是英文环境,生成的HTML效果会很好(类似下图)。相信后续版本会逐步优化多语言支持。

【关联抽取】

实际应用中常常需要把多个相关的抽取结果关联起来。比如上例中,一种药物的名称、用法、剂量应该被绑定在一起。LangExtract提供了两种方式来实现:

利用分组关联多个实体

给每个抽取实体赋予一个“分组”属性(比如medication_group),具有相同分组值的实体就自动关联在一起。你只需要修改提示词和示例即可。

我们拿一段更复杂的医学文本测试:

“患者上个月被开了利辛普利和二甲双胍。他每天服用利辛普利10毫克治疗高血压,但经常漏服二甲双胍500毫克剂量,应该每日两次服用治疗糖尿病。”

修改prompt和examples如下:

prompt_description_re = textwrap.dedent("""
提取药物及其详细信息,使用属性将相关信息分组:
1. 按照实体在文本中间出现的顺序提取
2. 每个实体必须具有 'medication_group' 属性,将其链接到相应的药物
3. 一个药物的所有详细信息应该共享相同的 medication_group 值
""")  

examples_re = [
    lx.data.ExampleData(
        text="患者服用阿司匹林100毫克每日一次用于心脏健康,以及辛伐他汀20毫克睡前服用。",
        extractions=[
            # 第一个药物组
            lx.data.Extraction(
                extraction_class="medication",
                extraction_text="阿司匹林",
                attributes={"medication_group": "阿司匹林"}
            ),
            lx.data.Extraction(
                extraction_class="dosage",
                extraction_text="100毫克",
                attributes={"medication_group": "阿司匹林"}
            ),
            lx.data.Extraction(
                extraction_class="frequency",
                extraction_text="每日一次",
                attributes={"medication_group": "阿司匹林"}
            ),
            lx.data.Extraction(
                extraction_class="condition",
                extraction_text="心脏健康",
                attributes={"medication_group": "阿司匹林"}
            ),
            # 第二个药物组(辛伐他汀)省略...
        ]
    )
]

通过medication_group把药物相关的多个实体关联起来,解析结果中可以轻松看到每种药物的聚合信息。

以实体为中心的属性抽取

另一种方式是把药物作为主实体,其他相关信息(剂量、频率等)作为该药物的属性。示例如下:

prompt_description_attr = textwrap.dedent("""
提取药物信息,将每个药物作为主要实体,其相关的剂量、频率、途径、适应症等信息直接作为该药物的属性:
1. extraction_class 统一为 "medication"
2. extraction_text 为药物名称
3. 所有相关信息(剂量、频率、给药途径、适应症、持续时间等)放在 attributes 中
4. 按照药物在文本中间出现的顺序提取
""")

examples_attr = [
    lx.data.ExampleData(
        text="患者服用阿司匹林100毫克每日一次用于心脏健康,以及辛伐他汀20毫克睡前服用。",
        extractions=[
            lx.data.Extraction(
                extraction_class="medication",
                extraction_text="阿司匹林",
                attributes={
                    "dosage": "100毫克",
                    "frequency": "每日一次", 
                    "condition": "心脏健康",
                    "route": "口服"  # 可以推断或明确提及
                }
            ),
            ...
        ]
    )
]

调用lx.extract后,得到的结果与分组方式基本一致,只是数据组织方式不同。

04 实例演示:LangExtract超长文本抽取

如果你曾经尝试用LLM提取超长文本中的结构化信息,大概率遇到过模型理解能力下降、性能差、准确率不够等问题。LangExtract针对长文本做了专门的设计。

我们用一篇“漫威世界背景知识”的文本文件做测试,共约23000个中文字符,里面描述了大量人物、关系、事件、组织等。很适合用来验证复杂结构的信息抽取能力。

第一步,设定prompt和examples:

prompt_description = textwrap.dedent("""
从给定的漫威宇宙文本中提取角色、能力、关系、组织和事件。
为每个实体提供有意义的属性以增加上下文和深度。
重要提示:使用输入文本中的确切文字作为 extraction_text,不要意译。
按出现顺序提取实体,不要重叠文本片段。注意:在漫威宇宙中,角色通常有多个身份、绰号、能力和隶属组织。""")

example_data = [
    ExampleData(
        text="X教授是一位在漫威漫画中的出版物《X战警》中的虚构人物。X教授和至交好友万磁王不同,他一心想让变种人与人类能和平共处。",
        extractions=[
            Extraction(
                extraction_class="角色",
                extraction_text="X教授",
                attributes={"身份": "变种人领袖", "能力": "心灵感应", "组织": "X战警", "目标": "人类变种人和平共处"}
            ),
            Extraction(
                extraction_class="角色", 
                extraction_text="万磁王",
                attributes={"身份": "变种人", "关系": "X教授至交好友", "立场": "与X教授不同"}
            ),
            Extraction(
                extraction_class="组织",
                extraction_text="X战警", 
                attributes={"类型": "超级英雄团队", "领袖": "X教授", "成员": "变种人"}
            ),
            Extraction(
                extraction_class="关系",
                extraction_text="至交好友",
                attributes={"类型": "友谊", "人物1": "X教授", "人物2": "万磁王", "状态": "理念不同"}
            ),
        ]
    ),
    .....    
]

然后从文件读取内容并解析,这里有几个针对长文本的特殊参数:

...从文件读取到marvel_text...

# 处理漫威宇宙文本
result = extract(
    text_or_documents=marvel_text,
    prompt_description=prompt_description,
    examples=example_data,
    config=model_config,
    extraction_passes=2,      # 多轮提取提高召回率
    max_workers=5,           # 并行处理加速
    max_char_buffer=1024,      # 较小的上下文窗口提高准确性
    fence_output=True,
    use_schema_constraints=False
)

最终结果一共提取了1926个实体。我们打印出前十名角色及属性、前十名组织(这里可以看到一个小瑕疵:X战警出现了两次)、前十名重要事件,效果还是很直观的。

LangExtract在超长文档解析上的设计策略总结起来有三点:

  • 多次提取:通过extraction_passes参数执行多次独立提取,每次发现新的非重叠实体,减少遗漏。
  • 智能分块:用更小的上下文窗口提高单次推理的提取质量,同时通过识别文本分隔符确保上下文完整性和格式规范。
  • 并行处理:设置max_workers参数,对大文档进行并行化处理,显著减少总体耗时。

05 总结与应用展望

LangExtract为非结构化文本的洞察提取带来了新的体验和有效改进——它把LLM的能力以一种更可控、可靠的方式用在了信息抽取上,解决了结果不可预期和不可溯源的老大难问题。这对企业级应用来说,意义非常大。

哪些场景可以用起来?

  • 医疗与金融等专业报告结构化:从临床文本中提取药物名称、剂量、用法,建立关联关系;从财报或研报中提炼指标数据和关键信息,支撑风控和决策。
  • 客户评价与投诉分析:整理凌乱的用户反馈,快速提炼主要问题类型和情绪倾向,帮助企业抓住共性诉求。
  • 软件Bug反馈整理:自动抽取问题描述、错误信息、影响范围等字段,帮助开发团队快速定位修复。
  • 合同与法律文档要点提取:从冗长的合同、协议或判决书中自动识别当事方名称、关键日期、金额、义务条款,降低人工审核负担。
  • 会议纪要与邮件要点萃取:从会议纪要中抓取决策结论、行动项;从邮件中提取客户要求或技术摘要,提高团队跟进效率。

LangExtract已经发布在PyPI上,你可以轻松安装并集成到自己的应用里。快去试试吧!

END

热点追踪提示词
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:谷歌出品LangExtract:轻量级结构化信息提取神器要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
来源:https://www.53ai.com/news/OpenSourceLLM/2025081818327.html
ai 人工智能

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关热点
AI热点2026-07-08 20:13
Craftman AI聊天机器人构建工具

最近留意到一款AI聊天机器人构建工具——Craftman,它的核心思路很有意思:让企业或个人能用自己已有的数据来训练ChatGPT,然后直接嵌入到网站上做智能客服或问答助手。简单来说,就是把通用大模型变成你的专属知识库响应系统。什么是Craftman?Craftman是一个AI聊天机器人构建平台,允

AI热点2026-07-08 20:13
Vidu长视频AI大模型一键生成16秒1080P高清视频

如果告诉你,现在借助AI技术就能一键生成时长16秒、分辨率达1080P的高清视频,并且画面流畅自然、物理规律真实可信,你是不是觉得有些不可思议?事实上,这就是Vidu——由中国生数科技与清华大学联合打造的全球首个长时长、高一致性、高动态性视频大模型。它采用独创的Diffusion与Transform

AI热点2026-07-08 20:13
Hansei通过AI聊天帮助用户高效便捷简化知识库访问流程

想象一下,你拥有一个庞大而复杂的知识库,里面堆满了各类文档、PDF文件以及YouTube视频教程。过去想要查找某份资料,往往需要翻遍目录、反复尝试关键词搜索,效率低下令人困扰。如今,借助Hansei这款知识库管理工具,一切变得轻松高效——你只需像与朋友聊天一样,用自然语言提出需求,AI助手就能从你的

AI热点2026-07-08 20:13
Blinkn ChatGPT智能购物助手

Blinkn是基于ChatGPT的智能电商购物助手,具备语义理解、精准产品推荐与比较、多语言支持等功能,可与主流平台无缝集成并个性化定制,提供7×24小时实时客服,高效解决购物疑问,显著减少决策摩擦,提升转化率与用户体验。

延伸阅读