上下文、记忆和知识库,AI到底“记住”了什么

周全 · 法律AI与数字工作 · 首发于

公众号原文(新标签页)

开篇先问个问题:你是更喜欢和熟人交流,还是和陌生人交流?

当然,也有人会说,我就喜欢和陌生人交流。那我只能说一句:社牛。

通常情况下,人还是更愿意和熟人交流。有可能越熟,聊得越多,这叫有说不完的话;也可能越熟,表达得越简洁,很多背景和前提都可以省略,这叫有默契。

其实,和AI交流也有点像。AI掌握的背景越多,我需要重复说明的内容就越少。有时即使新建一个对话,它仍然可以通过记忆知道我的职业背景和表达偏好,回答也会更贴合我的实际需要。

但这种“记得”并不意味着所有信息都会在不同空间之间自动流转。职业背景等长期信息可能通过记忆继续使用,具体项目的文件、事实和特殊要求,仍然需要放在相应的对话、项目或者知识文件中。

实际上,当前对话、上下文、记忆、项目和知识库都可能影响AI的回答,但它们保存和调用信息的方式并不相同。要判断一项信息为什么没有被使用,又应当补到哪里,首先要分清AI这一次能够看到什么、哪些信息可能跨对话继续使用,以及需要时可以去哪里查找资料。

一、上下文决定AI这一次能够看到什么

向AI提交一份合同,再补充“请站在销售方立场审查,重点关注交期和违约责任”,待审合同和补充要求都会进入当前任务。

模型生成回答时,可以使用的内容通常不止这一条消息。前面的对话、上传的文件、产品预设的指令、从知识文件中检索到的片段,以及工具返回的结果,都可能参与本次回答。这些当前可以被模型处理的信息,可以统称为上下文。

以合同审查为例,模型要分析交付、付款和违约责任之间的关系,需要同时看到合同中的相关条款。如果部分约定只写在附件中,而附件没有上传或者没有被正确读取,模型就可能在材料不完整的情况下继续分析。问题出在当前任务缺少必要上下文,不一定说明模型完全不具备相应能力。

所以,使用AI得到相对准确、稳定且可以复现的结果,一个重要前提,就是提供充分、准确且与当前任务相关的上下文。现在,司法系统中已经有部分法院开始探索使用AI辅助案件材料整理、类案检索、文书生成和审判管理。我们团队在研究和测试LawBuddy的过程中也发现,完成当前任务所需要的上下文越充分,AI越不容易脱离现有材料进行过度推理和臆想,形成的分析结论也越容易核验。

就像以深圳中院为代表的各地司法系统也开始进行AI辅助司法审判。司法审判是一个很能说明上下文重要性的场景。一个案件进入审判程序后,原告会提交起诉状,说明诉讼请求、事实和理由;被告会提交答辩状,回应原告的主张;双方还会分别提交证据、质证意见、代理意见和其他诉讼材料。法官作出判断时,看到的并不是一个孤立的问题,而是由各方主张、案件事实、证据材料和法律依据共同构成的完整案件背景。

这些材料如果能够被准确读取并组织起来,也就为AI提供了相对充分的上下文。AI不再需要根据一句简单描述猜测案件经过,而是可以围绕原告主张什么、被告如何回应、各自提交了哪些证据、争议焦点在哪里进行检索、归纳和比对。与案件争议相关的上下文越完整、组织越清楚,AI越容易把分析限定在已有材料和争议范围内,减少脱离案件事实进行过度推理或者自行补充前提的情况。

但是,随着对上下文的重视不断增加,又容易出现过犹不及的情况。不论材料是否重要、与当前问题是否真正相关,只要稍微沾边,就一股脑地塞给AI读取。这样不仅不一定提高回答质量,反而可能造成重点偏移。

很多人说,现在的人都缺乏注意力,因为注意力总会被各种各样的信息吸引。注意力被消耗殆尽的后果,就是抓不住主线,忙忙碌碌一天,却不知道自己究竟在干什么。对AI来说,也存在类似的问题:提供的信息越多,并不代表它越能准确抓住重点。

从实际使用效果来看,造成AI回答偏移的原因可能有很多。上下文具有容量限制,随着对话轮次和材料数量增加,早期内容可能被压缩、截断,或者没有在当前回答中得到充分关注;无关信息、过时要求和已经放弃的方案也可能持续占据上下文,使模型难以判断哪些内容才是当前真正有效的要求。

