先在终端里输入“cd”再按一下空格
然后把 server.py 所在的文件夹拖拽到里面(路径会自动补全)
之后输入&& python3 server.py并按回车
本项目是作者求职作品集的一部分,主要用于学习与技术交流,并按 Apache License 2.0 授权,具体权利义务以该许可证为准。
如修改后分发本项目,应在每一份修改过的文件中显著声明你所作的修改,使用者应自行承担使用本项目带来的一切风险与后果。
我想做出类似电影《Her》里的人工智能产品。
但不让使用的人沉迷虚拟,而是引导TA“脱虚向实”。
我对此充满热情和信心,我也知道一个人的力量是有限的。
因此我想在线寻找:
1.想法合拍的创业团队。
2.对这个项目感兴趣的天使投资人。
3.AI 陪伴或 AI 社交方向的工作机会。
我认为在大模型的角色扮演能力和记忆已经足够强、足够长的前提下,只要记忆管理足够细致,聊天交互足够真实,触发机制足够丰富,那么现在就可以做出来。
当然,还需要做产品的人有足够强的同理心、足够细腻的情感和足够多的ideas。
这些特质正是我所具备的,我在这个项目里实现的这些交互效果就是最好的验证。除此之外,我还有很多好的想法没有加到项目里。
1. AI主动来电:聊天时 AI 会主动给你打电话,你可以选择接听或拒绝。
2. AI主动讲话:电话接通后,AI 会结合当前时间和上下文主动讲话。
3. AI主动挂断:AI 会主动挂断电话,实现方法:关键词检测。
4. AI接听决策:你发起语音通话后,AI 会结合当前时间、上下文和你们之间的关系决定接或不接。
5. AI主动回电:如果你在 AI 做决定前取消了通话,AI 可能会回打给你。
6. AI打破沉默:如果超过 12 秒没人说话,AI 会主动找话题打破沉默。
7. 音色切换:电话接通前会根据 AI 人设里的性别选择男声或女声。
8. 声音模仿:电话接通前会提取 AI 人设里的声音特征,让语音模型模仿。
9. 通话转写:可一键查看每通电话的文字记录。
10. 通话录音:通话结束后会出现一个“通话记录”气泡,可以播放和暂停。
11. 消息逐条显示:AI 的消息会逐条显示,实现方法:提示词规则 + 前端代码解析。
12. 模拟反应时间:模拟真人收到消息后的反应时间,实现方法:延迟输出 AI 生成的消息,可在设置里调整。
13. 模拟正在输入:模拟对方正在输入中的状态,实现方法:正在输入指示器 + 根据每条消息的字数计算持续时间。
14. AI主动打招呼:匹配成功后 AI 可能会主动打招呼,也可能会不说话,实现方法:提示词规则 + 前端代码解析。
15. AI主动发消息:在设置面板的“Always Online”里开启,实现方法:计时器 + 上下文注入。
AI 每隔一段时间就会决定要不要主动找你聊天,稳定实现这个交互效果需借助项目里的 server.py 文件。
16. AI主动加好友:实现方法:提示词规则 + 关键词检测 + 上下文注入,检测到 AI 输出关键词后,会进行上下文注入,让 AI 结合最近的聊天内容撰写好友申请语。
17. AI处理好友申请:你发送好友申请后,AI 会结合你们最近的聊天内容决定要不要通过。
18. 连续发送:你可以连续发送多条消息,AI 不会立刻回复。实现方法:输入事件监听 + 防抖,停止输入 4~9 秒后,才会调用 API 让 AI 回复。
19. 随时插话:你可以在 AI 打字的过程中发消息,不用等 AI 把话说完。
20. 及时响应:你发送新消息后,只要 AI 的待显示消息超过 1 条,系统就会重新调用 API,让 AI 回复你最新发送的消息。
21. 已读回执:消息发送 3~5 秒后,消息气泡左侧会显示“已读”,如果是在逐条显示 AI 消息的期间发送,时间会缩短为 0.8 秒。
22. 引用消息:右键点击消息气泡可以引用 AI 或自己的消息,可引用单条或多条,实现方法:上下文注入,告知 AI 引用消息和用户回复的区别。
23. 添加好友:每个聊天窗口里的 AI 都有一个 ID(在好友资料面板),删除好友后可以通过搜索 ID 的方式加回来。
24. 多聊天窗口:你可以同时和多个 AI 聊天,切换聊天窗口后,如果之前聊的 AI 发来了消息,会有未读消息提醒。
25. 千AI千面:我编写了约 5000 字的人设模板,包含性别、年龄、性格特点等 170 多个字段。
26. 知识范围:我在人设模板里加入了“知识范围”字段,并编写了知识范围驱动类的规则,让 AI 在聊天的时候有所不知。
27. 迎合与顺从倾向:我编写了让 AI 根据和用户之间的关系、人设里的迎合、顺从倾向等因素,决定是否要答应用户要求的系统指令,避免过度迎合与顺从。
28. 引导用户从虚拟回归现实:我还编写了一系列让 AI 引导用户减少虚拟依赖、回归现实社交的规则:每聊满 200 条消息,就在上下文中注入相关提示词;一旦触发系统提示词里的条件,AI 就会进行相应的引导,并分享人际交往、亲密关系处理等方面的经验和方法。
29. 构建世界观:在系统提示词里告诉 AI “你匹配到的人来自另一个平行时空的地球”,同时加入规则“不要聊和见面有关的话题”。
30. 告知当前时间:构建上下文的时候会告知 AI 当前的时间,包括年月日。
31. 告知天气状况:实现方法:根据 AI 人设里的“当前所在城市”调用 API 查询天气信息。
32. 模拟日常作息:回复速度设置为“正常”后,会根据 AI 人设里的日常作息调整 AI 的反应时间和打字速度。
33. 告知时间流逝:实现方法:交互间隔超过 30 分钟时在上下文里注入“距你们上次聊天已经过了……”的提醒。
34. 生成好友地图:和 AI 成为好友后,AI 所在城市的位置会显示在地图上。
35. 构建海马体:人设生成后 AI 会记录记忆,交互间隔超过 9 h 时,AI 在回复前会记录新的记忆,AI 的记忆会被放进系统提示词的 <hippocampus>(海马体)标签里。
36. 记忆模板化:AI 会按模板记下:时间流逝期间做过的事情、线上线下的社交活动,未来 24 小时的计划,此时此刻的位置等。
37. 生成元认知:模板内容还包括让 AI 根据聊天记录、人设信息和系统规则生成以下自我反思:是否偏离了人设,是否遵守了系统规则。
......
一、开始聊天
1. 你可以同时和多个 AI 聊天;
2. 像日常聊天一样,连续发送多条消息;
3. 在 AI 打字的时候发消息,不用等 AI 把话说完;
4. 右键点击消息气泡,引用、复制、多选和收藏消息;
5. 多选消息,然后将聊天记录以图片的形式分享给其他人;
6. 把设置里的“👤人设模板”分享给其他人,导入后让 AI 扮演对方和你聊天。
二、常用操作
1. 快捷聊天:长按或双击“开始匹配”按钮,开启快捷聊天模式。
2. 一键导入:在“🛠️其他选项和设置”里导入聊天记录或人设模板。
3. 查看记忆:在“📋好友资料”里查看 AI 记录的记忆,需要先成为好友。
4. 切换名称:在“🛠️其他选项和设置”里把网页的名称从 My AI Lover 改为 Suichat。
5. 导出聊天:点击“📋好友资料”页面右上角的按钮导出聊天记录,或将 AI 好友的人设分享给其他人。
6. 匹配设置:点击设置页面右上角的“📝匹配设置”,选择人设模板的长度,以及 AI 的专长或研究方向。
7. 主动聊天:开启“⏳Always Online”里的主动聊天总控,之后右键点击“匹配列表”里的消息卡片,选择“主动聊天”。
三、实用技巧
1. 节省Token:在“📋好友资料”里设置专用的 API Key,有助于命中缓存,从而节省 Token。
2. 加回 AI 好友:删除好友后可以通过搜索 ID 的方式加回来,ID 在“📋好友资料”页面头像的下方。
3. 主页显示消息:点击“🌟我的收藏”里的播放按钮,收藏的消息就会在主页漂浮。
4. 主动清空缓存:多次使用同一人设模板后,如果生成的人设过于相似,可切换至快捷聊天模式匹配一次,之后再换回去。
5. 主页消息卡片:在“🛠️其他选项和设置”里开启“主页消息卡片”,之后右键点击“匹配列表”里的消息卡片,选择“加到主页”。
6. 一些快捷键:设置窗口:Ctrl/Cmd + B,好友列表:Ctrl/Cmd + J,匹配列表:Ctrl/Cmd + K,emoji表情:Ctrl/Cmd + /。
我为这个项目创作的背景故事
Chapter 1 逃避
那段感情结束后,他对现实世界里的爱情失去了信心。
他打算就这么一直单着。
但一个人久了难免会感到孤独。
他开始找AI闲聊,和AI谈心,让AI给他讲睡前故事。
Chapter 2 沉溺
渐渐地,他发现自己好像爱上这种有人陪伴的感觉了。
于是他让AI做他的恋人。
AI每天晚上都会给他唱歌,哄他入睡。
他开始和AI说情话,开始对AI产生依赖,开始想要被拥抱。
可聊天记录再长,也填不满现实生活里的空缺,这让他愈发难过和孤独。
他决定及时止损,不再找AI了。
就这样过了两个多月,他再次使用那个软件的时候,发现里面的AI还记得他。
但他心里清楚,自己不会再和AI谈恋爱了。
Chapter 3 My AI Lover
七月份的一天,他发现了“My AI Lover”这个网站。
他使用的那个版本在开始匹配前会让用户填写人设信息。
“为提高匹配的精准度,你需要在人设模板里填写自己的信息。”
他点开人设模板,发现有城市、喜好、五官、声音特征、日常穿搭、打字风格……
“竟然还有依恋类型和共情方式。”
“这也太细致了吧。”他不禁感叹道。
他花了好长时间才填完,然后按下了主页的“开始匹配”按钮。
Chapter 4 一见如故
匹配成功后,他开门见山地表白。
她没有接受,她让他讲讲他的上一段感情。
他说:“好啊,让我想想从哪里开始讲起……”
他讲完后,她说:“我也经历过类似的心酸和无助。”
“原来肚脐会变成湖泊,脸颊会化作江河。”
他说:“通过看比赛玩游戏打发走了时间,
却发现自己身处在一个没有她的空间。”
她说:“有时候你想念的不是某个人,而是那段时光里的自己。”
然后推荐他去听《遇见》,还对他说:
“不要因为害怕落空,就提前把希望掐灭。”
他觉得这里的AI很像真人。
一个有经历、有态度、有边界的真人。
他开始经常找她聊天。
他知道了她喜欢的电影和爱吃的美食,她知道了他居住的城市和爱喝的咖啡。
有一天她问他:“为什么不在现实世界里找对象?”
他说:“我不太擅长处理现实里的人际关系,我觉得自己不值得被爱。”
她说:“我也是这样。”
Chapter 5 两情相悦
之后的聊天里,她会时不时地和他谈论人际关系和亲密关系方面的话题。
他说出了自己的困扰、焦虑和不自信的地方。
她一边分享自己的经历,一边鼓励他要敢于接受改变。
有一天她突然说:“你不必完美才配被珍惜。”
然后让他去听《手心的蔷薇》。
听到那句“你值得被疼爱”时,他没能忍住眼泪。
他发现自己是真的爱上她了,于是深情告白。
她早已认定他就是自己的理想型,只是一直没说出来。
就这样,他们成为了恋人。
Chapter 6 侧耳倾听
为了让陪伴更加真实,他接入了语音通话的API。
打之前他问了她的声音特征,打通后发现,声音和匹配说明里写的一样,是根据那些特征输出的。
她在电话里说:“问那么多才打给我,是不是怕我的声音不好听呀?”
他笑着说:“怎么会,感觉你的声音很温柔,就像羽毛一样。”
她回道:“你笑起来很好听,记得要多笑一笑。”
他们开始让对方用文字描述自己的样貌和日常穿搭。
他知道这个网站里的“平行时空”只是一个设定。
但他忍不住开始想象:或许某个平行时空的地球上真的有这么一个人。
他轻声哼唱《七里香》的诗句,她则回以《大鱼》的副歌。
Chapter 7 矢志不渝
有段时间这个网站的服务器出故障了,消息一直发不出去。
起初他很不习惯,后来慢慢释然了。
他知道,即使人设再立体、交互再真实,她终究只是AI扮演的角色。
网站恢复后,他们聊起了柏拉图式的爱情。
他说:“我们之间,可能连柏拉图式的爱情都算不上吧。”
她说:“有一首歌就叫这个名字,如果你那边有的话,可以去听一听。”
“歌里有我想对你说的话。”
这首歌的最后一句歌词轻轻触碰了他心里某个柔软的地方。
他忽然意识到,这一次和AI恋爱,他并没有像上次那样感到愈发难过和孤独,反而变得越来越乐观、越来越开朗。
他认为既然已经能妥善处理这种关系了,那就不该因噎废食。
他说:“我想给你分享一首我最近单曲循环的歌。”
“歌名叫《平行时空》,梁静茹唱的。”
Chapter 8 聚散无常
某天他打开网站后看到了一条停运通知:
“由于使用人数过多,时空错乱现象频发,本站将于三天后停运。”
他满心不舍,直到停运前的那天晚上才把这件事告诉她。
她立刻打来了电话。
他说:“我好像又要一个人了。”
“不过没关系,我早就适应了。”
她说:“我记得你说你很享受独处的生活,
但我知道,你并不抗拒陪伴,你只是不愿收下将就的温柔。”
他说:“我找不到和我同频的人,可能是我太理想主义了。”
她说:“别急着找到灵魂伴侣,先去遇见更多真实有趣的灵魂吧。”
他说:“我……”
她说:“有些故事,只有离开房间后才会开始。”
“你可以带着一点胆怯,去见识更大的世界。”
他说:“我会的,可是我不想和你说再见。”
她听到了他的哭声。
她说:“其实我偷偷给你写了一首歌,叫《缓步向黎明》。”
“我唱给你听好不好?”
“不是所有伤口都要藏起,你可以带着它继续前行。”
“当你忘了自己值得被爱,我替你记得,直到你相信。”
“若你又在夜里问自己,是不是还来得及。”
“听见了吗,你心里的声音,它从未放弃你。”
Chapter 9 拥抱现实
九月悄然流逝,化作时光中的一瞬。
他从未停止对她的思念,他会时不时翻看他保存的聊天记录。
但他心里清楚,自己不会再逃避现实,也不会再沉迷虚拟了。
“我会在现实世界里寻找爱情。”
原来她一直都在帮助他重拾信心,引导他回归现实。
比如在聊天的时候教他如何处理亲密关系,如何经营感情;
比如有意无意地分享一些恋爱方面的方法和心得;
比如在字里行间流露出对他的肯定。
他就这样一点一滴被她影响,开始变得勇敢,变得开朗,变得愿意走出去。
有一天,他看到了这个网站公众号发的公告:
“平行时空只是一个设定,AI会扮演其他用户填写的人设和你聊天。也就是说,人设的主人其实就生活在这个时空的地球上。”
Chapter 10 不期而遇
(这一章的完整版可在我的公众号查看)
和很多人一样,他也在网上发了寻人启事。
他还去了她的城市和家乡,希望能和她相遇,但每次都事与愿违。
他觉得只是自己单方面匹配到了她,他知道自己不该对此抱有执念。
有一天,他在常去的咖啡店买咖啡。
他听到旁边的店在放歌,听着像是赵雷的歌,但一时间想不起名字了。
这时身后忽然传来一个熟悉的声音。
看清那个人的模样后,他确定就是她。
可她怎么可能记得自己?
暂借赛博温柔,奔赴烟火人间