Starfish Takeaway Stranraer

© Copyright Billy McCrorie and licensed for reuse under this Creative Commons Licence.

 

 

前回は、Bingを「より創造的に」という会話スタイルで使って、①アイデアを量産し、②評価軸と評価軸間の重みづけも考えて量産したアイデアを絞り込み、③更に、絞り込んだアイデアをブラッシュするためのプロンプトをご紹介しました。

Azure OpenAI Serviceを本格的に使いこなすには、まずは、Azure OpenAI Serviceを包含するAzure Cognitive Servicesだけでなく、Azureのクラウド環境をある程度理解しておく必要があります。

何もかも目新しい大地を、Microsoft Learnが無料で提供してくれている「AIエンジニア」向けのいろいろなコースの情報を頼りに彷徨っているうち、今回、Azure Cognitive Searchに行き着きました。

Azureを使いこなしている方には「何をいまさら」ということかもしれませんが、自分としては、(多分Azure OpenAI ServiceからAzureの世界に飛び込んだほかの方にとっても)、「大規模言語モデル(LLM)のファインチューニング」という観点から新しい発見があったので、ご紹介したいと思います。

出典:Microsoft Portfolio for AI

 

まずは、Azure OpenAI Serviceではなく、ChatGPTとの対話から始めます。

今回は、無料版(GPT-3.5)を使っています。

 


 

私#1

ChatGPTのモデルに対して行われる事前学習とRLHFおよびファインチューニングの目的/関連性/違いについて教えてください。

ChatGPT#1

事前学習 (Pretraining)、RLHF (Reinforcement Learning from Human Feedback)、およびファインチューニング (Fine-tuning) は、ChatGPTなどの言語モデルの開発と改善に使用されるトレーニング手法です。これらの手法は、モデルをより優れたパフォーマンスを持つものにするために組み合わせて使用されることがあります。以下にそれぞれの手法について説明します:

事前学習 (Pretraining):

事前学習は、大規模なテキストコーパスを用いて、モデルを一般的な言語理解を持つように訓練するプロセスです。ChatGPTはGPT (Generative Pre-trained Transformer) アーキテクチャに基づいており、この事前学習フェーズでは、多数のWebページや書籍などから抽出されたテキストデータを使って、次の単語を予測するタスクを学習します。これにより、モデルは言語の構造や文脈を理解する能力を獲得します。事前学習によって得られたパラメータは、後続の手法でさらなるチューニングに使用されます。

RLHF (Reinforcement Learning from Human Feedback):

RLHFは、事前学習されたモデルをさらに洗練させるための手法です。通常、モデルにはまだ改善の余地があります。この改善を促進するために、人間がモデルの出力に対してフィードバックを提供します。人間のフィードバックは、例えば与えられたテキストへの適切な応答を教える形式で与えられます。これらのフィードバックは、報酬としてモデルにフィードバックが与えられるリンフォースメントラーニングと組み合わせられます。RLHFによって、モデルは人間の意図により適合し、より自然で適切な回答を生成するように改善されます。

ファインチューニング (Fine-tuning):

ファインチューニングは、特定のタスクにモデルを適応させるための手法です。事前学習とRLHFで訓練されたモデルを、特定のタスクに対応するように微調整します。たとえば、ChatGPTは一般的な言語理解を持っていますが、特定のドメインやタスクにおいては、より専門的で具体的な回答を求められることがあります。ファインチューニングでは、限られたデータセットを使って、特定のタスクに適したモデルの重みを微調整し、性能を向上させます。これによって、モデルは特定の応用分野においてより優れた成績を発揮できるようになります。

つまり、これらの手法は以下のように連携して働きます:

事前学習:モデルの言語理解を向上させる基本的なトレーニング。

RLHF:人間のフィードバックによってモデルをより適切に調整し、一般的な誤りを修正。

ファインチューニング:特定のタスクに適応させるためにモデルを微調整し、タスクの性能を向上させる。

