Back to Hello Agents

💖 NPC好感度系统使用指南

code/chapter15/Helloagents-AI-Town/AFFINITY_SYSTEM_GUIDE.md

1.0.29.0 KB
Original Source

💖 NPC好感度系统使用指南

📚 概述

赛博小镇的NPC现在拥有了好感度系统,能够根据与玩家的对话内容自动调整好感度,并影响后续对话的风格和态度!


✨ 核心功能

1. 自动情感分析

  • 🤖 使用LLM Agent分析对话情感
  • 📊 判断玩家态度 (友好/中立/不友好)
  • 🎯 评估对话质量 (深入/一般/敷衍)
  • 💬 识别情感倾向 (赞美/批评/中性)

2. 好感度动态调整

  • 📈 友好对话提升好感度 (+1 到 +10)
  • 📉 批评对话降低好感度 (-3 到 -15)
  • 🔄 自动更新好感度值 (0-100)
  • 🎚️ 限制在合理范围内

3. 关系等级系统

  • 🥶 陌生 (0-20): 冷淡疏离,不太愿意多说
  • 😐 熟悉 (20-40): 礼貌但略显生疏
  • 😊 友好 (40-60): 礼貌友善,正常交流
  • 🤗 亲密 (60-80): 友好热情,愿意多聊
  • 💕 挚友 (80-100): 非常热情,像老朋友一样

4. 对话风格调整

  • 🎭 好感度影响NPC的对话风格
  • 💬 高好感度: 更热情、更愿意分享
  • 😶 低好感度: 更冷淡、回答简短
  • 🔄 动态调整,实时生效

🎯 使用示例

示例1: 好感度提升

初始好感度: 50 (友好)

第一次对话:
玩家: "你好,很高兴认识你!"
张三: "你好!我也很高兴认识你。"
📈 好感度: 50 -> 55 (友好问候)

第二次对话:
玩家: "你的代码写得真棒!"
张三: "谢谢!我最近在研究新技术,你对这个感兴趣吗?"
📈 好感度: 55 -> 63 (赞美工作) → 关系等级提升: 友好 -> 亲密

第三次对话:
玩家: "能教教我吗?"
张三: "当然可以!我很乐意分享。你想从哪里开始?"
📈 好感度: 63 -> 69 (请教学习)

示例2: 好感度降低

当前好感度: 69 (亲密)

批评对话:
玩家: "你这个代码写得太烂了!"
张三: "抱歉,我会改进的..."
📉 好感度: 69 -> 61 (批评工作) → 关系等级降低: 亲密 -> 友好

示例3: 对话风格变化

好感度: 30 (熟悉)
玩家: "你好,最近怎么样?"
李四: "还行吧。" (简短回答)

好感度: 70 (亲密)
玩家: "你好,最近怎么样?"
李四: "挺好的!最近在做一个很有意思的项目,你要不要听听?" (热情详细)

好感度: 90 (挚友)
玩家: "你好,最近怎么样?"
李四: "哈哈,老朋友!最近忙得不行,但很充实。对了,上次你问的那个问题,我找到答案了!" (亲切主动)

🔧 技术实现

架构设计

RelationshipManager
├── affinity_scores: Dict[str, Dict[str, float]]  # NPC好感度存储
├── analyzer_agent: SimpleAgent                   # 情感分析Agent
├── get_affinity(npc_name, player_id)            # 获取好感度
├── analyze_and_update_affinity(...)             # 分析并更新好感度
├── get_affinity_level(affinity)                 # 获取关系等级
└── get_affinity_modifier(affinity)              # 获取对话风格修饰词

情感分析流程

1. 玩家发送消息
   ↓
2. NPC生成回复
   ↓
3. 情感分析Agent分析对话
   ├── 分析玩家态度
   ├── 评估对话内容
   ├── 判断情感倾向
   └── 计算好感度变化量
   ↓
4. 更新好感度
   ├── 当前好感度 + 变化量
   ├── 限制在0-100范围
   └── 检查等级变化
   ↓
5. 保存到记忆系统
   └── 记录好感度和情感信息

好感度变化规则

对话类型变化量示例
赞美、感谢、请教+3 到 +8"你真棒!" "谢谢你!" "能教教我吗?"
友好问候、正常交流+1 到 +3"你好!" "最近怎么样?"
普通闲聊、中性话题0"今天天气不错"
批评、质疑、不耐烦-3 到 -8"这个不太好" "真的吗?"
侮辱、攻击、恶意-8 到 -15"你太烂了!"

🚀 API接口

1. 获取NPC好感度

http
GET /npcs/张三/affinity?player_id=player

响应:

json
{
    "npc_name": "张三",
    "player_id": "player",
    "affinity": 65.0,
    "level": "亲密",
    "modifier": "友好热情,愿意多聊,会主动关心对方"
}

2. 获取所有NPC好感度

http
GET /affinities?player_id=player

响应:

json
{
    "player_id": "player",
    "affinities": {
        "张三": {
            "affinity": 65.0,
            "level": "亲密",
            "modifier": "友好热情,愿意多聊,会主动关心对方"
        },
        "李四": {
            "affinity": 50.0,
            "level": "友好",
            "modifier": "礼貌友善,正常交流,保持专业"
        },
        "王五": {
            "affinity": 72.0,
            "level": "亲密",
            "modifier": "友好热情,愿意多聊,会主动关心对方"
        }
    }
}

3. 设置NPC好感度 (测试用)

http
PUT /npcs/张三/affinity?affinity=80&player_id=player

响应:

json
{
    "message": "已设置张三对玩家的好感度",
    "npc_name": "张三",
    "player_id": "player",
    "affinity": 80.0,
    "level": "挚友",
    "modifier": "非常热情友好,像老朋友一样亲切,愿意分享私人话题"
}

🧪 测试方法

方法1: 使用测试脚本

bash
cd backend
python test_affinity.py

测试内容:

  • ✅ 基本好感度功能
  • ✅ 好感度提升/降低
  • ✅ 关系等级变化
  • ✅ 对话风格调整
  • ✅ 好感度渐进提升

方法2: 使用API测试

  1. 启动后端服务:
bash
cd backend
python main.py
  1. 访问API文档: http://localhost:8000/docs

  2. 测试好感度接口:

    • 对话: POST /chat
    • 查看好感度: GET /npcs/张三/affinity
    • 查看所有好感度: GET /affinities

📊 好感度系统配置

情感分析提示词

情感分析Agent使用精心设计的提示词来分析对话:

python
【分析维度】
1. 玩家态度: 友好/中立/不友好
2. 对话内容: 积极/中立/消极
3. 互动质量: 深入/一般/敷衍
4. 情感倾向: 赞美/批评/中性

【输出格式】
{
    "should_change": true/false,
    "change_amount": -15到+10之间的整数,
    "reason": "简短说明原因",
    "sentiment": "positive/neutral/negative"
}

调整建议

如果想调整好感度变化的敏感度,可以修改 relationship_manager.py 中的提示词:

  • 更敏感: 增加变化量范围 (例如: -20 到 +15)
  • 更保守: 减少变化量范围 (例如: -5 到 +5)
  • 更细腻: 添加更多分析维度
  • 更简单: 简化分析规则

🎓 教学价值

学习要点

  1. LLM情感分析

    • 如何使用LLM分析对话情感
    • 如何设计情感分析提示词
    • 如何解析LLM的JSON响应
  2. 好感度系统设计

    • 如何设计好感度变化规则
    • 如何实现关系等级系统
    • 如何将好感度与对话风格关联
  3. 系统集成

    • 如何将好感度系统集成到Agent
    • 如何与记忆系统协同工作
    • 如何通过API暴露功能
  4. 用户体验设计

    • 如何让NPC更有人情味
    • 如何提升对话的连贯性
    • 如何增强游戏的沉浸感

🔍 调试技巧

1. 查看好感度变化日志

python
# 在agents.py的chat方法中
📈 张三对玩家的好感度: 50.0 -> 55.0 (友好问候)
🎉 关系等级提升: 友好 -> 亲密

2. 检查情感分析结果

python
# 在relationship_manager.py中添加调试输出
print(f"情感分析结果: {analysis}")

3. 测试不同对话类型

python
# 使用test_affinity.py测试不同类型的对话
friendly_messages = ["你好!", "你真棒!", "能教教我吗?"]
critical_messages = ["这个不好", "你太烂了"]
neutral_messages = ["今天天气不错", "嗯"]

❓ 常见问题

Q1: 好感度为什么没有变化?

可能原因:

  • 对话内容过于中性
  • 情感分析Agent判断为不需要改变
  • LLM响应解析失败

解决方法:

  • 使用更明确的情感表达
  • 检查日志中的情感分析结果
  • 调整情感分析提示词

Q2: 好感度变化太快/太慢?

解决方法:

  • 修改 relationship_manager.py 中的变化量范围
  • 调整情感分析提示词中的规则
  • 使用 set_npc_affinity 手动设置初始值

Q3: 对话风格没有明显变化?

可能原因:

  • 好感度差异不够大
  • NPC的system_prompt没有充分利用好感度修饰词

解决方法:

  • 增大好感度差异 (例如: 20 vs 80)
  • 在system_prompt中强调对话风格的重要性

🎉 总结

✅ NPC好感度系统已成功集成到赛博小镇!

核心特性:

  • 🤖 自动情感分析
  • 📊 动态好感度调整
  • 🎚️ 关系等级系统
  • 💬 对话风格调整
  • 💾 与记忆系统集成

教学价值:

  • LLM情感分析的实战应用
  • 好感度系统的设计与实现
  • 多系统协同工作
  • 用户体验优化

下一步:

  • 在Godot中显示好感度UI
  • 添加好感度相关的游戏机制
  • 优化情感分析算法

作者: HelloAgents团队
日期: 2024-01-15
版本: v1.0