ZMonster's Blog 巧者劳而智者忧,无能者无所求,饱食而遨游,泛若不系之舟

LLM Prompt Engineering 实践:序

本文是《LLM Prompt Engineering 实践》系列的第一篇文章,系列文章如下:

  1. LLM Prompt Engineering 实践:序 · ZMonster's Blog
  2. LLM Prompt Engineering 实践:原型 · ZMonster's Blog
  3. LLM Prompt Engineering 实践:记忆(1) · ZMonster's Blog

ChatGPT 刚发布不久,我就把它接进了飞书供公司同事使用,回过头去看当时的聊天记录,那个时候它还是会经常拒绝回答,虽然相比过去的对话机器人有了非常大的提高,但还是显得有点呆笨的样子,对于它到底能做什么我并不是特别了解,再加上公司裁员、北京疫情(12月上半个月是北京疫情的高峰期)的因素,我就没花太多精力在这方面。春节回来后,可能是因为社会放开了以及经过两个月的发酵,非常明显地感觉到讨论热度在上升,我也开始去做更详细的了解 —— 一方面是持续地去使用 ChatGPT 以及了解其他人怎么使用,另外一方面是开始看相关的论文了解背后的技术变迁。ChatGPT 在模型上除了 RLHF 外我是大致熟悉的,但是近几年困在工作和情绪里没怎么去关注学术进展了,所以二月、三月主要是在补课,顺着几篇比较高质量的综述论文把过去几年的一些工作和思路看了下,慢慢地就对现在大语言模型面临的问题以及可能的发展方向有了一些感觉。

毫无疑问,以 ChatGPT 为代表的大语言模型是很有价值的。从专业角度来看,如果不考虑成本的话,原来的大部分简单 NLP 任务都已经没有必要再做,有人因此担心 NLP 工程师要失业,但我觉得对 NLP 领域整体上来说是好事情,领域和行业的能力下限因此得到了提高,原来我们认为很复杂的、只能花昂贵代价做小规模应用的事情现在也可以得到普及(比如说基于文档的问答),我们也终于可以有更多的精力去讨论自然语言里更深层的原理和问题了。从用户角度看,ChatGPT 无疑也有非常大的潜能,回答知识性问题、辅助写作、翻译、总结、处理数据、写代码、绘图……似乎我们能想到的通过语言来做的事情,它都能做并且做得还不错,作为工具来说它已经大大提高了使用者处理事情的效率,并且还在被用户不断地挖掘出新的用法和能力,不管它的长期影响是好是坏,我想没有人会否认它很能干这个事实。

在受益于 ChatGPT 的同时,很多人也因此非常焦虑,我多少也有一点,这种焦虑的根源主要在于 ChatGPT 后续影响的不确定性。目前观察到的应对这种焦虑的方式主要有几种:

  1. 通过追踪新的资讯、动态来证明自己能跟上变化,但往往因为人的精力有限而使自己非常疲惫并造成进一步的焦虑;
  2. 通过预测(或看别人预测)大语言模型普及背景下的行业和社会未来以减轻焦虑,但是真的了解专业知识又具有宏观视野的人还是比较少,大部分非专业人士之间的相关讨论往往落入玄谈范畴,或者索性变成个人世界观的输出;
  3. 通过重度使用、开发相关工具或应用、推动相关社会治理规范来参与新生态的建设,但是由于目前尚处于新生态早期,工具和方法论都非常不完善,想象力也还是不够。

作为一个工程师,我不认为自己具备预测未来的宏观视野,但我想我还是可以参与到新生态建设里去的。以 ChatGPT 为代表的大语言模型效果确实非常强,但它也还是有非常多问题的,和所有机器学习模型一样,这些问题在之后有可能会慢慢地得到缓解,但绝对不会消失,如果要将大语言模型作为一个基础设施来构建应用,那么这些问题必然要有相应的应对机制,我相信新的生态会在这个基础上生长出来。这些问题已经在大量的论文中被提出讨论了,我自己也有维护相应的笔记来追踪这些问题的研究进展,本来是想以各个问题作为出发点来写一些文章做一些讨论的,不过不少问题即使在研究上也还处在探索讨论的阶段,只是单纯整理出来作为科普觉得会有点枯燥,于是决定写一个项目,通过代码的方式来展示我对这些问题的应对方法的思考和尝试。

对大语言模型,我们目前已经知道的问题有:

  1. 模型偏差问题: 模型会表现出对特定领域的倾向性而不是在各种问题上完全中立客观,在有上下文时模型会表现出近期偏差和标签偏差;
  2. 评估问题: 对输入和输出结果,我们缺乏足够有效的评估手段;
  3. 知识幻觉问题: 有时候语言模型会输出一些与给定上下文或客观事实不符的内容,该问题是由训练数据噪声、表示学习的不充分、解码方法、记忆机制缺失等众多复杂因素导致的;
  4. 记忆机制的缺失: 语言模型本身未设计任何记忆机制,以 ChatGPT 为代表的产品仅能将需要记忆的内容同其他内容一起输入给语言模型,需要模型自己对区分输入中哪部分是记忆、哪部分是指令及其他内容,也因此无法像人一样维护长期记忆;
  5. 多轮对话状态管理: 在对话模式下,对话场景的开始、跳出、返回、结束,目前全依靠语言模型自身进行辨别但做得并不是特别好;
  6. 复杂结构数据的处理: 对体量较大但内部结构简单的数据目前可以切片处理,但对内部结构复杂的数据(如完整的项目源代码)目前要处理还是比较麻烦;
  7. 复杂操作的执行: 人类往往对自己给出的指令的复杂性不太敏感,有时候认为理所当然的简单要求实际上可能需要分解成复杂的步骤才能完成,分解后的步骤之间也可能存在复杂的关系。

我准备写的这个项目,计划由易而难地推进,最开始应该就是实现一个简单的机器人,设定一个初始 Prompt,每次对话时带上之前的聊天历史,然后逐步实现记忆机制、加上对知识幻觉的处理、整合阅读网页和文档的能力、整合图像和音频理解能力、加上任务分解和执行能力、实现人设的一致性和连续性、模拟出自我意识、统治人类……这些都不难,多多少少也在很多其他项目中实现过了,大概率不会有特别突破性的东西,甚至有可能鸽掉……总之,我现在要去解决最困难的一个问题了,那就是,这个项目该叫什么名字?