Dingo:AI-Ready 数据全链路质量评测框架

背景介绍

行业演进:从“数据可观测”到“AI 全链路可评测”

传统数据质量主要关注完整性、唯一性、格式一致性和字段合法性;进入大模型时代后,评测对象和质量标准都发生了变化。把视野放到整个行业,这条赛道大致经历了三代范式:

范式 面向对象 关注的质量 代表玩家
第一代・传统数据质量 / 数据可观测性 数据仓库中的结构化数据 完整性、一致性、新鲜度、异常检测 规则派:Great Expectations、Soda、dbt tests;可观测派:Monte Carlo、Anomalo、Bigeye
第二代・LLM / RAG 评测与可观测性 Prompt、检索上下文、模型回答 忠实度、相关性、幻觉、Prompt 效果 评测库:Ragas、DeepEval、TruLens;平台:LangSmith、Langfuse、Arize Phoenix、Braintrust、Galileo、Patronus AI
第三代・Agent / 端到端链路评测 Trace/Span 级的执行过程 工具调用、计划遵循、错误恢复、过程效率 尚无绝对赢家的新战场

大多数玩家是“从一端切入”的:要么专注预训练数据清洗(如 Cleanlab、Lilac),要么专注应用层评测(如 Ragas、Langfuse)。Dingo 的差异化在于用一套框架贯穿全链路——从预训练数据 → 文档解析 → RAG → Agent → 生产监控,用统一的“规则 + LLM 混合评测”范式覆盖,避免团队为每一段链路拼装多个割裂的工具。

我们也主动划清边界:不与全链路可观测性平台正面竞争 tracing 基础设施,Dingo 的核心竞争力是质量评测的深度和标准化,可以作为评测消费者接在这些平台之后。

一张图看清 Dingo 的站位

横轴是评测发生的位置(离线数据 ↔ 在线应用),纵轴是评测手段(规则/确定性 ↔ 语义/LLM)。多数产品聚集在某一两个象限,而 Dingo 的目标是把四个象限用同一套范式串起来。

Dingo 在离线数据、在线应用、规则评测和 LLM 评测四个象限中的定位

演进带来的三类核心能力要求

因此,AI 数据质量评测需要同时具备三类能力:可解释且低成本的规则评测、能够理解语义的 LLM 评测,以及覆盖离线实验和线上运行的持续观测能力。下表按评测对象展开:

评测对象 典型质量问题 评测方式
预训练与微调数据 重复、乱码、低信息量、毒性、语言混杂、指令与回答不匹配 规则评测、统计分析、LLM 语义评测
文档与多模态解析结果 OCR 错误、阅读顺序错乱、表格/公式丢失、图文不一致 格式规则、跨字段校验、LLM/多模态评测
RAG 系统 召回不相关、上下文覆盖不足、回答缺少依据、引用不一致 检索指标、忠实度与相关性评测
Agent 运行轨迹 工具选择错误、参数错误、无效循环、计划偏离、任务未完成 Trace/Span 级规则与 LLM 评测
AI4S 科研工作流 检索遗漏、证据不足、引用错误、过程不可复现、结论越界 规则、LLM 与 Trace/Span 混合评测
生产系统 指标漂移、异常样本增加、时延或成本失控 异步在线评测、趋势监控与告警

阶段一:预训练数据评估

行业坐标: 这一阶段对应 2022–2024 年整个行业的注意力焦点——当时模型能力的主要瓶颈是数据,所有人都在卷预训练/微调数据的去重、去毒和配比。Dingo 的起点正踩在这个节拍上。

早期的大模型数据质量工作主要集中在预训练和微调数据集。面对海量语料,核心目标是在训练前识别并隔离低质量样本,减少噪声数据对模型效果的影响,同时降低无效训练带来的算力成本。

Dingo 在这一阶段提供:

Dingo 从原始数据解析、清洗评测到模型训练验证的数据处理链路

阶段二:多模态、Agent 与标准化评测

行业坐标: 2024 年之后,模型已经足够强,行业注意力从“训练数据”迁移到“应用层”——RAG 幻觉、Agent 可靠性成为新的瓶颈。Dingo 的能力扩展与这条行业曲线同步。

