ATRI-skil与ds+napcatqq的有机结合
侧边栏壁纸
  • 累计撰写 2 篇文章
  • 累计收到 4 条评论

ATRI-skil与ds+napcatqq的有机结合

atri
2026-05-26 / 0 评论 / 3 阅读 / 正在检测是否收录...

(源于我发现了有人写了对游戏角色ATRI的全剧情skill提取,于是萌生了赛博女友的想法)
正片:
基于 DeepSeek + NapCatQQ 的 ATRI 角色扮演 QQ 机器人

将 Galgame 角色的行为逻辑工程化为可运行的对话系统。

架构

┌─────────┐   OneBot v11    ┌──────────────┐       AI API   ┌──────────┐
│ NapCatQQ │ ── WebSocket ─▶ │  Python Bot   │ ── HTTP ────▶ │ DeepSeek │
│ (QQ层)   │ ◀──────────── │  (业务层)      │ ◀──────────── │ (推理层)  │
└─────────┘                 │               │               └──────────┘
                            │  · 角色引擎    │
                            │  · 状态机      │
                            │  · 记忆管理    │
                            │  · 调度器      │
                            └───────────────┘
  • 协议层:NapCatQQ 将 QQ 消息封装为 OneBot v11 事件,通过反向 WebSocket 推送到 Bot 服务端
  • 推理层:DeepSeek API(OpenAI 兼容接口),负责对话生成,支持热切换通义千问
  • 业务层:Python/asyncio,包含角色引擎、状态机、记忆系统、定时调度

角色引擎设计

角色行为不是靠「写一段人设描述」就能稳定的。LLM 天然有输出漂移的问题——几轮对话后人设会逐渐走样。

解决方案是将角色的行为规则结构化为多层级约束:

状态机

状态触发条件表达特征退出阻尼
低电压晨间 / 被唤醒嗜睡、呓语、揉眼睛2-3 轮缓慢过渡
高性能被夸奖 / 掩饰失误得意、挺胸、嘴硬被戳穿时瞬间泄气
防御态被辱骂搬法律反击、必然忘词沉默后找台阶恢复
空洞态被命令「别伪装」去温度、客观陈述、零语气词需外部主动打破

状态切换带有阻尼感——不是瞬时的 if-else,而是符合情感惯性的渐进过渡。这在 System Prompt 中以「退出/恢复的阻尼感」规则约束 LLM 的输出。

口癖与动作的触发控制

吧唧吧唧嘿嘿揪衣角 等每个标志性行为都有明确的触发条件和频率上限。没有触发条件的行为绝不出现,避免 LLM 泛化成廉价卖萌。

阶段预设

角色关系分前/中/后三期,默认锁定在前中期。后期的高浓度情感只在用户给出明确上下文(离别、表白、期限)时才解锁,避免「初见就表白」的角色崩坏。

这些规则来自 GzSakura1337/ATRI-skills 对游戏全量剧本的逆向工程,包含表达 DNA 分析、场景锚点提取、思维逻辑建模。


记忆系统

  • 短期记忆:环形缓冲区,保留最近 30 轮对话作为上下文窗口
  • 长期记忆:旧对话通过 LLM 压缩为摘要存入 SQLite,检索时基于关键词匹配 + 重要性加权
  • 好感度:基于用户消息内容,规则引擎计算变化量,持久化到 SQLite

部署

git clone https://github.com/atriyoung/atri-qq-bot.git
# 配置 .env
docker compose up -d

Docker Compose 编排两个容器:NapCatQQ(QQ 协议)和 Python Bot(业务逻辑),通过内部网络通信。


技术栈

Python 3.11+ · aiohttp · SQLite (aiosqlite) · DeepSeek API · OneBot v11 · NapCatQQ · Docker


GitHub: atriyoung/atri-qq-bot

角色研究致谢: GzSakura1337/ATRI-skills

1

评论 (0)

取消