ホームページ >バックエンド開発 >PHPチュートリアル >PHP/Symfony 7 での固有表現認識のための OpenAI Assistant の利用

PHP/Symfony 7 での固有表現認識のための OpenAI Assistant の利用

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-26 02:44:13764ブラウズ

大規模な言語モデルを現実世界の製品バックエンドに統合することは、イノベーションの最新の戦場です。しかし、すべてのテクノロジートレンドと同様に、真の勝者は、急いですべてを知ろうとする人ではありません。代わりに、立ち止まり、熟考し、賢明な決定を下すことが重要です。

AI がかつてないほど身近になったとはいえ、それを簡単なタスクだと考えるのは大きな間違いです。この分野はまだ初期段階にあり、テクノロジー関係者やビジネス関係者のほぼ全員が、この分野を理解する方法を模索しています。インターネットには、信頼できる情報と誤解を招く誇大宣伝の両方が溢れています。

信じられないかもしれませんが、AI のゴシップを耳にするたびに飛びつく必要はありません。一歩下がって、思慮深く取り組んでください。

あなたが PHP 開発者であるか、PHP コードベースを使って作業している場合、AI は異質な概念のように感じるかもしれません。クラス、インターフェイス、メッセージ キュー、およびフレームワークは、NLP、微調整、確率的勾配降下法、LoRA、RAG、およびその他すべての専門用語とはまったく別のもののように見えます。わかった。これらの概念を体系的に学ぶには、ソフトウェア エンジニアリングの他の分野と同様、時間と適切な実践が必要です。

しかし、AI、機械学習、データサイエンスは Python や R プログラマーの領域ではないでしょうか?あなたは部分的には正しいです。ほとんどの基本的な機械学習は Python で行われます。正直なところ、Python は学ぶのが楽しいです。多用途で、無数の興味深いプロジェクトに適用できます。言語モデルの構築とトレーニングから、API を介したデプロイまで、Python がカバーします。

しかし、PHP に戻りましょう。

心配しないでください。あなたが通常のソフトウェア エンジニアとして時代遅れになるわけではありません。まったく逆です。コンテナ化、CI/CD、システム エンジニアリング、クラウド インフラストラクチャなどの関連分野を理解することがますます求められているため、AI は急速にツールキットのもう 1 つの必須スキルになりつつあります。学習を始めるのに今ほど良い時期はありません。

とはいえ、(本当にそうしたい場合を除き)ゼロからニューラル ネットワークの構築に真っ先に取り組むことはお勧めしません。圧倒されやすいです。その代わりに、AI 実験の実用的な出発点を示しましょう。

何が期待できますか?

このガイドで説明する内容は次のとおりです:

非同期 AI ワークフロー
RabbitMQ、Amazon SQS、またはお好みのブローカーのいずれであっても、メッセージ キューを使用して AI ワークフローを実装する方法を説明します。

実稼働対応ソリューション
AI を使用して基本的なビジネス要件を解決する、実稼働システムに導入されたソリューションの実例をご覧ください

Symfony の統合
このソリューションは、Symfony PHP フレームワーク内に完全に実装されています。

OpenAI ツール
OpenAI PHP ライブラリと最新の OpenAI Assistants 2.0 を使用します。

どのようなトピックを扱いますか?

  • データセット構造
    AI モデルのトレーニングと評価のためのデータセットを構築する方法。

  • OpenAI モデルの微調整
    適切な .jsonl ファイルを準備し、特定のビジネス ユースケースに合わせて GPT-4o-mini モデルまたは GPT ファミリの別のモデルを微調整する方法を学びます。

  • OpenAI Assistant 2.0 の作成とテスト
    OpenAI アシスタントをセットアップし、OpenAI Playground でテストする方法を理解します。

  • 知識ベース
    ナレッジ ベースの概念を詳しく見てみましょう。GPT がすべてを知っているわけではない理由と、GPT に適切なコンテキストを提供して精度を大幅に向上させる方法を説明します。

  • PHP と Symfony の統合
    AI エージェントと Symfony アプリケーションをシームレスに接続する方法を学びましょう。