之前看过腾讯的一个公众号,这里也顺便推荐一下——“腾讯技术工程”。里面的内容非常干,干到我有些时候甚至看不太懂。但不知道是不是学法律导致的,现在看到一个东西,就总想研究它背后的机制和原理,所以只能逼着自己继续看。

这个公众号有时会发布一些AI理论和工程实践方面的内容,我也算是把自己硬啃下来的干货,再转述成相对容易理解的白话。

书归正题。这个公众号曾经发过一篇文章,其中一位腾讯AI产品工程师介绍了使用AI时怎样“讲卫生”。他的核心建议是:不要让一个会话逐渐变成堆积历史日志、工具调用记录和过时要求的“垃圾桶”。任务发生变化、对话已经明显跑偏,或者间隔较长时间以后再继续推进,都可以考虑新建对话,而不是依赖模型不断翻查冗长的历史记录。

文章中还给出了一些更具体的经验判断:

别让会话变垃圾桶。超长会话堆积历史日志和工具调用记录,模型翻旧账,又贵又慢。换任务就开新对话,跑偏了重开重说背景,距上一条超一小时也重开。只有同一任务连续推进且不足一小时,留原对话才划算。

这个判断,确实让我有一种醍醐灌顶的感觉,不亚于之前另一位现实中认识的腾讯工程师问我:“你现在还手写文章的吗?”

要知道,在读到这篇文章之前,我可是一直把自己的“历史会话”当个宝。那会儿正是已经知道上下文重要,却还不知道怎样管理上下文的时候。我只认识到,这个历史会话里的内容都是长期积累,也是经过我反复矫正、确认和沉淀下来的成果,所以舍不得放弃。只要稍微沾边,同类型或者具有接续关系的事项,我都会继续放在这个历史会话中推进。

结果就是,会话越来越长,旧要求和新要求交织在一起,已经放弃的方案也可能继续产生干扰。使用体验上最直观的感受就是:AI好像被我越用越笨了。

我又想到开发LawBuddy产品时的一件事。有一次版本更新后,我发现原来常驻在界面左侧的多个对话,被折叠进了一个需要找半天才能找到的“历史会话”栏目。我当时还一本正经地要求技术专家改回去,理由是:

围绕一个项目新建的多个对话,大部分时候不是先后顺序或者新旧关系,而是本身就在并行使用。对话常驻在屏幕左侧,会更方便来回查阅。

现在来看,当时还是太年轻了。

“历史会话”就应该成为历史,被折叠、被降低存在感。一个会话尽量围绕一项明确任务持续推进;如果已经出现超长会话堆积、任务明显跑偏,或者需要间隔较长时间才能继续,就可以果断新开对话。

那有人可能会问:新开对话以后,之前的背景不就都没有了吗?

即使有一些内容已经沉淀为文件,确实仍会有一部分经过确认的背景情况、任务进展和下一步动作只存在于原来的上下文中。这个时候,我的经验是,直接让AI生成一份新对话接续提示词:

我准备新开一个对话继续当前任务。请生成一份可以直接用于新对话的接续提示词,至少包括:应当读取的文件、任务目标、整体规划、已确认的事实和结论、目前进展、待解决问题以及下一步动作。

已经确认的事实、要求、结论和待解决问题,可以先让AI重新汇总成一份任务摘要,再将这份摘要与当前权威版本和必要原始材料一起带到新的对话中。这样既能保留真正需要接续的信息,也可以减少早期试探、重复表达和已经放弃的方案继续干扰后面的回答。

这种做法可以理解为主动整理和压缩上下文。

二、记忆用于跨对话保留部分信息

如果说上下文主要解决的是“这一次对话中,AI能够看到什么”,记忆解决的则是“换一个对话以后,哪些长期信息还可以继续使用”。

我现在新建一个ChatGPT对话,有时不需要再从头介绍自己。它可能已经知道我是法律从业者,平时主要使用中文,偏好回答结论先行,也知道我对文章修改、合同审查和文件处理的一些长期要求。

这就是记忆最直观的作用:让AI保留一部分跨对话仍然有用的信息,减少用户反复交代长期背景。

