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

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

相关推荐
pany5 分钟前
程序员近十年新年愿望,都有哪些变化?
前端·后端·程序员
杨宁山7 分钟前
Java 解析 CDR 文件并计算图形面积的完整方案(支持 MultipartFile / 网络文件)@杨宁山
后端
朱昆鹏10 分钟前
IDEA Claude Code or Codex GUI 插件【开源自荐】
前端·后端·github
HashTang11 分钟前
买了专业屏只当普通屏用?解锁 BenQ RD280U 的“隐藏”开发者模式
前端·javascript·后端
明月_清风13 分钟前
从"请求地狱"到"请求天堂":alovajs 如何用 20+ 高级特性拯救前端开发者
前端·后端
掘金者阿豪17 分钟前
如何解决 "Required request body is missing" 错误:深度解析与解决方案
后端
William_cl20 分钟前
ASP.NET Core 视图组件:从入门到避坑,UI 复用的终极方案
后端·ui·asp.net
小杨同学4922 分钟前
C 语言实战:3 次机会密码验证系统(字符串处理 + 边界校验)
后端
天天摸鱼的java工程师30 分钟前
工作中 Java 程序员如何集成 AI?Spring AI、LangChain4j、JBoltAI 实战对比
java·后端
叫我:松哥31 分钟前
基于 Flask 框架开发的在线学习平台,集成人工智能技术,提供分类练习、随机练习、智能推荐等多种学习模式
人工智能·后端·python·学习·信息可视化·flask·推荐算法