【LangChain入门 7 】消息管理与聊天历史存储

文章目录一、消息存储在内存二、配置会话唯一键三、介入Redis消息持久化四、类介绍4.1 RunnableWithMessageHistory4.2 ConfigurableFieldSpec本节主要内容:消息存储在内

文章目录

  • 一、消息存储在内存
  • 二、配置会话唯一键
  • 三、介入Redis消息持久化
  • 四、类介绍
    • 4.1 RunnableWithMessageHistory
    • 4.2 ConfigurableFieldSpec

本节主要内容:

  1. 消息存储在内存
  2. 消息持久化到redis
  3. 修改聊天历史
  4. 裁剪消息
  5. 总结记忆

一、消息存储在内存

  • 构建一个名为 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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信