langchain架构已有记忆功能,本文将简单介绍一下如何构建一个带有记忆功能的机器人
首先导入需要的包
python
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_community.chat_message_histories import SQLChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
定义llm的基础设置
模型名和apikey
python
llm = ChatOpenAI(model = ,apikey=)
创建prompt词
MessagesPlaceholder(variable_name="history"),是占位符,为了导入完整的历史记录
python
prompt = ChatPromptTemplate(
[
("system", "你是一个得力的助手"),
MessagesPlaceholder(variable_name="history"),
("human", "{question}"),
]
)
创建chain
| 是 LangChain 的"链式操作符"(pipe operator),类似于 Unix 的管道(pipe)。它将 prompt 的输出"管道"到 llm 的输入,形成一个"链"。
这个链的执行流程是:用户输入 → 填充提示模板 → 发送给 LLM 生成回复。目的:简化调用,只需 chain.invoke(input) 就能运行整个流程。如果不链式连接,你需要手动填充提示再调用模型。
python
chain = prompt| llm
RunnableWithMessageHistory 是 LangChain 的高级 Runnable 类,用于包装普通链(chain),添加历史管理功能。参数:
chain:要包装的链。
lambda session_id: SQLChatMessageHistory(...):一个 lambda 函数(匿名函数),根据 session_id 创建历史存储器。SQLChatMessageHistory 是存储类,
connection_string="sqlite:///chat_history.db" 指定使用本地 SQLite 数据库(文件会自动创建在项目根目录)。
input_messages_key="question":输入字典中,用户消息的键名(匹配提示模板中的 {question})。LangChain 会从这个键提取用户消息,并注入到提示模板中。目的:标准化输入格式。简单语法,无需额外解释。
history_messages_key="history":历史消息在提示中的占位符键名(匹配 MessagesPlaceholder("history"))
python
chain_with_history = RunnableWithMessageHistory(
chain,
lambda session_id: SQLChatMessageHistory(
session_id=session_id, connection_string="sqlite:///chat_history.db"
),
input_messages_key="question",
history_messages_key="history",
)
至此为止,我们就创建了完整的流程,那么我们接下来怎么了进行交流呢
我们使用invoke方法,由于我们是带有历史记录的,所以需要指定一个config。里面需要包括一个config文件
python
response = self.chain_with_history.invoke(
{"question": text},
config={"configurable": {"session_id": session_id}}
)
response_text = response.content
参考文档:langchain