隆重推出 LangExtract:由 Gemini 驱动的信息提取库

2025年7月30日
Akshay Goel ML Software Engineer
Atilla Kiraly ML Software Engineer

在当今数据丰富的世界中,许多有价值的见解往往深藏于非结构化文本之中,例如详尽的临床记录、冗长的法律文件、纷繁的客户反馈以及不断更新的新闻报道。手动梳理这些信息,或编写专门的代码来处理数据,既耗时又容易出错;而若简单地使用现代大语言模型 (LLM),则可能引入新的错误试想一下,如果能够以编程方式精准提取所需信息,同时确保输出结果结构清晰,并能可靠地追溯来源,那该有多高效?

今天,我们很高兴推出 LangExtract,这是一款全新的开源 Python 库,旨在帮助开发者实现上述目标。LangExtract 提供了一个轻量级的接口,可连接包括 Gemini 模型在内的多种 LLM,以根据自定义指令将大量非结构化文本处理为结构化信息,兼顾灵活性与可追溯性。

无论您处理的是医疗报告、财务摘要,还是其他任何文本密集型领域的资料,LangExtract 都能为您提供一种灵活而强大的方式,释放其中蕴藏的数据价值。


是什么使 LangExtract 在信息提取方面表现出色

LangExtract 集成了一系列独特功能,使其在信息提取任务中尤为实用:

  • 精准的来源定位:每个提取的实体都会精确映射回其在来源文本中的字符偏移位置。如下方动画所示,该功能通过直观地在原文中突出显示每个提取内容来实现可追溯性,从而更便于评估和验证所提取的信息。

  • 可靠的结构化输出:使用 LangExtract 数据表征定义您期望的输出格式,并提供一个或多个“少样本”示例。LangExtract 利用此信息强制执行模式,通过 Gemini 等支持模型中的受控生成技术,确保输出结果始终保持一致的结构。这一点在我们对《罗密欧与朱丽叶》的全文分析中已得到充分验证,展现出其强大的结果稳定性。

  • 优化的长上下文信息提取:从大型文档中检索信息可能很复杂。例如,尽管 LLM 在许多基准测试中表现优异,但百万级 token 上下文的“大海捞针”测试表明,在涉及多事实检索的场景下,召回率可能会下降。LangExtract 通过分块策略、并行处理以及在更小、更聚焦的上下文上进行多轮传递,专门针对这一挑战进行了优化设计。

  • 交互式可视化:几分钟内即可从原始文本生成一个独立的交互式 HTML 可视化结果。LangExtract 让您能够轻松地在上下文中查看提取的实体,并对成千上万条注解进行高效探索。

  • 灵活的 LLM 后端支持:无论您偏好的是云端大模型(如 Google 的 Gemini 系列),还是开源的设备端模型,LangExtract 均可无缝对接。

  • 广泛的领域适用性:只需提供几个精心挑选的示例,即可为任意领域定义信息提取任务,无需对 LLM 进行微调。LangExtract 能“理解”您期望的输出格式,并将其应用于大规模的新文本输入。查看此药物信息提取示例,直观了解其工作方式。

  • 利用 LLM 的世界知识:除了提取有依据的实体外,LangExtract 还能借助模型自身的世界知识,对提取的信息进行补充。这类补充信息可以是显式的(即源自来源文本的内容),也可以是推断得出的(即基于模型内在的世界知识)。此类补充知识(尤其是推断所得的知识)的准确性与相关性,在很大程度上取决于所选 LLM 的能力,以及指导提取过程的示例提示词的精确程度。


快速入门:从莎士比亚文本到结构化对象

以下是如何从莎士比亚的台词中提取人物详细信息的示例。

首先,安装内容库:

有关更详细的设置说明,包括虚拟环境和 API 密钥配置,请参阅项目 README 文档

pip install langextract
Python

接下来,定义提取任务。提供清晰的提示和高质量的“少样本”示例,以指导模型。

import textwrap
import langextract as lx
 
# 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"},
            ),
        ],
    )
]
 
# 3. 在输入文本上运行提取
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-pro",
)
Python

结果对象包含提取的实体,可保存为 JSONL 文件。随后,您可以生成一个交互式 HTML 文件来查看这些注解。这种可视化方式非常适合用于演示或评估提取质量,能够节省大量时间。它可在 Google Colab 等环境中无缝运行,也可保存为独立的 HTML 文件,通过浏览器直接查看。

# 将结果保存为 JSONL 文件
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl")
 
# Generate the interactive visualization from the file
html_content = lx.visualize("extraction_results.jsonl")
with open("visualization.html", "w") as f:
    f.write(html_content)
Python

适用于专业领域的灵活性

上述原理同样适用于医学、金融、工程或法律等专业领域。LangExtract 的设计理念最初正是应用于医疗信息提取,并在处理临床文本方面表现出色。例如,它能够识别药物名称、剂量及其他药物相关属性,并建立它们之间的关联关系。这一能力是推动本内容库诞生的核心研究成果,您可通过我们关于加速医疗信息提取的论文了解更多详情。

下方动画展示了 LangExtract 处理临床文本,提取与药物相关的实体,并将其分组至对应来源药物的全过程。

结构化放射学报告演示

为了展示 LangExtract 在专业领域的强大能力,我们在 Hugging Face 上开发了一个名为 RadExtract 的交互式演示,用于结构化放射学报告。该演示展示了 LangExtract 如何处理自由文本形式的放射学报告,并自动将其关键发现结果转换为结构化格式,同时突出显示重要的结果。这种方法在放射学领域尤为重要,因为结构化报告能够提升信息清晰度、确保内容完整性,并增强数据在科研与临床诊疗中的互操作性。

在 HuggingFace 上体验该演示:https://google-radextract.hf.space


免责条款: 上述药物提取示例和结构化报告演示仅用于展示 LangExtract 的基础功能,不代表任何已完成或获批的产品;不用于诊断疾病或推荐治疗方案,亦不应作为医疗建议使用。


开始使用 LangExtract:资源和后续步骤

我们期待看到开发者们以富有创意的方式,利用 LangExtract 从文本中挖掘出更多数据洞见。查阅文档,浏览 GitHub repo中的示例,立即开始转化非结构化数据吧。