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 存储

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

相关推荐
Victor3563 小时前
https://editor.csdn.net/md/?articleId=139321571&spm=1011.2415.3001.9698
后端
Victor3563 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
后端
灰子学技术5 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
Gogo8166 小时前
BigInt 与 Number 的爱恨情仇,为何大佬都劝你“能用 Number 就别用 BigInt”?
后端
fuquxiaoguang6 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
毕设源码_廖学姐6 小时前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
野犬寒鸦8 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
逍遥德8 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
MX_93599 小时前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
程序员泠零澪回家种桔子10 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构