興味がありますか?巻いてみましょう

OpenAI PHP プロジェクトの前提条件

  1. OpenAI アカウント openai.com のアカウントが必要です。
  2. オプション: 重みとバイアスのアカウント wandb.ai でのアカウントのセットアップはオプションですが、強くお勧めします。これは、AI 実験を追跡し、結果を視覚化するための優れたツールです。

問題の定義

解決している問題について詳しく見ていきましょう。
その中心となるのは、何か (この場合は住所) を表すテキストのブロックです。目標は、そのコンポーネントを事前定義されたグループに分類することです。

そのため、ユーザーがアドレスを送信すると、アドレスを複数の部分に分割した JSON 構造を返すことを目指しています。例:

{
  "street": "Strada Grui",
  "block": "Bloc 7",
  "staircase": "Scara A",
  "apartment": "Apartament 6",
  "city": "Zărnești"
}

なぜこれが重要なのでしょうか?

これらのアドレスは人々、つまり当社の顧客によって入力されるもので、一貫性がないことがよくあります。構造化され解析されたデータが必要な理由は次のとおりです:

  1. 一貫した書式設定 アドレスがシームレスな処理のために標準形式に従っていることを確認します。
  2. アドレス検証 (オプション) アドレスが有効か存在するかを確認できます。

これを実現するには、住所を「番地」、「家」、「郵便番号」などの事前定義されたグループに分割し、それを目的のシーケンスに再構成します。

正規表現を使用しないのはなぜですか?

一見すると簡単そうに思えます。新規顧客に対して書式設定を強制する場合、または顧客が通常特定の方法で住所を書くことがわかっている場合は、正規表現が合理的な解決策のように思えるかもしれません。

ただし、ルーマニアの住所の例を考えてみましょう。

STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI

BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124

ルーマニアの住所は複雑なことが多く、特定の順序で書かれておらず、郵便番号などの要素が省略されることがよくあります。最も洗練された正規表現でも、このような変動性を確実に処理するのは困難です。

これは、GPT-3.5 Turbo や GPT-4o-mini のような AI モデルが輝くところです。これらの AI モデルは、正規表現のような静的ルールが処理できる範囲をはるかに超えた不整合や複雑さを管理できます。

よりスマートな AI ワークフロー

はい、私たちは従来のアプローチを大幅に改善した AI ワークフローを開発しています。

すべての機械学習プロジェクトは、データとモデルという 2 つの重要な要素に要約されます。モデルも重要ですが、データの方がはるかに重要です。

モデルは事前にパッケージ化され、テスト済みで提供され、どちらのパフォーマンスが優れているかを確認するために交換できます。しかし、真の変革をもたらすのは、モデルに提供するデータの品質です。

機械学習におけるデータの役割
通常、データセットは 2 つまたは 3 つの部分に分割されます。

  • トレーニング データ: モデルに何をすべきかを教えるために使用されます。
  • テスト データ: モデルのパフォーマンスを評価するために使用されます。

このプロジェクトでは、住所をそのコンポーネントに分割し、これを分類タスクにしたいと考えています。 GPT のような大規模言語モデル (LLM) で良好な結果を得るためには、トレーニング データセットに少なくとも 100 個の例が必要です。

データセットの構造化

データセットの生の形式はあまり重要ではありませんが、直感的で使いやすい構造を選択しました。

{
  "street": "Strada Grui",
  "block": "Bloc 7",
  "staircase": "Scara A",
  "apartment": "Apartament 6",
  "city": "Zărnești"
}

これが例です:

STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI

BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124

ご覧のとおり、目標は、入力アドレスに基づいて構造化された JSON 応答を生成することです。

OpenAI API アカウントのセットアップ

まず、OpenAI API アカウントが必要です。これは簡単なプロセスなので、初期資金を追加することをお勧めします。始めるには 10 ドルか 20 ドルで十分です。 OpenAI は便利な前払いサブスクリプション モデルを使用しているため、支出を完全にコントロールできます。

ここでアカウントの請求を管理できます:

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

OpenAI プレイグラウンドを探索する