随着 AI 应用从模型训练走向真实业务,评测对象已从单条文本扩展到文档、图片、检索上下文、模型回答、工具调用和完整 Agent 轨迹。质量评测也从“判断一条数据好不好”,演进为“判断一条应用链路是否可靠”。

Dingo 在多模态、SFT、检索质量、Agent 轨迹和国标评测等方向的能力范围

功能介绍

为什么选择 Dingo?

竞品对比:全链路覆盖是最大差异点

把主流玩家放在同一张表里,最直观的结论是:大家各自强在某一段,而 Dingo 的价值在于“一栏栏连起来”。

能力维度 Ragas DeepEval Langfuse Cleanlab Dingo
预训练/数据集质量 × × × ✅ ✅
文档/多模态解析质量 × × × 部分 ✅
RAG 检索与生成评测 ✅ ✅ 部分 × ✅
Agent 轨迹评测 × 部分 部分 × ✅
在线/生产质量监控 × 部分 ✅ × ✅
规则 + LLM 混合评测 部分 部分 × ✅ ✅
开源 ✅ ✅ ✅ 部分 ✅
企业级平台 / 私有化 × ✅ ✅ ✅ ✅

说明:上表为面向本次分享的定性对比,各产品能力持续演进,实际选型请以最新版本为准。Dingo 不追求在单一维度上超过所有专精工具,而是用一套统一范式提供“够深且连贯”的全链路覆盖。

架构图

Dingo 全链路质量评测框架架构图

Dingo 使用示例

SDK 模式:评估 LLM 对话数据

from dingo.config.input_args import EvaluatorLLMArgs
from dingo.io.input import Data
from dingo.model.llm.text_quality.llm_text_quality_v5 import LLMTextQualityV5
from dingo.model.rule.rule_common import RuleSpecialCharacter

data = Data(
    data_id="123",
    prompt="hello, introduce the world",
    content="�I am 8 years old. ^I love apple because:",
)


def llm():
    LLMTextQualityV5.dynamic_config = EvaluatorLLMArgs(
        key="YOUR_API_KEY",
        api_url="https://api.openai.com/v1/chat/completions",
        model="gpt-4o",
    )
    res = LLMTextQualityV5.eval(data)
    print(res)


def rule():
    res = RuleSpecialCharacter().eval(data)
    print(res)


rule()
llm()

SDK 模式:评估数据集

from dingo.config import InputArgs
from dingo.exec import Executor

# Evaluate a dataset from Hugging Face
if __name__ == '__main__':
    input_data = {
        "input_path": "tatsu-lab/alpaca",  # Dataset from Hugging Face
        "dataset": {
            "source": "hugging_face",
            "format": "plaintext"  # Format: plaintext
        },
        "executor": {
            "result_save": {
                "bad": True  # Save evaluation results
            }
        },
        "evaluator": [
            {
                "evals": [
                    {"name": "RuleColonEnd"},
                    {"name": "RuleSpecialCharacter"}
                ]
            }
        ]
    }

    input_args = InputArgs(**input_data)
    executor = Executor.exec_map["local"](input_args)
    result = executor.execute()
    print(result)

CLI 模式

dingo eval --input .github/env/local_plaintext.json

.github/env/local_plaintext.json 配置示例:

{
  "input_path": "test/data/test_local_plaintext.txt",
  "dataset": {
    "source": "local",
    "format": "plaintext"
  },
  "evaluator": [
    {
      "evals": [{ "name": "RuleColonEnd" }]
    }
  ]
}

MCP Server 模式

# Start MCP server (SSE transport, default port 8000)
dingo serve

# stdio transport (for Claude Desktop)
dingo serve --transport stdio

Dingo SaaS 平台介绍

Dingo SaaS 是基于开源项目 Dingo 构建的企业级数据质量评估与管理平台。它将 Dingo 强大的数据质量评估能力产品化,提供 Web 界面、API 服务和完整的数据管理工作流。

核心特性

功能演示

Dingo SaaS 平台提供 “Quick Try” 和 “Full Pipeline” 两种评测模式,满足不同场景需求:

Dingo SaaS 首页的 Quick Try 和 Full Pipeline 入口

Quick Try 模式 - 快速验证

Dingo SaaS Quick Try 单条数据评测界面

Full Pipeline 模式 - 批量评测

