OpenAI には ChatGPT をより活用するための工夫を補助する仕組みが用意されています。 Ask The Laravel Docs はそういった仕組みの一つである Embedding を利用して Laravel のドキュメントに特化した ChatGPT との対話をするプログラムです。このプログラムのリポジトリとデモは次です。
cosmeoes/ask-the-laravel-docs: A CLI tool to ask questions to the Laravel docs using the OpenAI API written in PHP
Cosme Escobedo’s blog にあるデモ
OpenAI の Embedding は文字列をベクトル化する仕組みです。ベクトル化することによって与えられた文字列と検索対象の文字列の類似度を容易に測れる様になります。検索対象の文字列を Embedding でベクトル化してDB(データベース)にしておき、与えられた文字列もベクトル化し、ベクトルの類似度を用いて文脈を検索することによって文字列が一致するか否かを見る検索よりもあいまいな検索ができます。これを用いて与えられた文字列についての検索をすると次の様なメッセージを ChatGPT に送れます。ちなみに Google の類似画像検索も同じ様に画像をベクトル化して近いベクトルの画像を引っ張ってくるとかそんな感じで動いてます。
以下の文脈に基づき、質問に答えてください。 文脈の内容: {与えられた文字列のEmbeddingに基づいてDBから呼び出した類似する文章}。 質問: {生の与えられた文字列}
これによって ChatGPT は文脈の情報を含めて回答を作ることができ適切な回答を返してくれやすくなります。この仕組みの都合上、与えられた文字列から適切な文字列を DB から呼び出せるか否か重要です。ChatGPTは従量課金であるため毎回長大な文章を送ると料金がかさみ入力できる文章の長さの限界もあるため、なるべく適切な長さで適切な対象を探せるようにする必要があります。このため Embedding による ChatGPT の拡張は特定の範囲のドキュメントから何かを探したりすることにとても向いています。「アレなんだっけ?」というふんわりとした質問から「アレ」に近いドキュメントの断片を ChatGPT が扱いやすい大きさ呼び出し、ドキュメントの断片を元にいい感じに「アレ」についての返事を ChatGPT がしてくれる様になります。
Ask The Laravel Docs は Embedding を用いて Laravel のドキュメントを元に ChatGPT を拡張したプログラムです。デモページは次リンクにあります。
デモページでは次の様に質問を投げるとそれらしく返してくれます。文脈として使われているのは英語版の公式ドキュメントですが、ベースのChatGPTモデルが優秀なのか日本語の質問でもそれっぽい回答を返してくれます。(素の ChatGPT でも Laravel についてはまあまあいい感じに語ってくれるのでそれが呼ばれているのかもしれませんが…)
GitHub のリポジトリには PHP 版の ChatGPT の Embedding チュートリアル的なソースコードが置かれています。GitHub 上で公開されている Laravel 公式ドキュメントをダウンロードし Embedding を用いたベクトルのデータベースの構築、与えられた文字列からベクトルデータベース内の文字列の検索、検索結果の文字列と与えられた文字列を使った ChatGPT との対話、と一連の処理がわかりやすく書かれています。
GitHub のリポジトリ上のコードはコマンドライン上で動くように作られており web 上から操作できるデモよりいささか使いにくいですが教材には十分です。リポジトリは次リンクです。
余談ですが Embedding を用いた Q&A ページを Python で作るチュートリアルを OpenAI が公開しており、これは次ページにあります。