アカウントを設定したら、OpenAI Playground に移動します。

インターフェースについてよく理解してください。準備ができたら、左側のメニューで「アシスタント」セクションを探してください。

ここでカスタム GPT インスタンスを作成します。

GPT アシスタントのカスタマイズ

GPT アシスタントは、次の 2 段階で特定のニーズに合わせて調整されます。

  • 例を含む詳細なシステム手順
    このステップは、ソリューションが機能するかどうかを迅速にテストして検証するのに役立ちます。これが結果を確認する最も早い方法です。

  • ナレッジベースによる微調整 (単純な RAG)
    最初の結果に満足したら、モデルを微調整します。このプロセスにより、すべてのプロンプトで広範な例を提供する必要性が減り、その結果、推論時間 (モデルが API 経由で応答するまでにかかる時間) が短縮されます。

両方の手順を組み合わせると、最も正確で効率的な結果が得られます。

それでは、始めましょう。

固有表現を認識するためのシステム プロンプトの設計

固有表現認識システムでは、構造化された JSON 応答を一貫して出力するモデルが必要です。これを達成するには、思慮深いシステム プロンプトを作成することが重要です。

ここで焦点を当てます:

  • 明確な結果を生成するための初期の「ダーティ」システム プロンプトを構築します。
  • 後でプロンプトを調整して、効率を向上させ、コストを最小限に抑えます。

少数ショットテクニックから始める

「少数ショット」テクニックは、このタスクに対する強力なアプローチです。これは、モデルに必要な入出力関係の例をいくつか提供することで機能します。これらの例から、モデルはこれまでに見たことのない入力を一般化して処理できることがわかります。

数ショット プロンプトの重要な要素:

プロンプトはいくつかの部分で構成されており、最良の結果を得るには慎重に構成する必要があります。正確な順序は異なる場合がありますが、次のセクションを含めることが必須です。

1. 明確な目的

プロンプトの最初の部分では、モデルが達成することが期待される内容の概要が示されています。

たとえば、この使用例では、入力はルーマニアの住所であり、スペルミスや間違った形式が含まれている可能性があります。このコンテキストは、モデルの準備を整え、モデルが処理するデータの種類を説明するため、不可欠です。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

2. フォーマット命令

タスクを定義した後、その出力のフォーマット方法を AI に指示します。

ここでは、モデルが入力から各キーと値のペアをどのように導出するかを含め、JSON 構造について詳しく説明します。期待を明確にするために例が含まれています。さらに、有効な JSON を保証するために、特殊文字はすべて適切にエスケープされます。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

3. 例

例は「少数ショット」テクニックのバックボーンです。より関連性の高い例を提供するほど、モデルのパフォーマンスが向上します。

GPT の広範なコンテキスト ウィンドウ (最大 16,000 トークン) のおかげで、多数の例を含めることができます。

サンプル セットを構築するには:

基本的なプロンプトから開始し、モデルの出力を手動で評価します。
出力にエラーが含まれている場合は、それらを修正し、修正バージョンをサンプル セットに追加します。
この反復プロセスにより、時間の経過とともにアシスタントのパフォーマンスが向上します。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

4. 訂正情報

それは避けられません。アシスタントが間違いを犯すことは避けられません。場合によっては、同じエラーが繰り返し発生する可能性があります。

これに対処するには、プロンプトに明確かつ丁寧な修正情報を含めてください。明確に説明してください:

アシスタントが犯している間違い。
代わりに出力から期待されるもの。
このフィードバックは、モデルの動作を調整し、より良い結果を生成するのに役立ちます。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

アシスタントの構成とテスト

概念実証のための数ショット ソリューションの最初のプロンプトを作成したので、次はアシスタントを構成してテストします。

ステップ1

  • OpenAI ダッシュボードに移動します
  • 左側のメニューから「アシスタント」を選択します
  • アシスタントの作成ページにリダイレクトされます。 OpenAI ダッシュボードに戻り、左側のメニューから「アシスタント」を選択します。 クリエイターアシスタントにリダイレクトされます。

