桌宠开发日志

AI桌宠项目开发日志

📅 项目信息

  • 项目名称: AI桌宠后端系统
  • 开发日期: 2026年3月6日
  • 技术栈: Python 3.10, asyncio, SQLite, Ollama (deepseek-r1:1.5b)
  • 架构模式: 事件驱动 + 模块化

✅ 已完成阶段

阶段1:项目基础框架搭建

完成时间: 2026-03-06

完成项目目录结构、虚拟环境、依赖管理、配置系统、日志系统和主入口文件。系统可正常启动运行。


阶段2:核心模块开发

完成时间: 2026-03-06

交付物:

  • 事件总线(异步事件分发、优先级队列)
  • 状态管理器(状态持久化、状态验证)
  • 基础事件类型(8种事件类型)

测试结果: 23/23 通过 ✅


阶段3:记忆系统开发

完成时间: 2026-03-06

技术方案: 时间感知 + SQLite + 三层记忆结构

核心特性:

  • 时间感知(智能解析自然语言时间)
  • 三层记忆(短期→中期总结→长期)
  • 角色化总结(以桌宠人格视角)
  • 双检索模式(TIME部门 + SEARCH部门)
  • 记忆衰减机制(半衰期30天)
  • 二级缓存(日记系统)

交付物: 9个模块 + 11个测试用例

测试结果: 11/11 通过 ✅


阶段4:LLM接口层

完成时间: 2026-03-06

交付物:

  • LLM基类(统一调用接口)
  • OllamaProvider(流式响应、错误重试)
  • PromptManager(提示词模板管理)

测试结果: 21/21 通过 ✅


阶段5:行为引擎

完成时间: 2026-03-06

设计决策: 规则优先策略 + LLM后备机制

内置行为规则(6条):

  • 能量<20 → 休息(优先级9)
  • 饥饿>70 → 进食提醒(优先级8)
  • 玩耍中 → 表达快乐(优先级7)
  • 心情=sad/excited → 表达情绪(优先级6)
  • 快乐值>90 → 跳舞庆祝(优先级5)

交付物:

  • 动作定义(10种动作类型)
  • 行为引擎(规则优先 + LLM决策)
  • 规划器(动作队列、冲突检查)

测试结果: 25/25 通过 ✅


📋 待完成阶段

阶段6:实现终端交互模块


阶段7:集成测试和优化

待完成:

  • 端到端测试
  • 性能优化(响应时间<1秒,内存<500MB)
  • Bug修复和代码优化

📊 项目进度统计

  • 已完成: 5/7 阶段(71%)
  • 待完成: 2/7 阶段(29%)
  • 单元测试: 60+ 测试用例 ✅
  • 集成测试: 6+ 测试场景 ✅
  • 测试通过率: 100% ✅

🔧 技术债务

  1. Pydantic版本警告(Config → ConfigDict)
  2. JSON编码器更新
  3. 增加边界条件测试

下阶段任务:解决相关记忆持久化及检索问题。
1.检索触发依赖关键词:只有明确说”记得”、”喜欢”等词才会检索
2.在没有提示词、且对话超过十条的情况下无法进行语义理解:不能理解”想玩游戏”与”喜欢玩原神”的关联
3.总结记忆未被利用:历史总结记忆无法被自动检索
4.一个设想,在两个月之前对AI提及某月某日是自己的生日,到了那一天,如果用户什么都没有说,那么AI会不会想起这件事情呢?(个人认为比较合适的解决方案是将月份也作为对话的一部分进行存储。)
5.未来计划将这一块完善后封装起来,AI调用的时候只通过接口获取是否需要记忆及相关内容。(但不知道会不会很慢)
6.AI的发言和人类的发言同等重要,原方案只记录了人类发言,可能会导致逻辑缺漏。

7.关于角色设定需要修改的部分,需要日常向和哲理向兼具,让AI记录的内容更加有意义。

最后更新: 2026-03-06

