ホームページ >ウェブフロントエンド >jsチュートリアル >OpenAI JSON モードと JSON スキーマによるデータ抽出の簡素化
ChatGPT-3.5 のリリース後、初めて ChatGPT-3.5 を試したとき、さまざまなアプリケーションに対するその可能性に興奮しました。しかし、大きな障害に遭遇すると、私の興奮はすぐに冷めてしまいました。返される貴重な情報は非常に読みやすいものでしたが、アプリケーションが確実に取り込める形式ではありませんでした。皮肉なことに、LLM は非構造化テキストから情報を抽出することに優れていますが、それを非構造化形式でしか返すことができません。 LLM からプログラムで結果を抽出しようとすると、最高においしい料理を提供する素晴らしいレストランにいるような気分になりました。しかし、調理器具は何もなく、目で見て匂いを嗅ぐことはできますが、そこに到達することはできません。
私はこの本のあらゆるトリックを試して、構造化データのようなものを理解させようとしました。 「各項目をバーまたは改行で区切って、解説を省略してください」と私は懇願します。うまくいくこともあれば、うまくいかないこともありました。時には、善意ではあるが少し混乱しているアシスタントのように、アイテムに「親切に」番号を付けたり、並べ替えたりすることもあります。また、おしゃべりな同僚を思わせるコメントがこっそり入ることもありました。私は、JSON だけを返すように明確な条件で要求しましたが、コンマが省略されることがありました。まるで受動攻撃的なジャブを打っているかのようでした。結局、私は諦めて、しぶしぶ、あまり刺激的ではないが、より予測可能な従来のアルゴリズムの範囲に戻りました。
幸いなことに、数か月後、OpenAI は LLM に有効な JSON を強制的に返す機能である JSON モードを導入しました。この機能を試してみることにしましたが、アプリケーションでの結果の処理が大幅に効率的であることがわかりました。 JSON モードを有効にした場合の出力の例を次に示します:
PROMPT: Parse the following sentence into words and then return the results as a list of the original word and the translation in English and return the results in JSON. -- sentence -- 早安 RESULTS: { "results": [ { "original": "早安", "translation": "Good morning" } ] }
この出力は確かに改善されています。ただし、出力は有効な JSON ですが、その構造はプロンプトの内容によって異なる場合があります。より予測可能なアプローチは、必要な戻り形式を指定することです。これを実現する 1 つの方法は、LLM が従うサンプル JSON 構造を提供することです。この方法では、サンプルを作成し、それを解析するコードを作成します。構造が変更された場合は、両方の場所で変更を行う必要があります。
別のアプローチは、結果を保持するデータ転送オブジェクト (DTO) を定義し、それを LLM への指示と結果の解析の両方に使用して、同期の問題を回避することです。まず、DTO を定義します。例:
record Entries(List<Entry> entries) { record Entry(String originalWord, String wordInEnglish, String pronunciation) {} }
これで、DTO をプロンプト命令および解析コードで使用できるようになりました。
// Construct the prompt with the output schema. var prompt = MessageFormat.format(""" Parse the following sentence into English and return the results in JSON according to the following JSON schema. 人工智慧將引領未來,以智慧之光照亮人類無限可能的前程。 --- output json schema --- {0} """, jsonSchemaOf(Entries.class)); var result = sendPrompt(prompt, Entries.class);
Jackson JSON スキーマ ジェネレーターを使用するコードは次のとおりです。
PROMPT: Parse the following sentence into words and then return the results as a list of the original word and the translation in English and return the results in JSON. -- sentence -- 早安 RESULTS: { "results": [ { "original": "早安", "translation": "Good morning" } ] }
注: デフォルトでは、生成されたスキーマには参照に使用される ID フィールドが含まれるため、トークンが無駄になる可能性があります。これらの未使用の ID を削除するコードについては、リポジトリの OpenAI JSON モード サンプルを参照してください。
最後に、Azure OpenAI Java SDK を使用して OpenAI にプロンプトを送信するコードを示します。
record Entries(List<Entry> entries) { record Entry(String originalWord, String wordInEnglish, String pronunciation) {} }
このソリューションはほとんどの場合うまく機能します。 LLM は JSON スキーマを効果的に理解しますが、注意が必要です。時々、それが間違っているケースを見たことがあります。たとえば、フィールドが文字列で、その名前が複数形 (例: 「exampleValues」) の場合、LLM は代わりに文字列の配列を返すことを要求することがあります。
LLM は、場合によっては平均的な人の能力を超える、驚くべき成果を生み出すことができます。しかし、少なくとも現時点では、生成された出力を確実にフォーマットするという、より日常的な作業に彼らが苦労していることは興味深いです。
以上がOpenAI JSON モードと JSON スキーマによるデータ抽出の簡素化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。