langchain学习总结-ChatMessage 组件学习笔记

ChatMessage 组件学习笔记

一、ChatMessage 是什么?

ChatMessage(聊天消息历史组件)是 LangChain 框架中用于管理和存储对话历史的组件。它提供了多种实现方式,包括内存存储和文件存储,能够帮助 AI 应用程序实现多轮对话的上下文记忆功能。

核心特性

  • 自动管理对话历史
  • 支持多种存储后端(内存、文件、数据库等)
  • 提供统一的接口来操作消息
  • 支持 Human(用户)、AI(助手)、System(系统)等多种消息类型

二、ChatMessage 有什么用?

1. 实现多轮对话

让 AI 能够记住之前的对话内容,实现连贯的多轮对话体验。

2. 上下文管理

自动管理对话的上下文,避免手动拼接历史消息的繁琐工作。

3. 持久化存储

支持将对话历史保存到文件或数据库,实现跨会话的记忆功能。

4. 简化开发

提供简洁的 API,开发者无需关注底层存储细节。

三、主要实现类

1. InMemoryChatMessageHistory(内存存储)

用途: 将对话历史存储在内存中,适合临时对话或单次会话场景。

优点:

  • 速度快
  • 无需额外配置
  • 适合测试和开发

缺点:

  • 程序重启后数据丢失
  • 不支持跨会话记忆

2. FileChatMessageHistory(文件存储)

用途: 将对话历史持久化到文件中,适合需要长期保存对话记录的场景。

优点:

  • 数据持久化
  • 跨会话记忆
  • 简单可靠

缺点:

  • 读写速度相对内存慢
  • 并发访问需要注意文件锁

四、代码示例与输出

示例 1:内存对话消息历史组件

python 复制代码
from langchain_core.chat_history import InMemoryChatMessageHistory

chat_history = InMemoryChatMessageHistory()

chat_history.add_user_message("你好,我是ccc,你是谁")
chat_history.add_ai_message("你好,我是chatgpt,有什么可以帮到你?")

print(chat_history.messages)

输出示例:

python 复制代码
[
    HumanMessage(
        content='你好,我是ccc,你是谁',
        additional_kwargs={},
        response_metadata={}
    ),
    AIMessage(
        content='你好,我是chatgpt,有什么可以帮到你?',
        additional_kwargs={},
        response_metadata={},
        tool_calls=[],
        invalid_tool_calls=[]
    )
]

说明:

  • add_user_message() - 添加用户消息
  • add_ai_message() - 添加 AI 消息
  • messages 属性 - 获取所有历史消息列表

示例 2:文件对话消息历史组件实现记忆

代码:2. 文件对话消息历史组件实现记忆.py

python 复制代码
import dotenv
from langchain_community.chat_message_histories import FileChatMessageHistory
from openai import OpenAI

dotenv.load_dotenv()

client = OpenAI(base_url='https://api.moonshot.cn/v1')
chat_history = FileChatMessageHistory('./memory.txt')

while True:
    query = input("Human:")

    if query == "q":
        exit(0)

    print("AI", flush=True, end="")

    system_prompt = (
        "你是OpenAi开发的ChatGpt聊天机器人,可以根据相对应的上下文回复用户消息,上下文存放的是人类和你的对话信息列表"
        f"<context>{chat_history}</context>\n\n"
    )
    print(chat_history, 'chat_history')

    response = client.chat.completions.create(
        model='moonshot-v1-8k',
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": query}
        ],
        stream=True,
    )

    ai_content = ""

    for chunk in response:
        content = chunk.choices[0].delta.content
        if content is None:
            break
        ai_content += content
        print(content, flush=True, end="")

    chat_history.add_user_message(query)
    chat_history.add_ai_message(ai_content)
    print("")

交互示例:

bash 复制代码
Human: 你好
AI[] chat_history
你好!我是ChatGPT,有什么可以帮助你的吗?
Human: 我叫ccc
AI[HumanMessage(content='你好', additional_kwargs={}, response_metadata={}), AIMessage(content='你好!我是ChatGPT,有什么可以帮助你的吗?', additional_kwargs={}, response_metadata={}, tool_calls=[], invalid_tool_calls=[])] chat_history
你好ccc!很高兴认识你,有什么我可以帮助你的吗?
Human: q
(程序退出)

memory.txt 文件内容(持久化存储):

json 复制代码
[
    {"type": "human", "data": {"content": "你好", "additional_kwargs": {}, "response_metadata": {}}},
    {"type": "ai", "data": {"content": "你好!我是ChatGPT,有什么可以帮助你的吗?", "additional_kwargs": {}, "response_metadata": {}, "tool_calls": [], "invalid_tool_calls": []}},
    {"type": "human", "data": {"content": "我叫ccc", "additional_kwargs": {}, "response_metadata": {}}},
    {"type": "ai", "data": {"content": "你好ccc!很高兴认识你,有什么我可以帮助你的吗?", "additional_kwargs": {}, "response_metadata": {}, "tool_calls": [], "invalid_tool_calls": []}}
]

五、常用 API 方法

InMemoryChatMessageHistory / FileChatMessageHistory 共有方法:

方法 说明 示例
add_user_message(message) 添加用户消息 chat_history.add_user_message("你好")
add_ai_message(message) 添加 AI 消息 chat_history.add_ai_message("你好!")
messages 属性 获取所有消息 chat_history.messages
clear() 清空历史 chat_history.clear()

六、使用场景对比

场景 推荐组件 原因
简单对话机器人 InMemoryChatMessageHistory 无需持久化,简单快速
客服系统 FileChatMessageHistory 需要保存对话记录
聊天应用 FileChatMessageHistory 用户需要历史记录
一次性任务 InMemoryChatMessageHistory 无需保存历史
测试开发 InMemoryChatMessageHistory 方便调试,重启即清空

七、注意事项

  1. 文件存储路径 :使用 FileChatMessageHistory 时确保程序有文件读写权限
  2. 性能考虑:大量对话历史可能影响响应速度,可考虑实现历史消息截断策略
  3. 安全性:文件存储时注意敏感信息的保护
  4. 并发问题:多进程/线程访问同一文件时需要加锁机制

八、扩展知识

LangChain 还支持其他 ChatMessage 历史存储方式:

  • SQLChatMessageHistory - 数据库存储
  • RedisChatMessageHistory - Redis 缓存存储
  • MongoDBChatMessageHistory - MongoDB 存储
  • PostgreSQLChatMessageHistory - PostgreSQL 存储

这些都需要额外的依赖和配置,适合生产环境的大规模应用。

相关推荐
VX:Fegn08958 小时前
计算机毕业设计|基于ssm + vue超市管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
Java天梯之路12 小时前
Spring Boot 钩子全集实战(七):BeanFactoryPostProcessor详解
java·spring boot·后端
wr20051413 小时前
第二次作业,渗透
java·后端·spring
短剑重铸之日13 小时前
《SpringCloud实用版》生产部署:Docker + Kubernetes + GraalVM 原生镜像 完整方案
后端·spring cloud·docker·kubernetes·graalvm
爬山算法14 小时前
Hibernate(67)如何在云环境中使用Hibernate?
java·后端·hibernate
女王大人万岁14 小时前
Go标准库 io与os库详解
服务器·开发语言·后端·golang
露天赏雪14 小时前
Java 高并发编程实战:从线程池到分布式锁,解决生产环境并发问题
java·开发语言·spring boot·分布式·后端·mysql
短剑重铸之日15 小时前
《SpringCloud实用版》 Seata 分布式事务实战:AT / TCC / Saga /XA
后端·spring·spring cloud·seata·分布式事务
FAFU_kyp15 小时前
RISC0_ZERO项目在macOs上生成链上证明避坑
开发语言·后端·学习·macos·rust
qq_124987075316 小时前
基于springboot的会议室预订系统设计与实现(源码+论文+部署+安装)
java·vue.js·spring boot·后端·信息可视化·毕业设计·计算机毕业设计