字号:TTT

原华为“天才少年”4万字演讲,谈谈天才眼中的AI


其实咱们在场很多做大模型的同事都应该感谢知乎,为什么呢?因为知乎给我们中文大模型提供了很重要的预训练语料,知乎的语料质量在国内UGC 的平台里算是非常高的了。

我们用来做微调的语料可以大致分为对话性语料和事实性语料两类。对话性语料包括像Twitter、聊天记录等,往往是第一人称的,主要是用来微调人物的个性和说话的风格。而事实性语料包括 Wikipedia上关于他的页面、关于他的新闻以及博客等,往往是第三人称的,这些可能更多的是关于这个人物事实性的记忆。这里就有一个矛盾,就是如果只用对话性语料去训练,他可能只能学到该人的说话风格和思维方式,但学不到关于他的很多事实性记忆。但如果只用事实性语料训练,又会导致其说话风格像是写文章的人的风格,而不是那个人本人的说话风格。

那么如何平衡这两者呢?我们采用了一个两步训练的方法。第一步,我们先用对话性语料去微调他的个性和说话风格。第二步,再去把事实性语料进行数据清洗后,基于各种角度提问,生成这个人物第一人称口吻的回答,这叫做数据增强。用这种数据增强之后生成的回答,再去微调人物的事实记忆。也就是说,所有用来微调事实记忆的语料都已经以第一人称的口吻组织成了问题和回答对。这样也解决了微调领域的另一个问题,即事实性语料往往是长篇文章,而长篇文章不能直接用来做微调,只能用来做预训练。微调需要一些QA pair,也就是问题和回答对。

我们不是使用 LLaMA-2 Chat 或者 Vicuna 这样的通用 Chat模型作为基础模型,因为这些模型其实并不是为真人对话设计的,而是为 ChatGPT这样的智能助手设计的;它们说话往往太官方、太正式、太冗长,并不像人实际说话。因此,我们采用了影视字幕、公开群组聊天这样的一些通用对话语料进行微调,从LLaMA、Mistral这些开源基础大模型的基础上,微调出一个对话大模型,它说话的感觉更像日常生活中的真人。在这个对话模型的基础上再微调具体人物的说话风格和记忆,效果会更好。

有趣的灵魂:目前的差距

点击图片看原样大小图片

有趣的灵魂绝不仅仅是上面说的微调记忆和个性,还有很多深层次的问题。我们结合几个例子来看一下,现在的 AI Agents在有趣的灵魂方面还有哪些差距。

比如我跟 Character AI 上面的马斯克去聊天,同一个问题问五遍,“马斯克”永远不会抓狂,每次都回复类似的内容,好像之前从来都没有问过。

一个真人不仅能记住之前聊过的问题,不会生成重复的回答,而且如果同一个问题连问五遍,一定会生气。我们还记得 Sam Altman说的吗,AI 是一个工具,不是一个生命。因此 “像人一样会生气” 就不是 OpenAI的目标。但对于一个娱乐场景下好玩的应用,“像人” 是非常重要的。

点击图片看原样大小图片

另外比如说你问 Character AI 上的马斯克,你还记得我们第一次见面吗?

它会随便瞎编一个,那不仅是幻觉的问题,同时还反映了AI 缺少长期记忆。

现在已经有一些平台改进了这点,比如 Inflection 的 Pi 在记忆方面就比 Character AI 好很多。

点击图片看原样大小图片

另外你问 Character AI 上的马斯克 “你是谁”,有的时候它说自己是GPT,有的时候它说自己是川普,它自己不知道它自己到底是谁。

实际上 Google 的 Gemini 也会有类似的问题,Gemini API 甚至把 OpenAI 和 GPT这些关键词都给屏蔽掉了。如果用中文问,Gemini 一开始说自己是文心一言。后来这个 bug 修复了,又说自己是小爱同学了。

有人说这是因为互联网上的语料已经被大量 AI 生成的内容污染了。数据集污染确实不好,但这不是答错 ”你是谁“的借口。身份问题都是要做微调的,比如 Vicuna 模型为了让它回答自己是 Vicuna 而不是 GPT 和LLaMA,让它回答自己是 LMSys 而不是 OpenAI 做的,是专门构造了微调数据的,在 Vicuna的开源代码中可以找到。

点击图片看原样大小图片

另外还有很多的深层的问题,比如说给 AI Agent 说“我明天要去医院看病”,那么明天他会不会主动关心你看病结果怎么样。还有如果多个人在一起能不能正常聊天,而不会互相抢麦,大家都说个没完没了。还有一句话敲到一半的时候,他会等你说完,还是立即回复一些不知所云的东西。还有很多类似的这样的问题。

AI Agent 也需要能够与其他 Agent 社交。比如目前的 Agent跟每个人的记忆都是互相隔离的,一个数字生命如果从小明这里得到一个知识,他应该跟小红聊天的时候也知道,但是如果说它在从小明这里得到了一个秘密,跟小红聊天的时候他可能就不能说。Agent社交也是一个很有意思的方向。