これにより、ChatGPTのような言語モデルは、幅広い応用分野でより高度な言語理解と応答を提供できるようになります。

 

私#2

つまり、RLHFは、特定のタスクに適応させる目的ではないけれども、一般的に人間との対話において適切な応答を教えるためのチューニングととらえてよいですか?

ChatGPT#2

はい、おっしゃる通りです。RLHFは、特定のタスクに直接適応させるためではなく、主に人間との対話においてより適切な応答を生成するためのチューニングの手法です。具体的には、人間がモデルの出力に対してフィードバックを提供し、そのフィードバックを報酬としてリフォースメントラーニングに組み込むことで、モデルの応答を改善します。

このプロセスによって、モデルは一般的な言語理解に加えて、特定のタスクやドメインに対するより適切な応答を学習することができます。RLHFによって、モデルは人間のフィードバックにより調整され、より自然で意味のある回答を生成できるようになります。

 

私#3

プロンプトエンジニアリングの中でもチューニングと呼ばれるものがありますが、これはファインチューニングとどう違っているのでしょうか?

ChatGPT#3

プロンプトエンジニアリングの「チューニング」とファインチューニングは、いくつかの点で異なる概念です。以下にそれぞれの違いを説明します:

ファインチューニング (Fine-tuning):

ファインチューニングは、通常、事前学習済みのモデルを特定のタスクに適応させるための手法です。事前学習済みのモデルは、大規模なテキストコーパスを用いて一般的な言語理解を獲得したものであり、これを特定のタスクに適用するために、タスク固有のデータセットを使ってモデルを微調整します。ファインチューニングでは、タスク固有の特徴に適合するようにモデルを調整することが目的です。

プロンプトエンジニアリングの「チューニング」:

プロンプトエンジニアリングは、コンピュータープログラムなどのシステムに対して、ユーザーに対して適切な応答を引き出すための入力を設計するプロセスです。プロンプトは、システムに与えられる入力の形式であり、適切に設計されると、システムが望ましい応答を生成しやすくなります。

プロンプトエンジニアリングの「チューニング」とは、特に言語モデルを使用する場合、事前学習済みのモデルに対して適切なプロンプトを設計することを指します。適切なプロンプトを設計することにより、モデルの出力を目的に合わせて導くことができます。例えば、特定の質問に対して情報を返すようなプロンプトを設計すると、モデルは質問に適切に回答するように誘導されるという具合です。

つまり、ファインチューニングはタスク固有のデータで事前学習済みモデルを調整する一方で、プロンプトエンジニアリングの「チューニング」は、適切なプロンプトを設計することによってモデルの出力を誘導する手法です。これらは異なるアプローチですが、プロンプトエンジニアリングはファインチューニングと組み合わせることで、より優れたモデルを構築することが可能です。

 

私#4

prompt tuningの他に、prefix tuningというのもあるようですが?

ChatGPT#4

はい、その通りです。prefix tuning(プレフィックスチューニング)も言語モデルの応答を調整する手法の1つです。プレフィックスチューニングは、特定のタスクや応用において、モデルが生成するテキストの前に特定のテキスト(プレフィックス)を挿入することによって、モデルの出力を誘導する手法です。

プレフィックスチューニングでは、タスクに関連するプレフィックスを定義し、それを入力としてモデルに提供します。モデルはこのプレフィックスに従って応答を生成するため、よりタスク固有の回答を得ることが期待されます。プレフィックスは、タスクの要件やユーザーの意図に合わせて設計され、モデルが望ましい形式の回答を生成するための手がかりとなります。

プレフィックスチューニングは、特に特定の応用や制約のあるタスクに対してモデルを適応させる際に有用です。例えば、特定の質問形式に回答するためのプレフィックスを設計することで、モデルが質問に正確に回答するように誘導することができます。

これまでに説明したファインチューニングやプロンプトエンジニアリングと同様に、プレフィックスチューニングも言語モデルの応答の精度や適切さを向上させる手法として重要です。これらの手法は、特定の応用分野やタスクにおいて、より優れたモデルを構築するために組み合わせられることがあります。

 

