将iMessage聊天记录转化为AI聊天数据:从数据抽取到模型微调的完整指南

# 将iMessage聊天记录转化为AI聊天数据:从数据抽取到模型微调的完整指南

## 引言

iMessage是苹果设备用户广泛使用的即时通讯工具,很多用户会希望将其聊天记录用于AI模型训练,例如,微调生成式预训练模型以适应自己的对话风格。这篇文章将详细介绍如何利用`IMessageChatLoader`工具,提取iMessage数据,将其转换为可用于LangChain的聊天记录,并最终实现模型的微调。

## 主要内容

### 1. 访问iMessage数据库

iMessage的对话记录保存在macOS系统的SQLite数据库中,路径为`~/Library/Messages/chat.db`。在操作之前,可能需要将数据库文件复制到方便访问的目录(如Documents),因为默认情况下,终端无法直接访问这个路径。或者,您可以在系统设置中为终端应用程序授予完全磁盘访问权限,但这并不是推荐的做法。

### 2. 下载示例数据库

我们准备了一个示例数据库,您可以通过以下代码下载该文件:

```python
import requests

def download_drive_file(url: str, output_path: str = "chat.db") -> None:
    file_id = url.split("/")[-2]
    download_url = f"https://drive.google.com/uc?export=download&id={file_id}"

    response = requests.get(download_url)
    if response.status_code != 200:
        print("Failed to download the file.")
        return

    with open(output_path, "wb") as file:
        file.write(response.content)
        print(f"File {output_path} downloaded.")

url = "https://drive.google.com/file/d/1NebNKqTA2NXApCmeH6mu0unJD2tANZzo/view?usp=sharing"
download_drive_file(url)

3. 创建Chat Loader

使用IMessageChatLoader类来加载聊天记录:

from langchain_community.chat_loaders.imessage import IMessageChatLoader

loader = IMessageChatLoader(
    path="./chat.db",  # 指定聊天数据库的路径
)

4. 加载和转换消息

通过调用load()lazy_load()函数来加载并转换消息:

from typing import List
from langchain_community.chat_loaders.utils import map_ai_messages, merge_chat_runs
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")  # 将特定发送者标记为AI消息
)

5. 准备进行微调

将聊天信息转换为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")

6. 微调模型

确保您已安装OpenAI包并设置了OPENAI_API_KEY

import json
import time
from io import BytesIO
import openai

# 将JSONL文件写入内存
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":
    print(f"Status=[{status}]... {time.time() - start_time:.2f}s", end="\r", flush=True)
    time.sleep(5)
    status = openai.files.retrieve(training_file.id).status
print(f"File {training_file.id} ready after {time.time() - start_time:.2f} seconds.")

job = openai.fine_tuning.jobs.create(
    training_file=training_file.id,
    model="gpt-3.5-turbo",
)

7. 在LangChain中使用模型

使用微调后的模型:

from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

model = ChatOpenAI(
    model=job.fine_tuned_model,
    temperature=1,
)

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are speaking to hare."),
        ("human", "{input}"),
    ]
)

chain = prompt | model | StrOutputParser()

for tok in chain.stream({"input": "What's the golden thread?"}):
    print(tok, end="", flush=True)

常见问题和解决方案

问题1:终端无法访问chat.db

  • 解决方案:将数据库文件复制到可访问的目录,或授予终端访问权限。

问题2:API访问不稳定

  • 解决方案:使用API代理服务以提高访问的稳定性。

总结与进一步学习资源

在本文中,我们讨论了如何提取iMessage聊天记录,并将其用于AI模型的微调。这一过程涉及数据抽取、转换和微调多个步骤。如果您希望深入了解LangChain和OpenAI,请访问以下资源:

参考资料

结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值