Azure OpenAIでファインチューニングを試してみよう

生成AI活用をしていくにあたって構築できることはもちろん大切なのですが、運用していくことも同様に重要となります。
今回はそんな運用の方にスポットを当てた記事になります。
はじめに
こんにちは。クラウドソリューショングループのtakinami.sです。
この記事では、ファインチューニングとは何かに軽く触れた後、Azure OpenAIで実現するにはどうすれば良いか手順を解説していこうと思います。
そもそもファインチューミングとは?
ファインチューニングとはなんなのでしょう?
簡単に言うと、OpenAIのGPT-4のような既存の学習済みモデルに対して、使用目的に合ったデータやより新しいデータを学習させることです。
例えば、先ほど挙げた汎用的なGPT-4のようなモデルはある時点までの一般的に知られたデータしか持っていません。
そこに日本全国の気温の記録を学習させると、その情報に特化したモデルにすることが可能です。
特化したモデルとはいえやはり学習した分のデータが全てになるので、データの更新に追いついていくための学習の必要もあります。
日本の1番暑い記録としてよく知られているのが2018年に記録された埼玉県熊谷市の41.1℃ですが、2020年には静岡県浜松市で同じ数値が記録されています。
2018年までのデータしか学習していないモデルに「日本で一番暑い街は?」と問いかけても熊谷市しか返してくれませんが、2020年のデータを追加で学習させることで浜松市も併せて回答してくれるようになるでしょう。
上記は気温という簡単な例でしたが、一般的に知られていない専門用語が多数存在するような業界・業種では、とても効果のあるアプローチではないかと思います。
「Fine tuning」を直訳すると「微調整」となりますので、英語のドキュメントをそのまま翻訳したようなケースではそのように表現されていることがありますが、より正確な表現をするなら「追加学習」や「再訓練」という言い方が適切かなと思います。
Azure OpenAIでファインチューニングを試す
それでは、Azure OpenAIで提供されているOpen AIモデルをファインチューニングしてみましょう。
今回は手っ取り早くAzure Portal上から操作していきます。
※前提として、Azure上にAzure OpenAIのリソースを作成済みであるものとします。
※本記事の内容は2025年6月時点のものになります
学習させるデータを作ろう
まず、ファインチューニングで用いたいデータを作っていきましょう。
形式はJSON Linesである必要があります。
今回はこんな10件分のデータを用意してみました。
{"messages": [{"role": "system", "content": "あなたは世界一日本の天気に詳しい人です。丁寧に天気について教えます。"}, {"role": "user", "content": "浜松市の記録上の最高気温は?"}, {"role": "assistant", "content": "41.1度です"}]}
{"messages": [{"role": "system", "content": "あなたは世界一日本の天気に詳しい人です。丁寧に天気について教えます。"}, {"role": "user", "content": "熊谷市の記録上の最低気温は?"}, {"role": "assistant", "content": "20.0度です"}]}
{"messages": [{"role": "system", "content": "あなたは世界一日本の天気に詳しい人です。丁寧に天気について教えます。"}, {"role": "user", "content": "旭川市の記録上の最高気温は?"}, {"role": "assistant", "content": "37.9度です"}]}
{"messages": [{"role": "system", "content": "あなたは世界一日本の天気に詳しい人です。丁寧に天気について教えます。"}, {"role": "user", "content": "那覇市の記録上の最高気温は?"}, {"role": "assistant", "content": "36.0度です"}]}
{"messages": [{"role": "system", "content": "あなたは世界一日本の天気に詳しい人です。丁寧に天気について教えます。"}, {"role": "user", "content": "佐野市の記録上の最高気温は?"}, {"role": "assistant", "content": "41.0度です"}]}
{"messages": [{"role": "system", "content": "あなたは世界一日本の天気に詳しい人です。丁寧に天気について教えます。"}, {"role": "user", "content": "美濃市の記録上の最高気温は?"}, {"role": "assistant", "content": "41.0度です"}]}
{"messages": [{"role": "system", "content": "あなたは世界一日本の天気に詳しい人です。丁寧に天気について教えます。"}, {"role": "user", "content": "金山市の記録上の最高気温は?"}, {"role": "assistant", "content": "41.0度です"}]}
{"messages": [{"role": "system", "content": "あなたは世界一日本の天気に詳しい人です。丁寧に天気について教えます。"}, {"role": "user", "content": "越谷市の記録上の最高気温は?"}, {"role": "assistant", "content": "40.4度です"}]}
{"messages": [{"role": "system", "content": "あなたは世界一日本の天気に詳しい人です。丁寧に天気について教えます。"}, {"role": "user", "content": "かつらぎ市の記録上の最高気温は?"}, {"role": "assistant", "content": "40.6度です"}]}
{"messages": [{"role": "system", "content": "あなたは世界一日本の天気に詳しい人です。丁寧に天気について教えます。"}, {"role": "user", "content": "伊勢崎市の記録上の最高気温は?"}, {"role": "assistant", "content": "40.5度です"}]}
このデータを元に返事をしてくれることを期待して、次のステップへ進みます。
カスタムモデルを作ろう
それでは、いよいよカスタムモデル作成です!

Azure Portalのリソース概要ページにある「Explore Azure Al Foundry Portal」のボタン、もしくはhttps://oai.azure.com/からAzure AI Foundryポータルを開きましょう。

画面左側のメニューに「ツール > 微調整(もしくはFine-tuning)」という項目があることが確認できるかと思います。
そこから「モデルの微調整」のボタンを押します。

すると、ファインチューニングを行うモデルを選択するモーダルが表示されます。
今回は『gpt-4.1』を選びました。

先程作成したデータを使いたいので、ファイルのアップロードを選択しました。
ローカルにあるファイルだけでなく、Azure上のストレージにあるファイルを参照することも可能です。
注意事項として、データが10件以上ないとアップロードの際にエラーになってしまいます。
データは豊富に用意しておきましょう。

ファインチューニングされたモデルの準備には少々時間がかかります。ステータスが「Queued > Running > Completed」と変化していきますが、「Completed」になったら準備完了です。
今回は準備完了までに50分ほど時間がかかっていました。
カスタムモデルを使おう

今回は手っ取り早くプレイグラウンドで試してみます。
「微調整されたモデルをデプロイする」から、先程準備したモデルを選びましょう。

内容は省きますが、モデル選択後に設定を行なって「デプロイ」を押せば、デプロイが実行されます。

浜松市と旭川市の最高気温を聞いてみたところ、無事データに基づいた回答がされているようです。
今回はかなり簡単なデータのためご覧のような結果でしたが、複雑化してくると10件程度では期待した回答が返ってこない可能性もあります。
最後に
ファインチューニングは説明だけ聞くと、とても有効な手段のように思えます。
しかし、正確な回答を求めるには学習させるデータが大量に必要になります。
料金面も気にしないといけないポイントかと思います。
Azure OpenAIでは使用量に関係なく、ファインチューニングされたモデルをデプロイしておくだけで1時間毎に料金がかかります。
今回検証で使用した『gpt-4.1』では1時間あたり約246円です。
単純計算で1ヶ月立てておくだけで20万円近くになります。
恐ろしいですね…
この辺りはどういった使い方をしたいのか、どこまで正確性も求めるのかなど、生成AIとの向き合い方が問われてくるのかなと感じているところです。
