赞
踩
大多数LLM
应用都有对话界面。对话的一个重要组成部分是能够引用对话中先前介绍的信息。至少,对话系统应该能够直接访问过去消息的某些窗口。更复杂的系统需要有一个不断更新的世界模型,这使得它能够执行诸如维护有关实体及其关系的信息之类的事情。
我们将这种存储过去交互信息的能力称为“记忆”。 LangChain
提供了许多用于向系统添加记忆
的实用程序。这些实用程序可以单独使用,也可以无缝地合并到链中。
记忆
系统需要支持两个基本操作:读和写。回想一下,每个链都定义了一些需要某些输入的核心执行逻辑。其中一些输入直接来自用户,但其中一些输入可以来自用户。在给定的运行中,一条链将与其记忆
系统交互两次。
在收到初始用户输入之后但在执行核心逻辑之前,链将从其记忆
系统中读取并增加用户输入。
在执行核心逻辑之后但在返回答案之前,链会将当前运行的输入和输出写入记忆
,以便在将来的运行中引用它们。
任何记忆
系统中的两个核心设计决策是:
任何记忆的基础都是所有聊天交互的历史记录。即使这些不全部直接使用,也需要以某种形式存储。
LangChain
记忆模块的关键部分之一就是用于存储这些聊天消息的一系列集成,从记忆列表到持久数据库。
聊天消息存储:如何使用聊天消息以及提供的各种集成
保留聊天消息列表相当简单。不太直接的是建立在聊天消息之上的数据结构和算法,它们提供了最有用的消息的视图。
一个非常简单的记忆系统可能只返回每次运行的最新消息。稍微复杂一点的记忆系统可能会返回过去 K 条消息的简洁摘要。更复杂的系统可能会从存储的消息中提取实体,并且仅返回有关当前运行中引用的实体的信息。
每个应用程序对于如何查询记忆可能有不同的要求。记忆模块应该可以轻松地开始使用简单的记忆系统,并在需要时编写您自己的自定义系统。
记忆类型:构成
LangChain
支持的记忆类型的各种数据结构和算法
我们来看看LangChain
中的记忆到底是什么样子的。在这里,我们将介绍与任意记忆类交互的基础知识。
我们来看看如何在链中使用ConversationBufferMemory
。 ConversationBufferMemory
是一种极其简单的内存形式,它仅将聊天消息列表保存在缓冲区中并将其传递到提示模板中。
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("whats up?")
在进入链之前,从内存中读取各种变量。它有特定的名称,需要与链期望的变量保持一致。你可以通过调用memory.load_memory_variables({})
来查看这些变量是什么。
请注意,我们传入的空字典只是实际变量的占位符。如果您使用的memory类型取决于输入变量,您可能需要传入一些变量。
memory.load_memory_variables({})
结果:
{'chat_history': "Human: hi!\nAI: whats up?"}
在本例中,您可以看到 load_memory_variables
返回单个key: history。这意味着您的链(可能还有您的提示)期望输入名为:history
的key。
通常可以通过memory
类上的参数来控制此变量。例如,如果我们希望memory
变量key为 chat_history
,您可以执行以下操作:
memory = ConversationBufferMemory(memory_key="chat_history")
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("whats up?")
结果:
{'chat_history': "Human: hi!\nAI: whats up?"}
控制这些键的参数名称可能因memory
类型而异,但重要的是要了解:
(1) 这是可控的,
(2) 如何控制它。
最常见的记忆类型之一涉及返回聊天消息列表。这些可以作为单个字符串返回,全部连接在一起(当它们在 LLM 中传递时有用)或 ChatMessages 列表(当传递到 ChatModels 中时有用)。
默认情况下,它们作为单个字符串返回。为了作为消息列表返回,您可以设置 return_messages=True
memory = ConversationBufferMemory(return_messages=True)
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("whats up?")
结果:
{'history': [HumanMessage(content='hi!', additional_kwargs={}, example=False),
AIMessage(content='whats up?', additional_kwargs={}, example=False)]}
通常,链会接收或返回多个输入/输出键。在这些情况下,我们如何知道要将哪些键保存到聊天消息历史记录中?这通常可以通过记忆类型上的 input_key
和 output_key
参数来控制。
如果只有一个输入/输出键,则可以不用写 input_key
和 output_key
参数。但是,如果有多个输入/输出键,那么您必须指定要使用哪个输入/输出键的名称
最后,让我们看一下在链中使用它。我们将使用 LLMChain
,并展示如何使用 LLM
和 ChatModel
。
使用LLM
的例子:
from langchain.llms import OpenAI from langchain.prompts import PromptTemplate from langchain.chains import LLMChain from langchain.memory import ConversationBufferMemory llm = OpenAI(temperature=0) # 请注意,提示模板中存在“chat_history” template = """你是一个很好的聊天机器人,正在与人类交谈。 之前的对话: {chat_history} 新的人类问题: {question} 回复:""" prompt = PromptTemplate.from_template(template) # 请注意,我们需要对齐“memory_key” memory = ConversationBufferMemory(memory_key="chat_history") conversation = LLMChain( llm=llm, prompt=prompt, verbose=True, memory=memory )
结果:
# 请注意,我们只是传入“question”变量 - “chat_history”由memory填充
conversation({"question": "hi"})
使用ChatModel
from langchain.chat_models import ChatOpenAI from langchain.prompts import ( ChatPromptTemplate, MessagesPlaceholder, SystemMessagePromptTemplate, HumanMessagePromptTemplate, ) from langchain.chains import LLMChain from langchain.memory import ConversationBufferMemory llm = ChatOpenAI() prompt = ChatPromptTemplate( messages=[ SystemMessagePromptTemplate.from_template( "你是一个很好的聊天机器人,正在与人类交谈。" ), # 这里的“variable_name”必须与memory对齐 MessagesPlaceholder(variable_name="chat_history"), HumanMessagePromptTemplate.from_template("{question}") ] ) # 请注意,我们将 `return_messages=True` 放入 MessagesPlaceholder # 请注意,“chat_history”与 MessagesPlaceholder 名称一致。 memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) conversation = LLMChain( llm=llm, prompt=prompt, verbose=True, memory=memory )
结果:
# 请注意,我们只是传入“question”变量 - “chat_history”由memory填充
conversation({"question": "hi"})
本篇讲解 聊天的历史记录: 如何存储、如何查询。
这里是使用ConversationBufferMemory
类来完成存储和查询的。
也就是关键下面这段代码:
# 构建一个memory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 关联大模型
conversation = LLMChain(
llm=llm,
prompt=prompt,
verbose=True,
memory=memory
)
# 查询
# 请注意,我们只是传入“question”变量 - “chat_history”由memory填充
conversation({"question": "hi"})
ChatMessageHistory
公开两种方法和一个属性。
它公开的两个方法是 add_user_message
和 add_ai_message
,用于存储来自用户的消息和相应的 AI 响应。
它公开的属性是message
属性,用于访问所有以前的消息。
参考地址:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。