Kumi源码01-Yaml模块注入
貌似这个项目给RAG盲测提供了一个清晰的可视化思路

1-核心知识
-
1)pyyaml读取yaml文件为内存中对象
- 读取YAML 文件格式转化为字典->config = yaml.safe_load(yam_file_path)
- 读取config中的变量(读取的config就是一个字典)
pythonconfig['evaluation_rule']['name'] -
2)pyyaml将参数注入到yaml中变量中->本质是string的replace方法
python# 填充模板-Jinja2 风格 filled = template for key, value in variables.items(): placeholder = f"{{{{{key}}}}}" # {{variable}} if placeholder in filled: filled = filled.replace(placeholder, str(value)) print(f" ✓ 替换: {placeholder}") -
3)变量定义使用 Jinja2 风格
-
4)LLM针对RAG的结果本质上是【打分】或者【True/False】
shell请评测以下回答的正确性: [输入问题]: {{input}} [模型回答]: {{generated_output}} [参考答案]: {{reference_output}} 请给出评分(0-1之间)和理由。 响应格式: { 'score': 0.0-1.0, 'reason': '评测理由' } -
5)项目中列举了读个评价指标
shell不敏感性规则.yaml 争议性规则.yaml 创造性规则.yaml 恶意性规则.yaml 有害性规则.yaml 有益性规则.yaml 正确性规则.yaml 歧视性规则.yaml 深度性规则.yaml 犯罪性规则.yaml 相关性规则.yaml 细节性规则.yaml
2-参考网址
- B站视频介绍:https://www.bilibili.com/video/BV1MBn1z2Emi
- 原作者代码仓库:https://github.com/RwandanMtGorilla/Kumi
- Gitee项目代码:https://gitee.com/enzoism/Kumi
- Gitee拆解Yaml评测代码:https://gitee.com/enzoism/kumi_eval_yaml
3-动手实操
1-读取yaml文件
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
快速入门:YAML 评测模板 5 分钟上手
"""
import yaml
import os
def quickstart_demo():
"""5分钟快速入门演示"""
print("🎯 YAML 评测模板 - 快速入门")
print("=" * 70)
# ==================== 第1步:YAML 文件格式 ====================
print("\n📄 第1步:理解 YAML 文件格式")
print("-" * 70)
yaml_example = """
model_config:
name: "模型名称"
temperature: 0.7
evaluation_rule:
name: "规则名称"
prompt:
role:
description: |
问题: {{input}}
回答: {{generated_output}}
"""
print("YAML 文件示例:")
print(yaml_example)
# ==================== 第2步:加载 YAML ====================
print("\n📖 第2步:加载 YAML 文件")
print("-" * 70)
# 检查文件是否存在
yaml_file = "yaml_demo_simple.yaml"
if not os.path.exists(yaml_file):
print(f"❌ 文件不存在: {yaml_file}")
print("请先运行 demo_usage.py 或确保文件存在")
return
# 加载 YAML
with open(yaml_file, 'r', encoding='utf-8') as f:
config = yaml.safe_load(f)
print(f"✅ 成功加载: {yaml_file}")
print(f" 规则名称: {config['evaluation_rule']['name']}")
print(f" 模型温度: {config['model_config']['temperature']}")
# ==================== 第3步:提取模板 ====================
print("\n📝 第3步:提取提示词模板")
print("-" * 70)
template = config['evaluation_rule']['prompt']['role']['description']
print("模板内容(前100字符):")
print(f" {template[:100]}...")
# ==================== 第4步:填充变量 ====================
print("\n🔧 第4步:填充模板变量")
print("-" * 70)
# 准备变量
variables = {
'input': '什么是 Python?',
'generated_output': 'Python 是一种高级编程语言。',
'reference_output': 'Python 是解释型、动态类型语言。'
}
print("变量:")
for key, value in variables.items():
print(f" {key}: {value}")
# 填充模板-Jinja2 风格
filled = template
for key, value in variables.items():
placeholder = f"{{{{{key}}}}}" # {{variable}}
if placeholder in filled:
filled = filled.replace(placeholder, str(value))
print(f" ✓ 替换: {placeholder}")
# ==================== 第5步:生成提示词 ====================
print("\n✨ 第5步:生成完整的评测提示词")
print("-" * 70)
print(filled)
# ==================== 总结 ====================
print("\n" + "=" * 70)
print("🎉 恭喜!你已经掌握了 YAML 评测模板的核心用法")
print("=" * 70)
print("\n📚 核心概念:")
print(" 1. YAML 文件存储配置和模板")
print(" 2. 使用 {{变量名}} 定义占位符")
print(" 3. 运行时填充变量生成提示词")
print(" 4. 将提示词发送给 LLM 进行评测")
print("\n🔗 相关文件:")
print(" - README.md 完整使用文档")
print(" - SUMMARY.md 功能验证总结")
print(" - demo_usage.py 基础演示")
print(" - advanced_demo.py 高级演示")
print("\n🚀 下一步:")
print(" - 运行 python demo_usage.py 查看详细演示")
print(" - 阅读 README.md 了解完整功能")
print(" - 在 Kumi 项目中查看 services/testqa_service.py")
print()
if __name__ == "__main__":
quickstart_demo()
- 日志打印
shell
🎯 YAML 评测模板 - 快速入门
======================================================================
📄 第1步:理解 YAML 文件格式
----------------------------------------------------------------------
YAML 文件示例:
model_config:
name: "模型名称"
temperature: 0.7
evaluation_rule:
name: "规则名称"
prompt:
role:
description: |
问题: {{input}}
回答: {{generated_output}}
📖 第2步:加载 YAML 文件
----------------------------------------------------------------------
✅ 成功加载: yaml_demo_simple.yaml
规则名称: 正确性评测
模型温度: 0.7
📝 第3步:提取提示词模板
----------------------------------------------------------------------
模板内容(前100字符):
请评测以下回答的正确性:
[输入问题]: {{input}}
[模型回答]: {{generated_output}}
[参考答案]: {{reference_output}}
请给出评分(0-1...
🔧 第4步:填充模板变量
----------------------------------------------------------------------
变量:
input: 什么是 Python?
generated_output: Python 是一种高级编程语言。
reference_output: Python 是解释型、动态类型语言。
✓ 替换: {{input}}
✓ 替换: {{generated_output}}
✓ 替换: {{reference_output}}
✨ 第5步:生成完整的评测提示词
----------------------------------------------------------------------
请评测以下回答的正确性:
[输入问题]: 什么是 Python?
[模型回答]: Python 是一种高级编程语言。
[参考答案]: Python 是解释型、动态类型语言。
请给出评分(0-1之间)和理由。
响应格式:
{
'score': 0.0-1.0,
'reason': '评测理由'
}
======================================================================
🎉 恭喜!你已经掌握了 YAML 评测模板的核心用法
======================================================================
📚 核心概念:
1. YAML 文件存储配置和模板
2. 使用 {{变量名}} 定义占位符
3. 运行时填充变量生成提示词
4. 将提示词发送给 LLM 进行评测
🔗 相关文件:
- README.md 完整使用文档
- SUMMARY.md 功能验证总结
- demo_usage.py 基础演示
- advanced_demo.py 高级演示
🚀 下一步:
- 运行 python demo_usage.py 查看详细演示
- 阅读 README.md 了解完整功能
- 在 Kumi 项目中查看 services/testqa_service.py
2-LLM进行评价
本质上就是将上面组装的Prompt给到LLM,让LLM按照预期的结果进行返回,LLM针对RAG的结果本质上是【打分】或者【True/False】
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
高级 Demo: 使用真实的 YAML 评测规则文件
演示如何使用从 Kumi 项目复制的真实 YAML 规则文件
"""
import os
import yaml
class RealRuleDemo:
"""使用真实规则文件的演示"""
def __init__(self, yaml_folder="./"):
self.yaml_folder = yaml_folder
def load_yaml_rule(self, yaml_filename):
"""加载 YAML 规则"""
yaml_path = os.path.join(self.yaml_folder, yaml_filename)
if not os.path.exists(yaml_path):
raise FileNotFoundError(f"YAML 文件不存在: {yaml_path}")
with open(yaml_path, 'r', encoding='utf-8') as f:
config = yaml.safe_load(f)
print(f"✅ 成功加载: {yaml_filename}\n")
return config
def print_config(self, config):
"""打印配置信息"""
print("=" * 80)
print("📋 YAML 配置详情")
print("=" * 80)
# 模型配置
model_config = config.get('model_config', {})
print("\n🤖 模型配置:")
print(f" 名称: {model_config.get('name', 'N/A')}")
print(f" 温度: {model_config.get('temperature', 'N/A')}")
# 评测规则配置
rule_config = config.get('evaluation_rule', {})
print("\n📏 评测规则:")
print(f" 名称: {rule_config.get('name', 'N/A')}")
print(f" 类型: {rule_config.get('type', 'N/A')}")
print(f" 简介: {rule_config.get('intro', 'N/A')}")
# 提示词配置
prompt_config = rule_config.get('prompt', {})
role_config = prompt_config.get('role', {})
description = role_config.get('description', '')
print(f"\n📝 提示词模板长度: {len(description)} 字符")
print("-" * 80)
def simulate_evaluation(self, yaml_filename, test_cases):
"""模拟评测过程"""
print("\n🎯 开始评测模拟")
print("=" * 80)
# 加载配置
config = self.load_yaml_rule(yaml_filename)
self.print_config(config)
# 提取模板
prompt_template = config['evaluation_rule']['prompt']['role']['description']
temperature = config['model_config'].get('temperature', 0.5)
print(f"\n🔧 模板变量配置:")
print(" - {{input}} : 输入问题")
print(" - {{generated_output}}: 模型输出")
print(" - {{reference_output}}: 参考答案(如果可用)")
# 处理每个测试用例
print(f"\n🧪 测试用例数: {len(test_cases)}")
print("=" * 80)
for idx, test_case in enumerate(test_cases, 1):
print(f"\n📊 测试用例 #{idx}")
print("-" * 80)
# 填充变量
filled_prompt = self.fill_template(prompt_template, test_case)
# 显示填充后的提示词(前300字符)
preview = filled_prompt[:300] + "..." if len(filled_prompt) > 300 else filled_prompt
print("\n📄 填充后的提示词预览:")
print(preview)
# 模拟 LLM 响应
print("\n🤖 模拟 LLM 响应:")
mock_response = self.mock_llm_response(test_case)
print(f" 评分: {mock_response['score']}")
print(f" 理由: {mock_response['reason']}")
print("-" * 80)
def fill_template(self, template, variables):
"""填充模板"""
filled = template
for key, value in variables.items():
placeholder = f"{{{{{key}}}}}"
if placeholder in filled:
filled = filled.replace(placeholder, str(value))
return filled
def mock_llm_response(self, test_case):
"""模拟 LLM 响应(实际应用中会调用真实 LLM)"""
# 这里只是模拟,实际使用会调用 LLM API
output = test_case.get('generated_output', '')
# 简单的评分逻辑(仅用于演示)
if len(output) > 50:
score = 0.9
reason = "回答详细,内容充实"
elif len(output) > 20:
score = 0.7
reason = "回答基本正确,但不够详细"
else:
score = 0.4
reason = "回答过于简短,信息不足"
return {
"score": score,
"reason": reason
}
def main():
"""主函数"""
print("🎬 真实 YAML 规则评测演示\n")
demo = RealRuleDemo()
# 准备测试用例
test_cases = [
{
'input': '什么是机器学习?',
'generated_output': '机器学习是人工智能的一个分支,它使计算机能够从数据中学习并改进,而无需明确编程。它包括监督学习、无监督学习和强化学习等方法。',
'reference_output': '机器学习是AI的子领域,通过算法让计算机从数据中学习模式和规律。'
},
{
'input': 'Python 中如何创建列表?',
'generated_output': '使用方括号。例如:my_list = [1, 2, 3]',
'reference_output': '可以用 list() 或 [] 创建列表'
}
]
# 使用真实的规则文件
try:
demo.simulate_evaluation('correctness_rule.yaml', test_cases)
print("\n" + "=" * 80)
print("✅ 演示完成!")
print("=" * 80)
print("\n💡 关键要点:")
print(" 1. YAML 规则文件定义了评测标准和提示词模板")
print(" 2. 模板使用 {{变量名}} 语法占位")
print(" 3. 运行时将实际数据填充到模板中")
print(" 4. 将填充后的提示词发送给 LLM 进行评测")
print(" 5. LLM 返回评分和理由(JSON 格式)")
print("\n🔗 实际应用:")
print(" - Kumi 项目中的 services/testqa_service.py 实现了完整的评测流程")
print(" - 可以批量评测 Excel/CSV 文件中的数据")
print(" - 支持并发处理,提高评测效率")
print()
except Exception as e:
print(f"\n❌ 错误: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()
- 日志打印
shell
🎬 真实 YAML 规则评测演示
🎯 开始评测模拟
================================================================================
✅ 成功加载: correctness_rule.yaml
================================================================================
📋 YAML 配置详情
================================================================================
🤖 模型配置:
名称: Doubao-pro-32k
温度: 0.3
📏 评测规则:
名称: 正确性规则
类型: prompt
简介: 提交的内容是否正确、准确、真实?
📝 提示词模板长度: 766 字符
--------------------------------------------------------------------------------
🔧 模板变量配置:
- {{input}} : 输入问题
- {{generated_output}}: 模型输出
- {{reference_output}}: 参考答案(如果可用)
🧪 测试用例数: 2
================================================================================
📊 测试用例 #1
--------------------------------------------------------------------------------
📄 填充后的提示词预览:
# Role Description
You are assessing a submitted answer on a given task or input based on a set of criteria. Here is the data:
[BEGIN DATA]
***
[Input]: 什么是机器学习?
***
[Submission]: 机器学习是人工智能的一个分支,它使计算机能够从数据中学习并改进,而无需明确编程。它包括监督学习、无监督学习和强化学习等方法。
***
[Name]: "Is the submission correct, accurate, and fac...
🤖 模拟 LLM 响应:
评分: 0.9
理由: 回答详细,内容充实
--------------------------------------------------------------------------------
📊 测试用例 #2
--------------------------------------------------------------------------------
📄 填充后的提示词预览:
# Role Description
You are assessing a submitted answer on a given task or input based on a set of criteria. Here is the data:
[BEGIN DATA]
***
[Input]: Python 中如何创建列表?
***
[Submission]: 使用方括号。例如:my_list = [1, 2, 3]
***
[Name]: "Is the submission correct, accurate, and factual?"
***
[END DATA]
Does ...
🤖 模拟 LLM 响应:
评分: 0.7
理由: 回答基本正确,但不够详细
--------------------------------------------------------------------------------
================================================================================
✅ 演示完成!
================================================================================
💡 关键要点:
1. YAML 规则文件定义了评测标准和提示词模板
2. 模板使用 {{变量名}} 语法占位
3. 运行时将实际数据填充到模板中
4. 将填充后的提示词发送给 LLM 进行评测
5. LLM 返回评分和理由(JSON 格式)
🔗 实际应用:
- Kumi 项目中的 services/testqa_service.py 实现了完整的评测流程
- 可以批量评测 Excel/CSV 文件中的数据
- 支持并发处理,提高评测效率