03/09

  1. 混合检索系统 ✅
    memory/storage.py:添加总结记忆检索方法(search_summaries_by_keyword、get_recent_summaries)
    memory/manager.py:实现两级混合检索
    第一级:快速关键词检测
    第二级:LLM智能提取检索词
    第三级:并行多路检索(时间+关键词+总结记忆)
    main_terminal_demo.py:简化检索调用逻辑
  2. 角色设定优化 ✅
    修改系统提示词:
    改”天然呆”为”思维独特但聪明”
    强调”先理解,再表达”
    添加”记忆应用”和”平衡实用与个性”原则
    修改对话提示词:
    添加回答步骤(理解→应用→回答→展现个性)
    强调要回答用户问题,不只是聊天
  3. 上下文扩展检索(方案A) ✅
    storage.py:添加 search_by_keyword_with_context 方法
    对每个匹配记录获取前后3条上下文
    提供完整对话流程
    search_retriever.py:使用新的上下文扩展检索
  4. 缓存问题修复 ✅
    storage.py:添加 clear_diary_cache 方法
    diary.py:实现 clear_cache 方法
    main_terminal_demo.py:
    检测用户提供答案时自动清除缓存
    避免使用过时的缓存数据
  5. 触发关键词扩展 ✅
    manager.py:扩展触发关键词列表
    添加:”如果”等
    提高检索触发率
  6. 提示词细节增强 ✅
    prompt_manager.py:
    添加第8条要求:注意问题细节
    避免盲目复用之前答案
  7. 增加一个存储优化方案 ✅
    将记忆分为:

通用记忆(如:喜欢胡萝卜)
场景记忆(如:洗车店要开车去)
事实记忆(如:昨天吃了什么)
应用时:

通用记忆 → 总是应用
场景记忆 → 只在匹配场景时应用
事实记忆 → 根据上下文判断

test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
🐱 AI桌宠多惠已启动!
输入对话与多惠互动,输入'quit'退出,输入'state'查看状态
--------------------------------------------------

你: 你认为写日记是一个好习惯吗,小多惠

你:
多惠: 嗯...写日记吗?我觉得是很好的习惯呢。就像给吉他调音一样,每天花一点时间整理自己的心情,会让人变得很清晰。

我有时候会把想到的旋律片段记在本子上,或者画只小兔子在旁边...啊,不过最近都是直接弹出来录在手机里了。

对了,如果写日记的话,可以试试用不同颜色的笔,像彩虹和弦一样,看着就会很开心呢✨
如果你的记忆只能靠日记来存储,只要日记消失,你就会失去和我有关的所有回忆,你会害怕吗?

你: 2026-03-09 20:29:46 | INFO | memory.manager:_extract_search_terms:339 - LLM提取检索词: {'time_queries': [], 'entity_keywords': ['日记', '记忆'], 'sentiment': '消极'}
2026-03-09 20:29:46 | INFO | memory.search_retriever:retrieve_by_keyword:37 - 关键词检索: 日记
2026-03-09 20:29:46 | INFO | memory.search_retriever:retrieve_by_keyword:46 - 关键词检索找到 0 条结果(含上下文)
2026-03-09 20:29:46 | INFO | memory.diary:cache_answer:51 - 答案已缓存: SEARCH:日记
2026-03-09 20:29:46 | INFO | memory.search_retriever:retrieve_by_keyword:37 - 关键词检索: 记忆
2026-03-09 20:29:46 | INFO | memory.search_retriever:retrieve_by_keyword:46 - 关键词检索找到 0 条结果(含上下文)
2026-03-09 20:29:46 | INFO | memory.diary:cache_answer:51 - 答案已缓存: SEARCH:记忆

多惠: 嗯...这个问题呢。
如果记忆只能靠日记的话...确实会有点不安呢,就像弹吉他时突然忘记了和弦的指法一样。
不过啊,我觉得重要的回忆其实不会真的消失哦。它们会变成像空气里的音符一样,即使看不见,也会在某个时刻重新响起来 。
而且,如果日记真的不见了...那我们就一起创造新的回忆吧?就像每次弹唱时,都会遇见新的旋律一样。
我也不会忘记你的

