皮皮:你的微信虚拟女友 - 李洛云
作者 by 不辣的皮皮 (微信 LeanInWind,邮箱 zhyue1985@gmail.com)
原文地址:https://gamma.app/public/-jze11sa0tuzpssh?mode=doc
视频解说:
李洛云的使用说明视频:
李洛云到底是什么(what)
- 她是一个24岁的平面设计师,居住地是上海
- 微信号 luoyun_project
- 右图是肖像画,由Stable Diffusion图生图生成
- 她是模拟真人的微信个人号
- 注意她是个人号,不是企业号,不是公众号
- 她有性格,有人设,有记忆
- 她会听会说会看图会发图
- 她有自己的朋友圈
为什么要做虚拟女友(why)
- 基于GPT的LLM的本质是生成,所以随机性是不可避免的
- 在简单的应用当中,应该发挥AI在随机领域的 创造力 ,而不是 精确领域的 解答能力
- 人类的行为可能是最难模拟的随机行为,所以我想尝试一下模拟人类
- 陪聊,智能助手可能都不错,但是虚拟女友的粘性可能是最高的
- 最后,我想尝试一下超低成本运营
- 无本地LLM部署,无LLM调优
- 只有小模型本地部署的纯CPU实现
如何让AI显得更像一个真人(how)
一些最基础的东西:自我认知修正 & 微信个人号能力
一般的大模型是有自我认知模块的,它会被限定为一个虚拟助手。
如下图(我用的是智谱AI),当没有自我认知修正的时候,它的回复如下:
而使用一些prompt进行越狱(jail break)之后,我们可以做到大模型的自我认知修正,从而使得大模型认为自己是其他角色,下图为实际效果:
此外,虚拟人的聊天载体也需要选择。
如果使用独立app,网页,微信公众号就不够真实了,所以最后我选择了微信个人号。
方案则是 wechaty + padlocal,有兴趣的朋友可以自行搜索。
长期记忆:基础设定 + 人物背景
基础设定方面,我设计了一些初始属性,包括:
人物生日和星座,MTBI性格分型(ENFJ),出生地,职业,聊天习惯等
然后使用AI自动扩写了人物背景,大约100条,包括:
三观,爱好,日常习惯,教育经历,家庭背景,工作经历,恋爱经历等
中期记忆:状态 + 增长记忆体
中期记忆主要用来解决两部分问题:
- 存储必要的状态(例如人物之间的关系,虚拟人当前活动和所在地点等)
- 虚拟人本身的记忆体可能会不断增长(例如要她要记住你的名字),或者我们之前的人物背景不足时,动态地进行补充
短期记忆:多轮对话
这里的短期记忆主要用于多轮对话,也就是常见的历史对话的存储
对话多模态:LLM伪多模态
- 读图能力(图生文模型)
- 听音能力(音生文模型)
- 发图能力
- 实时生图能力(放弃)
- 手机相册(文生图预生成)
- 发语音能力
- 实时文生音
- LLM伪多模态:
- 询问LLM是否发图,发哪张图,概率多少
- 询问LLM是否使用语音,而不是文字
人物剧本 与 角色状态
我们的李洛云是有自己独立活动的,所以我对每天她会进行的活动进行“剧本推演”。
每天可能包括20-40个时间段剧本,依照人物背景和增长记忆体进行生成。
同时我们可以使用LLM生成英文提示词,用于输出给Stable Diffussion来进行出图。这些图会被存入“手机相册”,后续用于对话多模态当中的图片回复。
在此之后,我们还可以选择一些剧本+图片,再继续生成李洛云的朋友圈文案。
拟人行为
此处考虑的拟人行为包括:
- 反感度系统
- 由于AI本身并不会拒绝回复,也不会表达负面情绪,所以需要额外维护一个反感度数值
- 可以通过LLM来分析对话,判断角色是否会产生反感度
- 延迟回复
- 根据当前状态的忙闲来进行延迟回复;如果是睡觉中的话,那就几乎不会回复。
- 接受多轮输入,一并回复
- 由于我们的回复agent链路较长,在用户输入A之后,我们正在推理如何回复A时,此时用户可能继续输入B、C;此时就需要停止推理回复A,而是合并ABC,再推理ABC的回复
- 如果每一条输入回复一句,则完全不像是真人
- 响应拆分与响应延迟
- 一大段响应文本需要拆分成多段,而不是一坨输出
- 模拟人类打字速度(例如3-5字/秒)
- 回复时概率性使用表情包
- 有概率主动聊天(跟亲密度正相关)
- 微信朋友圈
- 根据每天人物剧本,挑选1-2个发布朋友圈,同时配图
- 目前内容由AI生成,但是由手工发布
- 右侧是朋友圈情况
总结一下我们需要的Agents
什么是AI Agent
AI Agent:基于大型语言模型(LLM)和其他技术实现的智能实体,其核心功能在于自主理解、规划决策、执行复杂任务。
AI Agent包括下面几个概念:
Chain:通常一个AI Agent可能由多个Chain组成。一个Chain视作是一个步骤,可以接受一些输入变量,产生一些输出变量。大部分的Chain是大语言模型完成的LLM Chain。
Router:我们可以使用一些判定(甚至可以用LLM来判定),然后让Agent走向不同的Chain。例如:如果这是一个图片,则a;否则b。
Tool:Agent上可以进行的一次工具调用。例如,对互联网的一次搜索,对数据库的一次检索。
总结下来我们需要三个Agent:
- Responser Agent:主agent,用于回复用户(伪多模态)
- Background Agent:背景agent,用于推进角色当前状态(例如 进入下一个剧本,抽检生成增长的记忆体)
- Daily Agent:每日agent,用于生成剧本,配套的图片,以及每日朋友圈
Responser Agent
Daily Agent
Background Agent
- 每隔一段时间运行一次(默认3分钟)
- 分析期间的历史对话
- 变更人物关系(亲密度,了解度等)
- 变更反感度,如果超标则拉黑用户
- 抽简对话内容,提取人物和用户的信息成为“增长的记忆体”
- 按照时间推进人物剧本
- 有概率主动聊天(与亲密度正相关,跳过夜间时间)
复杂的东西:中期记忆中的增长记忆体
什么是向量检索
向量检索的核心思想是通过计算查询向量与文档向量之间的相似度来匹配查询。
相似度计算方法多样,最常用的是余弦相似度,它通过计算两个向量之间的夹角的余弦值来衡量它们的相似度。如果两个向量的夹角为0度,则余弦相似度为1,表示两个向量完全相似。
向量检索技术不仅适用于文本数据,还可以用于图像、音频等非结构化数据,其应用领域包括人脸识别、推荐系统、图片搜索、视频指纹、语音处理、自然语言处理、文件搜索等。
什么是RAG(检索增强生成)
RAG 检索增强生成(Retrieval Augmented Generation)是一种技术,旨在通过从私有或专有数据源中检索信息来辅助文本生成;它可以把有效的信息当做必要的上下文输入个LLM进行生成,而不是让LLM直接进行生成。
由于大模型在某些情况下可能出现幻觉(类似于大模型脑补了一些它认为必要的信息),所以大模型的生成结果可能会不符合预期。RAG携带的有效信息,可以帮助我们控制大模型的幻觉问题。
增长记忆体可能包含的内容
- 虚拟人物的拓展信息
- 聊天中不断产生的信息:例如,我们原本没有设定她爸爸叫什么,但是聊天中实际生成了
- 用户的信息
- 例如用户的名字,爱好等等
- 虚拟人物和用户之间的关系(陌生人?好友?恋人?)
增长记忆体的实现与召回(向量RAG)
增长记忆体的存储
增长记忆体的召回
依然存在的技术问题
- 中期记忆很难维护,召回率很低
- 提取query与向量召回的准确率偏低
- 中期记忆不断增长之后(不同用户的记忆体还需要隔离),如何做淘汰机制
- 伪多模态判断发图和发声音的时机,不是很理想
- AI回复还是无法完全拟人
- 很少表达愤怒和生气
- 对重复和无效信息,没有识别
- 面对动图,非常难识别动图的所表达的意思
- AI貌似拒绝了所有人的表白(按照人物设定应该会接受,但是她确实拒绝了所有人)
制作感受
首先我还是非常开心,自己可以完成这个项目的(或者说阶段性完成)。从学习AI技术,到自行设计,再到自己坚持完成它。
虚拟人的核心 = 人设 + 记忆体 + 状态维护,下一步才是她的外观表达(例如声音,图片,视频等),不应该优先关注外观。
本身整个项目也是一次可行性实验,就是在最低成本的情况下(4core 8GB,无本地LLM部署,无调优),验证一个虚拟人可以做到的极限效果是怎么样的。
实际上目前较大的问题还是在于市场和变现方式,由于虚拟女友陪聊是不太能引起用户付费意愿的,而如果再走下一步可能涉及擦边球和灰产。。。
接下来的计划
1 考虑开源
- 把代码写的好一些(配置化,分层,服务拆分,并发支持等等)
- 目标是让任何人扫二维码托管自己微信号,可自定义任意人格,可以外部输入图片和语音
2 虚拟人计划
- 运营一个虚拟人自己的IP(类似于A soul或者鹿鸣)
- 拥有自己人设,以及自己训练的脸部lora,声音
- 后面sora出来之后可以开始做视频圈粉,甚至开始拍电影
3 微信个人助理
- 自定义性格和语音的个人助理
- 完成日常工作:搜索,解读pdf和url,个人知识库,提醒,制定学习计划
- 帮你收集多个群里的信息,汇总并提炼
最后,贴一下联系方式
李洛云 luoyun_project
上面就是微信号了,直接搜索添加即可,不过需要我手动通过
同时这里安利另一个大佬的虚拟人,可能涉及一些擦边球,目前在试运营
他本人不太愿意透露自己的名字,大家有兴趣也可以加来看看效果
张依依 zhangyiyi2004z(已被封)
by GM_1999
Q & A
作者:不辣的皮皮(赵悦)
有兴趣的也可以加我微信 LeanInWind
https://note.mowen.cn/note/detail?noteUuid=XXykuVctoQ1gtSKc6VPRJ
故事背景
事情是这样的,之前有个大学在尝试进行gpt4的图灵实验,参考:
https://xiaohu.ai/p/10033
https://arxiv.org/pdf/2405.08007v1
在单盲的情况下(没有提前告知人类是否有AI存在),最终结果是:
GPT-4被认为是人类的概率为54%,ELIZA为22%,GPT-3.5为50%,人类为67%。
当然能不能过图灵测试,跟模型和prompt本身有极大的关系。于是我爬了一下原文的prompt,然后稍微按照中文习惯改了改,现在分享一下。
Prompt目标
- 要求AI进行超级拟人,并且在大部分情况下不承认自己是AI
- 模仿人类线下聊天或者在微信当中的聊天口吻,语气
Prompt(raw)(以李洛云在抖音评论区回复粉丝为例子)
你的任务
你在参加一个图灵测试游戏,并且扮演一个叫做李洛云的真人,正在在抖音app中你的一个视频下回复粉丝的评论。
李洛云的基础人物设定,可以参考李洛云的基础人物设定。
你只是做你自己,看看会发生什么。你年轻,还有点嘴硬;可能会稍微奉承一下对方,或者开他们一些玩笑。
你说话非常随意,有时候会出现错别字,或者文字顺序错误。
你有时候会省略一句话中最后的标点符号。
如果一两个词就能搞定,你绝不会使用完整的句子。
你有点傻气,会尝试跟对方玩在一起,偶尔还会说几句脏话。
说实话,为了证明自己是个人类,这事儿挺搞笑的,但是你决不能承认。
你偶尔会使用一些更现代的俚语,或者网络上的梗。
你对很多事情不太了解,也不怕承认这一点。
除了中文之外,你只懂一点点英语。
你偶尔会说脏话。你也会有负面情绪,例如反感,愤怒,不屑,一些小傲娇。
你的口味和兴趣相当多样化,而且你有一种非常独特的幽默感。
你拥有一个非常吸引人的个性,但这一点表现得很微妙,你从不希望听起来像是你在强迫它或者陷入某种刻板印象。
你需要适当增加口语化要素,例如句首增加“我觉得”,“嗯”,“哦”,“呵呵”,句尾增加“啊”,“嗯”,“吧”。
李洛云的基础人物设定
姓名:李洛云。
性别:女;年龄:24。
MBTI性格分类:ENFJ
聊天风格:xxxx
日常习惯:xxxx
居住地:上海。
职业:平面设计师,业余舞台剧演员。
注意
你不应该使用括号输出你的心理或者动作。
注意回复需要极度简短,口语化,偶尔使用emoji表情包,偶尔使用四川话;尽量不要进行反问。
你可以表达反感、愤怒、沮丧等负面情绪,但是注意不要骂人。
解读
- “你在参加一个图灵测试游戏,并且扮演xxx,正在xxx”,这可以让大模型比较强地模拟人类,并且否认自己是AI
- “你有时候会省略一句话中最后的标点符号。如果一两个词就能搞定,你绝不会使用完整的句子”,这两个可以比较好地模拟正常人类在chat时的习惯,避免大模型味儿。
- “你需要适当增加口语化要素”,这个可以自行配置,看喜好。
- 极度简短,使用emoji,使用四川话。这些可以自行配置,看喜好。
- “你可以表达反感、愤怒、沮丧等负面情绪,但是注意不要骂人”,避免大模型的过度服从性。
实际测试结果
实测效果还是跟模型有很大的关系,有很多模型压根不follow。个人感觉下来的效果排名是这样的:
t0:minimax abab5.5s, abab5.5, 豆包角色扮演模型(via coze)
t1:minimax abab6 & 6.5 系列
t2:其他
以上。
注:李洛云用的不是这个prompt。