先说背景,我是个开发者,平时工作离不开 AI 工具。
但用着用着发现几个特别头疼的问题:
痛点1:每次要在 ChatGPT、Claude、Gemini 之间来回切换对比答案,太麻烦了
痛点2:和 AI 聊完有价值的信息,下次对话 AI 全忘了,还得重新解释背景
痛点3:想同时探索多个方向,只能开一堆对话窗口,最后自己都搞混了
痛点4:积累的技术方案、代码片段散落在各处,想找的时候根本找不到
所以我就想,干脆自己做一个得了。
做了个工具自己用了一段时间,觉得还挺顺手的。最近又更新了不少功能,包括后台推流这种很少见的特性——关了页面回来 AI 还在生成,今天跟大家分享一下思路和技术实现。
核心功能设计
1. 多模型并行对话
这个功能是我最先做的,因为自己深受其苦。
实现思路:
- 用户一次提问,同时发给多个 AI 模型
- 通过 SSE(Server-Sent Events)实现流式输出
- 多个模型的回复实时并行展示
技术选型:
- 后端:Spring Boot 3.5 + Kotlin
- AI 接入:通过 OpenRouter 统一调用(支持 OpenAI / Anthropic / Google / DeepSeek / Meta 等 300+ 模型)
- 流式输出:SSE,首包时间控制在 3 秒内
我的使用场景:
- 技术方案选型时,让多个模型同时给出建议,对比着看
- 写代码时,重要逻辑会让多个模型交叉验证,降低幻觉
- 免费模型和付费模型混用,控制成本
2. 对话分支管理(类 Git 设计)
这个功能是我作为程序员的一点私心,觉得对话就应该像写代码一样能分支管理。
功能设计:
- 从任意节点创建分支
- Fork 分支(基于历史节点)
- 合并分支
- 消息选中(Pick)标记主路径
- 每个分支独立配置模型和参数
解决的问题: 写技术方案时想试试不同方向,以前只能开新对话丢失上下文,现在直接分支并行推进。
多标签页管理:支持同时打开多个对话标签页,IDE 风格切换,右键菜单支持刷新/关闭/关闭其他等操作,不用来回找。
数据结构:
Chat(对话)
├── Branch 1(主分支)
│ ├── Node 1
│ │ ├── Message (GPT-4o)
│ │ └── Message (Claude)
│ └── Node 2
└── Branch 2(从 Node 1 Fork)
└── Node 3
3. 知识沉淀 + 记忆系统
这个功能是我花最多时间做的,但也是最值得的。
知识沉淀:
- 每次对话后,AI 自动提取关键信息,生成"知识条目"(标题 + 摘要 + 标签)
- 通过
baai/bge-m3模型将知识转化为 1024 维向量 - 存储到 PostgreSQL 的 pgvector 扩展中
- 下次对话时,自动检索最相关的知识注入上下文
记忆系统: AI 自动从对话中提取用户偏好、习惯等关键信息作为"记忆",按稳定性分为 6 个特征等级(FIXED / VERY_STABLE / HABIT / PREFERENCE / MUTABLE / WEAK),对话时自动检索相关记忆注入上下文。
上下文摘要压缩: 开启后,AI 自动把历史消息压缩成精华摘要,发消息时只携带摘要而非全文,长对话 Token 消耗大幅降低。
技术栈:
- 向量数据库:PostgreSQL + pgvector
- Embedding 模型:baai/bge-m3(1024 维)
- 检索方式:向量相似度检索
4. AI 应用创作 + 讨论面板
用自然语言描述需求,AI 直接生成 HTML 单页应用。
功能支持:
- 对话式迭代优化
- 手动编辑代码
- 版本历史与回滚
- iframe 实时预览
- 应用讨论面板:围绕 AI 应用实时讨论协作
模型广场:独立页面浏览 300+ 模型详情,按供应商/模态/价格/免费筛选,查看上下文长度、输入输出价格等,选模型不再盲目。
前端实现:
- Next.js 16 + React 19
- TypeScript
- shadcn/ui + Tailwind CSS
- iframe 沙箱隔离运行用户代码
5. 后台推流——关页面不断流
这个功能是我自己最需要的:很多时候 AI 还在生成回复,但我得切去做别的事,甚至不小心关了浏览器,回来发现回复没了。
YeeroAI 的解法:
- 用户关闭/刷新页面后,后端与大模型的 SSE 连接不断开,继续在后台流式接收数据
- 每个 chunk 通过 Redis List 持久化存储,Redis Channel 实时广播
- 用户重新打开对话时,调用
/checkActiveStream检测活跃流,通过/resume接口重连 - 前端收到
CATCH_UP事件后,以替换模式恢复已生成内容,然后继续接收后续流 - 支持全局开关(
backgroundStreamEnabled字段持久化到IceUser表)
多实例部署:
- Redis Pub/Sub + Redis List 双轨机制
- Redis List 存储每个 chunk(解决消息不丢失)
- Redis Channel 实时广播新 chunk(解决多实例解耦)
- 无论用户重连到哪个实例,都能恢复完整的流数据
简单说——AI 回复不怕断,关了页面回来还在生成。
6. 推理过程展示 + 多模态
支持 o1/o3 等推理模型的完整推理链展开查看,了解 AI 是怎么一步步得出结论的。这在做技术验证的时候特别有用,能看到 AI 的"思考过程"。
同时支持图片、音频、视频输入,AI 可以跨媒体类型理解与回应。图片还能生成不同尺寸和比例(1K~4K,1:1/16:9/2:3 等)。
近期更新功能
| 功能 | 说明 |
|---|---|
| 后台推流 | 关页面不断流,SSE 自动重连接续接收 |
| 邀请机制 | 邀请好友注册,双方获得积分奖励 |
| AI 语义搜索 | 文件和消息都支持自然语言描述搜索 |
| 应用讨论面板 | 围绕 AI 应用实时讨论协作 |
| 应用云端同步 | 多设备数据一致性 |
| 文件库 + 多格式预览 | 图片/视频/PDF/Office 在线预览 |
| 存储额度管理 | 空间用量一目了然,智能清理建议 |
| 推理过程展示 | 展开查看 AI 完整推理链 |
| 多模态输入输出 | 图片/音频/视频对话 |
| 模型广场 | 独立页面浏览 300+ 模型详情 |
技术架构
前端
Next.js 16 (App Router)
├── React 19
├── TypeScript 5.9
├── shadcn/ui + Tailwind CSS
├── next-intl (国际化)
└── SSE Client (流式输出)
后端
Spring Boot 3.5
├── Kotlin 2.3
├── PostgreSQL + pgvector
├── Redis + Caffeine (二级缓存)
├── OpenRouter API
└── SSE Server
性能优化
- SSE 首包 < 3 秒
- 接口 P95 < 200ms
- Redis 分布式缓存 + Caffeine 本地缓存
- 虚拟线程支撑高并发
其他实用功能
文件夹层级管理
- 多级嵌套文件夹
- 对话、应用、知识分类管理
- 每个文件夹独立配置默认参数(模型/工具/记忆/参数),支持继承
全局语义搜索
- Ctrl+K 打开全局搜索
- 跨类型搜索(对话/消息/文件/应用/文件夹)
- 向量语义匹配,显示匹配度百分比
- AI 语义搜索:用自然语言描述就能找到文件
- AI 图片语义搜索:AI 生成的图片建立向量索引,语义搜索直接找
其他
- 多标签页管理(IDE 风格切换)
- 用户反馈中心(故障报告/功能建议/状态追踪)
- 消息右键菜单(复制/复制为图片/删除/创建分支/排除上下文)
- 对话内容 AES 加密存储
- 隐私数据绝不售卖或共享给第三方
开发过程中的一些经验
1. SSE 流式输出的坑
- 注意连接超时设置
- 客户端重连机制很重要
- 错误处理要完善,避免白屏
2. 后台推流的设计要点
- 后端流状态管理要独立于前端连接生命周期
- Redis List 持久化 + Pub/Sub 广播的双轨机制是核心
- CATCH_UP 替换模式确保重连后内容不重复不丢失
- 全局开关让用户自己选择是否启用
3. 向量检索的性能
- pgvector 在数据量大时需要建索引
- 检索前先过滤,减少向量计算量
- 缓存热门检索结果
4. 国际化不是小事
- 从一开始就设计好 i18n
- next-intl 用起来挺顺手的
- 文案管理要规范,避免硬编码
适合谁来用?
- 需要频繁使用 AI 的开发者
- 需要对比多个模型输出的研究者
- 想建立个人知识库的技术人
- 想快速原型验证想法的产品经理
体验方式
感兴趣的朋友可以搜索试试,有问题随时在评论区交流,我会尽量回复。
以上就是我做这个工具的一些思路和技术实现,希望能给同样在做 AI 应用的朋友一些参考。如果觉得有用,点个赞支持一下~