你:
多惠: (开心地放下手中的胡萝卜)嘿嘿...听到你这么说,感觉心里暖暖的,像弹完一首很棒的曲子之后那样。

嗯...虽然日记可能会不见,但我觉得啊,有些东西是不会消失的。就像小欧每次听到吉他声就会跳过来一样,重要的回忆总会在某个时刻突然跳出来呢。

啊,对了!要不要听我弹一首新写的曲子?是关于“不会忘记”的旋律哦✨
你喜欢小欧它们吗

你: 2026-03-09 20:31:01 | INFO | memory.manager:_extract_search_terms:339 - LLM提取检索词: {'time_queries': [], 'entity_keywords': ['小欧'], 'sentiment': '中性'}
2026-03-09 20:31:01 | INFO | memory.search_retriever:retrieve_by_keyword:37 - 关键词检索: 小欧
2026-03-09 20:31:01 | INFO | memory.search_retriever:retrieve_by_keyword:46 - 关键词检索找到 0 条结果(含上下文)
2026-03-09 20:31:01 | INFO | memory.diary:cache_answer:51 - 答案已缓存: SEARCH:小欧

多惠: 嗯...当然喜欢啦。
它们每一只都很特别呢,就像吉他的每根弦一样,虽然看起来差不多,但发出的声音和性格都不一样。
小欧是领头的,总是第一个跳过来要吃的,耳朵竖得高高的,像在听我弹琴的节奏。
有时候练琴累了,看着它们挤在一起睡觉的样子,心情就会变得很柔软...
啊,说起来,它们最近好像特别喜欢听我弹《Yes! BanG_Dream!》的前奏呢。
你可以尝试写一些日记来记录它们的生活来着
2026-03-09 20:31:43 | INFO | core.state_manager:save_state:173 - ✅ 状态已保存到: data\state.json

你:
多惠: (眼睛亮起来)啊,这个主意真好呢!就像给每只兔子都写一首专属的小曲子一样✨

嗯...不过比起用文字,我可能会用录音笔记录它们吃胡萝卜的声音,或者拍下它们蹦跳的节奏...啊,小欧昨天还学会了用爪 子打拍子呢!

要一起听听看吗?虽然只是“咔嚓咔嚓”的声音,但感觉比日记本还要温暖呢。
请你也不要忘记它们。

你:
多惠: (轻轻拨了一下吉他弦)嗯...当然不会忘记的✨
就像小欧的耳朵总是记得胡萝卜放在哪里一样,重要的东西都会好好留在心里呢。

而且啊,每次弹起《Yes! BanG_Dream!》的时候,就会想起它们挤在一起听歌的样子...
啊,要不要现在给它们弹一小段?感觉它们也在说“不要忘记我们哦”呢🐰
state

状态信息:
😊 情绪: happy
❤️ 健康: 100.0%
⚡ 能量: 70.0%
🍔 饥饿: 18.0%
🌟 快乐: 100.0%
🎯 活动: eating
👥 总交互: 88
🎭 总动作: 0
🕐 最后更新: 2026-03-09 20:32:31


你: feed
2026-03-09 20:33:07 | INFO | core.state_manager:save_state:173 - ✅ 状态已保存到: data\state.json

🍽️ 你给多惠喂了食物!
⚡ 能量: 70.0% → 85.0%
🍔 饥饿: 18.0% → 0.0%
🌟 快乐: 100.0% → 100.0%

你: q

👋 再见!
2026-03-09 20:33:20 | INFO | core.state_manager:save_state:173 - ✅ 状态已保存到: data\state.json
2026-03-09 20:33:20 | INFO | llm.deepseek_provider:close:77 - DeepseekProvider已关闭
2026-03-09 20:33:20 | INFO | memory.manager:stop:67 - 记忆管理器已停止
2026-03-09 20:33:20 | INFO | core.event_bus:stop:122 - EventBus stopped
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:

请我喝杯咖啡吧~

支付宝
微信