Closed13
ChatGPT Plugins開発
Chat Plugins
- https://platform.openai.com/docs/plugins/introduction
- OpenAPI仕様書を公開しておくとGPTがそれを解釈してユーザーの入力からWebリクエストを作って処理してくれるすごいやつ
- プラグイン開発者は自分の作った各APIのdescriptionをちゃんと書いておけばあとはChatGPT側でよしなにやってくれる
- LangChainのOpenAPI Agentに仕組みは似ている
Retrieval Plugin
- そのままフォークして使える検索用の知識を与えるプラグイン(APIサーバー)の雛形
- こんな感じでAPI作れば動くよというリファレンス実装で、別にPython必須というわけではない
- 開発者は好きなベクトルDBを選んで自分で構築したインデックスを突っ込んでおけばOK
- ベクトルDBが必要な理由はテキストを入力してテキストを牽いてくるため
- 極端な話、クエリ文字列に何かレスポンスを返せれば実装は曖昧検索でも分解してLIKE検索でも何でもよい
- リッチな表示用にURLや画像を返したりもできる
descriptionにはこう書いてある
OAuth
- https://platform.openai.com/docs/plugins/authentication/oauth
- 開発者のサーバー上でOAuthフローを実装しておくとChatGPTが打ち返してくれて任意のユーザーでBearerトークンを送ってくれるようになるので自分のサーバー上のユーザーを特定できる
- 「ユーザーの所有するデータから検索」などが実現できる
chatgpt-retrieval-plugin以外
- https://platform.openai.com/docs/plugins/examples このページに何気にサンプルがある
TODO Plugin
- ToDo APIを公開しておくとユーザーの入力内容によって自動でアイテムが登録されたりする
- 認証の仕組みはないのでこのままだと全ユーザーのToDoが一箇所に保存される
TODO Plugin (service level auth)
- 上記にhttp_serviceの認証を付けたバージョン(OAuthではない)
-
username
がどうやって決まっているのかいまいち理解できてない
Sport Stats
- ベクトル検索などを用いないシンプルなREST APIも連携できるよというサンプル
- 外部APIをラップして呼び出しているのはサンプルコードとして理解しやすくするためだと思う
-
GET /players?q=text
でplayer_ids
を取得してGET /stats
にパラメーターとして送ってくるという人間が実装するクライアントみたいな操作をGPTがやってくる
通信方式
あと
- CORSを定義してる
- localhostで実行可能
なのでブラウザから直接APIを叩いてくるというのが分かった。なんとなくserver-to-serverでリクエストが来るのかと思い込んでいた。
だからレスポンスをダンプしてデバッグしたりBearerトークンをユーザーが入力できたりするのね
これは勘違いでserver-to-serverでリクエストしていました。
Memory
- Memory=プロンプトに会話履歴(や要約)を埋め込むデザインの総称
- Retrieval Pluginsの結果を元にできた会話はAPIサーバーが知ることはできないので別途送信してもらう必要がある
- これもAPIのdescriptionに「やれ」って書いておくとユーザーの確認付きで送信してくるらしい(ちょっと動かしてみないと想像できない)
- 履歴を保存したり参照する部分は普通に自分でDBに出し入れして実装する
llama-index
- Retrieval PluginにDATASTORE=llamaが追加された
llama-indexはデータベースより一個上のレイヤーで、インデックスをファイルで管理する機能もあってよりお手軽
バックエンドをDB製品に切り替えもできる
lama-index経由でChromaDBやOpenSearchに繋げたりできる
OpenSearch DataProviderを自作する記事
Retrieval Pluginではないけどqdrantをfly.ioでself-hostしてインデックス構築する時に参考になるプロジェクト
Managed Vector DB
ユーザー多そうな順に並べたつもり
- https://www.pinecone.io/pricing/
- https://cloud.qdrant.io/calculator
- https://zilliz.com/pricing
- https://weaviate.io/pricing
-
https://redis.com/redis-enterprise-software/pricing/ (RediSearch)
- redis本体はキャッシュストアとして普及してる
- fly.ioで採用されているupstashだとRediSearch使えなさそう
以下はchatgpt-retrieval-pluginにproviderがないけど組込めるのではないか
- https://supabase.com/pricing (pgvector)
- https://www.algolia.com/pricing/
- https://aws.amazon.com/jp/opensearch-service/pricing/
試算したら料金で泣いちゃったのであんまり深掘りしていない製品たち
- https://cloud.google.com/vertex-ai/pricing
- https://azure.microsoft.com/en-us/pricing/details/search/
Zennの全本を全文検索したいのGoogle Drive検索方式でも強引に実装できるはず
ローカルデータストアの選択肢
- 静的なデータセット + メタデータのフィルタリングを活用しないならDBサーバーは立てなくても運用できそう
- リポジトリでサポートされているDATASTORE=llamaを軸に構成するのがよいのではないか
- A: Embedding APIをかけてからクソデカJSONに保存しておく(SimpleVectorIndexやFaissIndex)
- B: ChromaIndex経由でDuckDBに保存しておく(Aよりスケールするはずだが、それならDBサーバー立てればいい気もする)
- あとはAPIのデプロイ時にDBファイル群をディスクにコピーしておく
ChromaDBを直接providersでサポートするPRが進行してる
開発環境
- https://github.com/openai/chatgpt-retrieval-plugin/#running-the-api-locally
-
poetry run dev
ってやればlocalhostでAPI仕様書を編集しつつAPI変更しながら便利に開発できる - curlで "POST" "http://localhost:3333/upsert" 叩くとインデックスに事前データ入れたりできる
エコシステム系
- PluginsはマニフェストとAPI仕様書が公開されているので外部のシステムがそれらを参照して活用できる
- なので自分のプログラムから既存のChatGPT Plugins(の裏のAPI)を利用する機能を付けることが可能(アクセスを許可されていれば)
- API仕様書からリクエストを生成する部分を代替LLMにできる
- ただChatGPTのユーザー認証は使えない
LangChainのAgentから呼び出すツール
LlamaIndexのバックエンドで使うツール
cloudflare/chatgpt-plugin
Cloudflare WorkersでChatGPTプラグインを作るサンプル。
- itty-routerベース
- cloudflare/itty-router-openapiという専用モジュールがマニフェストファイルやOpenAPI仕様の生成を補助
- セマンティック検索はドキュメントtext-embedding-ada-002でKVにキャシュしておきリクエストと演算で比較
このスクラップは2023/06/17にクローズされました