老铁们,今天我们来聊聊如何使用Facebook Messenger的数据来微调一个AI模型。这波操作可以说是相当丝滑,咱们一步步来看。首先,你需要下载你的Messenger数据,然后通过一些数据处理步骤,为微调AI模型做准备。最终,我们会使用OpenAI的服务进行微调,并在LangChain应用中使用结果模型。下面是详细步骤:
1. 下载数据
首先,你需要从Facebook下载你的Messenger数据。注意,必须以JSON格式下载,而不是HTML格式。这里有详细的下载步骤说明。
为了方便演示,我们在这个Google Drive链接上提供了一个示例数据包。下面是下载并解压的代码示例:
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
来加载聊天记录。如果你有多个文件,可以使用目录加载器FolderFacebookMessengerChatLoader
。
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]
print(chat_session["messages"][:3])
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)
print(f"Prepared {len(training_data)} dialogues for training")
4. 微调模型
准备好训练数据后,我们就可以开始微调模型了。确保已安装openai
库并正确设置OPENAI_API_KEY
。
import json
import time
from io import BytesIO
import openai
# 写入内存中的jsonl文件
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")
# 启动训练任务
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
while status != "succeeded":
time.sleep(5)
job = openai.fine_tuning.jobs.retrieve(job.id)
status = job.status
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)
今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~
—END—