ステップ 2: アシスタントを設定する

  • アシスタントに名前を付ける: アシスタントの目的を反映したわかりやすい名前を選択します (例: 「アドレス パーサー」)。
  • システム手順を貼り付けます: 作成したプロンプト全体をコピーし、システム手順入力ボックスに貼り付けます。これにより、アシスタントの動作が定義され、その出力が決まります。
  • アシスタントを保存する: プロンプトを貼り付けたら、[保存] をクリックして設定を保存します。

ステップ 3: 適切なモデルを選択します

このプロジェクトでは、次の理由から GPT-4o-mini を選択しました:

  • GPT-3.5 Turboよりも安いです
  • より正確です:)

とはいえ、常に精度とコストのバランスに基づいてモデルを選択する必要があります。ベンチマークを実行または検索して、特定のタスクに最適なものを判断します。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

出力スキーマの定義

初期設定が完了したら、アシスタント クリエーターで出力スキーマを直接指定できるようになります。

ステップ 1: 「生成」オプションを使用する
スキーマを手動で作成する代わりに、アシスタント作成者が提供する「生成」オプションを使用しました。その方法は次のとおりです:

  • プロンプトから (例の 1 つから) JSON 出力構造を取得します
  • 「生成」フィールドに貼り付けます。

このツールは、構造に一致するスキーマを自動的に生成するという優れた機能を果たします。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

--
一貫性のある予測可能な応答を確保するには、温度をできるだけ低く設定します。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

温度とは何ですか?

温度はモデルの応答のランダム性を制御します。温度値が低いということは、モデルがより予測可能で決定的な出力を生成することを意味します。

私たちのユースケースでは、これがまさに私たちが望んでいることです。入力として同じアドレスが与えられた場合、モデルは常に同じ正しい応答を返す必要があります。信頼性の高い結果を得るには、一貫性が重要です。

アシスタントのテスト

すべてのパラメータを設定したら、プレイグラウンドに移動してソリューションをテストします。

プレイグラウンドは、アシスタントを操作できるコンソールを提供します。ここからが楽しいところです。最低限のソリューションを厳密にテストして、次のことを明らかにできます。

  • モデルが幻覚を見ている (無関係または不正確な情報を生成している)。
  • プロンプトまたはスキーマの潜在的な欠陥。

これらの結果は、プロンプトの 修正情報 セクションを改良し、アシスタントをより堅牢にするのに役立ちます。

以下は、私の手動テストの結果の例です。

{
  "street": "Strada Grui",
  "block": "Bloc 7",
  "staircase": "Scara A",
  "apartment": "Apartament 6",
  "city": "Zărnești"
}

手動テストが重要な理由
昔ながらの実践的なテストは、信頼できるソリューションを構築するための基礎です。モデルの出力を手動で評価すると、問題をすぐに特定し、その修正方法を理解できます。自動化は後から行われますが、手動テストは、確実な概念実証を作成する上で非常に貴重なステップです。

PHP Symfony アプリケーションにアシスタントを接続する

今度は、すべてを PHP Symfony アプリケーションに統合します。セットアップは簡単で、古典的な非同期アーキテクチャに従っています。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

フローの内訳は次のとおりです:

1.フロントエンド対話

一般に、ここで説明するのは、メッセージ キューを使用した古典的な非同期セットアップです。 Docker コンテナ内で Symfony アプリケーションの 2 つのインスタンスが実行されています。 1 つ目は、フロントエンド クライアントとの対話です。

たとえば、顧客が次のように入力した場合:

STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI

BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124

アプリケーションは入力アドレスを処理し、それを Message オブジェクトにパッケージ化します。
次に、Message オブジェクトは Symfony Messenger Envelope インスタンスにラップされます。メッセージは、処理用の追加メタデータとともに JSON 形式にシリアル化されます。

Symfony Messenger は、非同期タスクの処理に最適です。これにより、OpenAI API の呼び出しなど、時間のかかる操作をバックグラウンド プロセスにオフロードできます。
このアプローチにより、次のことが保証されます。

  • 応答性: フロントエンドは引き続き高速で応答性が高くなります。
  • スケーラビリティ: タスクは複数のワーカーに分散できます。