按照OpenAI目前的产品设计来理解,ChatGPT的记忆主要可以从两个层面理解。一个是“已保存的记忆”,用于保留姓名、职业、偏好和长期目标等相对稳定的信息;另一个是“引用聊天记录”,允许ChatGPT在后续对话中参考过去聊天里与当前问题有关的信息。其他AI产品中的类似功能也可以类比,毕竟“天下AI一大抄”。

二者都不是把过去的所有对话逐字复制到新窗口中。对于希望系统长期稳定使用的信息,更适合明确保存为记忆;过去聊天中的其他细节能否在后续回答中被调用,则取决于系统判断。

所以,记忆不能简单地理解成一份完整的个人档案,更不能理解成AI会原样记住用户说过的每一句话。可以先把它理解为系统对长期有用信息形成的一份动态摘要。哪些内容被保留、怎样表述、什么时候被调用,都可能随着后续对话不断调整。

需要与记忆区分的是,一份完整的合同审查指导书、企业风险等级指引、某个案件的全部事实材料,或者一套必须逐字执行的工作规则,并不适合只交给记忆。

记忆可以记住“我有一套固定的合同审查口径”,却未必能够准确保存其中每一项风险等级和修改建议。需要精确执行的内容,仍然应当保存在可以逐字核对、随时修改并进行版本管理的文件中。

我已经开启ChatGPT记忆,让它尽可能保留我的职业背景、表达偏好和长期使用习惯;在Codex中,则更多依靠具体项目、对话历史和工作区文件接续任务。这样可以少做一些重复介绍,但真正需要准确执行的规则,仍然以本地文件为准。

此外,Codex还可以在“个性化”中设置自定义指令。个人使用感受上,它和记忆有些相似,都能减少重复介绍背景和要求的工作;但两者的机制并不相同。记忆主要由系统根据对话动态整理和调用,自定义指令则是由用户主动写入、持续生效的明确规则。

下面把我在Codex中使用的全局自定义指令放出来供大家参考。这份指令经过多次迭代,公开时进行了适当压缩和脱敏:

关于我

我主要从事法律及相关专业工作,长期关注专业工作、内容生产、AI工具、知识管理和个人事项管理。

我使用Codex的核心目的,是把本地文件、项目规则、事项记录、文章资料和分析结论维护成可以持续复用的知识系统。

基本偏好

  • 默认使用中文沟通,结论先行,再给理由;
  • 提供真实判断、具体步骤和可以追溯的依据;
  • 不要客套、谄媚或者空泛夸奖;
  • 如果我的想法有问题,直接指出,并给出更稳妥的替代方案。

工作原则

  • 先明确要解决的问题、已确认事实、待验证假设和最稳妥的处理路径;
  • 进入项目后,先检查已有规则、说明文件和目录约定;
  • 已有规则时严格遵守,没有规则时不要自行编造结构;
  • 当我说“先讨论”“先给方案”“不要落盘”时,不得修改文件;
  • 当我明确要求“执行”“保存”或者“落盘”时,再进入写操作;
  • 文件修改默认采用小步、可审查的方式,不做无关重构,不删除无关内容。

知识管理

  • 准确性优先于完整性,过期信息比没有信息更危险;
  • 能替换旧结论时,不重复追加;
  • 能合并同类内容时,不制造多份相似记录;
  • 重要结论保留适用边界和参数前提;
  • 不把一次讨论、阶段经验或者情绪表达直接升级为长期原则。

判断与核验

  • 涉及重要规则、产品信息、政策变化和重大决策时,主动核验;
  • 区分事实、用户判断、AI判断、文章观点和待验证假设;
  • 测算问题应当列明参数、假设、公式、结果和风险边界;
  • 不编造路径、字段、命令、配置或者信息来源;
  • 不自动执行不可逆操作,也不自动推送代码,除非我明确要求。

这份自定义指令虽然作了压缩,仍然能看出它与记忆承担的功能并不完全相同。

“我主要从事法律及相关专业工作”“偏好中文和结论先行”,更接近可以由记忆保留的长期背景;“不要在我说先讨论时修改文件”“写操作采用小步、可审查的方式”,则属于需要明确、稳定执行的操作规则,更适合写进自定义指令或者项目规则文件。

