如何使用iMessage数据为AI模型进行微调:从聊天记录到智能对话

46 阅读3分钟

如何使用iMessage数据为AI模型进行微调:从聊天记录到智能对话

引言

在当今数字通信时代,iMessage等即时消息应用程序成为了我们交流的重要渠道。iMessage将聊天记录存储在SQLite数据库中,如果能够将这些记录转换并应用于AI模型,将为对话系统训练提供丰富的数据支持。这篇文章将指导你如何使用iMessage的聊天记录微调OpenAI模型,以便打造一个更智能的对话系统。

主要内容

1. 访问iMessage聊天数据库

在macOS上,iMessage的聊天记录存储在~/Library/Messages/chat.db数据库中。由于权限限制,您的终端可能无法直接访问该路径。一个可行的方法是将数据库复制到一个可访问的目录(例如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 Chat Loader

接下来,使用langchain_community.chat_loaders.imessage模块中的IMessageChatLoader类加载聊天记录。注意,由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。

from langchain_community.chat_loaders.imessage import IMessageChatLoader

loader = IMessageChatLoader(
    path="./chat.db",
)

3. 加载和处理消息

使用load()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)
chat_sessions: List[ChatSession] = list(
    map_ai_messages(merged_messages, sender="Tortoise")
)

4. 准备微调数据并微调模型

将聊天记录转换为适应OpenAI微调的格式后,可以使用这些数据来微调你的AI模型。确保你的环境中安装了openai库,并正确设置了OPENAI_API_KEY

from langchain_community.adapters.openai import convert_messages_for_finetuning
import openai
import json
import time
from io import BytesIO

training_data = convert_messages_for_finetuning(chat_sessions)
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",
)

5. 在LangChain中使用微调后的模型

完成微调后,可以在LangChain中使用微调后的模型。通过以下代码加载并使用模型:

from langchain_openai import ChatOpenAI

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

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

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)

常见问题和解决方案

  • 无法访问iMessage数据库:确保将数据库文件复制到一个具有读取权限的目录。
  • API访问问题:对于网络不稳定的地区,考虑使用API代理服务。

总结和进一步学习资源

通过本文,你学习了如何从iMessage提取数据并应用于AI模型的微调。为更深入的研究,你可以查看OpenAI的微调指南以及LangChain的官方文档.

参考资料

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

---END---