Kumi源码01-Yaml模块注入

Kumi源码01-Yaml模块注入

貌似这个项目给RAG盲测提供了一个清晰的可视化思路


1-核心知识

  • 1)pyyaml读取yaml文件为内存中对象

    • 读取YAML 文件格式转化为字典->config = yaml.safe_load(yam_file_path)
    • 读取config中的变量(读取的config就是一个字典)
    python 复制代码
    config['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-参考网址


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 文件中的数据
  - 支持并发处理,提高评测效率

相关推荐
luoluoal8 小时前
基于python的英汉电子词典软件(源码+文档)
python·mysql·django·毕业设计·源码
luoluoal14 小时前
基于python的旅游景点方面级别情感分析语料库与模型(源码+文档)
python·mysql·django·毕业设计·源码
源码宝16 小时前
SaaS诊所管理信息系统源码,云门诊系统源码,分布式前后端分离+Java+Vue2.0+SpringBoot+MySQL
java·源码·电子病历·电子处方·药品管理·门诊系统·诊所系统
luoluoal1 天前
基于python的某在线中药店销售数据统计与分析系统(源码+文档)
python·mysql·django·毕业设计·源码
千寻技术帮2 天前
10351_基于Springboot的二手交易平台
java·spring boot·mysql·毕业设计·源码·代码·二手交易
CarryZhang3 天前
Android输入系统源码分析(上)
源码
谷哥的小弟4 天前
HTML5新手练习项目—新年祝福(附源码)
前端·源码·html5·项目
luoluoal4 天前
基于python的语音识别与蓝牙通信的温控系统(源码+文档)
python·mysql·django·毕业设计·源码