LangChain让LLM带上记忆

最近两年,我们见识了“百模大战”,领略到了大型语言模型(LLM)的风采,但它们也存在一个显著的缺陷:没有记忆。

在对话中,无法记住上下文的 LLM 常常会让用户感到困扰。本文探讨如何利用 LangChain,快速为 LLM 添加记忆能力,提升对话体验。

LangChain 是 LLM 应用开发领域的最大社区和最重要的框架。

1. LLM 固有缺陷,没有记忆

当前的 LLM 非常智能,在理解和生成自然语言方面表现优异,但是有一个显著的缺陷:没有记忆

LLM 的本质是基于统计和概率来生成文本,对于每次请求,它们都将上下文视为独立事件。这意味着当你与 LLM 进行对话时,它不会记住你之前说过的话,这就导致了 LLM 有时表现得不够智能。

这种“无记忆”属性使得 LLM 无法在长期对话中有效跟踪上下文,也无法积累历史信息。比如,当你在聊天过程中提到一个人名,后续再次提及该人时,LLM 可能会忘记你之前的描述。

本着发现问题解决问题的原则,既然没有记忆,那就给 LLM 装上记忆吧。

2. 记忆组件的原理

2.1. 没有记忆的烦恼

当我们与 LLM 聊天时,它们无法记住上下文信息,比如下图的示例:

img

2.2. 原理

如果将已有信息放入到 memory 中,每次跟 LLM 对话时,把已有的信息丢给 LLM,那么 LLM 就能够正确回答,见如下示例:

img

目前业内解决 LLM 记忆问题就是采用了类似上图的方案,即:将每次的对话记录再次丢入到 Prompt 里,这样 LLM 每次对话时,就拥有了之前的历史对话信息。

但如果每次对话,都需要自己手动将本次对话信息继续加入到history信息中,那未免太繁琐。有没有轻松一些的方式呢?有,LangChain!LangChain 对记忆组件做了高度封装,开箱即用。

2.3. 长期记忆和短期记忆

在解决 LLM 的记忆问题时,有两种记忆方案,长期记忆和短期记忆。

  • 短期记忆:基于内存的存储,容量有限,用于存储临时对话内容。
  • 长期记忆:基于硬盘或者外部数据库等方式,容量较大,用于存储需要持久的信息。

3. LangChain 让 LLM 记住上下文

LangChain 提供了灵活的内存组件工具来帮助开发者为 LLM 添加记忆能力。

3.1. 单独用 ConversationBufferMemory 做短期记忆

Langchain 提供了 ConversationBufferMemory 类,可以用来存储和管理对话。

ConversationBufferMemory 包含input变量和output变量,input代表人类输入,output代表 AI 输出。

每次往ConversationBufferMemory组件里存入对话信息时,都会存储到history的变量里。

img

3.2. 利用 MessagesPlaceholder 手动添加 history

python复制代码from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(return_messages=True)
memory.load_memory_variables({
   })

memory
### LangChain 记忆机制概述 在LangChain框架内,记忆功能对于维持上下文连贯性和提高交互质量至关重要。具体来说,`ConversationEntityMemory` 是用于跟踪对话过程中提及的实体,并能随着对话进展不断更新这些实体的相关信息[^3]。 这种记忆能力依赖于大型语言模型(LLM)来抽取有关实体的具体细节,并利用 LLM 的推理能力逐步积累起对某个特定对象的理解。这使得系统不仅能够识别重复出现的对象,还能基于先前获取的知识做出更合理的回应。 为了实现这一目标,当接收到新输入时,系统会先解析其中涉及的关键实体;接着查询已有的记忆库看是否有匹配项;如果有,则加载之前保存的数据作为背景支持当前轮次的回答生成过程;如果没有找到对应记录,则创建新的条目并将此次交流得到的新发现加入进去供后续调用。 ### 实现方式与使用方法 #### 创建和配置虚拟环境 首先建议在一个隔离的 Python 虚拟环境中安装所需的软件包,可以通过如下命令完成: ```bash python3 -m venv .venv source .venv/bin/activate ``` 激活后的下一步就是按照官方指南安装必要的依赖项,包括但不限于 `langchain` 和其他可能需要用到的支持库[^4]。 #### 初始化记忆组件 接下来,在应用程序代码里引入相应的类定义并实例化一个具体的记忆管理器对象。这里以 `ConversationEntityMemory` 为例展示基本操作流程: ```python from langchain.memory import ConversationEntityMemory memory = ConversationEntityMemory() ``` #### 应用场景下的集成 为了让聊天机器人具备持久化的认知能力,可以在每次接收消息之后立即调用相应接口将最新了解到的事实写入内存中去。而在准备回复前则应先行读取关联的历史数据以便更好地理解语境从而给出恰当反馈。 例如,在处理用户提问环节可以这样设计逻辑结构: ```python def process_message(message): entities = extract_entities_from_message(message) # 假设有一个函数可以从消息中抽取出实体 for entity in entities: memory.update(entity, get_entity_info(entity)) # 更新或新增实体信息 context = memory.get_context(entities) # 获取与本次互动相关的过往信息片段 response = generate_response(context + message) # 结合历史和即时内容形成最终答复 return response ``` 上述伪代码展示了如何围绕着 `ConversationEntityMemory` 构建一套完整的对话管理系统,确保每一次交谈都能充分利用累积下来的经验教训提升服务质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值