基于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
相关产品推荐
相关产品推荐

