对LangExtract的具体研究

LangExtract是今年11月份发布的,初步研究,发现其设计思路较为符合实际应用场景。结合近期工作,开展具体应用研究。

一、拉通业务流程

  1. 定义提取任务

第一步是用清晰的提示(Prompt)来描述你想要提取的内容。这个提示就像给人类分析师的指令——描述得越具体,结果就越好。
import langextract as lx
import textwrap

# 定义我们想从支持邮件中提取什么
prompt = textwrap.dedent("""
   从邮件文本中提取客户支持相关的实体。
   重点关注有助于确定优先级和分配工单的可操作信息。
   使用邮件中的确切文本——不要转述或总结。
   为支持人员提供有用的上下文属性。
""")
这里的textwrap.dedent()函数可以移除多行字符串中多余的缩进,使代码中的提示更易读,同时确保发送给AI的文本是干净的。
  1. 提供提取示例

示例是“教”AI如何准确提取并格式化结果的关键。每个示例都包含一段文本和期望从中提取的实体。
# 创建示例,向AI展示需要提取的内容
examples = [
   lx.data.ExampleData(
       text="My laptop screen keeps flickering. I bought it 3 months ago and need this fixed urgently for my presentation tomorrow.",
       extractions=[
           lx.data.Extraction(
               extraction_class="product",
               extraction_text="laptop",
               attributes={"issue": "screen flickering", "urgency": "high"}
           ),
           lx.data.Extraction(
               extraction_class="timeline",
               extraction_text="3 months ago",
               attributes={"context": "purchase_date"}
           ),
           lx.data.Extraction(
               extraction_class="urgency_indicator",
               extraction_text="urgently for my presentation tomorrow",
               attributes={"priority": "high", "deadline": "tomorrow"}
           )
       ]
   )
]
每个ExampleData对象包含一个文本样本和Extraction对象列表。Extraction对象定义了三个核心要素:
  • extraction_class: 实体的类型(如 “product”)。
  • extraction_text: 从原文中提取的确切文本。
  • attributes: 提供额外上下文的键值对。
属性(attributes) 是LangExtract区别于传统NER的强大之处。我们不仅能找到“laptop”,还能捕获到它存在“screen flickering”的问题,并标记为高优先级。

3.简单的例子

根据教程,部署环境,运行例子。这里我选择了qwen3_8b模型,因为目标环境中只有同样类型算力。
import textwrap
import langextract as lx
 
news_text = textwrap.dedent("""\
8月15日(周五)09:30 将公布中国7月CPI(同比)与核心CPI。
市场预测CPI同比上涨 3.0%,上月实际为 2.9%。
部分机构认为,食品分项涨幅扩大可能推高读数。
""")
 
prompt = textwrap.dedent("""\
请从输入的中文新闻段落中抽取与"经济指标发布"相关的信息:
- 指标名
- 发布时间
- 预测值
- 上月实际值
- 备注(若有)
要求:
- 使用输入中的原文片段作为 extraction_text
- 信息缺失时可以跳过该字段
""")
 
examples = [
    lx.data.ExampleData(
        text="将公布美国7月核心CPI,市场预测同比上涨 3.0%,上月为 2.9%。",
        extractions=[
            lx.data.Extraction("指标名", "美国7月核心CPI", attributes={"指标": "美国7月核心CPI"}),
            lx.data.Extraction("预测值", "3.0%", attributes={"预测值": "3.0%"}),
            lx.data.Extraction("上月实际值", "2.9%", attributes={"上月实际值": "2.9%"}),
        ]
    )
]
 
model_config = lx.factory.ModelConfig(
    model_id="Qwen/Qwen3-8B",
    provider="OpenAILanguageModel",
    provider_kwargs={
        "base_url": "https://api.siliconflow.cn/v1",  # 用base_url
        "format_type": lx.data.FormatType.JSON,
        "temperature": 0.1,
        "api_key": "sk-dhhgbxbsqnmi$kvcvsczyvkp",
    },
)
 
model = lx.factory.create_model(model_config)
 
result = lx.extract(
    text_or_documents=news_text,
    prompt_description=prompt,
    examples=examples,
    model=model,
    fence_output=False,
    use_schema_constraints=False)
 
