HHEM 幻觉检测和 retrieval 评测需另装可选依赖(pip install "dingo-python[hhem]" 或 [retrieval]),否则相关指标不可用;LLM 评估需自行填写 API key、api_url 与模型名;dingo serve 默认以 SSE 传输监听 8000 端口,接 Claude Desktop 需改用 --transport stdio。

dingo
MigoXLabApache-2.0活跃维护一站式评估 AI 数据、模型和应用质量的工具,能检测数据质量、幻觉等问题并生成质量报告,适合做数据清洗与模型上线前的质量把关。
Dingo: A Comprehensive AI Data, Model and Application Quality Evaluation Tool
pip install dingo-python
dingo eval --input .github/env/local_plaintext.jsonREADME 未说明显存或 GPU 型号要求;核心包为 Python 库,规则评估可纯 CPU 运行,LLM 评估需调用外部 API,HHEM 幻觉检测依赖 transformers + torch。
一站式评估 AI 数据、模型与应用质量的 Python 工具,覆盖训练数据清洗到 RAG 系统评测
一站式评估 AI 数据、模型和应用质量的工具,能检测数据质量、幻觉等问题并生成质量报告,适合做数据清洗与模型上线前的质量把关。
核心能力
- 内置 100+ 指标,规则与 LLM 评估可混合编排
- 支持多字段并行评估,不同字段套用不同质量规则
- 接入本地文件、SQL 数据库、HuggingFace 数据集与 S3
- 提供 RAG 评测指标与 HHEM 幻觉检测能力
- 内置 MCP Server,可接入 Cursor、Claude Desktop 等 Agent
容易踩的坑
- v2.5.0最新正式版2026-08-04 · 2026-08-04 11:06 UTC
What's Changed
- feat: 结果保存优化:数据库字段序列化、ExecutorResultSaveArgs新增参数 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/415
- feat: add pymysql by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/416
- docs: update wechat by @e06084 in https://github.com/MigoXLab/dingo/pull/417
- feat: add retrieval eval by @e06084 in https://github.com/MigoXLab/dingo/pull/418
- feat: retrieval add summary by @e06084 in https://github.com/MigoXLab/dingo/pull/419
- feat: add semantic_scholar client by @e06084 in https://github.com/MigoXLab/dingo/pull/420
- feat: retrival detail add matched_count by @e06084 in https://github.com/MigoXLab/dingo/pull/422
- feat: add .dockerignore by @e06084 in https://github.com/MigoXLab/dingo/pull/423
- feat: add google_scholar client by @e06084 in https://github.com/MigoXLab/dingo/pull/424
- fix: update IF task effective_query_text by @e06084 in https://github.com/MigoXLab/dingo/pull/425
- feat: add meta-search client by @e06084 in https://github.com/MigoXLab/dingo/pull/426
- feat: retrival add openalex client by @e06084 in https://github.com/MigoXLab/dingo/pull/427
- feat: scibase字段类型更新 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/428
- Feat: 更新doi逻辑 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/429
- feat: 更新references、related_works字段 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/430
- feat: EvaluatorRuleArgs允许自由拓展 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/431
- feat: RuleQuanliangFieldValidation.eval去掉classmethod by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/433
- feat(agent-eval): add LLMAgent* evaluators for agent trace monitoring by @seancoding-day in https://github.com/MigoXLab/dingo/pull/432
- feat: 细化reason by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/435
- feat: retrival eval title fallback add fuzzy matching by @e06084 in https://github.com/MigoXLab/dingo/pull/434
- ci: update pytrec-eval-terrier package by @e06084 in https://github.com/MigoXLab/dingo/pull/436
- feat: retrival add raw api metrics calculate by @e06084 in https://github.com/MigoXLab/dingo/pull/437
- docs: update wechat by @e06084 in https://github.com/MigoXLab/dingo/pull/438
- feat: retrival eval add open-eval mode by @e06084 in https://github.com/MigoXLab/dingo/pull/439
- feat: author、source表规则 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/441
- feat: add LLMAISmell checker for AI-generated requirement document detection by @e06084 in https://github.com/MigoXLab/dingo/pull/442
- docs: update wechat by @e06084 in https://github.com/MigoXLab/dingo/pull/443
- feat: add LiteLLM as AI gateway provider by @RheagalFire in https://github.com/MigoXLab/dingo/pull/440
- Sync main to dev by @e06084 in https://github.com/MigoXLab/dingo/pull/444
- feat: DatasetSqlArgs添加engine_args属性 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/445
- feat: update wechat by @e06084 in https://github.com/MigoXLab/dingo/pull/446
- feat: score实时更新 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/447
- feat: SummaryModel增加type_count by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/448
- Feature/lld ir by @pekopoke in https://github.com/MigoXLab/dingo/pull/449
- docs: update wechat by @e06084 in https://github.com/MigoXLab/dingo/pull/450
- feat: 国标 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/451
- feat:国标说明文档4个rule by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/452
- feat: 国标类名 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/454
- feat: 支持md类型文件 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/455
- feat: 国标all rule by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/456
- feat: 目录遍历,文件类型限制 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/457
- Add MCP Toplist rank badge by @chrstphe in https://github.com/MigoXLab/dingo/pull/458
- feat: add token usage by @e06084 in https://github.com/MigoXLab/dingo/pull/459
- feat: 国标0730 by @shijinpjlab i
- v2.4.0v2.4.0-released2026-05-29 · 2026-05-29 10:30 UTC
查看更新说明
What's Changed
- feat: add clawhub skill badge by @e06084 in https://github.com/MigoXLab/dingo/pull/374
- feat(llm): add overall timeout to ArticleFactChecker & add arXiv package by @seancoding-day in https://github.com/MigoXLab/dingo/pull/375
- fix: LLMHtmlExtractCompareV2 metric by @e06084 in https://github.com/MigoXLab/dingo/pull/376
- feat: table、equation质检prompt by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/377
- docs: update wechat by @e06084 in https://github.com/MigoXLab/dingo/pull/378
- feat: BaseTextQuality根据score来判断 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/379
- metric: update LLMTextQualityV5 by @e06084 in https://github.com/MigoXLab/dingo/pull/380
- feat: EvaluatorLLMArgs删除parameters属性,允许扩展 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/381
- docs: update wechat (#378) by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/382
- feat: add LLMHtmlExtractCompareV3 metric by @e06084 in https://github.com/MigoXLab/dingo/pull/384
- fix: optimize RequiredField sort by @e06084 in https://github.com/MigoXLab/dingo/pull/385
- docs: readme add saas screenshot by @e06084 in https://github.com/MigoXLab/dingo/pull/386
- feat: RuleDictConsistency by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/387
- docs: add mineru xunlianying doc by @e06084 in https://github.com/MigoXLab/dingo/pull/388
- fix: update LLMHtmlExtractCompareV3 response type by @e06084 in https://github.com/MigoXLab/dingo/pull/389
- feat: RuleDictConsistency忽略顺序 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/391
- update error judge by @dt-yy in https://github.com/MigoXLab/dingo/pull/393
- feat: raw情况添加dingo_id by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/394
- sync main to dev by @e06084 in https://github.com/MigoXLab/dingo/pull/398
- feat(llm): add configurable LLMCustomRule evaluator by @daniel5u in https://github.com/MigoXLab/dingo/pull/397
- feat: llm custom metric by @daniel5u in https://github.com/MigoXLab/dingo/pull/401
- fix: inject llm config into class in local executor by @daniel5u in https://github.com/MigoXLab/dingo/pull/403
- Feature/lld add chunk test for rag by @pekopoke in https://github.com/MigoXLab/dingo/pull/406
- Dev scibase by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/405
- feat: unify image loader by @e06084 in https://github.com/MigoXLab/dingo/pull/407
- feat: image download add User-Agent by @e06084 in https://github.com/MigoXLab/dingo/pull/408
- docs: update wechat by @e06084 in https://github.com/MigoXLab/dingo/pull/410
- feat: add mineru format support by @e06084 in https://github.com/MigoXLab/dingo/pull/412
- Release v2.4.0 by @e06084 in https://github.com/MigoXLab/dingo/pull/413
- Release v2.4.0 by @e06084 in https://github.com/MigoXLab/dingo/pull/414
Full Changelog: https://github.com/MigoXLab/dingo/compare/v2.2.1...v2.4.0
- v2.3.0v2.3.0-released2026-05-29 · 2026-05-29 03:24 UTC
查看更新说明
What's Changed
- feat: add clawhub skill badge by @e06084 in https://github.com/MigoXLab/dingo/pull/374
- feat(llm): add overall timeout to ArticleFactChecker & add arXiv package by @seancoding-day in https://github.com/MigoXLab/dingo/pull/375
- fix: LLMHtmlExtractCompareV2 metric by @e06084 in https://github.com/MigoXLab/dingo/pull/376
- feat: table、equation质检prompt by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/377
- docs: update wechat by @e06084 in https://github.com/MigoXLab/dingo/pull/378
- feat: BaseTextQuality根据score来判断 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/379
- metric: update LLMTextQualityV5 by @e06084 in https://github.com/MigoXLab/dingo/pull/380
- feat: EvaluatorLLMArgs删除parameters属性,允许扩展 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/381
- docs: update wechat (#378) by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/382
- feat: add LLMHtmlExtractCompareV3 metric by @e06084 in https://github.com/MigoXLab/dingo/pull/384
- fix: optimize RequiredField sort by @e06084 in https://github.com/MigoXLab/dingo/pull/385
- docs: readme add saas screenshot by @e06084 in https://github.com/MigoXLab/dingo/pull/386
- feat: RuleDictConsistency by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/387
- docs: add mineru xunlianying doc by @e06084 in https://github.com/MigoXLab/dingo/pull/388
- fix: update LLMHtmlExtractCompareV3 response type by @e06084 in https://github.com/MigoXLab/dingo/pull/389
- feat: RuleDictConsistency忽略顺序 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/391
- update error judge by @dt-yy in https://github.com/MigoXLab/dingo/pull/393
- feat: raw情况添加dingo_id by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/394
- sync main to dev by @e06084 in https://github.com/MigoXLab/dingo/pull/398
- feat(llm): add configurable LLMCustomRule evaluator by @daniel5u in https://github.com/MigoXLab/dingo/pull/397
- feat: llm custom metric by @daniel5u in https://github.com/MigoXLab/dingo/pull/401
- fix: inject llm config into class in local executor by @daniel5u in https://github.com/MigoXLab/dingo/pull/403
- Feature/lld add chunk test for rag by @pekopoke in https://github.com/MigoXLab/dingo/pull/406
- Dev scibase by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/405
- feat: unify image loader by @e06084 in https://github.com/MigoXLab/dingo/pull/407
- feat: image download add User-Agent by @e06084 in https://github.com/MigoXLab/dingo/pull/408
- docs: update wechat by @e06084 in https://github.com/MigoXLab/dingo/pull/410
- Release 2.3.0 version by @e06084 in https://github.com/MigoXLab/dingo/pull/411
Full Changelog: https://github.com/MigoXLab/dingo/compare/v2.2.1...v2.3.0
- v2.2.22026-04-02 · 2026-04-02 08:08 UTC
查看更新说明
What's Changed
- feat: add clawhub skill badge by @e06084 in https://github.com/MigoXLab/dingo/pull/374
- feat(llm): add overall timeout to ArticleFactChecker & add arXiv package by @seancoding-day in https://github.com/MigoXLab/dingo/pull/375
- fix: LLMHtmlExtractCompareV2 metric by @e06084 in https://github.com/MigoXLab/dingo/pull/376
- feat: table、equation质检prompt by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/377
- docs: update wechat by @e06084 in https://github.com/MigoXLab/dingo/pull/378
- feat: BaseTextQuality根据score来判断 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/379
- metric: update LLMTextQualityV5 by @e06084 in https://github.com/MigoXLab/dingo/pull/380
- feat: EvaluatorLLMArgs删除parameters属性,允许扩展 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/381
- docs: update wechat (#378) by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/382
- feat: v2.2.2 by @shijinpjlab in https://github.com/MigoXLab/dingo/pull/383
Full Changelog: https://github.com/MigoXLab/dingo/compare/v2.2.1...v2.2.2
- v2.2.1v2.2.1-released2026-03-24 · 2026-03-24 06:11 UTC
查看更新说明
What's Changed
- feat: optimize requirements build by @e06084 in https://github.com/MigoXLab/dingo/pull/359
- docs: add v2.1.0 poster by @e06084 in https://github.com/MigoXLab/dingo/pull/361
- docs: add zhihu post by @e06084 in https://github.com/MigoXLab/dingo/pull/362
- skills: add clawhub skill by @e06084 in https://github.com/MigoXLab/dingo/pull/364
- skills: update clawhub by @e06084 in https://github.com/MigoXLab/dingo/pull/365
- feat: refactor CLI to Agent-Native by @e06084 in https://github.com/MigoXLab/dingo/pull/366
- feat: dingo CLI add MCP server by @e06084 in https://github.com/MigoXLab/dingo/pull/367
- docs: update readme by @e06084 in https://github.com/MigoXLab/dingo/pull/368
- docs: update readme by @e06084 in https://github.com/MigoXLab/dingo/pull/369
- feat: delete dingo app demo code by @e06084 in https://github.com/MigoXLab/dingo/pull/370
- add article fact checking skills for Claude and OpenClaw by @seancoding-day in https://github.com/MigoXLab/dingo/pull/371
- release 2.2.0 by @e06084 in https://github.com/MigoXLab/dingo/pull/372
Full Changelog: https://github.com/MigoXLab/dingo/compare/v2.1.0...v2.2.1
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Introduction
Dingo is A Comprehensive AI Data, Model and Application Quality Evaluation Tool, designed for ML practitioners, data engineers, and AI researchers. It helps you systematically assess and improve the quality of training data, fine-tuning datasets, and production AI systems.
🚀 Enterprise Dingo SaaS Version
Need a production-grade data quality platform? Try Dingo SaaS Enterprise Edition!
✨ Compared to the open-source version, SaaS provides:
- 🌐 Web UI - Visual evaluation interface, no coding required
- 🔐 Access Control - JWT + Google OAuth 2.0
- 📊 Visual Reports - Interactive charts, trend analysis, export features
- 🔌 RESTful API - Seamless integration with existing systems
📝 How to Get Free SaaS Code
👉 Apply for Dingo SaaS Repository Access
Review time: 1-5 business days | Suitable for enterprise data governance, team collaboration
Why Dingo?
🎯 Production-Grade Quality Checks - From pre-training datasets to RAG systems, ensure your AI gets high-quality data
🗄️ Multi-Source Data Integration - Seamlessly connect to Local files, SQL databases (PostgreSQL/MySQL/SQLite), HuggingFace datasets, and S3 storage
🔍 Multi-Field Evaluation - Apply different quality rules to different fields in parallel (e.g., ISBN validation for isbn, text quality for title)
🤖 RAG System Assessment - Comprehensive evaluation of retrieval and generation quality with 5 academic-backed metrics
🧠 LLM & Rule & Agent Hybrid - Combine fast heuristic rules (30+ built-in) with LLM-based deep assessment
🚀 Flexible Execution - Run locally for rapid iteration or scale with Spark for billion-scale datasets
📊 Rich Reporting - Detailed quality reports with GUI visualization and field-level insights
Architecture Diagram

Quick Start
Installation
# Core package (includes rule evaluation, LLM evaluation, MCP server, datasource support)
pip install dingo-python
# With HHEM hallucination detection model (requires transformers + torch)
pip install "dingo-python[hhem]"
# With retrieval benchmark evaluation (MTEB + pytrec-eval-terrier)
pip install "dingo-python[retrieval]"
# With all features (HHEM + Agent + Retrieval)
pip install "dingo-python[all]"
Example Use Cases of Dingo
1. Evaluate LLM chat data
from dingo.config.input_args import EvaluatorLLMArgs
from dingo.io.input import Data
from dingo.model.llm.text_quality.llm_text_quality_v4 import LLMTextQualityV4
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():
LLMTextQualityV4.dynamic_config = EvaluatorLLMArgs(
key='YOUR_API_KEY',
api_url='https://api.openai.com/v1/chat/completions',
model='gpt-4o',
)
res = LLMTextQualityV4.eval(data)
print(res)
def rule():
res = RuleSpecialCharacter().eval(data)
print(res)
rule()
2. Evaluate Dataset
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"](https://github.com/MigoXLab/dingo/blob/HEAD/input_args)
result = executor.execute()
print(result)
Command Line Interface
Evaluate with Rule Sets
dingo eval --input .github/env/local_plaintext.json
Evaluate with LLM (e.g., GPT-4o)
dingo eval --input .github/env/local_json.json
MCP Server
Dingo includes a built-in Model Context Protocol (MCP) server for AI agent integration:
# Start MCP server (SSE transport, default port 8000)
dingo serve
# Custom port
dingo serve --port 9000
# stdio transport (for Claude Desktop)
dingo serve --transport stdio
For detailed setup and Cursor/Claude Desktop integration, see the dedicated documentation:
Video Demonstration
To help you get started quickly with Dingo MCP, we've created a video walkthrough:
https://github.com/user-attachments/assets/aca26f4c-3f2e-445e-9ef9-9331c4d7a37b
This video demonstrates step-by-step how to use Dingo MCP server with Cursor.
📚 Data Quality Metrics
Dingo provides 100+ evaluation metrics across multiple dimensions, combining rule-based speed with LLM-based depth.
Metric Categories
| Category | Examples | Use Case |
|---|---|---|
| Pretrain Text Quality | Completeness, Effectiveness, Similarity, Security | LLM pre-training data filtering |
| SFT Data Quality | Honest, Helpful, Harmless (3H) | Instruction fine-tuning data |
| RAG Evaluation | Faithfulness, Context Precision, Answer Relevancy | RAG system assessment |
| Hallucination Detection | HHEM-2.1-Open, Factuality Check | Production AI reliability |
| Classification | Topic categorization, Content labeling | Data organization |
| Multimodal | Image-text relevance, VLM quality, OCR visual evaluation | Vision-language data |
| Security | PII detection, Perspective API toxicity | Privacy and safety |
📊 View Complete Metrics Documentation →
📖 RAG Evaluation Guide → | 中文版
🔍 Hallucination Detection Guide → | 中文版
✅ Factuality Assessment Guide → | 中文版
👁️ VLM Render Judge Guide → | 中文版
Most metrics are backed by academic research to ensure scientific rigor.
Quick Metric Usage
llm_config = {
"model": "gpt-4o",
"key": "YOUR_API_KEY",
"api_url": "https://api.openai.com/v1/chat/completions"
}
input_data = {
"evaluator": [
{
"fields": {"content": "content"},
"evals": [
{"name": "RuleAbnormalChar"}, # Rule-based (fast)
{"name": "LLMTextQualityV5", "config": llm_config} # LLM-based (deep)
]
}
]
}
Customization: All prompts are defined in dingo/model/llm/ directory (organized by category: text_quality/, rag/, hhh/, etc.). Extend or modify them for domain-specific requirements.
🎓 Key Concepts for Practitioners
What Makes Dingo Production-Ready?
1. Multi-Field Evaluation Pipeline
Apply different quality checks to different fields in a single pass:
"evaluator": [
{"fields": {"content": "isbn"}, "evals": [{"name": "RuleIsbn"}]},
{"fields": {"content": "title"}, "evals": [{"name": "RuleAbnormalChar"}]},
{"fields": {"content": "description"}, "evals": [{"name": "LLMTextQualityV5"}]}
]
Why It Matters: Evaluate structured data (like database tables) without writing separate scripts for each field.
2. Stream Processing for Large Datasets
SQL datasources use SQLAlchemy's server-side cursors:
# Handles billions of rows without OOM
for data in dataset.get_data(): # Yields one row at a time
result = evaluator.eval(data)
Why It Matters: Process production databases without exporting to intermediate files.
3. Field Isolation in Memory
RAG evaluations prevent context bleeding across different field combinations:
outputs/
├── user_input,response,retrieved_contexts/ # Faithfulness group
└── user_input,response/ # Answer Relevancy group
Why It Matters: Accurate metric calculations when evaluating multiple field combinations.
4. Hybrid Rule-LLM Strategy
Combine fast rules (100% coverage) with sampled LLM checks (10% coverage):
"evals": [
{"name": "RuleAbnormalChar"}, # Fast, runs on all data
{"name": "LLMTextQualityV5"} # Expensive, sample if needed
]
Why It Matters: Balance cost and coverage for production-scale evaluation.
5. Extensibility Through Registration
Clean plugin architecture for custom rules, prompts, and models:
@Model.rule_register('QUALITY_BAD_CUSTOM', ['default'])
class MyCustomRule(BaseRule):
@classmethod
def eval(cls, input_data: Data) -> EvalDetail:
# Example: check if content is empty
if not input_data.content:
return EvalDetail(
metric=cls.__name__,
status=True, # Found an issue
label=[f'{cls.metric_type}.{cls.__name__}'],
reason=["Content is empty"]
)
return EvalDetail(
metric=cls.__name__,
status=False, # No issue found
label=['QUALITY_GOOD']
)
Why It Matters: Adapt to domain-specific requirements without forking the codebase.
🌟 Feature Highlights
📊 Multi-Source Data Integration
Diverse Data Sources - Connect to where your data lives
✅ Local Files: JSONL, CSV, TXT, Parquet
✅ SQL Databases: PostgreSQL, MySQL, SQLite, Oracle, SQL Server (with stream processing)
✅ Cloud Storage: S3 and S3-compatible storage
✅ ML Platforms: Direct HuggingFace datasets integration
Enterprise-Ready SQL Support - Production database integration
✅ Memory-efficient streaming for billion-scale datasets
✅ Connection pooling and automatic resource cleanup
✅ Complex SQL queries (JOIN, WHERE, aggregations)
✅ Multiple dialect support with SQLAlchemy
Multi-Field Quality Checks - Different rules for different fields
✅ Parallel evaluation pipelines (e.g., ISBN validation + text quality simultaneously)
✅ Field aliasing and nested field extraction (user.profile.name)
✅ Independent result reports per field
✅ ETL pipeline architecture for flexible data transformation
🤖 RAG System Evaluation
5 Academic-Backed Metrics - Based on RAGAS, DeepEval, TruLens research
✅ Faithfulness: Answer-context consistency (hallucination detection)
✅ Answer Relevancy: Answer-query alignment
✅ Context Precision: Retrieval precision
✅ Context Recall: Retrieval recall
✅ Context Relevancy: Context-query relevance
Comprehensive Reporting - Auto-aggregated statistics
✅ Average, min, max, standard deviation for each metric
✅ Field-grouped results
✅ Batch and single evaluation modes
🧠 Hybrid Evaluation System
Rule-Based - Fast, deterministic, cost-effective
✅ 30+ built-in rules (text quality, format, PII detection)
✅ Regex, heuristics, statistical checks
✅ Custom rule registration
LLM-Based - Deep semantic understanding
✅ OpenAI (GPT-4o, GPT-3.5), DeepSeek, Kimi
✅ Local models (Llama3, Qwen)
✅ Vision-Language Models (InternVL, Gemini)
✅ Custom prompt registration
Agent-Based - Multi-step reasoning with tools
✅ Web search integration (Tavily)
✅ Adaptive context gathering
✅ Multi-source fact verification
✅ Custom agent & tool registration
Extensible Architecture
✅ Plugin-based rule/prompt/model registration
✅ Clean separation of concerns (agents, tools, orchestration)
✅ Domain-specific customization
🚀 Flexible Execution & Integration
Multiple Interfaces
✅ CLI for quick checks
✅ Python SDK for integration
✅ MCP (Model Context Protocol) server for IDEs (Cursor, etc.)
Scalable Execution
✅ Local executor for rapid iteration
✅ Spark executor for distributed processing
✅ Configurable concurrency and batching
Data Sources
✅ Local Files: JSONL, CSV, TXT, Parquet formats
✅ Hugging Face: Direct integration with HF datasets hub
✅ S3 Storage: AWS S3 and S3-compatible storage
✅ SQL Databases: PostgreSQL, MySQL, SQLite, Oracle, SQL Server (stream processing for large-scale data)
Modalities
✅ Text (chat, documents, code)
✅ Images (with VLM support)
✅ Multimodal (text + image consistency)
📈 Rich Reporting & Visualization
Multi-Level Reports
✅ Summary JSON with overall scores
✅ Field-level breakdown
✅ Per-rule violation details
✅ Type and name distribution
GUI Visualization (via Dingo SaaS)
✅ Web UI with interactive data exploration
✅ Visual reports with trend analysis
✅ Anomaly tracking
Metric Aggregation
✅ Automatic statistics (avg, min, max, std_dev)
✅ Field-grouped metrics
✅ Overall quality score
📖 User Guide
🔧 Extensibility
Dingo uses a clean plugin architecture for domain-specific customization:
Custom Rule Registration
from dingo.model import Model
from dingo.model.rule.base import BaseRule
from dingo.io import Data
from dingo.io.output.eval_detail import EvalDetail
@Model.rule_register('QUALITY_BAD_CUSTOM', ['default'])
class DomainSpecificRule(BaseRule):
"""Check domain-specific patterns"""
@classmethod
def eval(cls, input_data: Data) -> EvalDetail:
text = input_data.content
# Your custom logic
is_valid = your_validation_logic(text)
return EvalDetail(
metric=cls.__name__,
status=not is_valid, # False = good, True = bad
label=['QUALITY_GOOD' if is_valid else 'QUALITY_BAD_CUSTOM'],
reason=["Validation details..."]
)
Custom LLM/Prompt Registration
from dingo.model import Model
from dingo.model.llm.base_openai import BaseOpenAI
@Model.llm_register('custom_evaluator')
class CustomEvaluator(BaseOpenAI):
"""Custom LLM evaluator with specialized prompts"""
_metric_info = {
"metric_name": "CustomEvaluator",
"metric_type": "LLM-Based Quality",
"category": "Custom Category"
}
prompt = """Your custom prompt here..."""
Examples:
Agent-Based Evaluation with Tools
Dingo supports agent-based evaluators that can use external tools for multi-step reasoning and adaptive context gathering. Two implementation patterns are available:
Pattern 1: LangChain-Based (e.g., AgentFactCheck)
- Framework-driven with autonomous multi-step reasoning
- Uses LangChain 1.0's
create_agentwith ReAct pattern - Best for: Complex reasoning tasks, rapid prototyping
- Less code, more declarative
Pattern 2: Custom Workflow (e.g., AgentHallucination)
- Developer-driven with explicit workflow control
- Manual tool calls and LLM interactions
- Best for: Composing existing evaluators, domain-specific workflows
- Full control, explicit behavior
Both patterns share the same configuration interface and are transparent to users.
Built-in Agents:
AgentFactCheck: LangChain-based fact-checking with autonomous search controlAgentHallucination: Custom workflow hallucination detection with adaptive context gatheringArticleFactChecker: Two-phase article fact-checking — extracts verifiable claims then verifies each in parallel using web search and Arxiv, with configurable concurrency control
Quick Example:
from dingo.io import Data
from dingo.io.output.eval_detail import EvalDetail
from dingo.model import Model
from dingo.model.llm.agent.base_agent import BaseAgent
@Model.llm_register('MyAgent')
class MyAgent(BaseAgent):
"""Custom agent with tool support"""
available_tools = ["tavily_search", "my_custom_tool"]
max_iterations = 5
@classmethod
def eval(cls, input_data: Data) -> EvalDetail:
# Use tools for fact-checking
search_result = cls.execute_tool('tavily_search', query=input_data.content)
# Multi-step reasoning with LLM
result = cls.send_messages([...])
return EvalDetail(...)
For detailed guidance on choosing and implementing agent patterns, see Agent Development Guide.
Configuration Example:
{
"evaluator": [{
"evals": [{
"name": "AgentHallucination",
"config": {
"key": "openai-api-key",
"model": "gpt-4",
"parameters": {
"agent_config": {
"max_iterations": 5,
"tools": {
"tavily_search": {"api_key": "tavily-key"}
}
}
}
}
}]
}]
}
Learn More:
- Agent Development Guide - Comprehensive guide for creating custom agents and tools
- AgentHallucination Example - Production agent example
- AgentFactCheck Example - LangChain agent example
- ArticleFactChecker Example - Article-scale two-phase fact verification
⚙️ Execution Modes
Local Executor (Development & Small-Scale)
from dingo.config import InputArgs
from dingo.exec import Executor
input_args = InputArgs(**input_data)
executor = Executor.exec_map["local"](https://github.com/MigoXLab/dingo/blob/HEAD/input_args)
result = executor.execute()
# Access results
summary = executor.get_summary() # Overall metrics
bad_data = executor.get_bad_info_list() # Quality issues
good_data = executor.get_good_info_list() # High-quality data
Best For: Rapid iteration, debugging, datasets < 100K rows
Spark Executor (Production & Large-Scale)
from pyspark.sql import SparkSession
from dingo.exec import Executor
spark = SparkSession.builder.appName("Dingo").getOrCreate()
spark_rdd = spark.sparkContext.parallelize(your_data)
executor = Executor.exec_map["spark"](
input_args,
spark_session=spark,
spark_rdd=spark_rdd
)
result = executor.execute()
Best For: Production pipelines, distributed processing, datasets > 1M rows
Retrieval Benchmark Executor
Evaluate search APIs against MTEB standard retrieval benchmarks (SciFact, SCIDOCS, etc.) with metrics like NDCG, Recall, and MRR.
CLI:
pip install dingo-python[retrieval]
dingo eval-retrieval --backend agentic --tasks SciFact \
--api-url https://api.sciverse.space \
--api-token YOUR_TOKEN --limit 100 --max-workers 8
dingo eval-retrieval --backend meta_search --tasks SciFact \
--api-url https://api.sciverse.space \
--api-token YOUR_TOKEN --limit 100 --rate-limit 1.0 \
--freshness-boost MILD \
--filters-json '[{"field": "publication_published_year", "operator": "FILTER_OP_GTE", "value": 2010}]'
dingo eval-retrieval --backend google_scholar --tasks SciFact \
--api-token YOUR_SERPAPI_KEY --limit 100 --rate-limit 1.0
dingo eval-retrieval --backend openalex --tasks SciFact \
--api-token YOUR_OPENALEX_API_KEY --limit 100
dingo eval-retrieval --backend openalex --tasks SciFact \
--api-token YOUR_OPENALEX_API_KEY --limit 50 \
--search-type semantic --rate-limit 1.0 --max-workers 1
SDK:
from dingo.config import InputArgs
from dingo.exec import Executor
input_data = {
"input_path": "SciFact",
"output_path": "outputs/retrieval_eval",
"executor": {
"retrieval": {
"backend": "agentic",
"api_url": "https://api.sciverse.space",
"api_token": "YOUR_TOKEN",
"limit": 100,
"max_workers": 8,
}
},
}
input_args = InputArgs(**input_data)
executor = Executor.exec_map["retrieval"](https://github.com/MigoXLab/dingo/blob/HEAD/input_args)
result = executor.execute()
print(result)
Best For: Evaluating search/retrieval APIs against academic benchmarks, comparing retrieval backends
Evaluation Reports
After evaluation, Dingo generates:
- Summary Report (
summary.json): Overall metrics and scores - Detailed Reports: Specific issues for each rule violation
Report Description:
- score:
num_good/total - type_ratio: The count of type / total, such as:
QUALITY_BAD_COMPLETENESS/total
Example summary:
{
"task_id": "d6c922ec-981c-11ef-b723-7c10c9512fac",
"task_name": "dingo",
"eval_group": "default",
"input_path": "test/data/test_local_jsonl.jsonl",
"output_path": "outputs/d6c921ac-981c-11ef-b723-7c10c9512fac",
"create_time": "20241101_144510",
"score": 50.0,
"num_good": 1,
"num_bad": 1,
"total": 2,
"type_ratio": {
"content": {
"QUALITY_BAD_COMPLETENESS.RuleColonEnd": 0.5,
"QUALITY_BAD_RELEVANCE.RuleSpecialCharacter": 0.5
}
}
}
🚀 Roadmap & Contributions
Future Plans
- Agent-as-a-Judge - Multi-agent debate patterns for bias reduction and complex reasoning
- SaaS Platform - Hosted evaluation service with API access and dashboard
- Audio & Video Modalities - Extend beyond text/image
- Diversity Metrics - Statistical diversity assessment
- Real-time Monitoring - Continuous quality checks in production pipelines
Limitations
The current built-in detection rules and model methods primarily focus on common data quality issues. For special evaluation needs, we recommend customizing detection rules.
Acknowledgments
Contribution
We appreciate all the contributors for their efforts to improve and enhance Dingo. Please refer to the Contribution Guide for guidance on contributing to the project.
License
This project uses the Apache 2.0 Open Source License.
This project uses fasttext for some functionality including language detection. fasttext is licensed under the MIT License, which is compatible with our Apache 2.0 license and provides flexibility for various usage scenarios.
Citation
If you find this project useful, please consider citing our tool:
@misc{dingo,
title={Dingo: A Comprehensive AI Data Quality Evaluation Tool for Large Models},
author={Dingo Contributors},
howpublished={\url{https://github.com/MigoXLab/dingo}},
year={2024}
}