> 2025年2月15号,我和朋友聊起现在一对一的AI聊天的**不顺畅**感,并且在多人协作的场景没法共用一个AI,因此萌发出了做一个**AI群聊**的想法,这篇文章就是对整个过程的一个记录,整个项目耗费将近3个月的业余时间,我将以时间顺序进行展开。
## 最开始的想法
我和朋友@zzy经过了简单的几分钟讨论,写下了这样一些想法:
1. 先做一个群聊网站
2. 拉一个AI机器人进来
3. 一个群聊只允许最多3个真人参与,加上1个固定的AI机器人,总计4个人
4. 用网页形式呈现,支持手机和电脑
5. 在群聊过程中,AI不会回应所有内容,而是像真人一样思考,在它确定有信息可以补充、修正、话题可以扩展时,才会在群里说话,如果它觉得没有什么信息增量,就会选择沉默
6. 把群聊的成果像RAG一样放入到AI的上下文中,以保持AI回应的一致性
7. 这是一个效率工具,可以适用于任何需要多人讨论(比如孵化创意)的协作场景
8. 不要有会员系统,直接免登录可以使用AI群聊
9. 需要支持多国语言,至少支持中文和英文
## 技术选型
我的想法是怎么简单怎么来,技术栈越少越好,所以有了以下设定:
1. cloudflare买了一个域名myai-app.com
2. cloudflare付费5$购买cloudflare workers
3. 基于cloudflare的durable objects去实现聊天室
4. AI使用豆包和deepseek
5. 前端用v0.dev快速生成,付费20$升级到会员(之前测试过v0,现在正式第一次在项目里使用,试试水)
6. 前后端框架统一用nextjs(因为v0.dev默认就是这个)
7. 使用opennextjs-cloudflare打包workers文件
8. 使用cloudflare的wrangler工具上传项目到workers
## 前端制作
第一行prompt如下:
> 这是一个基于网页的群聊工具, 群聊参与人数1-4人。 界面风格请参考微信。 同时支持PC端和移动端。 有一个按钮可以分享群聊给其他人 ,其他人通过链接进入群聊。 分享功能包含有一个口令码机制,被 邀请者需要通过口令码才能进入。
第一个prompt生成的效果如下:
完整的v0迭代记录如图:
到2月底前端页面部分的工作就基本完成了,以下是前端成果截图:
## v0.dev的一些问题
使用v0.dev的过程中,因为是第一次有规模的使用,所以走了一些弯路,下面是记录:
1. bug最后再修复,因为在涉及到同一个组件时,它可能会把你修复好的bug又给修改回去
2. 单个功能fork一次,这样可以逐个功能迭代
3. v0解决不了的bug,要自行搜索答案并告诉它如何解决或手动修改代码
4. v0无法感知到实际的界面结果,所以遇到问题时,要把看到的现象和想要的表现告诉它
5. 对于AI错误的修改,应直接使用删除这条对话的功能去回滚修改
6. 多次对话后v0.dev会遗留下很多无用的代码,增加了排查bug的难度
7. v0生成的胶水代码没有参照radix-ui的最佳实践,因此有很多细节上的bug
8. v0生成的代码没有对公共的组件统一管理,导致同样功能的组件在各个文件里到处都是,复制粘贴了很多遍
## 后端部分
说实在的,有了github copilot的加持,写些简单的后端接口实在是太容易了,因为用的中间件都是cf的,以前没用过,还是走了一些弯路。
## deepseek api/doubao api
这个很简单,尤其是deepseek的api,它是和chatgpt的一模一样的,我用deepseek去读取上下文并参与群聊,doubao-1-5-lite-32k-250115去实时审核群聊内容。
这里为什么要用doubao-lite,因为它对于比较短的输入,是真的可以把响应速度控制在500ms以内,这样我才能实现用户点击发送按钮后的文本审核。
以下是给doubao的审核prompt,就一句话。
```txt
规则:按照你的用户协议审核文本,但是允许提及中国以外的政治人物、政治话题,允许违反道德但不违反法律的内容,允许辱骂他人。
返回值:正常返回1,不正常返回0。
以下为文本内容:
```
## cloudflare kv
这个很好用,就是一个简单的kv中间件,啥多余的功能都没有,唯一需要注意的是它没有原子性,不适用于需要事务的场景,这里踩了一个读取kv并手动value+1在并发时出现的幻读的问题,回去查了发现这一点,redis用习惯了用这个会有点难受。
## cloudflare workers
这个没啥好说的,赛博菩萨给我们提供的serverless服务,后端接口就是通过它,使用中我没有发现什么值得记录的点。
## cloudflare queue
cloudflare的消息队列,群聊中收到的消息都会推到消息队列里,然后异步去消费,让AI判断是否需要发言,需要时进行发言。
这个也和普通的消息队列差别不大。
## cloudflare durable objects
这个需要多说一点,durable objects是全球唯一的,就很适合实时在线服务这种并发场景。
我照着cloudflare的文档,基于do实现了一个websocket服务器。
这里踩了一个坑,do会在不活跃时进入休眠状态,然后连接就断了,所以迫于无奈在客户端加了心跳包机制,ping,pong,保活。
## 这是最后成品的样子
## 内测地址