以下は私たちのシステムで使用されるメッセージ クラスです:

{
  "street": "Strada Grui",
  "block": "Bloc 7",
  "staircase": "Scara A",
  "apartment": "Apartament 6",
  "city": "Zărnești"
}

アプリケーションは、amqp PHP 拡張機能を使用して RabbitMQ インスタンスに接続します。これを設定するには、messenger.yaml 構成ファイルでトランスポートとメッセージ バインディングを定義する必要があります。

詳細なガイダンスについては、Symfony Messenger の公式ドキュメントを参照してください。
Symfony Messenger トランスポート構成

ドキュメント: https://symfony.com/doc/current/messenger.html#transport-configuration

メッセージがブローカー (RabbitMQ、AmazonMQ、または AWS SQS など) にプッシュされると、アプリケーションの 2 番目のインスタンスによって取得されます。このインスタンスは、アーキテクチャ スキーマで 3 とマークされているように、メッセンジャー デーモンを実行してメッセージを消費します。

消費プロセスは以下を実行することで処理されます:

bin/コンソールメッセンジャー:consume

はプロセスとして動作しています。

デーモンは、構成されたキューからメッセージを取得し、対応するメッセージ クラスに逆シリアル化して、処理のためにメッセージ ハンドラーに転送します。

OpenAI アシスタントとの対話が行われる メッセージ ハンドラー は次のとおりです。

STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI

BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124

ハンドラーの重要なポイント

  • ロギング
    トレーサビリティとデバッグのために処理の開始をログに記録します。
    正規化サービス

  • OpenAIAddressNormalizationService は、アシスタント経由で入力アドレスを処理するために呼び出されます。

  • 永続性
    正規化されたアドレスは、Doctrine の EntityManager を使用してデータベースに保存されます。

メッセージ ハンドラーは標準の Symfony コードのように見えるかもしれませんが、コアは次の行にあります。

INPUT: <what goes into the LLM>
OUTPUT: <what the LLM should produce>

このサービスは、指定された PHP ライブラリを介して OpenAI と対話する役割を果たします。

OpenAI PHP クライアント

PHP クライアントを使用してサービスの実装を見てみましょう。

OpenAIAddressNormalizationService の完全な実装は次のとおりです。

input: STRADA EREMIA GRIGORESCU, NR.11 BL.45B,SC.B NR 11/38, 107065 PLOIESTI
output: {{"street": "Eremia Grigorescu", "house_number": "11", "flat_number": "38", "block": "45B", "staircase": "45B", floor: "", "apartment": "", "landmark": "", "postcode": "107065", "county": "Prahova", 'commune': '', 'village': '', "city" "Ploiesti"}}

openai-php/client ライブラリを使用して推論 (または完了) (基本的に GPT からの応答) を取得するワークフローは、次の 3 つの主要な段階に従います。

1. OpenAIクライアントの初期化とアシスタントの取得

最初のステップは、OpenAI クライアントをセットアップし、構成されたアシスタントを取得することです:

INPUT: BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
OUTPUT:
{
  "street": "Bdul 21 Decembrie 1989",
  "house": "93",
  "flat": "50",
  "block": "",
  "staircase": "",
  "floor": "",
  "apartment": "",
  "landmark": "",
  "intercom": "",
  "postcode": "400124",
  "county": "Cluj",
  "commune": "",
  "village": "",
  "city": "Cluj"
}
  • クライアントの初期化: OpenAI::client() メソッドは、API キーと組織 ID を使用して新しいクライアントを作成します。

  • アシスタントの取得:retrieve() メソッドは、一意の ID で識別される、タスク用に構成された特定のアシスタント インスタンスに接続します。

1. スレッドの作成と実行

クライアントとアシスタントが初期化されたら、スレッドを作成して実行して対話を開始できます。スレッドは通信パイプラインとして機能し、ユーザーとアシスタント間のメッセージの交換を処理します。

スレッドの開始方法は次のとおりです:

{
  "street": "Strada Grui",
  "block": "Bloc 7",
  "staircase": "Scara A",
  "apartment": "Apartament 6",
  "city": "Zărnești"
}
  • アシスタント ID: アシスタントの ID により、どのモデル インスタンスが入力を処理するかが決まります。
  • メッセージ: 各スレッドには一連のメッセージが含まれます。この場合、メッセージには、メッセージがユーザー (入力) からのものであるか、システム (応答) からのものであるかを示す役割があります。 2 番目は Content - 実際の入力テキスト (住所など) が含まれます。

3. スレッド応答の処理

スレッドを開始した後、アプリケーションは応答を処理します。 OpenAI プロセスは即座に完了しない可能性があるため、「完了」とマークされるまでスレッドのステータスをポーリングする必要があります:

STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI

BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124

ポーリング: アプリケーションはスレッドのステータス (キューに入れられているか、進行中) を繰り返しチェックします。ステータスが「完了」に変わると、スレッドには最終出力が含まれます。

スレッドが完了すると、アプリケーションは応答メッセージを取得して正規化されたアドレスを抽出します。

INPUT: <what goes into the LLM>
OUTPUT: <what the LLM should produce>

正規化されたアドレスをフロントエンド クライアントに返してすぐに使用したり、後で処理するために CustomerAddressNormalized などの構造化エンティティとしてデータベースに保存したりできるようになりました。

このセットアップを実行すると、固有表現認識やその他の分類または生成タスクのために OpenAI から構造化された出力を抽出して保存できるようになります。

微調整とナレッジベースでアシスタントのブレイジングを正確にする (検索拡張生成)

場合によっては、基本的な AI ソリューションでは十分ではありません。法規制へのコンプライアンスやビジネス要件で高い精度が求められる場合、出力が事実に基づいていて信頼できるものであることを確認するために、さらに努力する必要があります。

たとえば、JSON 構造を生成するときは、その内容が現実と一致していることを保証する必要があります。一般的なリスクは、提供された郵便番号に基づいて場所を発明するなど、モデルが幻覚情報を提供することです。これは、特に一か八かの環境において、深刻な問題を引き起こす可能性があります。

ナレッジベースによるグラウンドトゥルース

幻覚を排除し、事実の正確性を確保するには、アシスタントに真実の知識ベースを提供する必要があります。これはモデルの最終的な参照として機能し、推論中に正確な情報が確実に使用されるようにします。

私のアプローチ: 郵便番号の知識ベース
ルーマニアのすべての郵便番号の完全な境界を含む、単純な (ただし非常に大きい、約 12 MB) JSON ファイルを作成しました。この辞書のような構造は以下を提供します:

郵便番号: 入力値。
検証済みの情報: 対応する都市、郡、全体的な地名などの事実。
この知識ベースは、固有表現認識を実行する際のアシスタントの参照ポイントとして機能します。

ナレッジベースの構造

ナレッジ ベースの JSON 構造のスニペットの例を次に示します。

{
  "street": "Strada Grui",
  "block": "Bloc 7",
  "staircase": "Scara A",
  "apartment": "Apartament 6",
  "city": "Zărnești"
}

ナレッジ ベースの準備ができたら、それを効果的に使用するようにアシスタントに指示します。これをプロンプトに直接埋め込むこともできますが、このアプローチではトークンの使用量とコストが増加します。これは、微調整を導入する絶好の機会となります。

微調整とは何ですか?

微調整には、事前トレーニングされたモデルの最外層 (特に重み行列) を変更し、特定のタスクに適応させることが含まれます。私たちの場合、固有表現認識 (NER) が最適な候補です。

微調整されたモデル:

  • 必要なプロンプトは小さくなります: 長い手順や埋め込みサンプルの必要性が減ります。
  • コストの削減: プロンプトが短く、サンプルが少ないため、トークンの消費量が少なくなります。
  • 推論時間の向上: 応答が速いほど、リアルタイム パフォーマンスが向上します。

主な目標は、モデルが処理する現実世界のデータのニュアンスとより密接に一致するようにすることです。ドメイン固有のデータをトレーニングすると、モデルの理解と適切な応答の生成が向上します。また、アプリケーションによる後処理やエラー修正の必要性も軽減されます。