有趣的灵魂:慢思考与记忆

点击图片看原样大小图片

要解决这些问题需要一个系统的解决方案,关键就是一个慢思考。我们开头就讲过,慢思考是神经科学的一个概念,区别于基础的感知、理解、生成这些快思考能力。我们前面提到“好看的皮囊” 里面这些多模态的能力,可以认为是快思考。而 “有趣的灵魂” 更多需要慢思考。

我们可以思考一下,人类是如何感觉到时间流逝的?有一种说法认为,时间流逝感源自工作记忆的消逝。另一种说法认为,时间流逝感源自思考的速度。我认为这两种说法都是对的。这也是大模型思考的两个本质问题:记忆(memory)和自主思考(autonomy)。

人的工作记忆只能记住 7 项左右的原始数据,其余数据都是整理后储存,再进行匹配和提取。今天的大模型 attention是线性的,上下文不管多长,都是线性扫描,这不仅效率低下,也难以提取逻辑深度较深的信息。

人类的思考是基于语言的。《人类简史》认为语言的发明是人类区别于动物最明显的标志,因为只有基于复杂的语言才可能进行复杂的思考。我们在大脑中没有说出来的话,就像大模型的Chain-of-Thought(思维链),是思考的中间结果。大模型需要 token 来思考,而 token就像是大模型的时间。

慢思考里面包括很多组件,包括记忆、情感、任务规划、工具使用等。我们在有趣的 AI 这一部分,重点介绍记忆和情感这两块。

点击图片看原样大小图片

其中的第一个问题就是长期记忆。

其实我们应该庆幸大模型帮我们解决了短期记忆的问题。上一代的模型,比如基于 BERT的那些模型,很难理解上下文之间的关联。当时一个指代问题就很难解决,搞不清楚 “他” 说的是谁,“这个”指的是哪个东西。表现出来就是,前面几个回合告诉 AI 的东西,后面几个回合就忘了。基于 Transformer的大模型是首个根本上解决上下文之间语义关联的技术,可以说是解决了短期记忆的问题。

但 Transformer 的记忆是用 attention实现的,受限于上下文长度。超出上下文的历史只能丢掉。那么超出上下文的长期记忆怎么解决?学界有两条路线,一条是长上下文,就是把上下文支持到100K 甚至无限大。另一条是 RAG 和信息压缩,就是把输入的信息总结整理之后再压缩存储,需要的时候只提取相关的记忆。

第一条路线的支持者认为,长上下文是一种更干净、更简单的方案,依靠 scalinglaw,算力足够便宜就行。长上下文模型如果做得好,可以记住输入信息中的所有细节。比如有一个经典的 “needle in ahaystack”(大海捞针)信息提取测试,输入一本几十万字的小说,就书中的一个细节提问,大模型都能回答出来。这是人类难以企及的超强细节记忆力。而且读这几十万字内容只要几十秒,简直是比量子波动速读还快。这就是大模型能力超过人的一个地方。

长上下文虽然效果好,但就目前而言,成本还是太高,因为 attention 的成本是跟上下文长度成正比的。OpenAI 之类的API 也是要对 input token 收费的,比如 8K 输入 token 的上下文,500 token 的输出,GPT-4Turbo 输入部分的成本是 $0.08,输出部分的成本却只有 $0.015,成本的大头都在输入上。如果 128K token的输入用满,一个请求就要 $1.28。

有人会说现在输入 token 贵是因为没有做持久化,每次重复输入前面相同的长下文(例如对话记录或长篇文档)都需要重新计算 KVCache。但就算把 KV Cache 全都缓存到片外的 DDR 内存里,DDR 和 HBM内存之间的搬入搬出也需要消耗很多资源。如果 AI 芯片能构建一个足够大、足够便宜的内存池,比如用高速互联把大量的 DDR连上来,可能这个问题会有新的解决思路。

在当前技术条件下,长期记忆我认为关键是个信息压缩的问题。我们不追求在几十万字的输入中大海捞针,像人类一样的记忆可能就足够了。目前大模型的记忆就是聊天记录,而人类记忆显然不是用聊天记录的方式工作的。大家正常聊天的时候不会不停地在那儿翻聊天记录,而且人也记不住聊过的每一个字。

一个人真正的记忆应该是他对周围环境的感知,不仅包括别人说的话、他说的话,还包括他当时想了什么。而聊天记录里面的信息是零散的,不包含人自己的理解和思考。比如别人说了一段话我可能被激怒可能不被激怒,但人是会把当时是否被激怒了这个心情记忆下来的。如果不做记忆,每次都根据原始聊天记录去推断当时的心情,那可能每次推出来的都不一样,就可能发生前后不一致的问题。

点击图片看原样大小图片

