仅用 SOLO 2 天搭建「闪念智记」——AI 驱动的微信小程序全栈智能记录助手

【Code with SOLO】用 SOLO 2 天搭建「闪念智记」——AI 驱动的微信小程序全栈智能记录助手


摘要

用 TRAE SOLO 开发了一款微信小程序「闪念智记」:只需用自然语言告诉 AI “买了两杯咖啡 68 元” 或 “明天下午 3 点开会”,AI 就能自动理解意图、将内容归类到笔记、待办或记账模块并保存;说"帮我把上周的咖啡支出改一下"也能直接完成修改;上传一份 PDF 合同或截图,就能建立私人知识库,随时检索。整个 App 前后端代码(含 AI 流式对话、对话式 CRUD、知识库 RAG、多 Tab 模块、小程序兼容层)均由 SOLO 辅助生成,34 个 Vue 组件 + 100 余个 TypeScript 文件,从 0 到功能可用前后约 2 天,比自己手写估计快了 5-6 倍。


背景

我是一名独立开发者,平时需要同时管理碎片信息——有时是一笔消费、有时是一个念头、有时是一个临时待办。过去用不同 App 分开记,切换成本高、忘记记的概率也高。

我想做一个「一句话记万物」的智能助手:打开就是聊天框,说什么 AI 帮我分类存档。但实现起来有几个难点:

  1. AI 多轮对话 + SSE 流式输出要同时支持 H5 和微信小程序(小程序没有 TextDecoder,也不能用 EventSource
  2. 对话式 CRUD:AI 不只是记录,还要能理解"删掉"“改一下”"查一下上周"这类意图,并准确定位到对应数据执行操作
  3. 知识库 RAG:用户上传 PDF / 图片 / 文档后,要能做向量检索并在对话中精准引用,而不是简单关键词匹配
  4. 小程序兼容性陷阱极多(样式穿透、z-index 跨组件失效、弹框被 TabBar 遮挡……)
  5. 全栈代码量大,手写太慢

实践过程

1. 任务拆解

我把整个项目分成三层让 SOLO 依次攻克:

后端 AI Agent 接口(SSE 流式)
  → 对话式 CRUD Agent(意图识别 + 工具调用)
    → 知识库 RAG 模块(文件解析 + 向量检索)
      → 前端 UniApp 页面(多 Tab + 对话 UI + 文件上传)
        → 小程序兼容性修复(逐个踩坑处理)

2. 用了 SOLO 哪些能力

  • 代码生成:完整 Composable 逻辑、Vue3 组件、TypeScript 类型定义
  • 架构建议uni.request + enableChunked 实现小程序 SSE、Tool Calling 意图路由方案、RAG 向量检索分层设计
  • Bug 诊断t-tab-bar 遮挡弹框、scoped 样式无法穿透 TDesign 组件、小程序文件上传 ArrayBuffer 编码等
  • 知识补充:小程序自定义组件层叠上下文隔离原理、UTF-8 增量解码、向量数据库选型对比

3. 关键 Prompt 示例

让 SOLO 生成小程序 SSE 方案时:

“微信小程序不支持 EventSource 和 TextDecoder,需要用 uni.request 的 enableChunked 模式实现 SSE 流式对话,同时解决跨 chunk 的中文乱码问题,帮我写一个 Composable”

SOLO 生成了完整的增量 UTF-8 解码器(纯手写,不依赖任何 API),逐字节解析 1/2/3/4 字节 UTF-8 序列,解决了中文跨 chunk 乱码的根本问题:

// 小程序环境无 TextDecoder,使用增量 UTF-8 解码器避免跨 chunk 中文乱码
const decodeUtf8Chunk = (chunk: ArrayBuffer, pending: number[]) => {
  const bytes = pending.concat(Array.from(new Uint8Array(chunk)))
  // ... 逐字节解析 1/2/3/4 字节 UTF-8,未完整的字节留 pending 等下次合并
}

让 SOLO 实现对话式增删改查时:

“AI 现在能新增记录,但我想让它也能处理’删掉昨天那笔咖啡’、'把那个待办改成明天’这类修改/删除意图。后端用 langchain4j Tool Calling,帮我设计工具函数的签名和前端意图识别的交互流程”

SOLO 设计了一套基于 Tool Calling 的意图路由方案,AI Agent 根据用户意图自动选择调用 createRecordupdateRecorddeleteRecordqueryRecord 四类工具,工具执行结果再回流给 AI 生成自然语言确认:

// Agent 工具调用记录结构
export interface ToolCallRecord {
  toolName: string       // "createNote" | "updateTodo" | "deleteAccounting" | ...
  params?: string        // 工具入参 JSON
  resultSummary?: string // 执行结果摘要,AI 据此生成回复
}

用户体验上,AI 在执行删除/修改前会先用流式输出"确认"文字,防止误操作:

用户:“删掉上周买咖啡那条”
AI:“找到了:2026-04-28 咖啡 68元(支出),确认删除吗?”
用户:“确认”
AI:“已删除 ✓”

让 SOLO 实现知识库 RAG 功能时:

“用户上传 PDF、图片、Word 文档后,需要做向量化存储,然后在对话中能检索相关内容回答问题。后端用 langchain4j + 向量数据库,前端小程序需要支持选择文件/拍照上传,帮我设计完整方案”

SOLO 给出了分层架构:文件解析(PDF/图片 OCR/Word)→ 文本分块 → 向量化 → 存入向量库,检索时用问题向量做 Top-K 相似度召回,拼入 Prompt 上下文:

前端上传部分 SOLO 也处理了小程序的文件选择兼容问题:

// 小程序文件选择(兼容图片 + 文档)
const chooseFile = () => {
  // #ifdef MP-WEIXIN
  wx.chooseMessageFile({ count: 5, type: 'file', ... })
  // #endif
  // #ifdef H5
  // input type=file 走普通上传
  // #endif
}

知识库检索效果示例:

用户上传:《项目合同.pdf》
用户:“合同里的付款条款是什么?”
AI:“根据您上传的合同,第五条约定:首付 30%,验收后付 70%,账期 30 天……”

让 SOLO 处理弹框被 TabBar 遮挡问题时:

“小程序中日期选择弹框在 Tab 子组件里,被外层 t-tab-bar 遮挡,z-index 无效,怎么解决?”

SOLO 给出了「Composable 桥接模式」:子组件只负责触发,弹框提升到页面级(index.vue)渲染:

// useWeekCalPicker.ts —— 跨组件桥接
export function useWeekCalPicker() {
  return {
    requestPick(initValue, onConfirm) { /* 子组件调用 */ },
    handleConfirm(e) { /* 页面级绑定 @confirm */ },
  }
}

4. 踩过的坑

问题 原因 SOLO 给出的解法
中文 SSE 内容乱码 小程序 chunk 切割不按字符边界 自实现增量 UTF-8 解码器
日期弹框被 TabBar 遮挡 小程序 z-index 不跨自定义组件 提升到页面级 + Composable 桥接
TDesign 组件样式无法覆盖 scoped 带 data-v-xxx 无法穿透 非 scoped + styleIsolation: shared
键盘弹出后底部 AI 输入栏消失 系统上推 + tabbar 安全区叠加 adjust-position=false + 手动 padding-bottom
AI 回复完成后气泡不滚动 content 流式更新但 scrollIntoView 未响应 watch content 变化触发 scrollToBottom
AI 误删数据(无二次确认) Tool Calling 直接执行无用户确认环节 Agent 先流式输出确认文字,等用户回复"确认"再调用工具
知识库检索结果不准 分块粒度太大,向量相似度被稀释 SOLO 建议改为滑动窗口分块 + 段落级 overlap 策略
小程序选文件只能选图片 wx.chooseImage 不支持 PDF/Word 改用 wx.chooseMessageFile 兼容任意文件类型

成果展示

功能截图描述(文字说明,截图请见实际发帖)

首页 - AI 对话界面

  • 顶部:笔记总数 / 未完成待办 / 本月支出三卡片统计
  • 中部:流式渐进气泡对话,支持 Markdown 渲染
  • 底部:多行自适应输入框 + 发送按钮(激活态绿色高亮)

AI 自动分类效果(新增)

对话式增删改查效果

  • 输入:“删掉上周买咖啡那条” → AI 确认具体记录后删除,防误操作
  • 输入:“把明天开会的待办改成后天下午2点” → AI 定位记录并更新提醒时间
  • 输入:“帮我查一下这个月总共花了多少在餐饮上” → AI 汇总记账数据并用自然语言回答

知识库功能

  • 上传 PDF / Word / 截图 → 自动解析、分块、向量化存储
  • 输入:“合同里的付款条款是什么?” → RAG 检索相关段落,精准引用回答
  • 支持多文件混合检索,来源可追溯

其他 Tab

核心代码文件

uniapp-smart-record/
├── src/composables/useAgentChat.ts     # AI 对话核心(SSE + 小程序兼容)
├── src/components/biz/index/
│   ├── HomeTab.vue                     # 首页 AI 对话入口
│   ├── SmartRecordChat.vue             # 对话气泡组件
│   ├── NoteTab.vue                     # 笔记模块
│   ├── TodoTab.vue                     # 待办模块
│   └── AccountingTab.vue              # 记账模块
├── src/api/smartrecord/
│   ├── agentApi.ts                     # AI Agent 接口(含对话式 CRUD 工具调用)
│   ├── smartrecordApi.ts               # 业务 CRUD 接口
│   └── knowledgeApi.ts                 # 知识库上传 / 检索接口

效果与总结

提效数据

工作项 估计手写时间 实际(SOLO 辅助) 节省
项目脚手架 + 基础配置 1 天 半天 ~50%
SSE 小程序兼容方案 1-2 天 3-4 小时 ~75%
笔记 / 待办 / 记账三模块 CRUD 3-4 天 1 天 ~75%
AI 对话 UI + 流式渲染 1-2 天 半天 ~75%
对话式增删改查(Tool Calling) 2-3 天 4-5 小时 ~80%
知识库 RAG(上传 + 检索) 3-5 天 1 天 ~80%
小程序兼容性 Bug 修复 1-2 天 3-4 小时 ~80%
TypeScript 类型定义 1 天 2-3 小时 ~70%
整体评估 3-4 周 约 2 天 ~85%

SOLO 在我流程中做了什么

  1. 帮我想到了我没想到的方案:小程序 SSE 的增量 UTF-8 解码思路,是 SOLO 主动提出的,我之前想用 base64 绕过,SOLO 给了更优雅的方案
  2. 极大降低了"反复查文档"的成本:TDesign UniApp 组件的 styleIsolationexternalClassesvirtualHost 这些配置,SOLO 直接给出了正确用法
  3. 把踩坑时间压缩到极致t-tab-bar 遮挡弹框这个坑,自己排查可能要 1-2 小时,SOLO 说出原因(小程序自定义组件层叠上下文隔离)并给出解法,10 分钟搞定

可复用的方法论

  1. 小程序 SSE 通用模板uni.request + enableChunked + 增量 UTF-8 解码,可适配任何需要流式输出的小程序场景
  2. Composable 桥接模式:凡是弹框/弹层被 t-tab-bar 遮挡,一律提升到页面级渲染,用 Composable 做状态桥接
  3. TDesign 样式覆盖标准:非 scoped + styleIsolation: shared,彻底解决组件内部样式穿透问题
  4. 对话式 CRUD 安全机制:删除/修改类操作必须 AI 先输出确认文字再执行工具,"确认"作为二次意图触发,防止误操作
  5. RAG 分块策略:滑动窗口 + 段落级 overlap,比固定长度分块检索准确率提升明显,SOLO 直接给出了可落地的参数建议

感受

用 SOLO 开发小程序最大的价值不是"少写代码",而是把「不知道怎么做」的时间变成了「告诉 SOLO 要做什么」的时间。小程序有太多奇怪的坑,以前靠经验和运气,现在靠 SOLO 的知识库和推理能力——效率差距是质的飞跃。

对话式 CRUD 和知识库 RAG 这两块是我最没把握的部分,Tool Calling 的意图识别准确性、RAG 的检索质量都有很多细节要调。但 SOLO 不只是帮我写代码,它把背后的原理讲清楚了——为什么分块要 overlap、为什么删除前要加确认环节——这让我真正理解了做了什么,而不只是复制粘贴。


技术栈:Vue3 + UniApp + TypeScript + TDesign UniApp + langchain4j(AI Agent + Tool Calling + RAG)
发布平台:微信小程序