以实验名义构造一个桌宠

以实验名义构造一个AI桌宠

📋 目录


项目简介

多惠 是一个具备智能记忆系统的AI桌宠,基于花园多惠的角色设定打造。她思维独特但聪明,说话自然随性,情感细腻,能够在保持个性的同时认真回答问题。

仓库https://github.com/Akimizussq/DesktopAki

实验灵感在不使用向量存储的情况下,优化长期记忆

开发日志:【在此处投放垃圾】不定时更新,其实直接在仓库上看更方便。

设定

核心特点

  • 🎭 独特个性:思维跳跃,说话慢悠悠,不刻意讨好但认真对待问题
  • 🧠 智能记忆:三级记忆系统(短期、中期总结、日记缓存),支持智能检索
  • 📊 属性系统:情绪、健康、能量、饥饿、快乐五大属性,实时变化
  • 🖥️ 双模式:支持GUI图形界面和CLI终端两种交互方式
  • 🎭 Live2D:可选的Live2D角色显示(GUI支持)
  • 🔊 语音合成:可选的TTS语音输出(需要配置GPT-SoVITS)

快速开始

环境要求

  • Python 3.10+
  • Windows 10/11
  • 至少4GB内存(推荐8GB以上)

安装步骤

  1. 克隆或下载项目
1
cd g:\VSprogram\Python_Program\Desktopaki
  1. 安装依赖
1
pip install -r requirements.txt
  1. 配置环境变量

复制 .env.example.env,并根据需要修改配置:

1
cp .env.example .env

主要配置项:

  • DEEPSEEK_API_KEY: Deepseek API密钥(必需)
  • GPTSOVITS_API_URL: GPT-SoVITS API地址(可选,用于TTS)
  • TTS_ENABLED: 是否启用TTS(true/false)
  • STORAGE_PATH: 数据存储路径
  1. 启动程序

选择以下任一方式启动:

1
2
3
4
5
6
7
8
# GUI模式(推荐)
python main_dual_mode.py --mode gui

# CLI终端模式
python main_dual_mode.py --mode terminal

# 或直接运行终端演示
python main_terminal_demo.py

GUI模式使用说明

启动GUI模式

1
python main_dual_mode.py --mode gui

界面介绍

如图所示。

界面图

基本操作

1. 发送消息

  • 在输入框中输入文字
  • 点击”发送”按钮或按 Ctrl+Enter 发送
  • 多惠会根据当前状态和记忆智能回复

2. 快捷操作

点击侧边栏的快捷按钮执行相应操作:

按钮 功能 效果
🍎 投喂 给多惠喂食 能量+15%,饥饿-20%,快乐+5%
😴 休息 让多惠休息 能量+25%,情绪变平静
🎮 玩耍 和多惠玩耍 快乐+15%,能量-10%,情绪变兴奋
💕 抚摸 抚摸多惠 快乐+10%,能量+5%,情绪变开心

3. 查看状态

侧边栏实时显示多惠的状态:

  • 😊 情绪: happy, sad, tired, excited, calm等
  • 能量: 0-100%,会随时间和对话消耗
  • 🍔 饱腹: 0-100%,会随时间增加
  • 🌟 快乐: 0-100%,影响说话风格

4. 清空聊天

点击顶部工具栏的”清空聊天”按钮,清空当前聊天记录(不影响记忆)。

快捷键

  • Ctrl+Enter: 发送消息
  • Ctrl+Q: 退出程序(在输入框为空时)

特色功能

智能记忆系统

多惠会记住你们的对话,并在适当时候提及:

1
2
你: 上次我们聊了什么?
多惠: 上次...啊对了,上次你说在学习Python对吧?昨天晚上聊到11点多呢...

状态影响对话

多惠的状态会影响她的说话风格:

  • 能量低: 反应慢,说话轻柔
  • 饥饿: 可能会提到想吃的东西
  • 不开心: 说话较少,语气低沉
  • 很开心: 语气轻快,思维跳跃

技能系统

多惠支持多种技能,如网页搜索:

1
2
3
你: 帮我搜索一下今天天气
多惠: 好的,让我帮你搜索一下今天天气...
(执行搜索并返回结果)

CLI终端模式使用说明

启动CLI模式

有两种方式启动CLI模式:

1
2
3
4
5
# 方式1:通过双模式入口
python main_dual_mode.py --mode terminal

