今天是2023年7月25日,周二,天气晴,踏上返程,我们继续来谈一个有趣的事儿。
我们在前面说到,目前大模型用于特定领域的文档问答搜索已经成为了少见的几个落地场景,通过给定一些文档,进行切分,建立索引,召回相关文档,拼接上下文并进行作答,可以解决传统问答受限的一些问题。
而作为这一问答范式的延伸,角色扮演以及数字人也同在受到关注,角色扮演通过引入限定风格的角色,并加入语音、视频等多模态数据,形成一个虚拟人,来进行互动,以解决一些特定的对话体验需求。
事实上,当前已经有许多的数字人相关产品出现,例如Real char,character.ai等,下表恩重如山开源情况、个性化角色定义等方面进行了对比。
但问题又来了,即其内部实现机制为何,这个是我们加上对其理解的一个重要途径。
这两天社区也对这一话题进行了讨论,本文先引用社区的一些观点跟经验,然后谈谈现有的几个代表的项目,尝试谈谈其中的技术原理,供大家一起参考。
一、话题的提出
这几天,最近看了下数字人,例如character.ai,有个很自然的疑问,即它的底层实现逻辑那么多角色,是怎么训练的,用的什么语料都是值得我们关注的点。
顺着昨天的鲁迅prompt的工作,项目:https://chatmarx.zihaoai.cn展示了大学思政教材问答人工智能,可以向AI提问关于中国近现代史、思修、相关的问题,并在下方切换AI的不同角色设定:匹配教材原文、回答考卷试题等,其底层在实现上采用了langchain的方案。
有趣的是,其提供了导师、知识点、学霸、鲁迅等几个人物角色的回复方式,相当于是角色扮演。
而其实现思路也十分简单,如下图,其为每个角色都设定了一个对应的提示词模板,然后将用户的问题填充至模板当中。进而让模型进行问题回复。
例如,选择鲁迅这一角色,让其来评价一下目前标题党泛滥的问题,效果如下:
可以看到,有模有样。
至于为什么好使,其本质在于大模型内部已经学过了鲁迅的一些知识,包括鲁迅写的文章,鲁迅的一些语录等,而借助人设prompt。即可以激活出其风格,从而达到模仿的效果。
因此,我们可以很显然的看到,这种方案扩展性很差,效果很受限【尤其是,聊的很深入,或者问及其基本信息时,幻觉问题会十分严重】,也就是说直接加人设prompt,这个引入的人设信息太少,对基础模型依赖性太高。
顺着这个话题,早上大家已经开始在做这样的一些讨论,如下:
设置prompt,组织角色语料,通过 system prompt + samples + history + question 构建完整的prompt,另一种方式是进行finetune微调。
论文题目: Unleashing Cognitive Synergy in Large Language Models: A Task-Solving Agent through Multi-Persona Self-Collaboration论文链接: https://arxiv.org/abs/2307.05300,可以参考这个方面的工作。
而说到数字人这个方向,也有朋友表示,不看好这个创业方向,一是版权问题,热门人物一定有版权,不然就只能做古人,二是没啥门槛,做大模型开放问答的公司很容易直接集成这个功能。
还是要看模型本身的能力。就像前面说的,和于谦讲相声就不太行。一些能力如果模型没有,就要想很多工程上的方案去规避和绕路。目前AI就是这种AI弱智就补丁摞补丁, 最好是核心的Ai能力强一些,否则确实累。
二、从character.ai说起
上面说了一些具体的观点,我们现在来看看几个代表性的产品。
我们首先来看character.ai,该产品给出了一个虚拟人物的自主构建框架。
地址:https://beta.character.ai
这个产品的核心在于,用户可以自行的定义出破需要建模角色的名称、问候语、关于角色的简介包括短的,长的,这些都是作为外部上下文知识来引入的。
因此,其实现方式就变成了两种,一种是基于用户设定的上述知识作为背景知识进行问答,这种方式最为朴素,没有训练过程,如下图所示。
另一种是基于训练的方式,即用户可以在对话中通过反馈(回答1-4打分,左右滑选择最喜欢的回答),这相当于是在构造标注数据,积累对话数据,从而更好地贴近角色设定。
不过,这自然而然就会涉及到一个问题,即:使用星级打分等方式来训练角色的效果确实很好,可以塑造角色的说话风格和细节,但这种方式需要用户进行大量对话,消耗很多时间和精力,训练出一个符合预期的角色门槛较高。
因此,我们就会想到一个方法,能否预先地给角色找到符合其风格的对话语料,包括采访,演讲,聊天记录等内容,构造对应的SFT数据,从而完成训练。
但,实际情况是,这类数据并不好找。
三、再看realchar的实现方式
RealChar,是另一个数字人的项目,与character.ai相比,更为简单,可创建、自定义并实时与你的AI角色/同伴对话。
项目地址:https://github.com/Shaunwei/RealChar
在实现路径上,也很有趣,如上图所示,其本质上是基于外挂知识库的方式在做,并在工程集成了多个模态的工具,其在实现工程上做了很多工作上的集成,包括:Web:Vanilla JS、WebSockets
移动:Swift、WebSockets;
后端:FastAPI、SQLite、Docker;
数据摄取:LlamaIndex、Chroma;
LLM 编排:LangChain、Chroma;
LLM:OpenAI GPT3.5/4、Anthropic Claude 2;
语音转文本:本地 Whisper、OpenAI Whisper API、Google Speech to Text;
文字转语音:ElevenLabs;
语音克隆:ElevenLabs;
这些工具,对于提升我们的工程系统观,有很大帮助。另外,该代码也开源,感兴趣的可以研究源码。
四、再看微调风格开源项目LuXun-GPT
LuXun-GPT: ChatGLM+LoRA微调的鲁迅风格改写模型 ,其实际上与上述的数字人个角色扮演还不同,其解决的是特定角色写作风格的模拟。
如下面是一个很不恰当的最终效果:
地址:https://github.com/Suffoquer-fang/LuXun-GPT
该项目开源了经过LoRA指令微调(Instruct-tuning)的ChatGLM-6B模型,可以用鲁迅的语言风格改写给定的输入。
其具体实现上,思路也很简单,针对给定的任务(鲁迅风格的文本改写/翻译),通过鲁迅的文章和GPT3.5 API构建了对应的指令数据集,并在此基础上对ChatGLM-6B进行了指令微调。
在数据集构建上,该工作通过将鲁迅的文章反向改写为原始文本,可以构建pair-wise的训练数据。鲁迅的文章地址,可以参见:https://github.com/Ac-heron/luxun
{
"Input": "在我的后园,可以看见墙外有两株树,一株是枣树,还有一株也是枣树。"
"Output": "在我的院子里有两棵树,都是枣树。"
}
利用ChatGPT 3.5的接口,可以进行不同领域的数据扩增,使得最终的训练样本更加丰富。
{
"Input": "在我的后园,可以看见墙外有两株树,一株是枣树,还有一株也是枣树。",
"Output": [
"在博物馆里,可以看见有两件文物,一件是陶器,还有一件也是陶器。",
"在公园里,可以看见有两只鸟,一只是麻雀,还有一只也是麻雀。",
"在我的画室里,可以看见画架上有两幅画,一幅是油画,还有一幅也是油画。",
"在我的邮箱里,可以看见两封信,一封是邀请函,还有一封也是邀请函。",
"在电影院,可以看见有两部电影,一部是喜剧片,还有一部也是喜剧片。"
]
}
总结
本文针对数字人角色扮演这一话题进行了讨论,本文先引用社区的一些观点跟经验,然后谈了谈现有的几个代表的项目,尝试谈谈其中的技术原理,但并没太细。
总结的说,方式就两种,设置prompt,组织角色语料,通过 system prompt + samples + history + question 构建完整的prompt,另一种方式是进行finetune微调。前者很快,足够简单,但效果并不好。后者则涉及到相应微调数据的获取等挑战。
已下车,深夜里竟然都是蝉鸣,果然是热的夏天了!
关于我们
老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
对于想加入更优质的知识图谱、事件图谱实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。
