关于在智能体开发中的记忆功能——记忆的本质其实就是把对话内容保存下来,然后带入到每次对话的上下文中

 大模型是无状态的,而记忆的本质只是把对话记录放到对话上下文中。



在大模型应用中,记忆是一个很重要的功能模块,特别是在对话场景中,记忆能够让大模型“记住”你的对话场景和上下文。因为大模型本身是无状态的,因此对模型来说每次对话都是一次全新的对话,大模型不知道你之前说了什么;因此,大模型就像一个拥有健忘症的人。


但在实际开发过程中,特别是使用一些开发框架之后,我们很多人都被记忆模块开发给带偏了,甚至很多人都没弄明白记忆的本质到底是什么。





大模型记忆功能




再次强调一个概念,对用户来说与大模型的唯一交互窗口只有提示词(prompt);虽然这句话说的并不是完全准确,但从开发的过程来说基本上属于准确的。


原因就在于,不论是我们设置系统提示词,还是用户输入,亦或者是记忆,工具调用等;最终在输入大模型时,都会被封装到提示词中,因此才有了对用户来说与大模型唯一的交互窗口只有提示词。但与大模型交互其它还有其它参数,如温度等。


那大模型的记忆功能到底是什么?


虽然说对话记忆最终也要被封装到提示词中,但对记忆功能来说还是有一定的格式要求的,特别是在对话场景中;毕竟在某些场景下,是不需要记忆功能的。


在大模型对话中主要有三个角色,system-系统角色,human-用户角色和assistant-AI(模型)角色。


首先,系统角色的作用是设定大模型当前的角色类型;比如说是技术大佬,是营销专家;因为大模型的训练数据比较复杂,就类似于一个高中生,学了政治历史物理化学等多门学科,而有些话题需要限定在某个学科下,这个就是角色类型。


而用户角色就很容易理解了,用户就是使用者,也就是我们,我们不论是提出问题还是增加一些背景描述都属于用户角色的范畴。


而模型角色就是指模型本身,模型就是用模型角色来回答或处理用户的问题。


因此,在对话场景中记忆一般都是以下格式:


SystemMessage: 模型的系统角色HumanMessage: 用户问题AIMessage: 模型回答HumanMessage: 用户问题AIMessage: 模型回答... ...ToolMessage: 工具返回

由于会存在多轮对话,因此会有多个HumanMessage和AIMessage,因此一般记忆都是使用数组进行存储;但注意点是,SystemMessage只会有一个,原因就是系统角色只需要设置一次。


如果是在智能体中,可能还会存在工具调用的结果,因此还会有一个工具消息。


虽然说记忆功能只需要把对话历史丢到提示词中即可,但由于模型上下文窗口的限制,以及从成本的角度考虑,一般会对记忆进行优化;比如说,只保存最近n次的对话记录,亦或者对整个对话记录进行总结提炼,以减少记忆超长等问题的出现。


而根据记忆存储的方式也分为长期记忆和短期记忆,所谓的长期记忆就是把记忆保存到数据库中,如向量数据库,传统数据库,redis等等;而短期记忆就是把记忆保存到内存中,随着系统的重启或超时会丢失。





(文:AI探索时代)

发表评论