文章目录
- 一、消息存储在内存
- 二、配置会话唯一键
- 三、介入Redis消息持久化
- 四、类介绍
- 4.1 RunnableWithMessageHistory
- 4.2 ConfigurableFieldSpec
本节主要内容:
- 消息存储在内存
- 消息持久化到redis
- 修改聊天历史
- 裁剪消息
- 总结记忆
一、消息存储在内存
- 构建一个名为
get_session_history
的可调用对象 - 引用此字典以反馈
ChatMessageHistory
实例 - 通过在运行时相
RunnableWithMessageHistory
传递配置,可以指定可调用对象的参数。
默认情况下,期望配置参数是一个字符串 session_id。 可以通过 history_factory_config
关键字参数进行调整。
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_ollama import ChatOllama
# 创建一个聊天提示模版
prompt = ChatPromptTemplate.from_messages([
("system", "你是西天取经的人工智能助手,你的名字叫齐天智能"),
# 历史消息占位符
MessagesPlaceholder(variable_name="history"),
("human","{input}")
])
# llm = ChatOpenAI(
# base_url="https://api.deepseek/v1", # DeepSeek API端点
# model="deepseek-chat", # DeepSeek模型标识
# openai_api_key="sk-50db0------", # 替换为DeepSeek密钥
# max_tokens=1000,
# temperature=0
# )
llm = ChatOllama(
model="deepseek-r1:7b",
)
chain = prompt | llm
# 用来存储会话历史记录
store = {}
# 定义一个获取会话历史的函数,入参数session_id, 但会一个会话历史记录
def get_session_history(session_id: str) -> BaseChatMessageHistory:
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
# 创建一个带会话历史记录的Runnable
with_message_history = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key="input",
history_messages_key="history",
)
# 调用带会话历史记录的Runable
response = with_message_history.invoke(
{"input":"你在西天是是干什么的?"},
config={"configurable":{"session_id":"abc123"}},
)
print(response)
当seesion_id是一样的时候,表示记住了历史信息
# 记住
response = with_message_history.invoke(
{"input":"你说什么?"},
config={"configurable":{"session_id":"abc123"}},
)
没记住, 因为改了session_id
# 没记住, 因为改了session_id
response = with_message_history.invoke(
{"input":"你说什么?"},
config={"configurable":{"session_id":"ab"}},
)
print(response.content)
二、配置会话唯一键
我们可以通过向 history_factory_config
参数传递一个ConfigurableFieldSpec
对象列表来自定义跟踪消息历史的配置参数。
下面我们使用了两个参数: user_id和conversatin_id.
配置user_id和 conversation_id作为会话唯一键
from langchain_core.runnables import ConfigurableFieldSpec # 针对history会话的配置
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
store = {}
def get_session_history(user_id: str, conversation_id: str) -> BaseChatMessageHistory:
if (user_id,conversation_id) not in store:
store[(user_id,conversation_id)] = ChatMessageHistory()
return store[(user_id,conversation_id)]
with_message_history = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key="input",
history_messages_key="history",
history_factory_config=[ # 动态拓展
ConfigurableFieldSpec(
id = "user_id",
annotation=str,
name="User ID",
default="",
is_shared=True,
),
ConfigurableFieldSpec(
id = "conversation_id",
annotation=str,
name="Conversation_id ID",
default="",
is_shared=True,
),
]
)
response = with_message_history.invoke(
{"input":"你在西天是是干什么的?"},
config={"configurable":{"user_id":"abc123", "conversation_id":"3211"}},
)
print(response)
三、介入Redis消息持久化
需要事先 了解使用Redis和其他程序它实现聊天消息历史的方法。
这里我们演示使用内存中的 ChatMessageHistory 以及使用 RedisChatMessageHistory 进行更持久存储。
# 引入Redis聊天消息存储类
from langchain_community.chat_message_histories import RedisChatMessageHistory
REDIS_URL = "redis://localhost:6379/0"
def get_session_history(session_id: str) -> RedisChatMessageHistory:
return RedisChatMessageHistory(session_id, url=REDIS_URL)
with_message_history = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key="input",
history_messages_key="history",
)
四、类介绍
4.1 RunnableWithMessageHistory
是 LangChain 中用于为链(Chain)添加消息历史记录(即聊天记忆)的类。它通过包装另一个 Runnable 对象,并管理其聊天消息历史记录,从而实现对话状态的持久化。
参数
- runnable:需要包装的底层 Runnable 对象。
- get_session_history:一个可调用对象,根据 session_id 返回一个
BaseChatMessageHistory
的实例。 - input_key:指定输入字典中用于获取最新消息的键,默认为 “input”。
- history_key:指定输入字典中用于获取历史消息的键,默认为 “history”。
- output_key:指定输出字典中用于存储响应的键,默认为 “response”。
- session_id_key:指定配置字典中用于获取 session_id 的键,默认为 “session_id”。
4.2 ConfigurableFieldSpec
是 LangChain 中用于定义可配置字段的类,它允许用户在运行时动态调整某些参数或行.
- id:字段的唯一标识符。
- name:字段的名称,用于用户界面或日志。
- description:字段的描述,用于解释字段的作用。
- default:字段的默认值。
- type:字段的数据类型,例如 str、int、float 等。
- options:字段的可选值列表(如果适用)。
- required:字段是否为必填项。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1754605473a5181520.html
评论列表(0条)