私#5

OpenAI APIを通してprefix tuningを行うには、どのようにすればよいのでしょうか?

ChatGPT#5

OpenAI APIを使用してprefix tuningを行うには、以下の手順に従ってください:

モデルを選択:

OpenAI APIを使用するために、事前学習済みのモデルを選択します。

プレフィックスの設計:

タスクに適したプレフィックスを設計します。プレフィックスは、モデルが応答を生成する際に使われるテキストであり、タスクの要件やコンテキストをモデルに提供するための手がかりとなります。プレフィックスは、JSON形式で指定します。

APIリクエストの作成:

Pythonなどのプログラミング言語を使用して、APIリクエストを作成します。OpenAI APIを利用する場合、OpenAI Pythonパッケージを使用してリクエストを送信します。リクエストの際に、選択したモデルとプレフィックスを指定します。

APIリクエストの送信:

作成したAPIリクエストをOpenAI APIに送信します。APIエンドポイントにリクエストを送信し、モデルからの応答を取得します。

応答の解析:

APIから受け取った応答を解析して取得します。応答の解析は、プログラム内で行われ、必要に応じて適切な形式に整形されることが一般的です。

 

以下は、Pythonを使った簡単な例です(OpenAI Pythonパッケージがインストールされていることを前提としています):

import openai

# OpenAI APIキーの設定

openai.api_key = “YOUR_OPENAI_API_KEY”

# モデルとプレフィックスの設定

model = “gpt-3.5-turbo”

prefix = “Translate the following English text to French:”

# 入力テキストの設定

input_text = prefix + ” Hello, how are you?”

# OpenAI APIにリクエストを送信して応答を取得

response = openai.Completion.create(

    engine=model,

    prompt=input_text,

    max_tokens=100

)

# 応答の解析

output_text = response.choices[0].text.strip()

print(“応答:”, output_text)

これは、英語のテキストをフランス語に翻訳するタスクを行う例です。プレフィックスに「Translate the following English text to French:」を指定し、その後に翻訳したい英文を入力としてモデルに提供しています。

これらの手順に従ってOpenAI APIを使用すれば、prefix tuningを実現することができます。必要に応じて、異なるタスクやコンテキストに合わせてプレフィックスをカスタマイズすることで、モデルの応答をより適切に誘導できるようになります。

 

私#6

どうもありがとうございます。ただ、示してくれた例のprefixの設定は、ChatGPTへのプロンプトの中での「指示」に相当するもので、特段チューニングするものには見えないのですが?

ChatGPT#6

申し訳ありません、私の説明が混乱を招いたようです。おっしゃる通り、私が示した例はプロンプトエンジニアリングの一例であり、prefix tuningの具体的な例ではありませんでした。

prefix tuningは、タスクに応じたプレフィックスを用いてモデルを微調整する手法です。これは、特定のタスクにおいてより適切な応答を引き出すためにモデルを訓練することを意味します。プレフィックスは、タスクの要件やコンテキストをモデルに伝えるための手がかりとなります。

具体的なprefix tuningの例を示します:

例:テキスト生成タスク (summarization)

プレフィックス: “summarize:”

入力テキスト: “summarize: The article discusses the impact of climate change on biodiversity in the Amazon rainforest.”

出力: “Climate change has significant effects on Amazon rainforest biodiversity.”

上記の例では、”summarize:”というプレフィックスを使って、モデルに記事を要約するタスクを行わせています。プレフィックスによって、モデルが要約のための適切な回答を生成するように誘導されます。

このように、prefix tuningではタスク固有のプレフィックスを指定し、そのプレフィックスに従ってモデルを訓練することで、タスクに特化したモデルを作成します。プロンプトエンジニアリングとして、特定の応用において適切なプレフィックスを設計することが含まれる場合もありますが、prefix tuningはそのようなタスクに特化した訓練の一環です。

 