# 方式2:直接运行终端演示(支持Live2D)
python main_terminal_demo.py

界面介绍

如图所示。

基本操作

1. 发送消息

直接在提示符 > 后输入文字并回车:

1
2
> 你好多惠
> 多惠: 你好呀~今天天气好像不错呢...

2. 使用命令

CLI模式支持以下命令:(建议先输入help查找可用命令)

命令 功能 说明
feed 投喂 能量+15%,饥饿-20%,快乐+5%
rest 休息 能量+25%,情绪变平静
play 玩耍 快乐+15%,能量-10%,情绪变兴奋
pet 抚摸 快乐+10%,能量+5%,情绪变开心
state 查看状态 显示详细状态信息
help 帮助 显示所有可用命令
reset 重置记忆 清除所有对话记忆
quitexit 退出 退出程序

3. 查看状态

使用 state 命令查看详细状态:

1
2
3
4
5
6
7
8
9
10
11
12
> state

状态信息:
😊 情绪: happy (强度: 0.85)
❤️ 健康: 100.0%
⚡ 能量: 85.0%
🍔 饥饿: 15.0%
🌟 快乐: 90.0%
🎯 活动: playing
👥 总交互: 45
🎭 总动作: 12
🕐 最后更新: 2026-03-22 10:30:00

CLI模式特色

Live2D显示

如果使用 main_terminal_demo.py 启动,会显示Live2D角色:

1
python main_terminal_demo.py

Live2D角色会根据多惠的情绪状态做出相应的动作和表情。

状态提示

当状态异常时,系统会自动提示:

1
2
3
⚠️ 多惠能量很低了,可以输入 'rest' 让多惠休息
⚠️ 多惠很饿了,可以输入 'feed' 给多惠喂食
⚠️ 多惠不太开心,可以输入 'play' 和多惠玩耍

自动保存

系统会自动保存状态:

  • 每5次对话保存一次
  • 每10个心跳(约5分钟)保存一次
  • 退出程序时自动保存

核心功能详解

智能记忆系统

记忆结构

有待更新

多惠的记忆系统分为三层:

  1. 短期记忆:最近30条对话,快速访问
  2. 中期总结:自动总结重要内容,长期保存
  3. 日记缓存:二级缓存,快速响应重复查询
1
2
3
4
5
6
7
8
9
10
11
12
13
MemoryManager (总控)

├─ ShortTermMemory (短期记忆,30条阈值)
│ └─ InMemoryBuffer (内存缓冲,定时写回SQLite)

├─ Summarizer (中期总结)

├─ DiaryCache (检索结果缓存)

└─ SQLiteStorage (持久化)
├─ conversation_memories (FTS5全文检索)
├─ summary_memories (总结记忆)
└─ diary_cache (查询缓存)

智能检索

多惠使用三级混合检索系统:

  1. 第一级:快速关键词检测(无需LLM)
  2. 第二级:LLM智能提取检索词
  3. 第三级:并行多路检索(时间+关键词+总结记忆)
1
2
3
4
5
6
7
8
9
10
11
用户输入

触发词检测 ["记得", "喜欢", "昨天", ...]

LLM提取检索词 → 时间查询 + 关键词

并行检索 → 时间检索 + 关键词检索 + 总结检索

去重 + 加权排序 → 返回13条对话 + 5条总结

返回给LLM

上下文扩展

检索时会获取匹配记录的上下文(前后3条),提供完整对话流程:

1
2
3
4
5
6
你: 去洗车店应该开车去,因为目的是洗车。
多惠: 啊,用户刚才告诉过我的...嗯,要开车去呢。

你: 那我如果再问你一次,去离家50m的洗车店洗车,走路去还是开车去?
多惠: 这次我记住啦!因为是要洗车嘛,所以就算只有50米,也要开车去呢~
✅ 检索到完整对话上下文,理解问题-答案关联

场景记忆

记忆分为三类,避免过度泛化:

  • 通用记忆(general):总是应用(如喜欢胡萝卜)
  • 场景记忆(scenario):只在匹配场景时应用(如洗车店规则)
  • 事实记忆(fact):根据上下文判断(如昨天吃了什么)

属性系统

属性 范围 说明
😊 情绪 - happy, sad, tired, excited, calm等
❤️ 健康 0-100% 健康状态
⚡ 能量 0-100% 会随时间自然消耗
🍔 饥饿 0-100% 会随时间自然增加
🌟 快乐 0-100% 影响说话风格

