概要
大多數(shù)LLM
應(yīng)用都有對話界面。對話的一個重要組成部分是能夠引用對話中先前介紹的信息。至少,對話系統(tǒng)應(yīng)該能夠直接訪問過去消息的某些窗口。更復(fù)雜的系統(tǒng)需要有一個不斷更新的世界模型,這使得它能夠執(zhí)行諸如維護有關(guān)實體及其關(guān)系的信息之類的事情。
我們將這種存儲過去交互信息的能力稱為“記憶”。 LangChain
提供了許多用于向系統(tǒng)添加記憶
的實用程序。這些實用程序可以單獨使用,也可以無縫地合并到鏈中。
記憶
系統(tǒng)需要支持兩個基本操作:讀和寫?;叵胍幌?,每個鏈都定義了一些需要某些輸入的核心執(zhí)行邏輯。其中一些輸入直接來自用戶,但其中一些輸入可以來自用戶。在給定的運行中,一條鏈將與其記憶
系統(tǒng)交互兩次。
-
在收到初始用戶輸入之后但在執(zhí)行核心邏輯之前,鏈將從其
記憶
系統(tǒng)中讀取并增加用戶輸入。 -
在執(zhí)行核心邏輯之后但在返回答案之前,鏈會將當前運行的輸入和輸出寫入
記憶
,以便在將來的運行中引用它們。
將記憶構(gòu)建到系統(tǒng)中
任何記憶
系統(tǒng)中的兩個核心設(shè)計決策是:
- 狀態(tài)如何存儲
- 如何查詢狀態(tài)
存儲:聊天消息列表(Storing: List of chat messages)
任何記憶的基礎(chǔ)都是所有聊天交互的歷史記錄。即使這些不全部直接使用,也需要以某種形式存儲。
LangChain
記憶模塊的關(guān)鍵部分之一就是用于存儲這些聊天消息的一系列集成,從記憶列表到持久數(shù)據(jù)庫。
聊天消息存儲:如何使用聊天消息以及提供的各種集成
查詢:聊天消息之上的數(shù)據(jù)結(jié)構(gòu)和算法(Querying: Data structures and algorithms on top of chat messages)
保留聊天消息列表相當簡單。不太直接的是建立在聊天消息之上的數(shù)據(jù)結(jié)構(gòu)和算法,它們提供了最有用的消息的視圖。
一個非常簡單的記憶系統(tǒng)可能只返回每次運行的最新消息。稍微復(fù)雜一點的記憶系統(tǒng)可能會返回過去 K 條消息的簡潔摘要。更復(fù)雜的系統(tǒng)可能會從存儲的消息中提取實體,并且僅返回有關(guān)當前運行中引用的實體的信息。
每個應(yīng)用程序?qū)τ谌绾尾樵冇洃浛赡苡胁煌囊?。記憶模塊應(yīng)該可以輕松地開始使用簡單的記憶系統(tǒng),并在需要時編寫您自己的自定義系統(tǒng)。
記憶類型:構(gòu)成
LangChain
支持的記憶類型的各種數(shù)據(jù)結(jié)構(gòu)和算法
開始使用
我們來看看LangChain
中的記憶到底是什么樣子的。在這里,我們將介紹與任意記憶類交互的基礎(chǔ)知識。
我們來看看如何在鏈中使用ConversationBufferMemory
。 ConversationBufferMemory
是一種極其簡單的內(nèi)存形式,它僅將聊天消息列表保存在緩沖區(qū)中并將其傳遞到提示模板中。
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("whats up?")
從memory中返回哪些變量(What variables get returned from memory)
在進入鏈之前,從內(nèi)存中讀取各種變量。它有特定的名稱,需要與鏈期望的變量保持一致。你可以通過調(diào)用memory.load_memory_variables({})
來查看這些變量是什么。
請注意,我們傳入的空字典只是實際變量的占位符。如果您使用的memory類型取決于輸入變量,您可能需要傳入一些變量。
memory.load_memory_variables({})
結(jié)果:
{'chat_history': "Human: hi!\nAI: whats up?"}
在本例中,您可以看到 load_memory_variables
返回單個key: history。這意味著您的鏈(可能還有您的提示)期望輸入名為:history
的key。
通??梢酝ㄟ^memory
類上的參數(shù)來控制此變量。例如,如果我們希望memory
變量key為 chat_history
,您可以執(zhí)行以下操作:
memory = ConversationBufferMemory(memory_key="chat_history")
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("whats up?")
結(jié)果:
{'chat_history': "Human: hi!\nAI: whats up?"}
控制這些鍵的參數(shù)名稱可能因memory
類型而異,但重要的是要了解:
(1) 這是可控的,
(2) 如何控制它。
記憶是字符串還是消息列表
最常見的記憶類型之一涉及返回聊天消息列表。這些可以作為單個字符串返回,全部連接在一起(當它們在 LLM 中傳遞時有用)或 ChatMessages 列表(當傳遞到 ChatModels 中時有用)。
默認情況下,它們作為單個字符串返回。為了作為消息列表返回,您可以設(shè)置 return_messages=True
memory = ConversationBufferMemory(return_messages=True)
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("whats up?")
結(jié)果:
{'history': [HumanMessage(content='hi!', additional_kwargs={}, example=False),
AIMessage(content='whats up?', additional_kwargs={}, example=False)]}
哪些key被保存到記憶中(What keys are saved to memory)
通常,鏈會接收或返回多個輸入/輸出鍵。在這些情況下,我們?nèi)绾沃酪獙⒛男╂I保存到聊天消息歷史記錄中?這通??梢酝ㄟ^記憶類型上的 input_key
和 output_key
參數(shù)來控制。
如果只有一個輸入/輸出鍵,則可以不用寫 input_key
和 output_key
參數(shù)。但是,如果有多個輸入/輸出鍵,那么您必須指定要使用哪個輸入/輸出鍵的名稱
端到端示例(End to end example)
最后,讓我們看一下在鏈中使用它。我們將使用 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}
回復(fù):"""
prompt = PromptTemplate.from_template(template)
# 請注意,我們需要對齊“memory_key”
memory = ConversationBufferMemory(memory_key="chat_history")
conversation = LLMChain(
llm=llm,
prompt=prompt,
verbose=True,
memory=memory
)
結(jié)果:
# 請注意,我們只是傳入“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
)
結(jié)果:
# 請注意,我們只是傳入“question”變量 - “chat_history”由memory填充
conversation({"question": "hi"})
總結(jié)
本篇講解 聊天的歷史記錄: 如何存儲、如何查詢。
這里是使用ConversationBufferMemory
類來完成存儲和查詢的。
也就是關(guān)鍵下面這段代碼:
# 構(gòu)建一個memory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 關(guān)聯(lián)大模型
conversation = LLMChain(
llm=llm,
prompt=prompt,
verbose=True,
memory=memory
)
# 查詢
# 請注意,我們只是傳入“question”變量 - “chat_history”由memory填充
conversation({"question": "hi"})
ChatMessageHistory
公開兩種方法和一個屬性。
它公開的兩個方法是 add_user_message
和 add_ai_message
,用于存儲來自用戶的消息和相應(yīng)的 AI 響應(yīng)。
它公開的屬性是message
屬性,用于訪問所有以前的消息。
參考地址:文章來源:http://www.zghlxwxcb.cn/news/detail-653786.html
https://python.langchain.com/docs/modules/memory.html文章來源地址http://www.zghlxwxcb.cn/news/detail-653786.html
到了這里,關(guān)于【LangChain】Memory的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!