长期记忆实际上有很多的东西可以做。记忆可以分为事实性的记忆和程序性的记忆。事实性记忆比如我们第一次是什么时候见面的,程序性记忆比如个性以及说话风格。前面讲到人物角色微调的时候也提到了对话性语料和事实性语料,对应的就是这里的程序记忆和事实记忆。

事实性记忆里面也有多种方案,比如总结、RAG 和长上下文。

总结就是信息压缩。最简单的总结方法是文本总结,也就是把聊天记录用一小段话总结一下。更好的方法是用指令的方式去访问外部存储,就像UC Berkeley 的 MemGPT 这个工作。ChatGPT 新增的记忆功能也是用类似 MemGPT的方法,模型把对话中的要点记录到一个叫做 bio 的小本本上。还有一种方法是在模型层面上用 embedding 做总结,比如LongGPT 这个工作,目前主要是学术界在研究,实用性没有 MemGPT 和文本总结强。

大家最熟悉的事实性记忆方案可能是 RAG(Retrieval Augmented Generation)了。RAG就是搜索相关的信息片段,再把搜索结果放到大模型的上下文里,让大模型基于搜索结果回答问题。很多人说 RAG就等于向量数据库,但我认为RAG 背后一定是一整套信息检索系统,RAG一定不是向量数据库这么简单。因为大规模语料库仅仅使用向量数据库的匹配准确率是非常低的。向量数据库比较适合语义匹配,传统的 BM25之类基于关键词的检索比较适合细节匹配。而且不同信息片段的重要程度不同,需要有个搜索结果排序的能力。现在 Google 的 Bard比微软的 New Bing 效果好一些,这就是背后搜索引擎能力的差别。

长上下文前面已经提到了,可能是一种终极方案。如果长上下文结合持久化 KV Cache、KV Cache 的压缩技术和一些attention 的优化技术,可以做到足够便宜,那么只要把所有对话的历史和 AI当时的思考和心情记录下来,就可以实现一个记忆力比人还好的 AI Agent。但是有趣的 AI Agent记忆力如果太好,比如能清楚的记得一年前的早上吃了什么,会不会显得不太正常,这就是需要产品设计方面思考了。

这三种技术也不是互斥的,它们是互相补充的。比如说总结和 RAG就是可以结合在一起的,我们可以分门别类的做总结,对每一次聊天做总结,一年下来这些总结也会有很多内容,需要 RAG的方法提取有关的总结,作为大模型的上下文。

程序性的记忆,比如个性和说话风格,我认为比较难仅仅通过 prompt 的方式解决,few-shot的效果一般也不是很好。短期来看微调仍然是效果最好的路线,长期来看 Memba 和 RWKV这些新的架构是存储程序性记忆比较好的方式。

点击图片看原样大小图片

这里我们讲一个简单有效的长期记忆解决方案,是文本总结和 RAG 相结合的。

原始聊天记录首先按照一定的窗口分段,然后对每一段聊天记录生成文本总结。为了避免段落开头丢失上下文,可以把上一段聊天记录的文本总结也作为输入交给大模型。每一段聊天记录的总结都拿去做RAG。

RAG 的时候使用向量数据库和倒排索引结合的方式,向量数据库做语义匹配,倒排索引做关键词匹配,这样recall(查全率)会高一些。然后需要有一个排序系统,取出 top K 的结果拿去送给大模型。

如果只是生成每段聊天记录的总结,会造成两个问题,首先是一个用户的基本信息、兴趣爱好、性格特征并不包含在每段聊天记录的总结中,但这部分信息又是记忆中非常关键的部分。另一个问题是不同段的聊天记录可能存在矛盾,比如多次开会讨论同一个问题,结论肯定要以最后一次开会的为准,但如果用RAG 的方式提取出每次开会的总结,那会提取出很多过时的总结,可能在有限的上下文窗口中不能找到想要的内容。

因此,我们在分段总结的基础上,再让大模型分别生成分话题的分类总结和全局的用户记忆概要。分话题的分类总结,就是根据文本总结内容确定是哪个话题的,然后把相关话题的原有总结内容加上新的聊天记录,更新这个话题的文本总结。这些分话题的总结也放进数据库用来做RAG,但是它在搜索结果排序时候的权重比原始聊天记录总结更高,因为分话题的总结信息密度更高。

而全局记忆概要就是一个不断更新的全局总结,包括用户的基本信息,兴趣爱好和性格特征等。我们知道一般 system prompt就是一个角色的设定,那么这个全局记忆概要可以认为是角色对用户的核心记忆,每次请求大模型的时候都会带着。

大模型的输入包括角色的设定、最近对话、全局记忆概要、经过 RAG的聊天记录分段总结和分类总结。这个长期记忆的方案不需要很高的长上下文成本,但在很多场景下都是比较实用的。

点击图片看原样大小图片




还没有人评论



    还可输入500个字!
    ©2023 wailaike.net,all rights reserved
    0.02346396446228 is seconds