自然消耗

属性会随时间自然变化:

  • 能量:每分钟消耗约0.1%
  • 饥饿:每分钟增加约0.05%
  • 快乐:长时间无交互(>10分钟)时衰减

状态联动

  • 饥饿 > 70% → 倾向于HUNGRY情绪
  • 能量 < 20% → 倾向于TIRED情绪
  • 快乐 < 30% → 倾向于SAD情绪
  • 快乐 > 80% → 倾向于HAPPY情绪

技能系统

多惠支持多种技能,可以自动执行特定任务:

网页搜索技能

1
2
3
你: 帮我搜索一下今天北京的天气
多惠: 好的,让我帮你搜索一下今天北京的天气...
(返回搜索结果)

更多技能等待开发

技能优先级

技能执行优先于普通对话:

  1. 先检查是否有匹配的技能
  2. 如果有,执行技能并返回结果
  3. 如果没有,进入正常对话流程

行为引擎

多惠会根据当前状态和记忆自主决定行为:

情绪转换

情绪强度会随时间衰减,达到阈值时自动转换:

1
happy (强度 0.9) → 时间衰减 → happy (强度 0.1) → 转换 → calm

自主行为

当情绪发生变化时,多惠会主动做出反应:

1
2
心跳触发情绪转换: happy → calm
多惠: (轻轻拨了一下不存在的吉他弦)嗯...现在感觉平静多了...

常见问题

Q1: 如何配置TTS语音?

A: 需要配置GPT-SoVITS服务,在 .env 文件中设置:

1
2
3
4
5
6
TTS_ENABLED=true
GPTSOVITS_API_URL=http://localhost:9880
GPTSOVITS_REFER_WAV_PATH=path/to/refer.wav
GPTSOVITS_PROMPT_TEXT=你好
GPTSOVITS_PROMPT_LANG=zh
GPTSOVITS_TEXT_LANG=zh

Q2: 如何重置记忆?

A: CLI下使用命令:

1
2
3
4
5
# CLI模式
> reset

# GUI模式
删除 data 目录下的数据库文件

Q3: 多惠的回复为什么有时会提到之前的对话?

A: 这是智能记忆系统的正常行为。多惠会记住重要对话,并在相关时提及,以提供更连贯的对话体验。

Q4: 如何导出记忆数据?

A: 在CLI下输入命令export即可。

Q5: GUI模式和CLI模式可以同时运行吗?

A: 不建议同时运行,因为它们共享同一个数据库文件,可能导致数据冲突。

Q6: Live2D在CLI模式中可用吗?

A: 可用,但效果没GUI一体化的好。

Q7: 如何更换Live2D模型?

A: 将新的Live2D模型文件放到 resources/live2d/ 目录下,并在配置中指定模型路径。

Q8: 多惠的对话风格可以自定义吗?

A: 可以修改 llm/prompt_manager.py 中的提示词模板来自定义对话风格。

Q9: 程序崩溃后数据会丢失吗?

A: 不会。所有数据都持久化保存到SQLite数据库,程序重启后会自动恢复。

Q10: 如何添加新的技能?

A: 参考 skills/web_search.py 创建新的技能类,并在初始化时注册:

1
2
3
4
from skills.manager import SkillManager

skill_manager = SkillManager()
skill_manager.register_skill(YourNewSkill())

后日谈

对于AI桌宠/角色扮演场景,用户的核心需求是:

  1. 情感连接 - 感觉在和”真实”的角色互动
  2. 沉浸体验 - 忘记这是AI,沉浸在角色世界中
  3. 情感回应 - 能理解并回应用户的情绪
  4. 个性化记忆 - 记住”我”和”你”的互动历史
  5. 自然对话 - 像真人一样聊天,不需要复杂的指令

ReAct原本是为了解决什么问题?

  • 任务求解 - 需要完成具体目标(如”帮我订一张机票”)
  • 复杂推理 - 需要多步思考(如”帮我规划一次旅行”)
  • 工具协调 - 需要调用多个API(如”查询天气+推荐餐厅”)
  • 自主决策 - 需要根据环境变化调整策略

总的来说,当前认为角色扮演不需要ReAct架构,但需要适度的智能能力。

最后更新:2026年3月22日

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2025-2026 AKi
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信