LLM(言語モデル)の微調整に関するシリーズへようこそ!前回の記事では、Hugging Faceを使用したLLMの微調整 (opens new window)について説明しました。今回は、OpenAIプラットフォームに焦点を当てます。多くの人々がOpenAIをChatGPTとAPIキーアクセスの統合に関連付けていますが、もう1つの強力な機能があります。それは、特定のニーズに合わせてモデルを微調整する機能です。このプロセスにより、事前学習済みモデルの広範な知識ベースを使用しながら、データセットとの互換性と最適化を確保することができます。
このブログでは、OpenAI APIを使用してモデルを微調整する方法を説明します。チャットボットの改善、新しいタイプのストーリーの作成、質問に答えるシステムの設定など、OpenAIの微調整機能を最大限に活用する方法を紹介します。
# 前提条件
始める前に、必要なパッケージがインストールされていることを確認してください。データセットの処理にはdatasets
パッケージが必要であり、OpenAI APIとのやり取りにはopenai
が必要です。ターミナルを開き、次のコマンドを入力します。
pip install datasets openai
**datasets
**ライブラリは、データセットの読み込みや操作に特化した多目的なツールです。機械学習のワークフローに特に便利です。
関連記事: レコメンデーションモデルの構築方法 (opens new window)
# データセットの読み込み
まず、データセットを読み込みます。デモンストレーションの目的で、Hugging Faceで利用可能なデータセットを使用します。以下の方法でデータセットを読み込むことができます。
from datasets import load_dataset
# Hugging Faceからデータセットを読み込む
dataset = load_dataset("lamini/lamini_docs")
このコードスニペットでは、"lamini/lamini_docs"という名前のデータセットを読み込んでいます。異なるデータセット名がある場合は、これを置き換えてください。
# データセットの探索
微調整を進める前に、データセットの構造を把握することが重要です。データセットの構造を確認してみましょう。
dataset
これにより、次のような結果が表示されます。
DatasetDict({
train: Dataset({
features: ['question', 'answer', 'input_ids', 'attention_mask', 'labels'],
num_rows: 1260
})
test: Dataset({
features: ['question', 'answer', 'input_ids', 'attention_mask', 'labels'],
num_rows: 140
})
})
次のステップでは、このデータセットから必要なデータを抽出し、トレーニングの準備をします。
関連記事: 画像検索アプリケーションの構築方法 (opens new window)
# 微調整のためのデータのフォーマット
データセットはトレーニングとテストの分割に分散されています。トレーニングデータのみを使用します。次のようにトレーニングデータを抽出しましょう。
import pandas as pd
train_dataset = dataset['train']
train_df = pd.DataFrame(train_dataset)
questions_answers = train_df[['question', 'answer']]
このステップでは、データフレームから質問と回答のみを抽出します。微調整には主にこれらの2つの要素が必要です。
OpenAIでは、微調整のためにデータを特定のJSONL形式にする必要があります。各行は、単一のトレーニング例を表すJSONオブジェクトである必要があります。データのフォーマット方法は次の通りです。
with open('finetune_data_chat_format.jsonl', 'w') as jsonl_file:
for index, example in questions_answers.iterrows():
formatted_data = {
"messages": [
{"role": "system", "content": "You're a helpful assistant"},
{"role": "user", "content": example['question']},
{"role": "assistant", "content": example['answer']}
]
}
jsonl_file.write(json.dumps(formatted_data) + '\\n')
注意: 私たちの目標はチャットボットを作成し、gpt-3.5-turboを微調整することです。そのため、対話形式のチャット形式を使用しています。他の形式については、OpenAIのチャット形式 (opens new window)ページを参照してください。
# データセットのOpenAIへのアップロード
微調整する前に、フォーマットされたデータセットをOpenAIにアップロードする必要があります。
from openai import OpenAI
from pathlib import Path
client = OpenAI(api_key="your_api_key")
response = client.files.create(
file=Path('finetune_data_chat_format.jsonl'),
purpose='fine-tune'
)
注意: APIキーを安全に保管し、共有や公開されたコードベースには公開しないでください。purpose='fine-tune'パラメータは、アップロードされたファイルがモデルのトレーニングに使用されることを示しています。
# 微調整プロセスの開始
データがアップロードされたら、微調整プロセスを開始できます。
fine_tune_response = client.fine_tuning.jobs.create(
training_file=response.id, # アップロードしたファイルのIDを使用する
model="gpt-3.5-turbo" # 微調整するモデルを指定する
)
print("Fine-tuning job started with ID:", fine_tune_response.id)
これにより、選択したモデルで微調整プロセスが開始されます。ジョブIDは、微調整ジョブの進行状況を追跡するために使用されます。
注意: トレーニングが完了すると、モデル名が含まれたメールが届きます。テストの部分でそのモデル名を使用します。
関連記事: 関係ベクトルデータベースを使用したGenAIアプリケーションの強化 (opens new window)
# 微調整の進行状況の監視
次のようにして、微調整ジョブの進行状況を監視できます。
client.fine_tuning.jobs.retrieve("your_fine_tune_job_id")
"your_fine_tune_job_id"をジョブ作成ステップから返されたIDに置き換えてください。このコマンドにより、ジョブの状態とパフォーマンスに関する詳細な情報が提供されます。
# 微調整済みモデルのテスト
微調整が完了したら、モデルをテストする時間です。次の方法で微調整済みモデルを使用して補完を生成できます。
completion = client.chat.completions.create(
model="your_fine_tuned_model_name",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Your message here"}
],
max_tokens=50
)
print(completion.choices[0].message.content)
**"your_fine_tuned_model_name"
と"Your prompt here"
**を、それぞれモデル名とテストプロンプトに置き換えてください。
これで、ニーズに合わせて微調整されたモデルが手に入りましたが、これはOpenAIの始まりに過ぎません。このプラットフォームでは、より高度で複雑なモデルをトレーニングすることができ、AIの可能性を広げることができます。
# Hugging FaceとOpenAIを使用したLLMの微調整の比較
Factor | Hugging Face | OpenAI |
---|---|---|
Ease of Use | User-friendly interface. Comprehensive documentation but requires strong machine learning background. | Straightforward and requires some machine learning familiarity. |
Model Availability | Wide range of pre-trained models (BERT, GPT, etc.). | Mainly focuses on GPT variants, with high optimization. Also offers Jurassic-1 Jumbo (QA) and Codex (code generation). |
Customization | Extensive customization options for fine-tuning. | Simplified customization process, less granular than Hugging Face. |
Data Privacy | Strong options: allows local or private cloud processing. | Strong, primarily cloud-based. May not suit all data sensitivity needs. |
Performance | Varies by model and settings, scalable with proper hardware. | High performance, especially in language understanding and generation. |
Scalability | User-managed scalability, depending on hardware and dataset size. | Managed by OpenAI, less user concern for infrastructure. |
Cost | Free and paid tiers, cost-effective with good management (especially local processing). | Usage-based pricing, can be expensive at scale. |
Community & Support | Large, active community with forums, tutorials, and shared projects. | Strong official channels and documentation, less community-driven. |
Additional Features | TRL Library simplifies fine-tuning (SFT, RLHF) | User-friendly API for application integration |
両方の微調整手法にはそれぞれ利点と欠点がありますが、主にユースケースに依存します。データのプライバシーを重視し、一定の技術的知識がある場合は、Hugging Faceを選択することができます。それ以外の場合は、OpenAIを採用することができます。
# 結論
OpenAI APIを使用してLLMを微調整することは、特定のニーズに合わせて言語モデルをカスタマイズするための効率的で強力な手法を提供します。この記事で説明した手順に従って、モデルを効率的に微調整し、カスタマイズされた高品質な結果を得ることができます。ただし、微調整の効果は、トレーニングデータの品質と関連性に大きく依存することに注意してください。微調整の取り組みから最良の結果を得るために、データセットのキュレーションと構造化に時間をかけてください。
モデルの微調整には、入力データの埋め込みやベクトルの生成が含まれる場合があります。一部の場合、これらの埋め込みをベクトルデータベースに格納して、効率的な検索や類似性検索を行うことができます。たとえば、特定のアプリケーション(ドキュメント分類など)向けに言語モデルを微調整する場合、AIアプリケーション向けのSQLベクトルデータベースであるMyScale (opens new window)を使用すると、高速な検索や類似性検索のパフォーマンスを実現できます。開発者にとっては、SQLのみが必要なため、非常にアクセスしやすいです。
フィードバックや提案については、MyScaleの**Discord (opens new window)**でお問い合わせください。