视频

了解更多
ChatGPT 内存解决了 AI 应用中使用的大型语言模型 (LLM) 中的上下文长度限制问题。ChatGPT 包使用 Redis 作为向量数据库来缓存每个会话的用户的历史交互,这提供了一种基于当前上下文的自适应提示创建机制。
ChatGPT 是由 OpenAI 创建的 AI 聊天机器人,它彻底改变了智能聊天型应用领域。自 2022 年 11 月推出以来,其基于复杂的 GPT-3.5 和 GPT-4 大型语言模型 (LLM) 并通过 人类反馈强化学习 (RLHF) 微调的类人响应和功能,迅速席卷全球。炒作机制全开。
一些 ChatGPT 交互娱乐性地很傻,一些 用途令人担忧,而且它们引发了 道德 问题,影响许多行业。
但是,每个人都认为这项技术必然会产生重大影响。例如,微软已经在使用这些模型来提供基于 AI 的编码助手(GitHub Copilot)以及支持其搜索引擎(必应)。Duolingo 和可汗学院 正在使用它们来为新的学习体验提供动力。而且 Be My Eyes 使用这些工具提供一个 AI 助手,可以 帮助视障人士。
尽管这些语言模型取得了成功,但它们也存在技术限制。特别是,正在探索 ChatGPT 可以实现什么的软件开发人员正在发现他们能够在持续对话中跟踪的上下文数量存在问题。
上下文长度是指语言模型可以用来理解和响应先前对话信息的量。一个比喻是 顾问阅读的书籍数量,他们可以从中提供实际建议。即使图书馆很大,但也不是无限的。
充分利用上下文长度来创建真正强大的基于 LLM 的应用非常重要。您需要巧妙地利用模型的可用上下文长度。这尤其重要,因为成本、延迟和模型可靠性都受到发送和接收至 LLM API(例如 OpenAI 的)的文本数量的影响。
为了解决 ChatGPT 和 GPT-4 等 AI 模型中上下文长度有限的问题,我们可以为模型附加一个外部内存源供其使用。这可以显着提高模型的有效上下文长度,对于由 转换器 型 LLM 模型驱动的更高级应用尤其重要。在这里,我们将分享我们在 Redis 的向量数据库 中使用 chatgpt-memory 项目来创建智能内存管理方法的过程。
让我们首先深入了解为什么上下文长度很重要。
随着 GPT-4 的出现,ChatGPT 的上下文长度从 4,096 个词元增加到 32,768 个词元。使用 OpenAI 的 ChatGPT 或 GPT-4 API 的成本是根据对话数量计算的;您可以在其 定价页面 上找到更多详细信息。因此,使用更多词元来处理更长的文档和使用相对较小的提示来最小化成本之间存在权衡。
然而,真正强大的应用程序需要大量的上下文长度。
从理论上讲,通过将向量数据库(即 Redis 向量数据库)中的历史交互与 LLM 聊天机器人集成,可以提供无限量的上下文。Langchain 是一个用于构建智能基于 LLM 的应用程序的流行库,它已经提供了这样的内存实现。但是,这些目前是基于启发式的,使用所有对话历史记录或仅使用最后 k 条消息。
虽然这种行为可能会发生变化,但这种方法是非自适应的。例如,如果用户在对话中改变了主题,但随后又回到了该主题,简单的 ChatGPT 内存方法可能无法从过去的交互中提供真正的相关上下文。造成这种情况的一个可能原因是词元溢出。确切地说,与当前消息相关的历史交互在对话历史记录中太靠后,以至于无法将其放入输入文本中。此外,由于简单的 ChatGPT 内存方法需要一个 k 值来遵守 ChatGPT 的输入文本限制,因此这些交互更有可能不在最后 k 条消息之外。
ChatGPT 可以提供有用个性化建议的主题范围有限。更广泛、更丰富的主题范围对于更有效、更通用的对话系统是可取的。
为了解决这个问题,我们提出了 ChatGPT 内存项目。ChatGPT 内存使用 Redis 向量数据库来存储用户与机器人过去交互的嵌入对话历史记录。然后,它在嵌入空间内使用向量搜索来“智能地”查找与当前用户消息相关的历史交互。这有助于聊天机器人通过将它们纳入当前提示中来回忆起重要的先前交互。
这种方法比当前的默认行为更具自适应性,因为它仅从整个历史记录中检索与当前消息相关的最后k 条消息。我们可以向提示添加更多相关上下文,并且永远不会耗尽词元长度。ChatGPT 内存提供自适应内存,它克服了启发式缓冲内存类型的词元限制约束。这种实现通过仅将最相关的历史记录纳入提示中来隐式地优化提示质量;从而在保持 ChatGPT 响应的效用和丰富性的同时,实现了一种隐式的成本效益方法。
ChatGPT 内存使用 Redis 作为向量数据库来缓存每个会话的用户的历史交互。Redis 提供基于 K 近邻 (KNN) 搜索和范围过滤器的语义搜索,距离度量包括 L2、内积 (IP) 和余弦。这些功能通过使用其中一种距离度量检索语义相关的历史用户交互,从而实现自适应提示创建。
此外,ChatGPT 内存项目利用了 Redis 支持的向量索引算法,包括 FLAT 索引(采用蛮力方法)和优化的分层可导航小世界 (HNSW) 索引。Redis 支持实时嵌入创建/更新/删除 (CRUD) 操作,以管理生产环境中的此过程。
除了缓解启发式内存限制的缺点之外,ChatGPT 内存还允许实时管理并发对话会话。它为每个聊天会话隔离每个会话的历史记录,这与用户与聊天机器人的过去交互相关。一旦 ChatGPT 助手响应用户查询,查询和助手的响应都会使用 OpenAI 的嵌入服务进行嵌入。然后,生成的嵌入在 Redis 索引中进行索引,以便以后检索。
随后的交互如下进行
这使用户能够获得更好、更个性化的答案,因为系统有更多信息可供参考。
在使用 ChatGPT 内存之前,您需要克隆存储库并安装依赖项。您还需要一个 OpenAI API 密钥 以及对基于云的 Redis 向量数据库(您可以 免费试用)的访问权限。
获得这些凭据后,将它们设置为名为 OPENAI_API_KEY、REDIS_HOST、REDIS_PASSWORD 和 REDIS_PORT 的环境变量,方法是在以下 bash 脚本中插入值。
# OPENAI API key
EXPORT OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Redis cloud database's credentials
EXPORT REDIS_HOST=localhost
EXPORT REDIS_PORT=1234
EXPORT REDIS_PASSWORD=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
之后,您可以通过编写几行代码来开始使用 ChatGPT 内存。
创建 Redis 数据存储连接的实例。
from chatgpt_memory.datastore import RedisDataStoreConfig, RedisDataStore
redis_datastore_config = RedisDataStoreConfig(
host=REDIS_HOST,
port=REDIS_PORT,
password=REDIS_PASSWORD,
)
redis_datastore = RedisDataStore(config=redis_datastore_config)
实例化 OpenAI 嵌入客户端以对对话历史记录进行矢量化。
from chatgpt_memory.llm_client import EmbeddingConfig, EmbeddingClient
embedding_config = EmbeddingConfig(api_key=OPENAI_API_KEY)
embed_client = EmbeddingClient(config=embedding_config)
创建内存管理器以根据当前上下文协调语义提示创建。
from chatgpt_memory.memory.manager import MemoryManager
memory_manager = MemoryManager(
datastore=redis_datastore,
embed_client=embed_client,
topk=1
)
然后连接到 ChatGPT API。
from chatgpt_memory.llm_client import ChatGPTClient, ChatGPTConfig
chat_gpt_client = ChatGPTClient(
config=ChatGPTConfig(api_key=OPENAI_API_KEY, verbose=True),
memory_manager=memory_manager
)
最后,您已准备好使用 ChatGPT 客户端进行交互,该客户端具有由 GPT 和 Redis 数据存储支持的无限上下文和自适应内存。
conversation_id = None
while True:
user_message = input("\n Please enter your message: ")
response = chat_gpt_client.converse(
message=user_message,
conversation_id=conversation_id
)
conversation_id = response.conversation_id
print(response.chat_gpt_answer)
那么,它看起来像什么?考虑以下两个与 ChatGPT 的对话示例。它们说明了两种操作模式之间的性能差异。
当内存功能未激活时,ChatGPT 模型无法检索用户在先前交互中提供的任何信息,即使是几句话之前的。
这两种对话呈现了类似的信息流。然而,在未启用内存功能的对话中,ChatGPT 模型无法回忆起用户提供的信息。相比之下,当启用内存功能时,模型会记住用户的特定细节,并提供个性化和可定制的对话体验。
我们相信 ChatGPT 内存是不断发展的旨在提升 LLM 能力的工具生态系统中宝贵的补充。它为开发人员提供了构建强大且上下文智能的 AI 应用程序的绝佳机会。
ChatGPT 内存的解决方案还突出了 Redis 向量数据库的本质,它可以满足多种 AI 用例,包括但不限于 LLM。
要亲自尝试 ChatGPT 内存,请访问我们的 GitHub 仓库并按照本文中的说明操作。您应该能够在几分钟内启动一个实例。最后,如果您有兴趣了解有关使用 Redis 和 LangChain 等工具构建 LLM 应用程序的更多信息,请注册即将举行的 RedisDays 虚拟会议。