框架与工具链2702 字

LangChain消息管理与聊天历史存储

·全库 431 / 611

《LangChain消息管理与聊天历史存储》共 0.3 万字,通篇围绕 Redis、prompt、上下文、LangChain 展开,归在「框架与工具链」这一层。

覆盖Redisprompt上下文LangChain检索部署

适合要选技术栈、不想把别人踩过的坑重踩一遍的人

目录骨架(8 节)
  1. 消息存储在内存
  2. 配置会话唯一键
  3. 消息持久化
  4. 修改聊天历史
  5. 配置redis环境
  6. 调用聊天接口,看Redis是否存储历史记录
  7. 裁剪消息
  8. 总结记忆

示例代码

注:将ppt后缀名改为zip后解压

python版本:3.12.4

​

分享内容

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

​

消息存储在内存

下面我们展示一个简单的示例,其中聊天历史保存在内存中,此处通过全局 Python 字典实现。

我们构建一个名为 get_session_history 的可调用对象,引用此字典以返回 ChatMessageHistory 实例。通过在运行时向 RunnableWithMessageHistory 传递配置,可以指定可调用对象的参数。默认情况下,期望配置参数是一个字符串 session_id。可以通过 history_factory_config 关键字参数进行调整。

使用单参数默认值:

#chat_history_memory.py
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(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]
with_message_history = RunnableWithMessageHistory(
    runnable,
    get_session_history,
    input_messages_key="input",
    history_messages_key="history",
)

请注意,我们已指定了 input_messages_key(要视为最新输入消息的键)和 history_messages_key(要添加历史消息的键)。

在调用此新 Runnable 时,我们通过配置参数指定相应的聊天历史:

with_message_history.invoke(
    {"ability": "math", "input": "余弦是什么意思?"},
    config={"configurable": {"session_id": "abc123"}},
)
content='余弦是一个数学函数,通常在三角学中使用,表示直角三角形的邻边和斜边的比例。' response_metadata={'token_usage': {'completion_tokens': 38, 'prompt_tokens': 38, 'total_tokens': 76}, 'model_name': 'gpt-4-0613', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-9aa23716-3959-476d-9386-6d433266e060-0' usage_metadata={'input_tokens': 38, 'output_tokens': 38, 'total_tokens': 76}
# 记住
with_message_history.invoke(
    {"ability": "math", "input": "什么?"},
    config={"configurable": {"session_id": "abc123"}},
)
content='余弦是一个数学术语,用于描述直角三角形中的角度关系。' response_metadata={'token_usage': {'completion_tokens': 26, 'prompt_tokens': 88, 'total_tokens': 114}, 'model_name': 'gpt-4-0613', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-f77baf90-6a13-4f48-991a-28e60ece84e8-0' usage_metadata={'input_tokens': 88, 'output_tokens': 26, 'total_tokens': 114}
# 新的 session_id --> 不记得了。
with_message_history.invoke(
    {"ability": "math", "input": "什么?"},
    config={"configurable": {"session_id": "def234"}},
)

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求