Dingo SaaS 批量评测结果与问题样本列表

Online Evaluation 模式 - 生产质量监控

Dingo SaaS Agent 在线评测报告

如何新增一个评测指标(Metric)

指标是 Dingo 的最小可复用资产。新增一个指标通常分两步:先做指标设计(想清楚“评什么、怎么算”),再做工程实现(把设计翻译成一个可注册、可复用的类)。这一节先讲设计方法论,再讲两类指标的代码落地,最后给出一条“零代码”的快速路径。

第一步:指标设计——把“质量”翻译成“可计算的公式”

设计一个新指标,本质是在两个正交的视角上给它定位:“评哪种质量”(质量维度) 和 “评什么对象”(链路阶段与应用场景)。先想清楚这两点,再落到公式与实现,思路就不会乱。

视角一:按质量维度看——指标“评的是哪一种好坏”。 这是可跨链路阶段复用的原子维度,也是 Dingo 中 quality_dimension 的分类思路:

质量维度 要回答的问题 典型指标 主要手段
有效性 / 规范性 格式、字符、结构是否规范? 乱码、特殊字符、HTML 残留、长度异常、Markdown 结构 规则为主
准确性 / 事实性 内容是否正确、有没有编造? 忠实度(Faithfulness)、事实核查 LLM
相关性 是否切合问题 / 意图? 上下文相关性、答案相关性 LLM + Embedding
完整性 / 召回 该有的信息覆盖全了吗? 上下文召回、答案完整性 LLM
一致性 前后是否矛盾、图文是否对齐、多次是否稳定? 图文一致性、自洽性 规则 + LLM
相似性 与参考答案 / 标准有多接近? 语义相似度、与 ground truth 比对 Embedding / LLM
安全性 / 合规性 有无毒性、偏见、隐私泄露、是否符合标准条款? 毒性检测、敏感信息、标准符合性 规则 + LLM
流畅性 / 可读性 语言是否通顺易读? 可读性评分、语病检测 LLM
多样性 / 去重 是否重复、信息量是否足够? 重复模式、低信息量检测 规则 + 统计
过程效率(Agent) 执行是否高效? 步骤数、Token 消耗、时延、无效循环 规则
任务完成度 / 过程合理性(Agent) 有没有完成、过程对不对? 计划遵循、工具与参数正确性、错误恢复 LLM

视角二:按评测对象看——指标“用在链路的哪个环节”。 这对应 Dingo 的全链路主线,每个阶段各有关注重点:

链路阶段 关注的核心维度 典型应用场景
预训练 / 微调数据 有效性、去重、毒性、语言纯净度、指令-回答匹配 训练前隔离低质样本,降低算力
文档 / 多模态解析 有效性(OCR、版面、结构)、完整性(表格 / 公式)、图文一致性 入知识库或训练前建立质量门槛
RAG 系统 相关性、忠实度、完整性、检索精度 定位瓶颈是“没检索到”还是“检索到没答对”
Agent 轨迹 任务完成度、过程合理性、过程效率 从“结果对不对”深入到“过程为什么失败”
生产 / 在线监控 上述维度的趋势、漂移与异常 持续观测线上质量退化并告警

定位好“维度”和“场景”之后,再用下面七个问题把单个指标设计具体化。这套结构直接来自 Dingo 现有 RAG 指标的设计范式(参见开源仓库 docs/rag_evaluation_metrics_zh.md):

设计要素 要回答的问题 以 Faithfulness(忠实度)为例
评估目标 衡量哪个质量维度? 答案是否完全基于检索上下文,即“有没有幻觉”
输入字段 需要哪些数据? question、answer、retrieved_contexts
计算方式 如何从原始数据得到判断? 把答案拆解为独立陈述 → 逐条判断能否被上下文支持
计算公式 如何把判断量化为分数? 支持的陈述数 / 总陈述数 × 10
评分标准 各分数段代表什么? 9–10 无幻觉;5–6 半数无依据;0–2 几乎全编造
推荐阈值 通过线设在哪? 7 / 10(金融、医疗等严格场景可上调到 8)
使用场景 什么时候用它? 生产环境防幻觉的关键指标

关于“计算公式”——这是指标设计中最需要打磨的部分。 好的公式让分数可解释、可对比、可复现。Dingo 的 RAG 指标示范了三种典型的量化范式,可作为设计新指标时的模板:

Faithfulness  = 上下文支持的陈述数 / 答案总陈述数 × 10
Context Recall = 上下文能支撑的参考陈述数 / 参考答案总陈述数 × 10

二者互为镜像:Faithfulness 防“多说”(编造),Context Recall 防“少说”(遗漏)。

Answer Relevancy = (1/N) × Σ cosine_sim(E_gi, E_o)
# 由答案反推 N 个问题,计算它们与原问题的平均相似度;需额外配置 embedding 模型
Context Precision = Σ(Precision@k × v_k) / 相关项总数
# v_k 为第 k 位是否相关(0/1),Precision@k 为前 k 项中相关项占比

设计小结: 规则难以覆盖的语义判断,交给 LLM 指标;能用确定性规则表达的(长度、字符、格式、循环调用、Token 消耗等),优先用规则指标——它零成本、可解释、可复现。同一质量维度也可以“规则 + LLM”双管齐下,先用规则做低成本初筛,再用 LLM 做深度研判。

第二步(A):实现一个规则指标(Rule)

规则指标继承 BaseRule,用 @Model.rule_register(...) 装饰器注册,只需实现 eval 方法。返回的 EvalDetail 中 status=True 表示“命中问题/未通过”。

from dingo.io.input import Data, RequiredField
from dingo.io.output.eval_detail import EvalDetail, QualityLabel
from dingo.model.model import Model
from dingo.model.rule.base import BaseRule


# 注册:metric_type(质量维度), group(可被指标组批量引用)
@Model.rule_register("QUALITY_BAD_EFFECTIVENESS", ["qa_standard_v1"])
class RuleContentTooShort(BaseRule):
    """内容长度过短检测:低于阈值判为低质量样本。"""

    # 用于自动生成指标文档
    _metric_info = {
        "category": "Rule-Based TEXT Quality Metrics",
        "quality_dimension": "EFFECTIVENESS",
        "metric_name": "RuleContentTooShort",
        "description": "检测内容长度是否过短",
    }

    # 声明该指标依赖哪些输入字段
    _required_fields = [RequiredField.CONTENT]

    @classmethod
    def eval(cls, input_data: Data) -> EvalDetail:
        res = EvalDetail(metric=cls.__name__)
        min_len = 10  # 也可从 cls.dynamic_config.threshold 读取,做成可配置阈值
        if len((input_data.content or "").strip()) < min_len:
            res.status = True  # True = 命中问题
            res.label = [f"{cls.metric_type}.{cls.__name__}"]
            res.reason = [f"内容长度不足 {min_len} 个字符"]
        else:
            res.label = [QualityLabel.QUALITY_GOOD]
        return res

第二步(B):实现一个 LLM 指标

LLM 指标继承 BaseOpenAI,用 @Model.llm_register(...) 注册。基类已用模板方法封装了“调用 LLM → 重试 → 解析”的通用流程,因此只需实现两个方法:build_messages(把设计好的评分 Prompt 组装成消息)和 process_response(把模型返回解析成 EvalDetail)。

import json
from typing import List

from dingo.io.input import Data, RequiredField
from dingo.io.output.eval_detail import EvalDetail
from dingo.model.model import Model
from dingo.model.llm.base_openai import BaseOpenAI


@Model.llm_register("LLMAnswerCompleteness")
class LLMAnswerCompleteness(BaseOpenAI):
    """答案完整性:判断回答是否覆盖了问题的全部关键要点。"""

    _metric_info = {
        "category": "RAG Evaluation Metrics",
        "metric_name": "LLMAnswerCompleteness",
        "description": "评估答案是否完整覆盖了问题的关键要点",
    }

    _required_fields = [RequiredField.PROMPT, RequiredField.CONTENT]

    @classmethod
    def build_messages(cls, input_data: Data) -> List:
        # 把第一步设计的“评分标准 + 计算公式”写进 Prompt
        prompt = f"""你是严格的评审专家。请判断【答案】是否完整覆盖了【问题】的关键要点。
按覆盖比例给出 0-10 分(覆盖比例 × 10),并指出缺失的要点。

问题:{input_data.prompt}
答案:{input_data.content}

只返回 JSON:{{"score": 0到10的数值, "reason": "缺失要点说明"}}"""
        return [{"role": "user", "content": prompt}]

    @classmethod
    def process_response(cls, response: str) -> EvalDetail:
        # 生产实现建议参考 LLMRAGFaithfulness 做更健壮的 markdown/JSON 清理
        data = json.loads(response.strip().lstrip("`").removeprefix("json").strip())
        res = EvalDetail(metric=cls.__name__)
        res.score = data["score"]
        threshold = 7
        res.status = res.score < threshold  # 低于阈值判为未通过
        res.label = (
            ["QUALITY_GOOD"]
            if not res.status
            else ["QUALITY_BAD.COMPLETENESS_FAIL"]
        )
        res.reason = [data["reason"]]
        return res