私#7

つまり、prefix tuningとは、prefixで指定したカテゴリのタスクに対して、プロンプトの例と出力例をペアで指定してモデルをファインチューニングするもので、ファインチューニングの一種と思ってよいですか?

ChatGPT#7

はい、その理解で正解です!

prefix tuningは、特定のタスクやカテゴリに対して、プレフィックス(prefix)を指定してモデルをファインチューニングする手法の1つです。プレフィックスは、タスクの要件やコンテキストをモデルに提供するためのテキストであり、モデルの出力を誘導するのに役立ちます。

ファインチューニングは、既に事前学習済みのモデルを特定のタスクに適応させるための手法を指します。prefix tuningは、このファインチューニングの一種であり、プレフィックスを使ってタスクに特化したモデルを構築する手法です。タスク固有のプレフィックスと入出力のペアを使ってモデルを調整することで、特定のタスクにおいて高い性能を発揮するモデルを得ることができます。

プロンプトエンジニアリングとして、適切なプレフィックスの設計が含まれる場合もありますが、prefix tuningはその一部であり、ファインチューニングの一つのアプローチとして捉えることができます。

 

私#8

OpenAIはChatGPTを提供するにあたって、あらかじめいくつかのprefixを定義しておくのではないかと想定したのですが、そうではなく、ChatGPTの利用者側がファインチューニングの一環で実施するものという理解でよいですか?

ChatGPT#8

OpenAIがChatGPTを提供する際に、あらかじめ特定のprefixを定義しておくことは一般的には行われません。ChatGPTは、一般的な対話を行うことを目的として訓練されたモデルであり、ユーザーが自由なテキストで対話できるように設計されています。

ユーザーは、事前学習済みのモデルをベースにして、自身の特定のタスクや応用に適したプレフィックスを定義し、それに基づいてモデルをファインチューニングすることができます。

 

私#9

これまで、自分の想像していたファインチューニングのイメージは、例えば、ある企業が全社的にChatGPTの導入を決めた場合、例えば、「交通費精算がしたいのですが?」と言えば、その企業の交通費精算申請書に記入しなければならない項目を対話型で埋められるよう、その企業の様々な申請書情報をChatGPT側に覚えこませ、モデルの振舞のトレーニングというよりも、OpenAIが事前学習させた以外の企業独自の情報を追加で理解するようにさせることかと思っていました。

ChatGPT#9

ファインチューニングは、一般的な事前学習済みモデルを特定のタスクや応用に適応させるために、タスク固有のデータや情報を取り込む手法です。あなたの例で挙げられたように、企業がChatGPTを導入し、特定の申請書情報を対話型でモデルに入力できるようにすることがファインチューニングの一例として挙げられます。

ファインチューニングによって、事前学習済みのモデルは特定の企業やドメインに関連する情報を学習し、その企業独自のタスクに適した回答を生成するようになります。企業独自の申請書情報を含むデータセットを使用してモデルをファインチューニングすることで、モデルは特定の申請書の要件や項目を理解し、対話に基づいて適切な情報を埋め込むことができるようになります。

例えば、ファインチューニングによってChatGPTを「交通費精算」のタスクに適応させる際に、以下のようなプレフィックスと入力テキストを使用することが考えられます:

プレフィックス: “交通費精算”

入力テキスト:

“日時: [入力日時]”

“目的: [交通費の目的]”

“From情報: [出発地点]”

“To情報: [到着地点]”

“交通手段: [交通手段の種類]”

“交通費合計: [金額]”

ユーザーはプレフィックスの後に必要な情報を入力し、ChatGPTが申請書の記入を対話形式でサポートするようになります。

そのため、ユーザーが以下のように入力すると:

プレフィックス: “交通費精算”

入力テキスト:

– “日時: 2023年07月20日”

– “目的: 顧客訪問”

– “From情報: 会社オフィス”

– “To情報: 顧客先”

– “交通手段: 電車”