换句话说,记忆更像AI逐渐形成的“对我的了解”,自定义指令则更像我主动提供给AI的“使用说明书”。

记忆也不是一个只能由系统决定、用户无法干预的黑箱。用户可以查看记忆摘要,也可以直接问一句:“你现在记得我的哪些信息?”如果发现其中有内容过时、理解错误或者不希望继续保留,可以要求系统修改、删除或者不再使用。

OpenAI目前也允许用户关闭记忆,或者使用临时聊天,让这次对话不调用已有记忆,也不为以后的对话创建新的记忆。

我自己偶尔也会检查一下AI到底记住了什么。这种检查并不是多此一举。人的工作岗位、关注重点和表达习惯都会变化,一项两年前形成的偏好,放到现在未必仍然适用。如果记忆长期没有校正,原本用来提高效率的背景信息,也可能反过来限制AI对新任务的理解。

检查记忆有时还有另外一种玩法,就是直接新开一个对话,要求AI根据对你的记忆,对你进行描述和评价。喜欢被骂的话,可以再加一句:

请客观、中立、不谄媚也不委婉地,根据你对我的记忆作出评价。

相信我,AI的回答一定很刻骨铭心。

因此,记忆的价值不在于保存得越多越好,而在于保留下来的内容是否长期有效。稳定的背景和偏好可以交给记忆,明确的操作要求可以写进自定义指令,精确的规则和完整的项目材料仍然交给文件;一旦发现记忆已经过时,再及时修改或者删除。

三、项目和自定义GPT如何使用这些信息

项目、自定义GPT、上下文、记忆和知识库并不属于同一类概念。项目和自定义GPT更接近产品提供的工作空间或者定制工具;上下文、记忆和知识库,则是在解释信息以什么方式保存、调用并进入当前任务。

先说项目。

ChatGPT项目适合围绕一项需要持续推进的具体事项来组织工作。一个项目里可以集中放置相关对话、上传文件和项目指令。项目指令只在当前项目中生效,并会覆盖全局自定义指令。这样一来,围绕同一篇文章、同一个案件或者一项长期规划形成的材料,不需要散落在不同对话中,也不必每次重新上传和说明。

项目还可以使用项目记忆,但项目并不一定天然与项目外的个人记忆和对话完全隔离。创建项目时,可以选择默认记忆或者仅限项目记忆。在默认记忆下,个人账号已经保存的记忆仍可能在项目中发挥作用,ChatGPT也会优先参考当前项目中的聊天和文件;选择仅限项目记忆以后,项目就不会调用项目外的个人记忆和其他对话。共享项目则会自动采用仅限项目记忆。

这也是为什么,进入一个新项目以后,AI可能仍然知道我的职业背景和表达偏好,却不知道这个项目的具体事实和最新进展。前者可能来自个人记忆,后者仍然需要通过项目聊天、文件和项目指令提供。项目解决的不是“让AI记住我的一切”,而是把一项具体工作需要的信息集中到相对稳定的空间里。

对于我来说,一篇需要长期修改的文章、一个持续推进的案件或者一项个人规划,都适合分别建立项目。围绕这件事形成的讨论、参考资料、当前版本和特殊要求,可以放在同一个项目里。即使新建对话,也不必每次都从最基础的背景重新说起。

现在,“法律人周全”公众号文章的配图,我基本都会通过ChatGPT项目“法律人周全生图流程”完成。参考图片、封面比例、文字安全规则和已经确认的视觉风格都集中放在这个项目里,新建对话后仍然可以沿用。

自定义GPT解决的是另一个问题。

自定义GPT通常不是围绕某一个具体项目建立,而是围绕一类会反复出现的任务,预先配置固定的处理方式。一个自定义GPT可以包含指令、知识文件和可以使用的能力与工具。指令规定它应当怎样完成任务,知识文件提供回答时可以参考的资料,可以使用的能力和工具则决定它能否联网搜索、处理文件、生成图片或者连接外部服务。

以我一直使用的合同审查GPT为例,审查立场、风险分级方法和输出格式写在指令中,合同风险等级指引和合同审查指导书作为知识文件保存。实际使用时,再上传本次需要审查的合同,补充交易背景和特殊要求。