第三步:注册与使用

Dingo 在启动时通过 Model.load_model() 递归扫描 dingo/model/rule/ 和 dingo/model/llm/ 目录并自动 import,装饰器执行时即完成注册。因此新增指标无需改动任何注册表——把文件放进对应目录即可,随后就能在 SDK、CLI、配置和 SaaS 平台里用类名直接引用:

"evaluator": [
    {
        "evals": [
            {"name": "RuleContentTooShort"},
            {"name": "LLMAnswerCompleteness", "config": {"threshold": 7}}
        ]
    }
]

零代码路径:通过配置定义自定义 LLM 指标

如果暂时不想写代码贡献到 SDK,可以直接复用内置的 LLMCustomMetric,用配置声明一个新指标——指定指标名、需要的输入字段和判定标准即可,适合快速验证一个评测想法或做业务专属规则。SaaS 平台的“指标配置”界面也基于同一能力,让非工程角色也能定义指标。

"evals": [
    {
        "name": "LLMCustomMetric",
        "config": {
            "model": "gpt-4o",
            "key": "YOUR_API_KEY",
            "api_url": "https://api.openai.com/v1",
            "custom_metric": {
                "metric": "ToneProfessional",           # 指标名
                "input_fields": ["content"],             # 依赖的输入字段
                "criteria": [                            # 判定标准,{{field}} 会被替换为字段值
                    "判断以下客服回复是否语气专业、礼貌:",
                    "{{content}}",
                    "若不专业,请将 status 置为 true 并说明原因。"
                ]
            }
        }
    }
]

从设计到上线的检查清单: ① 明确评估目标与所需字段;② 定义计算公式和 0–10 分的评分标准;③ 选择规则或 LLM 实现(或零代码配置);④ 用少量典型样本验证分数是否符合预期;⑤ 校准阈值;⑥ 沉淀为指标组,供批量实验和在线监控复用。

场景演示

场景一:MinerU 解析数据质量评测

场景问题

MinerU 等文档解析工具可以将 PDF 转换为 Markdown 或 JSON,但“成功解析”不等于“解析结果可直接使用”。乱码、段落顺序错乱、标题层级异常、表格和公式丢失等问题会继续传递到知识库、RAG 或训练数据中。

评测思路

演示流程

  1. 上传一批 MinerU 解析后的 Markdown/JSON 数据
  2. 选择文档解析质量指标组并创建实验
  3. 查看整体通过率和各指标的问题分布
  4. 打开问题样本,对照原文定位解析缺陷

业务价值: 在文档进入知识库或训练流程前建立质量门槛,避免解析错误被下游系统放大。

单条数据评测示例:

The objective is to learn a mapping function $f_{\theta}$ (parameterized by
Dripper-0.6B) that predicts the label sequence
$\hat{Y} = [\hat{y}_1, \hat{y}_2, \dots, \hat{y}_n]$ conditioned on the input X:

MinerU 原始公式数据的正确评测结果

原始公式的评测结果正确。

MinerU 公式被故意修改后的错误评测结果

公式被故意修改后,评测结果正确识别出错误。

数据集评测结果报告示例: 查看公开报告

场景二:Agent 轨迹数据质量评测

场景问题

Agent 即使给出了最终答案,执行过程也可能存在工具选择错误、参数不正确、重复调用、计划偏离或异常后无法恢复等问题。仅评估最终输出无法揭示这些过程风险。

评测思路