– “交通費合計: 2000円”

ChatGPTは対話を進めながら、ユーザーの入力に基づいて詳細な申請書を生成することが期待されます。

このように、プレフィックスを使って特定のタスクに関連する情報をモデルに提供することで、ChatGPTを特定の応用にカスタマイズして、より具体的なサポートを提供することができます。ファインチューニングを通じて、企業独自のタスクやニーズに合ったモデルを構築することが可能になります。

 

私#10

2023年7月6日付けのOpenAI社のProduct Announcementによると、「Based on the stability and readiness of these models for production-scale use, we are also making the GPT-3.5 Turbo, DALL·E and Whisper APIs generally available. We are working on safely enabling fine-tuning for GPT-4 and GPT-3.5 Turbo and expect this feature to be available later this year.」ということで、現時点(2023年7月23日)では、GPT-3.5 TurboおよびGPT-4のファインチューニングはできないようですね。

ChatGPT#10

おっしゃる通りです。2023年7月23日時点で、OpenAIはGPT-3.5 TurboとGPT-4のファインチューニングを公式にサポートしているわけではありません。GPT-3.5 TurboおよびGPT-4のファインチューニングについての公式な情報はまだ提供されていない可能性があります。

Product Announcementによれば、GPT-3.5 TurboとDALL·E、WhisperのAPIが本格的なプロダクション向けに提供されていることが確認されていますが、GPT-4およびGPT-3.5 Turboのファインチューニング機能は、今後のリリースに向けて安全に実装される予定です。

ファインチューニングの可能性やサポートについては、OpenAIの公式なリリースやアップデートを注意深くチェックすることが重要です。新しい機能やサービスがリリースされる際には、OpenAIの公式な発表を確認して最新の情報を入手することが大切です。

 

私#11

GPT-3.5 TurboまたはGPT-4を用いる場合、現時点で、上記のような企業情報でファインチューニングしたい場合、他に方法があるでしょうか?

ChatGPT#11

現時点で、GPT-3.5 TurboまたはGPT-4を用いる場合で、企業情報でファインチューニングを行うための公式サポートされた方法は提供されていないようです。GPT-3.5 TurboとGPT-4に関しては、OpenAIの公式な情報によれば、ファインチューニング機能が現時点では利用できないとされています。

 


 

ということで、現時点では、GPT-3.5 TurboやGPT-4をブラウザのChatGPT Plusから利用する場合も、OpenAI API経由で利用する場合も、実はファインチューニングできないということが分かりました。

 

最近、「企業レベルでChatGPTを導入した」というニュースを耳にしますが、では、そのような場合、企業独自の業務ノウハウや、営業情報、社則、帳票類などを、どのようにして「追加学習」させればよいのでしょうか?

OpenAI公認のChatGPT用プラグインには、プロンプトで入力する質問に関する補足情報として、ChatGPTが事前学習した内容以外の情報をURLで指定することを可能とするものはありますが、従業員が毎回ChatGPTを呼び出すごとに、必要な追加情報を自分で追加指定するのでは使いづらいですね。

ネットで調べてみると、ChatGPTで独自データを学習させて回答してもらう方法というのが見つかりました。

出典:ChatGPTで独自データを学習させて回答してもらう方法

 

説明によると、ChatGPTに全てのデータを渡すことはできないので、独自情報をVectorStoreというデータベースに保管(例えば自社の年金制度に関する情報)しておき、従業員が質問(例えば「自社の年金制度は?」)をしたとき、Langchainというライブラリでその質問を受け取って、Vector store内のデータの中の関係がありそうなデータを検索。得られた情報とともにOpenAI APIを用いてChatGPTを呼び出す構造になっているようです。

事前に自分の会社の年金制度に関して一度VectorStoreに登録しておけばよく、また、この方法を使えば1つのPDFだけではなく多くのドキュメントをローカルに保持できるようです。

ただし、データはローカルに保持できるものの、最終的にはChatGPTに対するプロンプトの一部となって、その情報がOpenAI側に送られることになります。

