[解锁iMessage聊天数据:如何利用LangChain进行AI消息转换和模型微调]

124 阅读3分钟

解锁iMessage聊天数据:如何利用LangChain进行AI消息转换和模型微调

引言

在数字时代,消息数据是构建语言模型的重要资源。苹果的iMessage是许多人常用的通信工具,但如何高效地转换这些聊天信息以用于AI模型的训练?本文将结合LangChain工具,展示如何将iMessage聊天记录转换为AI可读的格式,并进一步进行模型微调。

主要内容

1. 访问iMessage数据库

在MacOS上,iMessage会话记录通常储存在~/Library/Messages/chat.db(至少在macOS Ventura 13.4版本是如此)。由于系统权限问题,直接访问此路径可能会被拒绝。解决方法是将数据库文件复制到一个可访问的目录,如Documents,或者在系统设置中为终端授予完整磁盘访问权限(不推荐)。

为了便于学习和演示,我们提供了一个示例数据库,可以从此链接下载。

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)

2. 创建iMessage聊天加载器

使用IMessageChatLoader加载聊天数据。这需要提供数据库文件路径,还可以选择配置消息合并以及指定一个发送者作为AI角色。

from langchain_community.chat_loaders.imessage import IMessageChatLoader

# 创建聊天加载器并指定数据库路径
loader = IMessageChatLoader(
    path="./chat.db",
)

3. 加载并处理消息

利用loader.lazy_load()方法加载会话,并配置是否合并连续的消息,以及将哪个发送者视作AI角色。

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)

# 将"Tortoise"的消息设定为AI消息
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库并设置API密钥,进行模型微调。

# 确保你已经安装OpenAI库并配置好环境
%pip install --upgrade --quiet langchain-openai

import json
import time
from io import BytesIO
import openai

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
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",
)

status = openai.fine_tuning.jobs.retrieve(job.id).status
start_time = time.time()
while status != "succeeded":
    time.sleep(5)
    job = openai.fine_tuning.jobs.retrieve(job.id)
    status = job.status

print(job.fine_tuned_model)

6. 在LangChain中使用微调的模型

使用LangChain的ChatOpenAI类直接调用微调后的模型。

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)

常见问题和解决方案

  • 访问问题:无法直接访问Mac的iMessage数据库。解决方案是复制数据库到一个可访问的目录。
  • 微调过长:OpenAI的微调过程可能需要较长时间,可以尝试减少数据集规模以加速测试流程。

总结和进一步学习资源

通过本文的介绍,我们了解了如何将iMessage聊天数据转化为AI模型可解析的格式,并进行进一步的微调。想更深入了解LangChain或微调模型的技巧,可以访问以下资源:

参考资料

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

---END---