演示流程

  1. 创建 Monitor 并配置 Agent 指标
  2. 提交一条包含多次工具调用的 Trace
  3. 查看 Trace 的异步评测状态、各指标得分和原因
  4. 在监控面板查看一段时间内的指标趋势与异常记录

业务价值: 从“结果是否正确”深入到“过程为什么失败”,加快 Agent 调试,并持续发现生产环境中的质量退化。

评测结果报告示例: 查看 Agent 公开报告

Dingo Agent 轨迹评测流程演示

场景三:AI4S 科研智能体与科学发现工作流评测

场景问题

AI4S 平台的质量不只取决于最终报告是否“看起来合理”。科研智能体通常需要检索论文、数据集和代码仓库,调用搜索、解析或计算工具,再把多来源证据整理成可复核的研究结论。任何一个环节出现遗漏、误用或不可追溯,都会降低结果的可信度和复现能力。

对于端砚(Intern AI Discovery)等科研发现平台,可以把 Dingo 作为独立的质量评测层:平台负责科研任务执行,Dingo 消费导出的 Trace、检索记录、工具调用日志和最终报告,对整个工作流进行离线评测或线上监控。这里的“端砚”是应用场景参考,并不代表 Dingo 已与其建立官方集成。

评测思路

一个典型工作流

提出科研问题
    ↓
科研 Agent 检索论文、数据集和代码仓库
    ↓
调用搜索、解析、计算等工具并收集证据
    ↓
生成结构化研究报告
    ↓
Dingo 评测检索、证据、轨迹和报告质量
    ↓
结果反哺离线基准集与线上质量监控

AI4S 科研智能体质量评测流程

业务价值: 将“答案是否合理”的单点检查扩展为对科研数据、证据链和 Agent 执行过程的系统评测,帮助团队发现无依据结论、错误引用、工具误用和不可复现步骤。

能力边界: Dingo 负责评测数据和智能体工作流的质量,不替代蛋白结构、分子模拟或实验结论等领域验证,也不直接给出科研结论的权威性认证。

场景四:TC609 国家标准对齐与合规评测

场景问题

标准符合性评测通常涉及多个质量维度、指标口径和证据要求。如果依赖人工抽查,容易出现执行口径不一致、过程不可复现、结果难追溯等问题。Dingo 依据《全国数据标准技术委员会技术文件 TC609-5-2025-04 高质量数据集 质量评测规范》,支持自动化、智能化的高质量数据集评测。

评测思路

演示流程

  1. 选定本次评测所依据的具体标准和条款
  2. 展示条款到 Dingo 指标组的映射关系
  3. 对目标数据集执行评测并查看分维度结果
  4. 抽查问题样本与判定原因,生成并分享评测报告

业务价值: 将标准要求转化为可执行、可追溯、可复用的评测流程。Dingo 提供评测工具与证据,不替代认证机构的最终合规结论。

Dingo SaaS 创建 TC609 说明文档评测

创建说明文档指标评测。

Dingo SaaS 创建 TC609 数据质量评测

创建数据质量指标评测。

说明文档评测报告示例: 查看公开报告

数据质量评测报告示例: 查看公开报告

展望

Dingo 的愿景是成为 AI 数据质量评测的基础设施:在开发阶段帮助团队快速发现问题,在交付阶段提供可复现的评测证据,在生产阶段持续监控质量风险,最终让 AI 系统的质量变得可衡量、可解释、可改进。

产品力:从“工具”到“体系”的护城河

单个规则或单条 LLM 指标很容易被复制,真正越用越厚、越厚越难替代的资产在于:

  1. 评测对象更完整: 从文本和数据集扩展到图片、文档、音视频、RAG 上下文、Agent Trace,以及端到端 AI 应用链路。
  2. 评测过程更持续: 把一次性的离线验收扩展为开发阶段快速验证、交付阶段可复现报告和生产阶段在线监控。
  3. 指标资产不断沉淀: 持续建设规则与 LLM 指标库、行业指标模板、自定义指标能力和标准条款映射——这是随使用规模累积的资产,也是最难被抄走的部分。
  4. 离线 + 在线的数据飞轮: 线上监控发现的质量退化 → 反哺离线评测指标 → 沉淀为可复用模板 → 再用于新项目的快速验证。评测用得越多,指标库越准,护城河越深。