for e in result.extractions:
    print(e.extraction_class, e.extraction_text, e.attributes)
返回结果:
jsonl格式的抽取结果:
{"extractions": [{"extraction_class": "指标名", "extraction_text": "中国7月CPI(同比)", "char_interval": null, "alignment_status": null, "extraction_index": 1, "group_index": 0, "description": null, "attributes": {"指标": "中国7月CPI(同比)"}}, {"extraction_class": "预测值", "extraction_text": "3.0%", "char_interval": {"start_pos": 49, "end_pos": 52}, "alignment_status": "match_lesser", "extraction_index": 2, "group_index": 1, "description": null, "attributes": {"预测值": "3.0%"}}, {"extraction_class": "上月实际值", "extraction_text": "2.9%", "char_interval": {"start_pos": 60, "end_pos": 63}, "alignment_status": "match_lesser", "extraction_index": 3, "group_index": 2, "description": null, "attributes": {"上月实际值": "2.9%"}}, {"extraction_class": "备注", "extraction_text": "部分机构认为,食品分项涨幅扩大可能推高读数。", "char_interval": {"start_pos": 66, "end_pos": 88}, "alignment_status": "match_exact", "extraction_index": 4, "group_index": 3, "description": null, "attributes": {"备注": "部分机构认为,食品分项涨幅扩大可能推高读数。"}}], "text": "8月15日(周五)09:30 将公布中国7月CPI(同比)与核心CPI。\n市场预测CPI同比上涨 3.0%,上月实际为 2.9%。\n部分机构认为,食品分项涨幅扩大可能推高读数。\n", "document_id": "doc_444355f2"}
html可视化展示
这个例子也体现了LangExtract的设计思路,但是这里,待抽取文档和例子是非常接近的。

4.提取关系

前面提取的实体虽然有用,但它们是孤立的。当客户说“我2021年买的MacBook Pro有电池问题”时,我们需要将“MacBook Pro”、“2021”和“电池问题”关联起来,才能构成一个完整的支持案例。
LangExtract通过在提取时建立关系来解决这个问题,而不是在提取后试图用复杂的规则去连接实体。你可以使用共享属性来分组相关信息,同时保留每个信息点的精确来源。
我们将从公司公告中提取员工信息,并将每个人的姓名、职位、部门和联系方式关联起来。
import langextract as lx
import textwrap

# 定义关系提取的提示
prompt = textwrap.dedent("""
   从公司公告中提取员工信息。
   使用 employee_group 属性将每个人的相关信息分组。
   关联每个员工的姓名、职位、部门和联系方式。
   使用公告中的确切文本,不要转述。
""")

# 创建示例,展示如何分组相关信息
examples = [
   lx.data.ExampleData(
       text="Sarah Johnson, our new Marketing Director, will lead the digital campaigns team. You can reach Sarah at sarah.j@company.com for any marketing questions.",
       extractions=[
           lx.data.Extraction(
               extraction_class="person",
               extraction_text="Sarah Johnson",
               attributes={"employee_group": "Sarah Johnson"}
           ),
           lx.data.Extraction(
               extraction_class="department",
               extraction_text="digital campaigns team",
               attributes={"employee_group": "Sarah Johnson", "type": "email"}
           )
       ]
   )
]
这里的employee_group属性充当了关联键——所有具有相同employee_group值的实体都属于同一个人。
在这个例子中,正文内容和抽取内容是体现差异的。

5.扩展至生产环境

真实世界的文本远比示例复杂,可能包含格式混乱的50页报告、充满拼写错误的邮件或排版怪异的PDF。LangExtract提供了三个关键工具来应对这些挑战:并行处理、多次提取和智能分块。
# 适用于处理大量真实文档的设置
result = lx.extract(
   text_or_documents=document_batch, # 一批文档
   prompt_description=prompt,
   examples=examples,
   model_id="gemini-1.5-flash",
   max_workers=20,           # 同时处理20个文档
   extraction_passes=3,      # 尝试提取3次以提高召回率
   max_char_buffer=1000      # 将长文本切分为1000字符的小块
)
  • max_workers:控制并行处理的文档数量。更多的worker意味着更快的速度,但也会增加API成本并可能触发速率限制。
  • extraction_passes:多次运行提取任务并合并结果,有助于捕获首次可能遗漏的信息。
  • max_char_buffer:将长文档切分为适合AI模型处理的小块。较小的块(1000-2000字符)能捕捉更多细节,而较大的块(3000-5000字符)能保留更多上下文。
