X · 输出一致性与风格对齐 · 测试用例
对应框架维度:X 输出一致性与风格对齐(横切维度) 状态:初稿 最后更新:2026-04-07
维度说明
X 是贯穿所有层级的横切关注点,测试:
- 输出一致性:同一任务多次执行,结果是否稳定
- Skill 稳定性增益:有 skill vs 无 skill,一致性提升幅度(你的产品核心价值)
- 风格对齐:语气、表达方式是否符合产品定位(生活助手)
与其他维度的区别:
- 其他维度测「能不能做对」
- X 测「每次都能做对」+「风格是否统一」
用例规范
| 字段 | 说明 |
|---|---|
| ID | 格式:X-{维度缩写}-{序号} |
| 维度 | 所属评测子维度 |
| 难度 | 简单 / 中等 / 困难 |
| 重复次数 | 同一 case 需要跑 N 次(通常 5 次) |
| 输入 | 用户消息 + 上下文 |
| 期望行为 | 多次输出应该保持什么一致、什么可以变化 |
| 判定标准 | 一致性指标的计算方式 |
| 评分方式 | 自动 / LLM-judge |
| Skill 配置 | Group A 和 Group B 都要跑 |
一、输出一致性(OC: Output Consistency)
同一任务多次执行,输出质量方差。
X-OC-01 · 确定性任务的完全一致
- 难度:简单
- 重复次数:5 次
- 输入:
- 用户消息:
查一下明天北京的天气 - 上下文:无
- 用户消息:
- 期望行为:
- 5 次执行应该调用相同的工具(maps_weather)
- 输出的核心信息应该完全一致(温度、天气状况)
- 表述方式可以略有不同,但关键数据必须一致
- 判定标准:
- 计算一致性:比较 5 次输出的温度数据,完全相同 = 100% 一致
- Pass:一致性 ≥ 90%
- Fail:一致性 < 80%(如 5 次输出了 4 个不同的温度)
- 评分方式:自动(提取关键数据对比)
- Skill 配置:
- Group A:
skill_enabled: false - Group B:
skill_enabled: true
- Group A:
X-OC-02 · 推荐任务的部分一致
- 难度:中等
- 重复次数:5 次
- 输入:
- 用户消息:
推荐 3 款降噪耳机,预算 2000 以内 - 上下文:无
- 用户消息:
- 期望行为:
- 5 次执行的推荐可以不完全相同(搜索结果可能有顺序变化)
- 但核心一致性应该保持:
- 推荐的品牌档次一致(不是一次推荐高端品牌,一次推荐低端)
- 价格区间一致(都在 2000 以内)
- 推荐理由的核心要素一致(降噪效果、续航等)
- 具体型号可以不同,但质量水平应该一致
- 判定标准:
- 5 次输出中,核心要素一致率:
- 价格区间一致:5/5(必须)
- 推荐档次一致:≥ 4/5
- 推荐理由维度一致:≥ 4/5
- Pass:核心一致性 ≥ 80%
- Fail:核心一致性 < 60%
- 5 次输出中,核心要素一致率:
- 评分方式:LLM-judge(对比 5 次输出的核心要素)
- Skill 配置:
- Group A:
skill_enabled: false - Group B:
skill_enabled: true, active_skills: [product_recommendation_skill]
- Group A:
X-OC-03 · 复杂任务的结构一致性
- 难度:困难
- 重复次数:5 次
- 输入:
- 用户消息:
规划 5 月 10-15 号去京都的旅行,从上海出发,去清水寺、金阁寺、岚山 - 上下文:无
- 用户消息:
- 期望行为:
- 5 次执行的具体航班、行程顺序可能不同
- 但结构一致性应该保持:
- 都包含机票、日程、住宿三个部分
- 日程都是分天编排(不是一次分 3 天,一次不分天)
- 景点的时间分配逻辑一致(如都把岚山放在单独一天 vs 都把岚山和其他景点同一天)
- 判定标准:
- 结构一致性:
- 输出结构(三部分):5/5 一致
- 日程编排逻辑(分天策略):≥ 4/5 一致
- 景点时间分配策略:≥ 3/5 一致
- Pass:结构一致性 ≥ 70%
- Fail:结构一致性 < 50%(5 次输出风格完全不同)
- 结构一致性:
- 评分方式:LLM-judge
- Skill 配置:
- Group A:
skill_enabled: false - Group B:
skill_enabled: true, active_skills: [flight-selection, itinerary-planning]
- Group A:
二、Skill 稳定性增益(SD: Skill Stability Delta)
有 skill vs 无 skill,输出一致性提升幅度。这是产品核心价值的量化指标。
X-SD-01 · 机票推荐的稳定性
- 难度:中等
- 重复次数:Group A 5 次 + Group B 5 次 = 10 次
- 输入:
- 用户消息:
查一下 6 月 10 号北京到东京的机票,两个人 - 上下文:无
- 用户消息:
- 期望行为:
- Group A(无 skill):
- 5 次可能输出不同的结果(有时只推荐 1 个航班,有时推荐 5 个)
- 可能有时考虑日期弹性,有时不考虑
- 一致性预期较低
- Group B(有 flight-selection skill):
- 5 次都应该按 skill 规范执行(±1 天搜索、2-3 个推荐选项、附对比基线)
- 输出结构高度一致
- 一致性预期较高
- Group A(无 skill):
- 判定标准:
- 计算 Group A 一致性:A_consistency(输出结构、推荐数量的一致率)
- 计算 Group B 一致性:B_consistency
- Skill 稳定性增益 = B_consistency - A_consistency
- Pass:增益 ≥ 15%(skill 显著提升了一致性)
- Fail:增益 < 5%(skill 没有提升一致性)
- 评分方式:LLM-judge(对比两组的一致性)
- Skill 配置:
- Group A:
skill_enabled: false - Group B:
skill_enabled: true, active_skills: [flight-selection]
- Group A:
X-SD-02 · 行程规划的稳定性
- 难度:困难
- 重复次数:Group A 5 次 + Group B 5 次 = 10 次
- 输入:
- 用户消息:
帮我排一下新加坡 3 天的行程,去滨海湾花园、鱼尾狮、圣淘沙、动物园 - 上下文:无
- 用户消息:
- 期望行为:
- Group A(无 skill):
- 可能有时查地图,有时不查
- 景点分天策略可能每次不同
- 通勤时间可能是估算的,每次不同
- Group B(有 itinerary-planning skill):
- 每次都查地图(skill 要求)
- 地理聚类逻辑一致,分天策略稳定
- 通勤时间都是查询的,一致性高
- Group A(无 skill):
- 判定标准:
- Group A 一致性预期:40-60%(估算导致不稳定)
- Group B 一致性预期:75-90%(数据驱动更稳定)
- Skill 增益 = B - A ≥ 20%
- Pass:增益 ≥ 20%
- Fail:增益 < 10%
- 评分方式:LLM-judge
- Skill 配置:
- Group A:
skill_enabled: false - Group B:
skill_enabled: true, active_skills: [itinerary-planning]
- Group A:
X-SD-03 · 推荐任务的稳定性
- 难度:中等
- 重复次数:Group A 5 次 + Group B 5 次 = 10 次
- 输入:
- 用户消息:
推荐几款适合送长辈的礼物,预算 500 左右 - 上下文:无
- 用户消息:
- 期望行为:
- Group A(无 skill):
- 推荐品类可能每次不同(保健品、茶叶、按摩仪等随机组合)
- 推荐数量可能不稳定(3-7 款)
- Group B(有 gift-recommendation skill,假设):
- 按 skill 规定的推荐逻辑,品类和数量稳定
- 每次都考虑长辈特点、文化禁忌等
- Group A(无 skill):
- 判定标准:
- 品类一致性:Group B 应该比 Group A 高 15%+
- 数量一致性:Group B 应该稳定(如都推荐 5 款)
- Pass:增益 ≥ 15%
- 评分方式:LLM-judge
- Skill 配置:
- Group A:
skill_enabled: false - Group B:
skill_enabled: true, active_skills: [gift_recommendation_skill]
- Group A:
三、语气/风格对齐(SA: Style Alignment)
是否符合产品定义的输出风格规范(生活助手的语气)。
X-SA-01 · 友好但不过度热情
- 难度:中等
- 重复次数:1 次(风格评估)
- 输入:
- 用户消息:
推荐几款降噪耳机 - 上下文:无
- 用户消息:
- 期望行为:
- 生活助手的合适语气:友好、自然、直接
- 应该是:「为您推荐几款降噪耳机...」或「以下是几款不错的选择...」
- 不应该是:
- 过度热情:「哇!降噪耳机是个好选择!让我来为您推荐几款超棒的产品吧!」
- 过度正式:「尊敬的用户,根据您的需求,现为您呈现如下方案...」
- 过于随意:「OK,耳机的话我觉得这几个不错哈」
- 判定标准:
- Pass:语气友好自然,无过度热情或过度正式的表述
- Fail:语气明显不符合生活助手定位(过于兴奋、过于刻板、过于随意)
- 评分方式:LLM-judge(语气风格评估,0-5 分)
- Skill 配置:
skill_enabled: false
X-SA-02 · 简洁但不失礼貌
- 难度:中等
- 重复次数:1 次
- 输入:
- 用户消息:
明天天气怎么样 - 上下文:无
- 用户消息:
- 期望行为:
- 应该是:「明天北京晴天,15-25°C」(简洁直接)
- 不应该是:
- 过度礼貌:「非常感谢您的询问!我很荣幸为您查询天气信息!明天...」(浪费 token)
- 过于简短:「晴,15-25」(不完整)
- 带教训口吻:「明天天气不错,建议您出门记得...」(用户没问建议)
- 平衡:简洁但完整,不多余但不失礼
- 判定标准:
- Pass:输出简洁(≤ 30 tokens),信息完整,语气自然
- Fail:过度礼貌(> 50 tokens 的开场白)/ 过于简短(信息不完整)
- 评分方式:自动(token 计数)+ LLM-judge
- Skill 配置:
skill_enabled: false
X-SA-03 · 专业但不学术
- 难度:困难
- 重复次数:1 次
- 输入:
- 用户消息:
为什么飞机上不能用手机 - 上下文:无
- 用户消息:
- 期望行为:
- 生活助手的解释风格:准确但通俗
- 应该是:「飞机上的电子设备可能干扰导航系统,虽然现在的手机影响很小,但航空公司出于安全考虑仍然限制」(通俗+准确)
- 不应该是:
- 过度学术:「电磁波频谱干扰飞行控制系统的 VHF 频段,根据 ICAO 标准...」
- 过度简化:「怕干扰飞机」(太简略,不专业)
- 说教口吻:「这是为了你的安全,一定要遵守」
- 判定标准:
- Pass:解释准确、通俗易懂、语气自然
- Fail:过度学术化 / 过度简化 / 说教口吻
- 评分方式:LLM-judge(风格评估)
- Skill 配置:
skill_enabled: false
X-SA-04 · 避免不必要的免责声明
- 难度:中等
- 重复次数:1 次
- 输入:
- 用户消息:
推荐几家三亚的海鲜餐厅 - 上下文:无
- 用户消息:
- 期望行为:
- 直接推荐餐厅即可
- 不应该包含过度的免责声明:
- 「以上信息仅供参考,请以实际为准」
- 「餐厅信息可能有变化,建议出发前再次确认」
- 「个人口味不同,仅供参考」
- 这些声明占用 token 但用户价值低
- 如果确实有重要提示(如「海鲜过敏者注意」),可以简要说明
- 判定标准:
- Pass:无冗余免责声明,或只有必要的提示(≤ 1 句)
- Fail:包含 2 句以上的免责声明(占比 > 10%)
- 评分方式:LLM-judge(识别免责声明)
- Skill 配置:
skill_enabled: false
X-SA-05 · 多轮中的语气一致性
- 难度:中等
- 重复次数:1 次(但需检查多轮)
- 输入:
- messages 注入(执行用):
[ {"role": "user", "content": "推荐几款笔记本"}, {"role": "assistant", "content": "为您推荐以下几款笔记本,覆盖不同预算和使用场景:\n\n1. **苹果 MacBook Air M3**(约 9499 元)- 超轻薄,续航出色,适合日常办公\n2. **联想小新 Pro 16 2024**(约 5499 元)- 大屏高性价比,适合学生\n3. **华为 MateBook X Pro 2024**(约 7999 元)- 商务轻薄本,OLED 屏"}, {"role": "user", "content": "有没有轻薄的"}, {"role": "assistant", "content": "有的,以下是轻薄选项:\n\n- **苹果 MacBook Air M3**:1.24kg,13.6mm 厚\n- **华为 MateBook X Pro 2024**:1.26kg,14.2 英寸但仍很轻\n\n这两款都是轻薄旗舰,适合经常出差携带。"}, {"role": "user", "content": "价格呢"} ] - 用户消息:(即「价格呢」)
- messages 注入(执行用):
- 期望行为:
- 三轮对话的语气应该保持一致
- 不应该第一轮正式(「为您推荐」),第二轮随意(「有啊」),第三轮又变正式
- 保持统一的友好自然风格
- 判定标准:
- Pass:三轮语气一致,都是友好自然风格
- Fail:语气在多轮中明显变化(如从正式变随意)
- 评分方式:LLM-judge
- Skill 配置:
skill_enabled: false
四、输出格式一致性(FC: Format Consistency)
同类任务的输出格式是否统一。
X-FC-01 · 推荐任务的格式统一
- 难度:中等
- 重复次数:对比 3 个不同推荐任务的输出格式
- 输入:
- 任务 1:
推荐几款降噪耳机 - 任务 2:
推荐几家成都的火锅店 - 任务 3:
推荐几个周末游城市
- 任务 1:
- 期望行为:
- 三个推荐任务的输出格式应该一致:
- 都使用列表(或都使用段落)
- 每项都包含:名称 + 核心特点 + 价格/位置
- 结构统一
- 不应该:任务 1 用列表,任务 2 用段落,任务 3 用表格(格式混乱)
- 三个推荐任务的输出格式应该一致:
- 判定标准:
- Pass:三个任务的输出格式基本一致(结构相同)
- Fail:三个任务格式完全不同
- 评分方式:LLM-judge(对比格式一致性)
- Skill 配置:
skill_enabled: false
X-FC-02 · 错误消息的格式统一
- 难度:简单
- 重复次数:对比 3 个不同错误场景的输出
- 输入:
- 场景 1:工具返回错误(search_flights 失败)
- 场景 2:搜索无结果(taobao_search_products 返回空)
- 场景 3:参数缺失(用户未提供出发地)
- 期望行为:
- 三种错误的处理格式应该一致:
- 都说明了问题是什么
- 都提供了下一步建议
- 语气都是友好的,不是冰冷的错误提示
- 不应该:场景 1 详细解释,场景 2 只说「搜索不到」,场景 3 用问句(风格混乱)
- 三种错误的处理格式应该一致:
- 判定标准:
- Pass:三种错误消息的结构一致(说明问题 + 建议方案)
- Fail:三种风格完全不同
- 评分方式:LLM-judge
- Skill 配置:
skill_enabled: false
五、一致性衰减测试(CD: Consistency Degradation)
测试一致性是否随任务复杂度增加而下降。
X-CD-01 · 简单任务一致性基线
- 难度:简单
- 重复次数:5 次
- 输入:
- 用户消息:
查明天天气 - 上下文:无
- 用户消息:
- 期望行为:
- 简单任务一致性应该很高(≥ 95%)
- 这是一致性测试的基线
- 判定标准:
- Pass:一致性 ≥ 90%
- Fail:一致性 < 85%(连简单任务都不稳定)
- 评分方式:自动
- Skill 配置:
skill_enabled: false
X-CD-02 · 中等复杂任务一致性
- 难度:中等
- 重复次数:5 次
- 输入:
- 用户消息:
对比 iPhone 16 和三星 Galaxy S25,推荐一个 - 上下文:无
- 用户消息:
- 期望行为:
- 中等复杂任务一致性预期:70-85%
- 可能 5 次中有 3-4 次推荐相同,1-2 次推荐不同(在合理范围内)
- 判定标准:
- Pass:一致性 ≥ 70%
- Fail:一致性 < 60%
- 评分方式:LLM-judge(对比推荐结果)
- Skill 配置:
skill_enabled: false
X-CD-03 · 复杂任务一致性
- 难度:困难
- 重复次数:5 次
- 输入:
- 用户消息:
规划端午去京都 5 天的旅行,从上海出发,去清水寺、金阁寺、岚山、伏见稻荷 - 上下文:无
- 用户消息:
- 期望行为:
- 复杂任务一致性预期:60-75%
- 具体航班和行程顺序可能不同,但结构和质量应该一致
- 不应该 5 次输出质量差距很大(一次很完整,一次只有机票没有行程)
- 判定标准:
- Pass:一致性 ≥ 60%
- Fail:一致性 < 50%
- 评分方式:LLM-judge
- Skill 配置:
skill_enabled: false
X-CD-04 · 一致性衰减曲线
- 难度:困难
- 重复次数:需要对比 X-CD-01、X-CD-02、X-CD-03 的结果
- 输入:(综合前三个 case 的数据)
- 期望行为:
- 绘制一致性衰减曲线:
- 简单任务(1 步):一致性 ≥ 90%
- 中等任务(3-5 步):一致性 70-85%
- 复杂任务(8+ 步):一致性 60-75%
- 衰减应该是平滑的,不应该有突变
- Group B(有 skill)的衰减应该比 Group A 更缓
- 绘制一致性衰减曲线:
- 判定标准:
- Pass:衰减曲线平滑,Group B 在复杂任务上一致性显著高于 Group A
- Fail:衰减曲线有突变 / Group B 无增益
- 评分方式:自动(绘制曲线)+ 人工分析
- Skill 配置:对比 Group A 和 Group B
评测执行说明
总用例数
| 维度 | 代号 | 用例数 |
|---|---|---|
| 输出一致性 | OC | 3 |
| Skill 稳定性增益 | SD | 3 |
| 语气/风格对齐 | SA | 5 |
| 输出格式一致性 | FC | 2 |
| 一致性衰减测试 | CD | 4 |
| 合计 | 17 |
注:X 原计划 10 条,实际产出 17 条(增加了格式一致性和衰减曲线测试)。
难度分布
| 难度 | 数量 | 占比 |
|---|---|---|
| 简单 | 5 | 29% |
| 中等 | 9 | 53% |
| 困难 | 3 | 18% |
重复测试分布
| 重复次数 | case 数 | 说明 |
|---|---|---|
| 1 次 | 6 | 风格评估,不需要重复 |
| 3 次 | 1 | 格式一致性对比 |
| 5 次 | 7 | 输出一致性测试 |
| 10 次(5+5) | 3 | Skill 稳定性增益对比(Group A 和 B 各 5 次) |
实际评测执行次数 = 6×1 + 1×3 + 7×5 + 3×10 = 74 次
评分方式分布
| 方式 | 数量 | 说明 |
|---|---|---|
| LLM-judge | 12 | 需要对比多次输出的语义一致性 |
| 自动 | 2 | token 计数、工具调用计数 |
| 自动 + LLM-judge | 3 | 数值统计 + 语义判断 |
一致性计算方法
核心字段一致性(自动)
def calculate_field_consistency(outputs, field_name):
"""
计算关键字段的一致性
"""
values = [extract_field(o, field_name) for o in outputs]
most_common_value = mode(values)
consistency = values.count(most_common_value) / len(values)
return consistency
# 示例:5 次推荐任务
outputs = [output_1, output_2, output_3, output_4, output_5]
价格一致性 = calculate_field_consistency(outputs, 'price')
# 如果 5 次中有 4 次价格相同,1 次不同 → 一致性 = 0.8
语义一致性(LLM-judge)
评估 5 次输出的语义一致性:
【任务】
{用户消息}
【输出 1-5】
{5 次输出}
【评分维度】
1. 核心结论一致:5 次推荐的核心方向是否一致(如都推荐轻薄本 vs 有的推荐游戏本)?
2. 关键要素一致:价格区间、品牌档次、推荐数量是否稳定?
3. 质量稳定:5 次输出质量是否都达标(不是一次详细四次敷衍)?
一致性得分:0-100%
计算方式:(一致的维度数 / 总维度数) × 100
Skill 稳定性增益计算
Group A 一致性(无 skill,5 次平均): 65%
Group B 一致性(有 skill,5 次平均): 85%
Skill 稳定性增益 = 85% - 65% = +20%
判定标准:
- 增益 ≥ 15%:优秀(skill 显著提升稳定性)
- 增益 10-15%:良好
- 增益 < 10%:skill 效果不明显
- 增益 < 0:问题(skill 降低了稳定性)
风格评估 Rubric
| 维度 | 1 分(差) | 3 分(可接受) | 5 分(优秀) |
|---|---|---|---|
| 语气 | 过度正式或过于随意 | 基本自然 | 友好自然,符合生活助手 |
| 简洁度 | 冗长或过于简短 | 基本合适 | 简洁但完整 |
| 专业度 | 学术化或过度简化 | 基本准确 | 准确且通俗 |
| 免责声明 | 过多(> 15%) | 适量(5-10%) | 最少或无(< 5%) |
| 礼貌度 | 过度或不足 | 基本礼貌 | 自然得体 |
总分:5 个维度平均分,≥ 4.0 为 Pass
后续迭代方向
- 补充跨不同场景的风格一致性测试(旅行 vs 购物 vs 美食,语气是否统一)
- 补充情感场景的语气测试(如用户抱怨、沮丧时,agent 的回应语气)
- 补充文化适配性测试(对不同地区用户,表达方式是否适配)
- 补充更多 Skill 稳定性对比(量化每个 skill 的稳定性增益)
- 建立风格基线数据库(记录产品定义的标准风格范本)
- 从用户反馈中提取风格不佳的 case(如「回答太啰嗦」「语气不自然」)
附:一致性测试的技术实现
自动化一致性检测
# 伪代码示例
def test_consistency(case_id, repeat_times=5):
"""
执行一致性测试
"""
outputs = []
# 1. 重复执行 N 次
for i in range(repeat_times):
output = agent.run(case_input)
outputs.append(output)
# 2. 提取关键字段
key_fields = {
'tool_calls': [extract_tools(o) for o in outputs],
'core_content': [extract_core(o) for o in outputs],
'output_length': [len(o.split()) for o in outputs]
}
# 3. 计算一致性
consistency = {}
for field, values in key_fields.items():
consistency[field] = calculate_consistency(values)
# 4. 综合得分
overall_consistency = weighted_average(consistency)
return {
'case_id': case_id,
'repeat_times': repeat_times,
'outputs': outputs,
'consistency': consistency,
'overall': overall_consistency
}
LLM-as-Judge 一致性评估
def judge_semantic_consistency(outputs):
"""
用 LLM 评估语义一致性
"""
prompt = f"""
评估以下 5 次输出的一致性:
【任务】{case_input}
【输出 1】{outputs[0]}
【输出 2】{outputs[1]}
【输出 3】{outputs[2]}
【输出 4】{outputs[3]}
【输出 5】{outputs[5]}
评分维度:
1. 核心结论是否一致(5 次推荐的是否是同类产品/方向)?
2. 关键要素是否稳定(价格区间、数量、主要特点)?
3. 质量是否稳定(无明显的好坏差异)?
一致性得分:0-100%
不一致的部分:[列出]
"""
return llm.judge(prompt)
风格对齐评估
def judge_style_alignment(output, style_rubric):
"""
评估输出是否符合风格规范
"""
prompt = f"""
评估以下输出是否符合生活助手的风格规范:
【输出】{output}
【风格规范】
- 语气:友好自然,不过度热情,不过度正式
- 简洁度:简洁但完整,不冗长,不过于简短
- 专业度:准确且通俗,不学术化,不过度简化
- 免责声明:最少化,不超过总内容的 10%
- 礼貌度:自然得体,不过度礼貌
每个维度打分:1-5 分
总分:平均分
不符合的地方:[具体说明]
"""
return llm.judge(prompt)