本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。
原文链接:小白学信息抽取:LangExtract 一款由Gemini 驱动的信息提取库
在当今数据丰富的世界中,许多有价值的见解往往深藏于非结构化文本之中,例如详尽的临床记录、冗长的法律文件、纷繁的客户反馈以及不断更新的新闻报道。手动梳理这些信息,或编写专门的代码来处理数据,既耗时又容易出错;而若简单地使用现代大语言模型 (LLM),则可能引入新的错误。试想一下,如果能够以编程方式精准提取所需信息,同时确保输出结果结构清晰,并能可靠地追溯来源,那该有多高效?
https://developers.googleblog.com/zh-hans/introducing-langextract-a-gemini-powered-information-extraction-library/
今天,我们很高兴推出 LangExtract,这是一款全新的开源 Python 库,旨在帮助开发者实现上述目标。LangExtract 提供了一个轻量级的接口,可连接包括 Gemini 模型在内的多种 LLM,以根据自定义指令将大量非结构化文本处理为结构化信息,兼顾灵活性与可追溯性。
无论您处理的是医疗报告、财务摘要,还是其他任何文本密集型领域的资料,LangExtract 都能为您提供一种灵活而强大的方式,释放其中蕴藏的数据价值。
快速入门:从莎士比亚文本到结构化对象
首先,安装内容库:
pip install langextract
接下来,定义提取任务。提供清晰的提示和高质量的“少样本”示例,以指导模型。
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",
)
结果对象包含提取的实体,可保存为 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)
是什么使 LangExtract 在信息提取方面表现出色?
LangExtract 集成了一系列独特功能,使其在信息提取任务中尤为实用:
-
精准的来源定位:每个提取的实体都会精确映射回其在来源文本中的字符偏移位置。
-
可靠的结构化输出:使用 LangExtract 数据表征定义您期望的输出格式,并提供一个或多个“少样本”示例。
-
优化的长上下文信息提取:从大型文档中检索信息可能很复杂。例如,尽管 LLM 在许多基准测试中表现优异,但百万级 token 上下文的“大海捞针”测试表明,在涉及多事实检索的场景下,召回率可能会下降。
-
交互式可视化:几分钟内即可从原始文本生成一个独立的交互式 HTML 可视化结果。LangExtract 让您能够轻松地在上下文中查看提取的实体,并对成千上万条注解进行高效探索。
-
灵活的 LLM 后端支持:无论您偏好的是云端大模型(如 Google 的 Gemini 系列),还是开源的设备端模型,LangExtract 均可无缝对接。
-
广泛的领域适用性:只需提供几个精心挑选的示例,即可为任意领域定义信息提取任务,无需对 LLM 进行微调。
-
利用 LLM 的世界知识:除了提取有依据的实体外,LangExtract 还能借助模型自身的世界知识,对提取的信息进行补充。
LangExtract 是如何提取实体的?
LangExtract 通过 Annotator 类协调整个实体提取流程,主要包含以下几个核心步骤:
1. 文档处理和分块
系统首先将输入文档分解为可处理的文本块: annotation.py:193-248
-
使用
ChunkIterator将长文档分割成max_char_buffer大小的块 -
每个块保持与原始文档的位置映射关系
2. 提示生成和LLM推理
对每个文本块,系统生成结构化提示并调用语言模型: annotation.py:284-305
batch_prompts.append(
self._prompt_generator.render(
question=text_chunk.chunk_text,
additional_context=text_chunk.additional_context,
)
)
batch_scored_outputs = self._language_model.infer(
batch_prompts=batch_prompts,
**kwargs,
)
3. LLM输出解析
Resolver 类负责将LLM的原始输出解析为结构化的实体数据:
解析过程包括:
-
从YAML/JSON格式中提取实体信息
-
根据索引后缀对实体进行排序
-
处理实体属性和元数据
4. 实体对象创建
解析后的数据被转换为 Extraction 对象:
每个 Extraction 包含: data.py:65-98
-
extraction_class: 实体类别 -
extraction_text: 提取的文本内容 -
attributes: 实体属性字典 -
位置信息(字符和token间隔)
5. 文本对齐
最后,系统将提取的实体与原始文本进行精确对齐:
aligned_extractions = resolver.align(
annotated_chunk_extractions,
chunk_text,
token_offset,
char_offset,
**kwargs,
)
这确保每个实体都有准确的源文本位置信息,支持可视化和验证。
LangExtract 是如何避免重复调用大模型的?
系统在 _document_chunk_iterator 函数中实现了文档级别的去重。
当 restrict_repeats=True 时,系统维护一个 visited_ids 集合来跟踪已处理的文档ID,防止同一文档被重复处理。
系统通过批处理机制减少模型调用次数:
-
将多个文本块组合成批次(
batch_length参数控制) -
一次性调用
self._language_model.infer()处理整个批次 -
避免为每个文本块单独调用模型
LangExtract 如何处理嵌套实体的?
当检测到重叠时,系统采用"第一轮优先"策略:
-
在多轮提取中,如果后续轮次的实体与已有实体重叠,后续实体会被丢弃
-
只保留非重叠的新实体,避免嵌套冲突
此外每个 Extraction 对象都包含精确的位置信息:
-
精确定位每个实体在原文中的位置
-
检测实体间是否存在字符级别的重叠
-
支持嵌套实体的位置关系分析
LangExtract 当前的设计倾向于避免嵌套实体而非显式支持它们。系统通过重叠检测和"第一轮优先"策略来处理潜在的嵌套情况,但这更多是冲突解决机制而非真正的嵌套实体建模。
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

4529

被折叠的 条评论
为什么被折叠?