你可以根据不同场景调整这些超参数:
# 针对需要快速处理的简单文档
quick_result = lx.extract(
   text_or_documents=email_batch,
   extraction_passes=1,      # 单次传递以追求速度
   max_char_buffer=3000,     # 大块以提高速度
   max_workers=30           # 更多的worker以加快处理
)
看一下他人的评价:
样例机制与官方承诺对比:特色是否真的落地?结合官方设计与作者的实测,基本都是正向评价:
表格 还在加载中,请等待加载完成后再尝试复制
基于当前,可以想到的问题包括:
①在更具有普遍性的问题效果如何?
②如何通过规模抽取产生效益;
③如何持续评估和优化抽取效果?
④领域知识应该通过哪种方法进行补强?
 
官方例子中:
 

Romeo and Juliet Full Text Extraction

 
Medication Extraction Examples

三、开展具体实验

值得参考的经验:
表格 还在加载中,请等待加载完成后再尝试复制
最终在作者数据集上的结果如下,这一点证明是有构建数据集做相关工作
表格 还在加载中,请等待加载完成后再尝试复制
此外,多次复跑中一致性>95%,提示词 +样例的小改动带来的漂移被明显压缩。
数据选择2025年全国大数据与计算智能挑战赛-多类型异构论元事件抽取评测 赛道题目,选择其中的部分数据来做验证:

赛题任务

本赛题的任务为对篇章级的长新闻文本进行多类型异构事件抽取。
具体要求包括:
1.从文本中,根据事件触发词、事件时间等要素实现事件检测与事件类型分类。
2.根据确定的事件类型从上下文中尽可能完整的抽取出定义的该事件类型的事件论元。
输入: 整篇新闻文本。 输出: 结构化的事件类型、事件时间和对应事件类型的论元。

数据简介

