5、大模型的记忆与缓存

本节内容介绍

本节主要介绍大模型的缓存思路,通过使用常见的缓存技术,降低大模型的回复速度,下面介绍的是使用redis和mem0,当然redis的语义缓存还可以使用一些rag的检索库进行替代

记忆

所谓记忆,是表现得像大模型能够记住一些事情。在之前的课程里,我们说过,大模型的 API 是无状态的,所以,大模型本质上是没有记忆的。大模型记忆的实现是通过在提示词中传递更多的内容实现的。

讨论 Agent 系统实现的时候,我们谈到了记忆组件,它包括两个部分,短期记忆和长期记忆。其中,短期记忆我们在讨论聊天机器人时已经谈到了,实现记忆的方案就是将聊天历史放到提示词中,这是一个通用的做法。但是,正如我们那一讲里所说的,能放到提示词的聊天历史是有限的,所以,它只能记住“近期”的事,这也是这种方案被称为短期记忆的原因。

长期记忆要解决的就是短期记忆未能解决的问题,希望我们的 AI 应用能够记住更久远的聊天历史。如果能够拥有长期记忆,事情就会变得更有趣,一个聊天机器人就会变得像你的一个老朋友,它会对你的偏好有更多的了解,如果是一个 Agent,它就可以更好地针对你的特点,为你提供服务。

为什么长期记忆是一个问题?从本质上说,这是大模型上下文大小有限造成的问题。前面说过,几乎每个模型的上下文窗口都是有限的。如果上下文窗口是无限的,我们完全可以用短期记忆的解决方案,也就是把所有的聊天历史都发送给大模型,让大模型“记住”所有的东西。

该如何解决长期记忆问题呢?很遗憾,长期记忆的实现在业界还没有统一的方案。但值得欣慰的是,有很多人在尝试。

常见的一个思路是,把需要记忆的内容存放到向量数据库中,采用类似于 RAG 的方案,在生成的时候,先到向量数据库中进行索引,把索引到内容放到提示词里面。当然,在具体的实现里,什么样的内容是需要记忆的内容、怎样提取怎样的内容等等,都是需要解决的问题,更有甚者,有的实现还要实现深度的挖掘,找到不同事物之间的关系。

尽管没有哪个方案取得主导的地位,但长期记忆在这个领域里确实是非常重要的一个组成部分。所以,这一讲,我还是会选择一个项目来重点学习,这个项目就是 mem0:github地址

Mem0

根据 mem0 的自我介绍,它是为大模型应用提供的一个能够自我改进的记忆层。

这个项目甫一开源就受到了极大的关注,其中固然有这个项目本身的魅力,还有一个很重要的原因就是,它是由之前的一个项目改造而来。前一个项目叫 embedchain,是一个 RAG 框架,可以通过配置实现一个 RAG 应用。在研发过程中,研发团队发现一个长期记忆的项目是比 RAG 框架更有价值,于是,mem0 替代了 embedchain。

选择 mem0 作为长期记忆的实现方案作为我们的学习对象,固然是因为它很强大,能够满足介绍长期记忆的需要。还有一点是,它的 API 设计得很简洁,相对于其它一些方案,mem0 的 API 更容易理解。

我自己使用opena的环境配置:

import os
 
# 设置环境变量
os.environ['http_proxy'] = 'http://127.0.0.1:7890'
os.environ['https_proxy'] = 'http://127.0.0.1:7890'
os.environ['all_proxy'] = 'http://127.0.0.1:7890'

# export HTTP_PROXY=http://127.0.0.1:7890; #换成你自己的代理地址
# export HTTPS_PROXY=http://127.0.0.1:7890; #换成你自己的代理地址
# export ALL_PROXY=socks5://127.0.0.1:7890#换成你自己的代理地址

from openai import OpenAI
import os
os.environ["OPENAI_API_KEY"] = 'sk-openaikey'


DEFAULT_MODEL = "gpt-4o-mini"
client = OpenAI()

下面就是一个例子的具体代码:

## 要使用mem0,需要安装包:pip install mem0ai

from mem0 import Memory

config = {
    "version": "v1.1",
    "llm": {
        "provider": "openai",
        "config": {
            "model": "gpt-4o-mini",
            "temperature": 0,
            "max_tokens": 1500,
        }
    },
    "embedder": {
        "provider": "openai",
        "config": {
            "model": "text-embedding-ada-002"
        }
    },
    "vector_store": {
        "provider": "chroma",
        "config": {
            "collection_name": "mem0db",
            "path": "mem0db",
        }
    },
    "history_db_path": "history.db",
}

m = Memory.from_config(config)

m.add("我喜欢读书", user_id="dreamhead", metadata={"category": "hobbies"})
m.add("我喜欢编程", user_id="dreamhead", metadata={"category": "hobbies"})

related_memories = m.sea
### 如何在开源大型语言模型中实现记忆继承 #### 记忆机制的重要性 为了使对话更加连贯和具有上下文感知能力,在大型语言模型中引入记忆机制至关重要。通过这种机制,模型能够记住之前的交互内容,并将其应用于后续的对话轮次中。 #### 实现方法之一:外部数据库存储会话历史 一种常见的做法是利用外部数据库来保存用户的聊天记录和其他相关信息。每当有新的输入时,系统先查询该数据库获取之前当前用户之间的交流情况作为附加提示提供给模型[^2]。这有助于保持长期一致性的同时也减轻了单个推理过程中所需处理的信息量。 #### 方法二:基于Transformer架构内部状态管理 另一种方式是在不依赖额外组件的情况下直接修改现有框架内的编码结构——比如采用带有持久化内存单元设计变体版本的Transformers网络来进行优化改进。这类调整允许某些层间节点携带跨时间步长传递下来的特征向量从而形成短期工作空间以便更好地捕捉序列间的关联特性[^3]。 #### 示例代码片段展示如何集成简单的会话缓存功能 下面给出了一段Python伪代码用来说明怎样简单地把最近几次交谈的内容加入到下一轮预测前缀里: ```python class ChatModelWithMemory: def __init__(self): self.memory = [] def add_to_memory(self, text): """将新消息添加至记忆列表""" self.memory.append(text) def get_contextual_prompt(self): """构建包含过往对话的历史背景描述""" return "\n".join([f"User: {msg}" for msg in reversed(self.memory[-5:])]) def predict_next_reply(self, user_input): context = self.get_contextual_prompt() full_prompt = f"{context}\nUser: {user_input}\nAssistant:" response = model.generate(full_prompt) # 假设model是一个已经加载好的预训练大模型实例 reply_text = extract_response_from_model_output(response) self.add_to_memory(user_input) # 更新记忆库中的最新一次互动详情 self.add_to_memory(reply_text) return reply_text ``` 此示例展示了基本原理;实际应用可能还需要考虑更多细节如安全性验证、隐私保护措施等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值