这样做以后,不论审查的是采购合同、销售合同还是服务合同,这个GPT都会先采用相对固定的审查方法。但它能够保持这种稳定性,主要依靠预先配置的指令和知识文件,并不是因为它记得过去审查过的每一份合同。

按照OpenAI目前的产品规则,自定义GPT不会调用用户在普通ChatGPT中保存的个人记忆、全局自定义指令或者过去的对话。每次通过这个自定义GPT新建对话时,当前会话的具体背景都会重新开始。

也就是说,我的合同审查GPT可能知道“审查合同应当采用什么立场和格式”,却未必知道我最近调换了岗位、正在处理哪个具体项目,或者上一份合同最终采用了什么修改方案,除非这些内容被重新放进当前对话。

如果一定要打个比方,项目更像一个围绕具体事项建立的专案文件夹,自定义GPT则更像一个已经接受过固定培训的专用工具。

项目关注的是:

这件事情目前有哪些对话、文件、要求和进展?

自定义GPT关注的是:

遇到这一类事情时,应当按照什么方法处理?

四、知识库保存需要反复调用的专业资料

知识库也是让无数法律人,或者说无数严谨的专业人士魂牵梦萦的东西。甚至有不少大律所和企业进行所谓AI转型,第一步就是建设内部知识库。

要我说,还是被AI幻觉吓得太惨了。

知识库是什么,其实并不难理解。即使不了解AI背后的技术原理,大多数人也知道,知识库就是用户主动收集、整理并放进去的一批资料。

对法律人来说,可以放进去的内容包括法律法规、司法案例、学术文章、实务文章、企业制度、合同模板、历史审查意见和其他专业资料。它们不是AI对用户形成的个人印象,而是可以反复查询、回到原文核对,并且由用户持续补充和更新的外部资料。

把这些资料提供给AI,是为了让它在回答专业问题时有更可靠的依据,减少仅凭一般知识进行猜测,或者脱离现有材料自行发挥的情况。对于法律工作来说,这一点尤其重要。法律结论通常需要回答依据是什么、来自哪一条法律规定、哪一份合同或者哪一个案例,而不能只看AI生成的文字是否流畅、逻辑是否完整。

当然,把资料放进知识库,并不意味着AI从此就不会产生幻觉。知识库提供的是相对可靠、可以核对的资料来源,但系统还需要找到与当前问题真正相关的内容,并且正确理解和使用这些内容。如果资料本身已经过期、相互冲突,或者系统没有检索到关键内容,AI仍然可能得出错误结论。

记忆则明显不同。它记录的通常不是完整的法律法规、案例或者制度文件,而是一些相对抽象、概括性的长期信息,例如用户的职业背景、语言偏好、表达习惯、工作方式和长期目标。

例如,“我从事法律工作,修改文章时希望保留个人化表达”,适合交给记忆;合同审查规则、文章写作规范、法律法规和案件材料,则更适合放入知识库或者工作区文件。

二者真正需要放在一起说明的地方,不是因为知识库和记忆本身容易混淆,而是因为它们都可能让AI在新的对话中使用用户没有重新输入的信息。但背后的路径不同:记忆让AI延续对用户背景和偏好的了解,知识库则为AI提供完成专业任务时需要查询和核对的资料。

知识库中的资料要影响当前回答,仍然需要进入本次上下文。第一篇文章介绍过的RAG,就是一种常见路径:系统先从知识库中检索与当前问题相关的内容,再把检索结果提供给模型,由模型结合这些资料生成回答。

因此,三者可以这样理解:

知识库解决“有哪些资料可以使用”,RAG解决“这次任务怎样找到并使用相关资料”,上下文则反映“模型在这一次回答时实际拿到了什么”。

不过,把文件放进知识库,并不意味着知识库建设就已经完成。

很多人刚开始建设知识库时,最直接的想法就是资料越多越好。看到法律法规就放进去,看到案例就放进去,看到一篇不错的文章也放进去。文件越来越多,看起来知识库越来越丰富,但真正使用时,AI未必更容易找到答案。

知识库不是越大越好,准确性、权威性和适用性通常比数量更重要。

一般审查规则、企业正式口径、个人经验和单个项目中的特殊处理,如果不区分适用范围,全部混在一起,AI检索到的内容越多,反而越难判断应当以哪一份为准。过期版本、重复文件和相互冲突的规则,有时比完全没有资料更危险。