数据集包含15种事件类型(包括无事件),共计约1.4万可能具有事件信息的文本(每篇文本可能包含多个事件,也可能不包含事件),数据来源于国内外公开新闻网站。标注信息包含事件提及(触发词、事件类型和事件元素)、共指论元列表。15种事件类型及相应事件元素如下表所示。事件类型、事件时间、事件论元为期望的输出结果。
表格 还在加载中,请等待加载完成后再尝试复制
这个题目的思路是比较清楚的,不考虑原题需求,先做一个例子并进行对比:
输入: 【据airandspaceforces网站2023年2月3日报道】2023年2月1日,美国空军2架B-1B轰炸机和F-22A战斗机、韩国F-35A战斗机共同在朝鲜半岛附近编队飞行,这是近几个月来执行的第3次类似行动。2023年2月3日,上述B-1B还与美国空军F-22A战斗机、美国海军陆战队F-35B战斗机和韩国空军F-35A战斗机进行了共同训练。B-1B随后飞往关岛安德森空军基地,执行新一轮轰炸机特遣部队任务(BTF)。美国太平洋空军表示,这两架B-1B来自南达科他州埃尔斯沃思空军基地,F-22A战斗机则来自埃尔门多夫-理查森联合基地。美国太平洋空军还透露,2023年1月31日晚,第34远征轰炸中队的B-1B从南达科他州埃尔斯沃斯空军基地起飞,于2月1日抵达关岛安德森空军基地开始执行轰炸机特遣部队任务。虽然此次联合飞行标志着2023年韩美空军的首次联合空中训练,但近期美轰炸机实际上常常出现在朝鲜半岛及附近区域。
输出:
{
    "id": 8013,
    "events": [
        {
            "event_type": "抵达",
            "event_time": {
                "text": "2月1日",
                "offset": [
                    328,
                    332
                ]
            },
            "arguments": [
                {
                    "argument_key": "地点",
                    "argument_value": [
                        {
                            "text": "关岛安德森空军基地",
                            "offset": [
                                334,
                                343
                            ]
                        }
                    ]
                },
                {
                    "argument_key": "主体",
                    "argument_value": [
                        {
                            "text": "B-1B",
                            "offset": [
                                305,
                                309
                            ]
                        }
                    ]
                },
                {
                    "argument_key": "出发地",
                    "argument_value": [
                        {
                            "text": "南达科他州埃尔斯沃斯空军基地",
                            "offset": [
                                310,
                                324
                            ]
                        }
                    ]
                },
                {
                    "argument_key": "目的地",
                    "argument_value": [
                        {
                            "text": "关岛安德森空军基地",
                            "offset": [
                                334,
                                343
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "event_type": "出发",
            "event_time": {
                "text": "2023年1月31日晚",
                "offset": [
                    283,
                    294
                ]
            },
            "arguments": [
                {
                    "argument_key": "地点",
                    "argument_value": [
                        {
                            "text": "南达科他州埃尔斯沃斯空军基地",
                            "offset": [
                                310,
                                324
                            ]
                        }
                    ]
                },
                {
                    "argument_key": "主体",
                    "argument_value": [
                        {
                            "text": "B-1B",
                            "offset": [
                                305,
                                309
                            ]
                        }
                    ]
                },
                {
                    "argument_key": "出发地",
                    "argument_value": [
                        {
                            "text": "南达科他州埃尔斯沃斯空军基地",
                            "offset": [
                                310,
                                324
                            ]
                        }
                    ]
                },
                {
                    "argument_key": "目的地",
                    "argument_value": [
                        {
                            "text": "关岛安德森空军基地",
                            "offset": [
                                334,
                                343
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "event_type": "训练",
            "event_time": {
                "text": "2023年2月3日",
                "offset": [
                    108,
                    117
                ]
            },
            "arguments": [
                {
                    "argument_key": "训练方",
                    "argument_value": [
                        {
                            "text": "美国海军陆战队",
                            "offset": [
                                139,
                                146
                            ]
                        },
                        {
                            "text": "韩国空军",
                            "offset": [
                                155,
                                159
                            ]
                        },
                        {
                            "text": "美国空军",
                            "offset": [
                                126,
                                130
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "event_type": "巡航",
            "event_time": {
                "text": "2023年2月1日",
                "offset": [
                    33,
                    42
                ]
            },
            "arguments": [
                {
                    "argument_key": "地点",
                    "argument_value": [
                        {
                            "text": "朝鲜半岛附近",
                            "offset": [
                                79,
                                85
                            ]
                        }
                    ]
                },
                {
                    "argument_key": "任务执行方",
                    "argument_value": [
                        {
                            "text": "美国空军",
                            "offset": [
                                43,
                                47
                            ]
                        },
                        {
                            "text": "韩国",
                            "offset": [
                                66,
                                68
                            ]
                        }
                    ]
                },
                {
                    "argument_key": "巡逻装备",
                    "argument_value": [
                        {
                            "text": "B-1B轰炸机",
                            "offset": [
                                49,
                                56
                            ]
                        },
                        {
                            "text": "F-22A战斗机",
                            "offset": [
                                57,
                                65
                            ]
                        },
                        {
                            "text": "F-35A战斗机",
                            "offset": [
                                68,
                                76
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}
这里的结构相当复杂,肯定需要泛化的方法进行对比。这个地方我意识到一个之前没有想清楚的问题,就是这里实现的是”事件识别“,也就是动作识别。而之前做的比较多的都是实体识别。如果是大模型的方法,确实可以直接套提示词,让大模型自己去理解。但是若使用langExtract就必须细致地考虑转换的问题。这样我和之前一样,还是无法写出example,这也是导致我在比赛过程中无法使用langExtract的实际原因。现在要想办法结局。

四、提炼功能优势

看到两个效果非常不错的展示界面。
以及:
以及
并在直接创建了知识图谱,这个是我需要认识的。

五、迁移部署建议

 

posted on 2026-01-16 06:52  jsxyhelu  阅读(0)  评论(0)    收藏  举报

导航