OpenAI API 学習（ファインチューニング）

OpenAI API の以下のページを要約します。（実際には試していません。）

Fine-tuning

https://platform.openai.com/docs/guides/fine-tuning

チューニングしたモデルでは、プロンプトで多くの例題を提供する必要が無くなります。（ファインチューニング ⇔ フューショット学習）

１．トレーニングデータを用意し、アップロードする
２．新しいチューニングモデルに登録する
３．結果を評価し、必要ならば１から繰り返す
４．完成したチューニングモデルを使用する
　

**料金**

![1221_01m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/bf8c745e-ee16-c621-3036-7c84f9e15fda.png)

![1221_02m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/6be0d74a-fd69-5767-e39b-4fd9bac3d6fe.png)

![1221_03m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/6897e2c0-63ce-809a-9f10-a4b96a690a4a.png)


※［キャッシュされた入力トークン］で料金が下がります
　

**１．データセットを作成する**

実際の推論時に AI が回答するような、多様な会話例を作成する。

```json
{
    "messages": [
        {"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, 
        {"role": "user", "content": "What's the capital of France?"}, 
        {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}
    ]
}
{
    "messages": [
        {"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, 
        {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, 
        {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}
    ]
}
{
    "messages": [
        {"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, 
        {"role": "user", "content": "How far is the Moon from Earth?"}, 
        {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}
    ]
}
```

> Marv は事実に基づくチャットボットですが、皮肉屋でもあります。
> 「フランスの首都はどこですか？」
> パリです。みんなもう知ってるって感じですよね。
> 
> Marv は事実に基づくチャットボットですが、皮肉屋でもあります。
> 「『ロミオとジュリエット』を書いたのは誰ですか？」
> ああ、ウィリアム・シェイクスピアってただの人ですよ。聞いたことありますか？
> 
> Marv は事実に基づくチャットボットですが、皮肉屋でもあります。
> 「月は地球からどれくらい離れていますか？」
> およそ384,400キロメートルです。多少の誤差はありますが、そんなの気になりますかね。

　

**２．プロンプトの作成**

ファインチューニングを行う前に、モデルが最適に動作するような命令とプロンプトのセットを用意することを推奨します。そして、それをすべてのトレーニングサンプルに組み込むことをお勧めします。

すべてに組み込まず省略する場合でも、モデルが命令を与えられたかのように振る舞うことを確認してください。むしろ、推論時に命令を除外して動作させることは困難かもしれません。

モデルが命令無しでもトレーニングサンプル全体のように動作するようになるには、大量のトレーニングサンプルが必要です。
　

**３．推奨するトレーニングサンプル数**

最低10個
gpt-4o-mini や gpt-3.5-turbo で明確な改善を確認するには50から100個
50個から始めることを推奨
　

**４．トークン上限数**

![1221_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/dad2eb3a-a02f-d6a1-ea4c-918b59635434.png)

> INFERENCE CONTEXT LENGTH：
> モデルが推論を行うときの入力データの長さ
> 
> TRAINING EXAMPLE CONTEXT LENGTH：
> モデルの学習時に使用された1つのサンプルのデータの長さ

　
**５．データセットの整形**

jsonl フォーマットで保存する
拡張子 *.jsonl
1行に1つの JSON オブジェクト

```json:input.jsonl
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}
```

　
**６．トレーニングファイルのアップロード**

```console
cd working_directory 
npm install openai
export OPENAI_API_KEY=“…”

node FileUploads.mjs
```

```javascript:FileUploads.mjs
import fs from 'fs';
import fetch from 'node-fetch';
import OpenAI, { toFile } from 'openai';

const openai = new OpenAI();

// If you have access to Node `fs` we recommend using `fs.createReadStream()`:
await openai.files.create({ file: fs.createReadStream('input.jsonl'), purpose: 'fine-tune' });

```

　
**７．チューニングモデルを作る**

まずファインチューニングジョブを作成する。同時にチューニングモデルの作成が開始される

```javascript:CreateFineTunedModel.mjs
const fineTune = await openai.fineTuning.jobs.create({
  training_file: 'file-abc123',
  model: 'gpt-4o-mini-2024-07-18'
});
```

または、ウェブ（https\://platform.openai.com/finetune）から操作して作成する
作り終わると、完了のメールが届く

　
**８．チューニングモデルを使用する**

作成したチューニングモデルは、fine_tuned_model の一覧に表示されるため、他のモデルと同様に名前を指定して使用できる

```javascript:UseFineTunedModel.mjs
async function main() {
  const completion = await openai.chat.completions.create({
    messages: [{ role: 'system', content: 'You are a helpful assistant.' }, { role: 'user', content: 'Write a haiku about recursion in programming.' }],
    model: 'ft:gpt-4o-mini:my-org:custom_suffix:id',
  });
  console.log(completion.choices[0].message);
}
main();

```

　
**９．以下、モデルをチューニングするテクニックなど**