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:文件对话消息历史组件实现记忆
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 | 方便调试,重启即清空 |
七、注意事项
- 文件存储路径 :使用
FileChatMessageHistory时确保程序有文件读写权限 - 性能考虑:大量对话历史可能影响响应速度,可考虑实现历史消息截断策略
- 安全性:文件存储时注意敏感信息的保护
- 并发问题:多进程/线程访问同一文件时需要加锁机制
八、扩展知识
LangChain 还支持其他 ChatMessage 历史存储方式:
- SQLChatMessageHistory - 数据库存储
- RedisChatMessageHistory - Redis 缓存存储
- MongoDBChatMessageHistory - MongoDB 存储
- PostgreSQLChatMessageHistory - PostgreSQL 存储
这些都需要额外的依赖和配置,适合生产环境的大规模应用。