灵犀Claw实战:从零搭建一个会自我进化的AI Agent(五) 智能日记系统
开篇引言
前三篇完成了记忆系统的三层闭环:Layer 1/2 负责"记住你",Layer 3 负责"质检"。但结构化记忆是冷冰冰的,AI 缺了灵魂。
今天讲 Cherry Diary——记忆系统的感性出口。每天让 AI Agent 自动生成一篇日记,融合天气、对话记录和生活数据,写入 WPS 笔记。一句话定位:让 AI 不只是记住你,而是用日记的方式"陪"你过每一天。
安装:复制cherry-diary/到灵犀的 skills 文件夹即可
依赖:ainote-mcp(笔记写入必需)、noiz-tts(语音可选)
设计哲学:Agent 即编排器。没有后台服务、没有 cron、没有数据库——Agent 按 SKILL.md 一次性串联所有步骤。简单、可靠、每步输入输出清晰可见。
执行流程:六步流水线
日记生成是一次性完成的线性流水线,Agent 读取 SKILL.md 按顺序执行,中间结果全部可见可调试:
步骤 | 动作 | 输出 | 必需? |
1. 数据采集 | 天气 + 对话记录 + 生活数据 | 结构化数据 + 提示词 | 是 |
2. AI 内容生成 | 系统提示词 + 用户提示词 | JSON(mood / thoughts / voice_text 等) | 是 |
3. 图片生成 | 任意图像引擎 | 图片 URL | 可选 |
4. 语音合成 | 任意 TTS 引擎 → 上传 | 音频链接 | 可选 |
5. XML 构建 + 笔记写入 | MCP 协议 | 笔记链接 | 是 |
6. 验证 | 字数 + 标签检查 | 确认成功 | 是 |
没有图片?纯文字日记也很完整。没有语音?照样生成。所有模块都是可插拔的,下面按模块展开。
数据采集层
数据是日记的"原材料"。Cherry Diary 的数据源全部可选,缺任何一个都不影响日记生成。
天气数据(默认启用)
来自 wttr.in,免费公开 API,无需密钥,天级粒度缓存。有一个经典坑:lang_zh字段经常返回 double-encoded UTF-8,中文显示乱码。修复:先用latin-1编码还原原始字节,再按 UTF-8 解码,失败则回退英文翻译。可替换为和风天气、OpenWeatherMap 等。
对话记录(默认启用)
来自当天对话日志文件。原始记录含大量格式标记(时间戳、标题、列表符号),需预处理:去标记、合并空行、截断至安全长度。清洗后注入提示词,AI 据此生成内心感悟而非复述对话。文件不存在时正常生成,只是没有聊天回顾板块。
生活数据(可选,可自定义)
留给用户自由扩展的接口。不配置时日记照常生成。缓存策略有两个值得借鉴的设计:空数据不缓存(避免后续无法获取新数据)和格式版本校验(旧格式自动失效重新请求)。你可以替换成任何数据源——Keep、Apple Health、步数统计、代码提交记录……只要实现"获取 + 格式化"两个函数即可嵌入流水线。
AI 内容生成:提示词架构设计
Cherry Diary 的灵魂在系统提示词。本节不讲特定角色的提示词内容,而是讲架构设计方法——掌握了这套方法,你可以定制任何风格的日记。
系统提示词由五个模块组成,每个模块可独立替换:
模块 | 职责 | 通用? |
角色定义 | 决定日记的口吻和人格 | 你的定制空间 |
语言风格 | 决定文风(正式/幽默/文艺/口语) | 你的定制空间 |
主题分配 | 强制 N 段随笔各覆盖不同主题 | 建议保留 |
反套话红线 | 防止 AI 写出千篇一律的内容 | 建议保留 |
JSON Schema | 定义输出字段和约束 | 建议保留 |
角色定义和语言风格是你的定制空间——朋友、助手、工作日志、恋人,随你定义。其余三个模块是通用能力,下面分别展开。
主题分配机制
日记核心是 N 段随笔(每段 50-100 字)。如果让 AI 自由发挥,容易写成流水账——三段都在聊天气。我们在提示词中预定义一组主题(天气感受、日常碎片、情绪随笔、自我感慨等),强制每段只写一个,顺序随机打乱。你可以完全替换主题列表,关键是保持"N 段覆盖 N 个不同主题"的思路。
反套话红线
AI 写日记最容易犯的五个毛病:禁止重复主题(N 段每段不同)、禁止固定开头(不要每次从天气开始)、禁止空泛心情词(只写"好开心"而无具体原因)、禁止复述对话(写内心感受不写流水账)、禁止千篇一律(同样输入每次措辞不同)。前四条靠提示词约束,第五条靠温度参数配合。
mood 与 JSON Schema
mood是日记头部的一句简短心情(10-20 字)。早期版本偷懒截取随笔第一段凑数,导致和正文重复。修复后作为独立 JSON 字段,提示词禁止与正文重复。所有日记内容以 JSON 输出,每个字段有独立约束。定制时保留 Schema 结构,只替换角色和风格即可。
图片与语音:可选模块的接入方式
图片和语音的设计理念相同:可完全替换或跳过。不展开某个特定引擎的使用细节,只讲接入架构。
图片(可选):生成图片 → 获取 URL → 嵌入 XML 的<img>标签。引擎可以是 Seedream、Midjourney、DALL-E,或直接跳过。
语音(可选),三步接入:用任意 TTS 引擎生成音频文件 → 上传云存储获取公链 → 将 URL 写入 XML 的<a>标签,点击即可播放。语音文本是 JSON 中的独立字段(约 100 字口语旁白),和正文分离——不念全文,没有语音时日记显示纯文字。TTS 引擎可自由选择:Noiz TTS、Edge TTS、Azure TTS、阿里云 TTS,只要拿到一个可访问的音频链接就能嵌入。
笔记写入:MCP 协议与 XML 构建
日记通过 WPS 笔记的 MCP(Model Context Protocol)写入,协议为 JSON-RPC 2.0 over HTTP + SSE,鉴权用X-API-Keyheader。初始化需一次握手(initialize → 提取 session-id → 发送 initialized 通知)。MCP 响应同样有 double-encoded UTF-8 问题,建议客户端底层统一修复。
XML 构建器的核心设计:条件渲染。每个板块都有默认文案——有生活数据则显示完整记录,无则显示"今天没有";有语音则嵌入,无则不显示。条件渲染确保日记在任何数据组合下都能正常生成。
写入流程五步:创建新笔记(获取 note_id)→ 挂标签(必须在写内容之前)→ 写入 XML → 插入图片(可选,需重新获取 block ID)→ 验证字数和标签。
两条核心规则:第一,永远创建新笔记,不要在已有笔记上更新——replace 会导致新旧内容叠加重复。第二,先挂标签再写内容,顺序不能反——新版标签系统标签栏与正文分离,先写内容会导致标签挂载失败。
最易忽略的坑:replace 之后 block ID 会被服务端重新分配。如果需要插入图片,必须重新获取笔记大纲拿到最新 block ID。
踩坑清单
问题 | 根因 | 解法 |
wttr.in 中文乱码 | double-encoded UTF-8 | latin-1编码还原 + 英文回退 |
空数据被永久缓存 | 首次无记录时写入缓存 | 空数据不缓存 |
旧缓存不兼容 | 缺少版本标识 | 加版本校验 |
mood 与正文重复 | 截取随笔第一段凑数 | 独立字段生成 |
replace 内容重复 | 在已有笔记上操作 | 永远创建新笔记 |
MCP 响应乱码 | double-encoded UTF-8 | 客户端统一修复 |
图片插入失败 | replace 后 block_id 变化 | 重新获取大纲 |
标签挂载失败 | 先写内容再挂标签 | 先挂标签再写内容 |
API Key 泄露 | 硬编码 | 环境变量化 + .gitignore |
设计反思
Agent 即编排器——安装 skill 即用,每步输入输出清晰可见,可暂停调试。每个模块都可替换——天气、数据源、图片引擎、TTS、笔记 API、提示词风格,全是可插拔的。你可以从完整版开始逐步精简,也可以添加新数据源。缓存即降级——API 失败→本地缓存→占位符,三级降级确保日记永远能生成。环境变量化是开源第一步——脱敏不仅是替换密钥,注释中的角色名称、提示词中的私有措辞、Git 历史中的敏感信息同样需要处理。
系列进度
篇目 | 主题 | 核心能力 |
(一) | 总体架构 | 系统全景、Skill清单、设计哲学 |
(二) | 实时记忆 | 三层记忆架构、"先沉淀再回复"机制 |
(三) | Dreaming | 三阶段记忆沉淀、时间验证、碎片管理 |
(四) | Memory Consolidation | 每周深度整理、去重合并、Token控制 |
(五) | Cherry Diary | 智能日记:数据采集 + 提示词架构 + 可选多媒体 |
下一篇:Self-Improving —— 纠错记录、偏好固化、定期反思、衰减归档的完整经验学习闭环。