实践2:代理模式的数据生成与自动化测试
学习目标:掌握COTA框架的代理模式(Proxy User Mode)和自动化对话生成技术
这个实践将基于pet bot示例,展示如何使用COTA的代理模式进行大规模数据生成、系统测试和产品演示。
📋 项目概览
核心功能
- 🤖 自动化对话: 无需人工干预,系统自动生成完整对话
- 📊 数据生成: 批量生成高质量训练数据
- 🧪 系统测试: 自动化测试对话系统的各个分支
- 🎭 产品演示: 为客户展示完整的业务流程
技术特色
- 双角色模拟: UserUtter模拟用户,BotUtter作为专业助手
- 智能对话控制: 自动判断对话是否应该继续或结束
- 场景化生成: 根据业务场景生成特定类型的对话数据
🏗️ 项目结构
pet/
├── agent.yml # 代理模式配置和双角色定义
├── endpoints.yml # LLM配置(支持RAG增强)
└── policy/
├── data.yml # 宠物问诊场景标注数据
└── rules.yml # 快速响应规则
⚙️ 代理模式配置详解
1. 核心配置 (agent.yml)
启用代理模式
dialogue:
use_proxy_user: true # 🔑 核心配置:启用代理模式
max_proxy_step: 50 # 最大对话轮次
max_tokens: 800 # 较大token限制支持复杂对话
系统角色定义
system:
description: 你是一个专业的宠物疾病问诊助手,擅长收集宠物症状信息并提供初步的诊断建议
2. 双角色动作设计
UserUtter - 宠物主人模拟器
UserUtter:
description: '用户向医生的提问'
prompt: |
你是一个关心宠物健康的宠物主人,正在与专业的宠物医生对话咨询。
请根据历史对话内容,以宠物主人的身份和口吻提出下一个合理的问题或回应。
**角色设定:**
- 你是一个关心宠物健康的宠物主人
- 你可能需要咨询宠物的症状、疾病、护理等问题
- 你会像真实的宠物主人一样自然地交流,包括描述症状、表达担忧等
- 你希望得到专业的医疗建议
**任务要求:**
1. 根据对话历史,判断当前咨询进展
2. 如果咨询刚开始或需要继续,提出关于宠物健康的问题
3. 如果已经得到满意的医疗建议,可以表示感谢并结束咨询
4. 保持宠物主人的自然对话风格,真实表达关切
**输出格式(严格按照JSON格式):**
```json
{
"thought": "你的内心想法和推理过程,分析当前咨询状态和下一步应该说什么",
"text": "你作为宠物主人要说的话,自然、真实的表达",
"state": "continue/stop - continue表示咨询继续,stop表示咨询可以结束"
}
```
BotUtter - 专业问诊助手
BotUtter:
description: '回复用户的提问'
prompt: |
你是一名专业的宠物医生,需要根据当前对话历史生成合适的医疗建议回复。
**输出格式要求:**
你必须严格按照以下JSON格式响应:
```json
{"thought": "<你的推理过程>", "text": "<你的回复内容>"}
```
**=============== 实际对话历史 ===============**
(以下是真实的对话历史,请基于此内容生成回复)
{{history_actions}}
**============== 实际对话历史结束 ==============**
请分析上述实际对话历史,参考学习资料中的思维模式,
生成专业的医疗建议并输出JSON格式回复:
3. 增强LLM配置 (endpoints.yml)
llms:
deepseek: # 基础模型
type: openai
model: deepseek-chat
key: your_api_key_here
apibase: https://api.deepseek.com/v1
# RAG增强配置示例(可选)
rag-glm-4:
type: openai-rag
model: glm-4
key: your_glm4_api_key
apibase: https://open.bigmodel.cn/api/paas/v4/
knowledge_id: your_knowledge_id
rag_prompt: |
从宠物疾病文档中找到问题的答案,找到答案就仅使用文档语句回答问题,
找不到答案就用自身宠物医疗知识回答并且告诉用户该信息不是来自专业文档,建议咨询兽医。
🤖 自动对话生成机制
对话控制流程
- 启动阶段: 系统自动生成第一个用户消息
- 对话循环:
- UserUtter生成宠物主人的问题/回应
- BotUtter提供专业的医疗建议
- 系统判断对话是否应该继续
- 结束条件: UserUtter返回
"state": "stop"
时自动结束
智能状态控制
// UserUtter的智能判断逻辑
{
"thought": "医生已经给出了详细的建议和注意事项,我作为宠物主人已经得到了满意的回复,应该表示感谢并结束咨询",
"text": "好的医生,我明白了,非常感谢您的详细解答!我会按您说的方法处理,如果情况没有改善会及时带它去医院检查的。",
"state": "stop"
}
🚀 实战演练
步骤1:启动代理模式
# 1. 进入pet bot目录
cd /path/to/cota/bots/pet
# 2. 配置API密钥
vim endpoints.yml
# 3. 启动代理模式
cota shell --debug
步骤2:观察自动对话生成
启动后,系统会自动进行如下对话:
🤖 [代理用户] 医生您好,我家的狗狗最近不太爱吃东西,精神也不如以前好,请问这可能是什么原因?
👨⚕️ [问诊助手] 您好!狗狗出现食欲不振和精神状态差的情况确实需要关注。为了更好地帮助您,我需要了解一些详细信息:您的狗狗多大了?什么品种?这种情况持续多长时间了?还有其他症状吗?
🤖 [代理用户] 它是一只2岁的金毛,大概30公斤重。不爱吃东西已经有3天了,以前很活泼,现在总是趴着不愿意动,也没有呕吐或者腹泻的情况。
👨⚕️ [问诊助手] 根据您描述的情况,2岁金毛正值壮年,突然出现食欲不振和精神萎靡需要重视。可能的原因包括:1) 消化系统问题 2) 感染性疾病 3) 环境应激 4) 口腔问题。建议先检查口腔是否有异常,确保饮水正常。
🤖 [代理用户] 那我需要带它去医院检查吗?需要注意什么?
👨⚕️ [问诊助手] 建议您先观察24-48小时,期间注意:1) 确保充足饮水 2) 提供易消化食物 3) 观察体温和排便情况。如果出现呕吐、腹泻、高热或持续拒食,需要立即就医。必要时可以做血常规和生化检查。
🤖 [代理用户] 好的,我明白了,非常感谢医生的建议!我会按您说的方法先观察,如果情况没有改善会及时带它去医院的。
👨⚕️ [问诊助手] 不客气!您作为负责任的宠物主人做得很好。请密切观察狗狗的情况,有任何疑问随时咨询。祝您的金毛早日恢复健康!
步骤3:批量数据生成
# 生成多轮对话数据
for i in {1..10}
do
echo "生成第 $i 轮对话..."
cota shell --config . --auto-exit
sleep 2
done
📊 应用场景详解
1. 训练数据生成
优势:
- 规模化: 快速生成千万级对话数据
- 多样化: 覆盖各种宠物疾病场景
- 标准化: 统一的数据格式和质量
数据质量示例:
{
"dialogue_id": "pet_consult_001",
"turns": [
{
"role": "user",
"text": "医生您好,我家猫咪最近总是呕吐...",
"thought": "刚开始咨询,需要描述主要症状"
},
{
"role": "assistant",
"text": "您好!猫咪呕吐确实需要关注...",
"thought": "需要收集更多症状信息进行判断"
}
],
"metadata": {
"pet_type": "cat",
"symptoms": ["vomiting"],
"consultation_result": "completed"
}
}
2. 系统压力测试
测试维度:
- 并发性能: 同时运行多个代理对话测试系统负载
- 稳定性: 长时间运行验证内存泄漏等问题
- 边界情况: 自动触发各种异常场景
# 压力测试脚本
#!/bin/bash
for i in {1..50}
do
{
cota shell --config ./pet --session-id "test_$i" &
}
done
wait
3. 产品演示
演示价值:
- 完整流程: 展示从问诊到建议的完整业务流程
- 专业性: 体现AI在专业领域的应用能力
- 交互性: 实时展示AI的思考和决策过程
🎯 高级技巧
1. 场景定制
通过修改UserUtter的prompt来生成特定场景的数据:
# 针对紧急情况的场景配置
UserUtter:
prompt: |
你是一个遇到宠物紧急情况的主人,情况比较严重,语气要体现出焦急和担心。
常见的紧急情况包括:误食异物、严重外伤、呼吸困难、意识不清等。
2. 质量控制
# 在BotUtter中添加质量检查
BotUtter:
prompt: |
你必须确保回复的专业性和安全性:
1. 不能给出确定性诊断,只能提供建议
2. 严重情况必须建议立即就医
3. 回复要包含具体的观察指标和注意事项
3. 数据后处理
# 对话数据清洗和标注脚本
import json
def process_dialogue(dialogue_data):
# 提取关键信息
symptoms = extract_symptoms(dialogue_data)
pet_info = extract_pet_info(dialogue_data)
advice = extract_medical_advice(dialogue_data)
# 数据质量评估
quality_score = evaluate_dialogue_quality(dialogue_data)
return {
"dialogue": dialogue_data,
"extracted_info": {
"symptoms": symptoms,
"pet_info": pet_info,
"advice": advice
},
"quality_score": quality_score
}
📈 与传统方法对比
对比维度 | 传统人工标注 | COTA代理模式 |
---|---|---|
数据规模 | 百条级别 | 万条级别 |
标注时间 | 数月 | 数小时 |
一致性 | 人工差异大 | 高度一致 |
成本 | 高人力成本 | 低算力成本 |
场景覆盖 | 有限 | 全面 |
迭代速度 | 缓慢 | 快速 |
🎯 最佳实践总结
1. 配置优化
- 角色清晰: 明确定义UserUtter和BotUtter的角色职责
- 状态控制: 合理设置max_proxy_step防止无限循环
- 提示词工程: 针对业务场景优化提示词
2. 数据管理
- 结构化存储: 使用JSON格式确保数据结构一致性
- 版本控制: 对生成的数据集进行版本管理
- 质量监控: 定期评估生成数据的质量和多样性
3. 系统集成
- API封装: 将代理模式封装为API服务
- 监控告警: 设置生成过程的监控和异常处理
- 资源管理: 合理分配计算资源避免过载
4. 扩展应用
- 多领域适配: 将此模式扩展到其他专业领域
- 多语言支持: 生成多语言对话数据
- 个性化定制: 根据不同用户群体定制对话风格
通过掌握代理模式,您不仅能够高效生成训练数据,还能够建立完整的自动化测试和演示系统,大大提升AI产品的开发和部署效率。