想象一下,你正在和一个人对话,但他却把你刚才说的话忘得一干二净。你说的每一句话都会被当作你们讨论的开端。是不是很令人沮丧?缺乏记忆的大语言模型代理也面临类似的难题。要让一个代理真正有用,并进行有效的交流,它需要一种记忆的方式。我们来看看为什么这项能力如此有必要。保持对话连贯:维持对话语境记忆最直接的好处之一,就是在对话中保持语境。想想一个简单的对话:你:“伦敦天气怎么样?”代理(有记忆):“伦敦目前多云,有降雨可能。”你:“那明天呢?”代理(有记忆):“伦敦明天预计会是局部晴朗。”没有记忆,代理就不会明白“明天”指的是伦敦的天气。它会把你的第二个问题当作全新且不相干的问题,可能会问“明天哪里?”记忆让代理能够理解代词(如“它”或“它的”),回答追问,并提及之前讨论过的话题。这使得交流感觉更自然,更像人际交流,而不是一连串不连贯的提问。下面的图表说明了具有短期记忆的代理如何保持语境,与没有记忆的代理相比。digraph G { rankdir=TB; graph [fontname="Arial", fontsize=10, bgcolor="transparent"]; node [shape=rect, style="rounded,filled", fontname="Arial", fontsize=10, width=3.5, height=1, fixedsize=true]; edge [fontname="Arial", fontsize=9, color="#495057"]; // 场景一:缺乏记忆的代理 subgraph cluster_nomem { label="场景一:缺乏记忆的代理"; style="filled,rounded"; color="#adb5bd"; bgcolor="#e9ecef"; node [fillcolor="#ffc9c9", color="#f03e3e"]; nm_user1 [label="用户:\n法国首都是哪里?"]; nm_agent1 [label="代理:\n巴黎。"]; nm_user2 [label="用户:\n它的人口是多少?"]; nm_agent2 [label="代理:\n谁的人口?\n我没有之前的语境。"]; nm_user1 -> nm_agent1 [xlabel=" 交互1 ", fontcolor="#495057"]; nm_agent1 -> nm_user2 [style=invis, minlen=1.5]; nm_user2 -> nm_agent2 [xlabel=" 交互2 (无语境) ", fontcolor="#f03e3e"]; } // 场景二:具有短期记忆的代理 subgraph cluster_mem { label="场景二:具有短期记忆的代理"; style="filled,rounded"; color="#adb5bd"; bgcolor="#e9ecef"; node [fillcolor="#96f2d7", color="#0ca678"]; m_user1 [label="用户:\n法国首都是哪里?"]; m_agent1 [label="代理:\n巴黎。\n(将“巴黎”存入记忆)"]; m_user2 [label="用户:\n它的人口是多少?"]; m_agent2 [label="代理:\n巴黎的人口\n大约是210万。"]; m_user1 -> m_agent1 [xlabel=" 交互1 ", fontcolor="#495057"]; m_agent1 -> m_user2 [xlabel=" 记忆连接 ", fontcolor="#0ca678", style=dashed, minlen=1.5]; m_user2 -> m_agent2 [xlabel=" 交互2 (有语境) ", fontcolor="#0ca678"]; } }具有记忆的代理(场景二)能够理解“它的人口”指的是巴黎,而没有记忆的代理(场景一)则在交互之间失去语境。逐步处理任务许多任务无法一步完成。以规划一次旅行为例。你可能会要求代理:查找前往某个目的地的航班。然后,查找该目的地某个地标附近的酒店。最后,列出该地区的一些餐厅。为了处理这种情况,代理在进入第二步时必须记住第一步中选择的目的地,然后为第三步记住目的地,甚至酒店区域。记忆就像一个临时记录本,允许代理存储中间信息或先前操作的结果。没有记忆,每一步都需要你重复所有相关细节,这会使过程变得繁琐且低效。记忆会话中的用户偏好即使是简单的记忆形式也能大大提升用户体验,因为它允许代理根据你在交互中提供的信息进行调整。例如,如果你告诉代理“当我们谈论温度时,请使用摄氏度”,一个有记忆的代理就能在你当前对话期间记住这个偏好。你就不必每次询问温度时都指定“用摄氏度”。这让代理感觉更细心、更个性化,即使这种记忆只是会话期间的临时记忆。避免重复提问和操作记忆有助于代理更有效率。如果代理已经问过某个信息(比如你的名字或参考号)或者完成了一项计算(比如货币转换),它就可以存储这些信息。这避免了代理在同一会话中重复提问相同问题或重复已完成的工作。这不仅节省时间,也让交互感觉更流畅,而不是让你觉得在与一个对刚刚发生的事情毫无印象的系统打交道。从即时反馈中学习在一次交互中,你可能会纠正代理。例如,如果代理误解某个术语,而你澄清其含义,一个有记忆的代理就能存储这个修正,至少在当前会话中。这让它能够在后续的对话回合中使用被修正的理解,展现出一种基本的学习和适应能力。虽然这不是深度、长期的学习,但它有助于形成更富有成效、更少沮丧的对话。本质上,记忆将大语言模型从一个简单的文本生成器提升为一个能够进行更复杂、有状态交互的组件。它是构建代理的根本,让代理能够进行连贯的对话,完成多步骤任务,并提供更及时、更有帮助的体验。接下来,我们将研究如何实现简单的记忆机制,以便将这些优点带给你的代理。