微調整データセットの準備

モデルを微調整するには、OpenAI で必要とされる .jsonl (JSON Lines) 形式で適切にフォーマットされたデータセットが必要です。データセット内の各エントリには以下が含まれます:

  • システム プロンプト: アシスタントへの最初の指示。
  • ユーザー入力: 生の入力データ (例: 乱雑なアドレス)。
  • 期待される出力: 必要な構造化された応答。

このデータセットは、アシスタントにドメイン固有の例を提供し、将来同様のプロンプトに応答する方法を学習できるようにします。

微調整エントリを構成する方法の例を次に示します。

STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI

BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124

ルーマニアの住所処理のケースを例として、.jsonl ファイル内の微調整エントリの構造を分析してみましょう。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

各エントリは、ユーザーとアシスタントの間の実際の対話をシミュレートするように設計されており、以下をカプセル化します。

  • アシスタントの目的と範囲。
  • ユーザーの入力シナリオ。
  • 期待される構造化された出力。

このアプローチは、モデルが現実世界のコンテキストで望ましい動作を学習するのに役立ちます。

1.システム役割メッセージ

  • アシスタントの機能とその機能の範囲について説明し、通り名、番地、郵便番号など、認識および抽出する必要があるエンティティの種類についての期待値を設定します。

  • 例: システムは、アシスタントがルーマニアの住所の固有表現認識モデルとして機能するように設計されていることを説明し、抽出して分類する必要があるコンポーネントを詳しく説明します。

2.ユーザー役割メッセージ

  • ユーザーが特定のアドレスを入力する詳細なシナリオまたはクエリを提供します。データ入力のこの部分は、モデルが運用設定で同様の入力に応答する方法を学習する方法に直接影響するため、非常に重要です。

3.アシスタントの役割メッセージ

  • アシスタントからの予期される応答が JSON 形式で含まれます。この応答は、目的の出力形式と精度でモデルをトレーニングするため、非常に重要です。

微調整用の検証ファイルの作成

トレーニング ファイルを作成したら、次のステップは検証ファイルを準備することです。このファイルは、実際のデータに対する微調整されたアシスタントの精度を評価します。構造はトレーニング ファイルに似ているため、両方のファイルの作成をより簡単に自動化できます。

検証ファイルは、モデルの一般化機能をテストするように設計されています。これにより、不慣れな例や困難な例に直面した場合でも、微調整されたアシスタントが新しい入力を処理し、一貫して実行できることが保証されます。

検証ファイルの構造

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

システムメッセージ:
トレーニング プロセスとの一貫性を維持するには、システム メッセージはトレーニング ファイルで使用されるものと同一である必要があります。

ユーザーメッセージ:
トレーニング ファイルに含まれていなかった新しい入力 (住所など) を導入します。新しい例は、現実的かつドメイン固有であると同時に、軽微なエラーや複雑さを含めてモデルに挑戦する必要があります。

アシスタントメッセージ:
新しいユーザー入力に対して期待される構造化された応答を提供します。
これは、モデルの精度を検証するためのゴールドスタンダードとして機能します。

トレーニング ファイルと検証ファイルの両方の作成を効率化するために、自動スクリプトを使用できます。これらのスクリプトは、入力データセットに基づいて適切にフォーマットされた .jsonl ファイルを生成します。

スクリプトを含むリポジトリにアクセスして、トレーニング ファイルと検証ファイルを生成します。

自動 .jsonl 生成スクリプト

これは、微調整自動化の Python バージョンです。 PHP バージョンは近日公開予定です。

検証が重要な理由

  • 精度テスト: 微調整されたモデルが目に見えないデータに対してどの程度うまく機能するかを測定します。
  • 一般化: 新しい入力、複雑な入力、またはエラーが発生しやすい入力を処理するモデルの能力を検証します。
  • フィードバック ループ: 追加の微調整やデータが必要な領域を特定するのに役立ちます。

アシスタントを手動で微調整する

