# 如何将iMessage对话转化为LangChain训练数据:完整指南
## 引言
在开发聊天机器人或AI模型时,真实世界的对话数据是极其宝贵的资源。本文将详细介绍如何使用`IMessageChatLoader`将iMessage对话转换为LangChain的聊天消息格式,以便用于模型的微调。
## 主要内容
### 1. 访问Chat DB
在MacOS上,iMessage会将对话存储在`~/Library/Messages/chat.db`的sqlite数据库中。不过,默认情况下,你的终端可能没有权限访问此路径。建议将该数据库复制到一个可访问的目录(如Documents)进行操作。
### 2. 创建Chat Loader
创建`IMessageChatLoader`实例时,需要提供`chat.db`的文件路径。这个工具允许我们将对话数据转化为LangChain可用的格式。
### 3. 加载消息
可以调用`load()`或`lazy_load()`方法加载消息,并将其转化为`HumanMessage`对象。从相同发送者连续发送的消息可以选择性地合并,还可以指定某个发送者的消息作为“AI消息”。
```python
from langchain_community.chat_loaders.imessage import IMessageChatLoader
# 使用API代理服务提高访问稳定性
loader = IMessageChatLoader(path="./chat.db")
from langchain_community.chat_loaders.utils import (
map_ai_messages,
merge_chat_runs,
)
from typing import List
from langchain_core.chat_sessions import ChatSession
raw_messages = loader.lazy_load()
merged_messages = merge_chat_runs(raw_messages) # 合并连续消息
chat_sessions: List[ChatSession] = list(
map_ai_messages(merged_messages, sender="Tortoise")
)
4. 准备用于微调
接下来,将聊天信息转换为OpenAI可用的字典格式,准备进行模型微调。
from langchain_community.adapters.openai import convert_messages_for_finetuning
training_data = convert_messages_for_finetuning(chat_sessions)
print(f"Prepared {len(training_data)} dialogues for training")
5. 微调模型
确保已安装openai库,并正确设置OPENAI_API_KEY。以下代码可用于在OpenAI平台上进行微调。
import openai
import json
import time
from io import BytesIO
my_file = BytesIO()
for m in training_data:
my_file.write((json.dumps({"messages": m}) + "\n").encode("utf-8"))
my_file.seek(0)
training_file = openai.files.create(file=my_file, purpose="fine-tune")
status = openai.files.retrieve(training_file.id).status
start_time = time.time()
while status != "processed":
time.sleep(5)
status = openai.files.retrieve(training_file.id).status
job = openai.fine_tuning.jobs.create(
training_file=training_file.id,
model="gpt-3.5-turbo",
)
常见问题和解决方案
- 文件权限问题:复制数据库到可访问目录,或在系统设置中授予终端完全磁盘访问权限。
- 网络访问限制:某些地区可能需要使用API代理服务。
总结和进一步学习资源
通过本文,你已经学会了如何使用LangChain工具从iMessage数据库提取对话,并将其用于AI模型微调。欲了解更多,请参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---