OpenAI APIを利用する場合、入力したプロンプトの内容や、出力をOpenAIがモデルの学習用に用いないことは明記されていますが、OpenAI社は、これらのデータを最大30日間保存するとともに、OpenAIの社員によって、不正使用がないかどうか内容を監視していると言われています。

 

同じことをMicrosoft Azure OpenAI Serviceを利用する場合の方法が、Microsoft Learnの「独自のデータに基づく Azure OpenAI (プレビュー)」で解説されていました。


これは、GPT-35-Turbo や GPT-4 などのモデルを独自のデータに基づいて実行できるようにするもので、基本的な仕組みは、VectorStore/Langchainの組み合わせで実現される仕組みと変わりませんが、以下では、Microsoft Learnで学んだ内容/Azure OpenAI StudioのChatGPTプレイグラウンドでの操作の復習を兼ね、少し詳しくご紹介します。

出典:LLMシステムの非機能対応現場レポート

 

1)独自のデータソース(企業独自の業務ノウハウや、営業情報、社則、帳票類などの追加登録情報)をAzure Blob Storageに保存する。

※Azure Blob Storageは、非構造化データ(テキストデータやバイナリデータなど)を大量に格納するために最適化されたMicrosoftのクラウド用オブジェクトストレージ

 

2)後で、Azure Cognitive Searchにより、ユーザが入力したプロンプトの内容に関連する追加登録情報を高速に検索して入手できるよう、追加情報のインデックス化を行う。

 

3)Azure OpenAI StudioのChatGPTプレイグラウンド追加登録情報を利用する準備を行う

 

以下は、1)2)3)の操作を実施した際の画面コピーです。

 

■Azure OpenAI StudioのChatGPTプレイグラウンド画面

「+ Add a data source」をクリックすると、「Select or add data source」画面がポップアップする


■Add Data:Select or add data source」画面

 

  • select data source欄:ドロップダウンメニューから「Upload files」を選択
  • 「Select Azure Blob storage resource」欄:作成したAzure Blob storage resource名(azrblbstrage1)を入力
  • 「Select Azure Cognitive Search resource」欄:Azure Cognitive Searchを利用するために作成したリソース名(azrcogntvsrch1)を入力
  • 「Enter the index name」欄:アップロードする独自データを検索する際のインデックス名

これらを指定して「次へ」をクリックすると、「Upload files」画面に切り替わる

 

■Add Data:Upload files画面

  • 独自データソース(演習では、サンフランシスコ、ニューヨーク、ロンドン、ラスベガス、ドバイの旅行情報)を「ドラッグアンドドロップ、またはファイルを参照する」エリアにドラッグアンドドロップし、「Upload files」をクリック

アップロードが完了するとReview and finish画面になる

■Add Data:Review and finish画面

「保存して閉じる」をクリックすると、アシスタント(ChatGPT)に独自データソースの登録が完了する。

  • Uploadしたファイルのインデックスがアシスタントに登録され、「Limit responses to your data content」のチェックボックスをオンにしているので、この後のプロンプトに対してはアップロードした情報をベースにChatGPTは回答するようになる

※サンフランシスコの旅行情報はアップロードしたデータソースに含まれているが、東京の情報はないので、上記のような回答になっている

 


 

本日は、ChatGPTの「P」にあたる「事前学習」とファインチューニングに関して、現状どうなっているかを確認し、事前学習以外の情報をもとにChatGPTに回答させる方法として、VectorStore/Langchainの方法とMicrosoft Azure OpenAI Serviceを利用する場合の方法をご紹介しました。

前者では、OpenAI社が、OpenAI APIで渡されたプロンプトの内容及回答の内容に不都合がないかどうかOpenAIの社員によって監視されているのに対して、Azure OpenAI Serviceを利用する場合は、OpenAI/Microsoftの社員の監視も外すことができるようです。

 

本日は以上です。

 

終わり