必要に応じて、OpenAI のグラフィカル ユーザー インターフェイス (GUI) を使用してアシスタントを手動で微調整できます。トレーニング ファイルと検証ファイルの両方を準備したら、次の手順に従って開始します。

ステップ 1: 微調整ウィザードにアクセスします

  • ダッシュボードに移動し、左側のメニューで [微調整] をクリックします。
  • 緑色の「作成」ボタンをクリックして微調整メニューを開きます。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

ステップ 2: 微調整を構成する

微調整メニューで、次の設定を更新します:

  • ベース モデル: この記事の執筆時点では、最もコスト効率が高く、パフォーマンスの高いベース モデルは gpt-4o-mini-2024-07-18 です。パフォーマンスと予算の要件に最も合った基本モデルを選択してください。
  • トレーニングと検証データ - 前に作成したトレーニング データ ファイルと検証データ ファイルをアップロードします。
  • エポック数 - エポック数 (データセット全体に対するトレーニング プロセスの反復) を設定します。 3 エポックから始めることをお勧めしますが、予算が許せば、さらに多くのエポックを試してみることもできます。

ステップ 3: 微調整プロセスを監視する

微調整プロセスが開始されると、微調整ダッシュボードで進行状況を追跡できます。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

ダッシュボードはリアルタイムの更新を提供し、トレーニング プロセスの監視と評価に役立ついくつかの指標を表示します。

理解すべき主要な指標

  • トレーニング損失 モデルがトレーニング データにどの程度適合しているかを測定します。トレーニング損失が低いということは、モデルがデータセット内のパターンを効果的に学習していることを示します。

  • 完全な検証損失 検証データセットからの未確認データのパフォーマンスを示します。検証損失が低いということは、モデルが新しい入力に対して適切に一般化されることを示唆しています。

  • ステップと時間 トレーニング ステップは、データのバッチに基づいてモデルの重みが更新される反復回数です。
    タイムスタンプは各ステップがいつ処理されたかを示し、トレーニングの期間と評価間の間隔を監視するのに役立ちます。

メトリクスの解釈

以下のメトリクスを監視すると、微調整プロセスが正しく収束しているか、調整が必要かどうかを判断するのに役立ちます。

  • 損失の減少: トレーニング損失と検証損失の両方が時間の経過とともに減少し、最終的には安定することが理想的です。 過学習: 検証損失が増加または変動し始める一方で、トレーニング損失が減少し続けるときに発生します。これは、モデルがトレーニング データに過度に特化しており、目に見えないデータではパフォーマンスが低下していることを示しています。

アンダーフィッティング: 両方の損失が高いままの場合に発生し、モデルが効果的に学習していないことを示します。

モデルを接続して評価する

アシスタントのトレーニングと微調整が完了したら、アシスタントをアプリケーションに統合し、パフォーマンスの評価を開始します。

シンプルに始めましょう。

アシスタント プレイグラウンドまたはアプリケーション内で直接手動テストを開始します。この段階では評価が複雑になりすぎないようにしてください。基本が期待どおりに動作することを確認することに重点を置きます。

たとえば、次に示すように、Google スプレッドシートのような単純なツールを使用して、入力と出力を手動で比較できます。

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

これが最初のステップです。
AI および ML ソリューションでは、パフォーマンスの一貫性を確保するために継続的な評価が必要です。固有表現認識などのタスクの場合、Visual Studio Code の PromptFlow 拡張機能などの自動ツールは、テストと検証の合理化に役立ちます。

参考文献

OpenAI 微調整ドキュメント
Symfony メッセンジャーのドキュメント
OpenAI PHP クライアント ライブラリ
VS Code の PromptFlow 拡張機能

ありがとうございます!

このガイドをお読みいただきありがとうございます。 AI を活用したソリューションを構築し、微調整するための強固な基盤が得られることを願っています。ご質問やご提案がございましたら、お気軽にお問い合わせいただくか、コメントを残してください。

コーディングを楽しんで、AI プロジェクトの成功を祈ってください! ?

以上がPHP/Symfony 7 での固有表現認識のための OpenAI Assistant の利用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。