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

90 阅读2分钟

引言

在现代应用中,利用LLM(大型语言模型)进行微调可以显著提升特定任务的性能。本文将带你深入了解如何从LangSmith的LLM运行中加载数据并进行模型微调,这个过程包括三个简单的步骤。本文的目的是帮助开发者理解如何利用这些工具来提升他们的模型能力。

主要内容

安装先决条件

在开始之前,请确保您已经安装了需要的语言包,并配置了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

1. 选择运行

选择需要微调的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"

2. 准备数据

我们将选择成功的运行并使用LangSmithRunChatLoader加载为聊天会话。

from langsmith.client import Client
from langchain_community.chat_loaders.langsmith import LangSmithRunChatLoader

client = Client()
successful_traces = { run.trace_id for run in client.list_runs(project_name=project_name, execution_order=1, error=False) }

llm_runs = [ run for run in client.list_runs(project_name=project_name, run_type="llm") if run.trace_id in successful_traces ]

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

3. 微调模型

接下来,我们使用OpenAI库进行微调。

import json
import time
from io import BytesIO
import openai

training_data = convert_messages_for_finetuning(chat_sessions)

# 使用API代理服务提高访问稳定性
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

常见问题和解决方案

  • 网络访问问题:有些地区访问OpenAI API会受到限制,建议使用API代理服务来保障访问稳定性。
  • 模型微调时间过长:可以通过优化数据量和训练参数来缩短训练时间。

总结和进一步学习资源

本文介绍了如何从LangSmith的LLM运行中加载数据并进行模型微调。通过这些步骤,你可以优化特定任务的表现。建议读者进一步研究LangSmith的文档和OpenAI的微调指南。

参考资料

  • LangSmith Cookbook
  • LangSmith API Documentation
  • OpenAI Fine-tuning Guide

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

---END---