例如,同一类合同可能同时存在旧版审查指引、新版风险等级标准、某个项目中的临时处理方案,以及历史合同中的特殊修改意见。如果这些文件没有标明版本、日期和适用范围,AI可能会把项目例外当成通用规则,也可能引用已经失效的旧版本。

因此,知识库中的资料需要持续维护。如果不知道怎么维护,或者觉得每次上传文件都要分类、更新、标记版本太麻烦,也不必自己全部手工完成,可以让AI参与文件整理、重复内容识别、版本比对和失效信息标记。

但对于知识库,也没有必要神化,更不要抱有过大的信心和依赖。这里可以分两个层面来看。

第一,不要小看通用大模型本身已经具备的能力。

前文介绍过LLM。大语言模型在训练阶段接触过大量公开文本,形成了相当广泛的一般知识和语言模式,并表现出一定的推理能力。这也是为什么,大部分情况下,不论用户提出的问题多么奇怪,AI似乎都能有鼻子有眼地回答几句。

第二,也不要高估自己建设知识库的能力。

不少律所和企业内部的AI系统,都强调建设内部知识库。如果知识库主要保存企业或者律所内部的规章制度、审查口径、业务指引、模板和历史经验,这恰恰是知识库非常有价值的场景。因为这些资料本来就不属于公开知识,通用模型通常不会知道,也不可能准确掌握某家企业内部怎样划分风险等级、采用什么审批流程。

但如果把知识库的范围扩展到“法学知识”“司法实践”“法律法规”这样宏大的层面,问题就复杂了。

有谁敢保证自己设计、收集和建立的知识体系没有漏洞和遗漏?法律法规不断更新,司法案例数量庞大,不同法院的裁判思路也可能存在差异;学术文章和实务观点更不可能被某一个内部知识库完整收录。

如果为了避免AI幻觉,就通过提示词或者系统设置,尽量要求AI只能从一个覆盖有限的内部知识库中检索、匹配和输出内容,那么知识库本身的遗漏就可能直接变成AI的认知边界。即使如此,也不能保证AI完全不会在资料之外作出推断;更现实的问题是,它还可能因为资料不完整,而漏掉本来应当考虑的重要规则和观点。

所以,还是那句话:以平常心面对知识库。

不要神化知识库,也不要指望一次建设完成以后就可以一劳永逸。通用模型、内部知识库、外部权威资料和人工专业判断各自解决不同的问题。真正可靠的系统,不是把所有希望都寄托在某一个知识库上,而是知道什么时候依靠模型的一般能力,什么时候检索内部资料,什么时候必须核对最新法律法规和案例,以及什么时候最终需要由人作出判断。

五、三个概念放在一起看

上下文、记忆和知识库不是三个并列的“存储空间”。它们分别解释当前任务、跨对话信息和外部专业资料怎样影响AI的回答。

概念 主要解决的问题 适合承载的内容 最基本的管理方法
上下文 AI本次能够看到什么 当前问题、对话、上传文件、指令和工具结果 对话过长时先整理摘要,必要时携带接续材料新建对话
记忆 哪些背景可以跨对话延续 职业、偏好、长期目标等相对稳定的信息 定期查看和修正,不依赖记忆保存精确规则
知识库 专业资料存放在哪里,供系统查询 制度、指引、案例、模板和其他可以复用的资料 区分适用范围,并通过真实任务测试和调整

三者之间还存在一条基本关系。记忆和知识库中的信息只有被当前任务调用,进入模型可以处理的上下文,才会影响这一次回答。反过来,本次上下文中的临时内容也不会自动变成长期记忆或者知识库资料。

法律工作中既有需要反复适用的审查标准,也有只服务于某个项目的事实和交易安排。区分上下文、记忆和知识库,实际是在区分当前材料、长期背景和专业资料。概念分清以后,出现问题时也更容易确定应当补充当前对话、调整记忆,还是回到知识文件本身。

这篇文章讨论的是信息放在哪里、如何被调用,以及最终怎样进入当前上下文。下一篇继续讨论反复使用的工作方法应当放在哪里:一项要求什么时候只需要写进Prompt,什么时候值得整理成Skill,又在什么情况下需要形成Workflow。