You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于DSPy构建多输出验证函数求助:邮件实体提取验证遇阻

自定义DSPy多输出实体提取验证函数方案

核心思路

针对多字段实体提取的验证需求,我们可以直接自定义支持多字段对比的评估函数,替代DSPy默认的单字段精确匹配指标。以下是具体实现步骤:

1. 明确实体字段范围

先确定需要提取的所有实体字段,比如邮件场景常见的sender_email、recipient_name、invoice_number、order_date等,确保预测结果和真实标签的Answer对象都包含这些字段。

2. 编写自定义验证函数

根据需求选择两种匹配模式:

模式1:字段加权匹配率(部分匹配得分)

计算所有实体字段的匹配比例,适合需要衡量整体提取精度的场景:

def multi_entity_partial_match(pred, gold):
    # 定义需要验证的实体字段列表
    entity_fields = ['sender_email', 'recipient_name', 'invoice_number', 'order_date']
    matched_count = 0
    total_fields = len(entity_fields)
    
    for field in entity_fields:
        # 从预测和真实标签中获取字段值,不存在则返回None
        pred_val = getattr(pred, field, None)
        gold_val = getattr(gold, field, None)
        if pred_val == gold_val:
            matched_count += 1
    
    # 返回匹配率,避免除以0
    return matched_count / total_fields if total_fields > 0 else 0.0

模式2:严格全匹配(所有字段正确才得满分)

适合要求所有实体必须完全提取正确的场景:

def multi_entity_strict_match(pred, gold):
    entity_fields = ['sender_email', 'recipient_name', 'invoice_number', 'order_date']
    
    for field in entity_fields:
        pred_val = getattr(pred, field, None)
        gold_val = getattr(gold, field, None)
        if pred_val != gold_val:
            return 0.0
    return 1.0

3. 在DSPy中集成自定义指标

将自定义函数传入DSPy的评估器,即可完成多输出验证:

from dspy.evaluate import Evaluate

# 初始化评估器,传入自定义指标和验证数据集
evaluator = Evaluate(
    metric=multi_entity_partial_match,  # 替换为你需要的匹配函数
    devset=your_validation_dataset,  # 数据集每个样本需包含pred和gold的Answer对象
    num_threads=4
)

# 运行评估并输出得分
evaluation_score = evaluator(your_dspy_entity_extractor)
print(f"多实体提取验证得分: {evaluation_score:.2f}")

进阶:生成详细匹配报告

如果需要定位具体哪个字段提取错误,可以编写返回字段级匹配详情的函数:

def multi_entity_detailed_report(pred, gold):
    entity_fields = ['sender_email', 'recipient_name', 'invoice_number', 'order_date']
    report = {}
    total_matched = 0
    
    for field in entity_fields:
        pred_val = getattr(pred, field, None)
        gold_val = getattr(gold, field, None)
        matched = pred_val == gold_val
        report[field] = {
            '预测值': pred_val,
            '真实值': gold_val,
            '是否匹配': matched
        }
        if matched:
            total_matched += 1
    
    report['整体匹配率'] = total_matched / len(entity_fields)
    return report

调用该函数可以逐个字段排查提取问题,优化模型效果。

内容的提问来源于stack exchange,提问作者fatima abbas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:07:15