イーロン・マスクらが立ち上げて、マイクロソフトも1兆円近く出資するといったことで話題になっているOpenAIを皆さんもお使いでしょうか?OpenAIのアカウントを昨年末に登録して以降、私も色々遊んで使ってますが、本当によくできてるとビックリしてました。みんなが自然文で調べることに慣れてくると、Google検索一強もいよいよ終わりになるのでしょうか?

さて、そのOpenAIでは、最新AIを有料のAPIでも提供していますが、どうやら今なら18ドル分の枠がタダで使えるということなので、dtn.jpの検索にもOpenAIのAPIを組み込んでみようと思いつきまして、早速やってみました。

そこで、この記事ではOpenAIのAPIをPHPで使ってみた方法や、dtn.jpの検索に組み込んでみて気が付いた自然文検索とキーワード検索の違い、その解決にYahooの日本語形態素解析APIを使ってみたところなどもご紹介したいと思います。

ちなみに、AIならPythonということで、OpenAIのマニュアルもPython中心になっていましたが、APIにクエリを投げて、返ってきたJSONからデータを取り出すだけならPHPでもできるので、dtn.jp検索でも使ってるPHPコードでのご紹介になります。

OpenAI APIの使い方

OpenAIのAPIを使うためには、OpenAIのアカウントAPIキーが必要になります。アカウントを新規で取得する場合は、携帯番号を使った2ファクタ認証があるのでご注意下さい。

OpenAIアカウントの登録

OpenAI APIのサイトから「GET STARTED」ボタンを押してアカウント作成に進みます。

OpenAI APIのサイト
OpenAI APIのサイト

先に進むと、新規のアカウント作成画面が表示されます。メールアドレス・パスワードを使った新規登録以外にも、Googleアカウント・Microsoftアカウントを使ったOAuth認証ができるみたいです。

新規登録の場合は、アドレスを入力してメールアドレスの認証に進みます。

OpenAIのアカウント新規登録画面
OpenAIのアカウント新規登録画面

メールアドレスの認証後、今度は携帯番号を使った2ファクタ認証が求められます。課金もあるので、このあたりはしっかりしています。

OpenAIのアカウント登録で2ファクタ認証
OpenAIのアカウント登録で2ファクタ認証

無事に登録が終わると、OpenAIのダッシュボードが確認できると思います。ダッシュボードではAIとの対話を試すことができるので、ひとまずAIとはどんなものかをここで試してみると今後の開発イメージがし易いと思います。

ダッシュボードの上部にある「Playground」に進むと、「text-davinci-003」という最新の自然言語処理AIとの対話をすぐに試すことができます

試しに、「ウクライナ戦争を終わらせる方法」を聞いてみると、AIが簡潔に答えてくれました。プーチンにもOpenAIを教えてあげたいですね。

GPT-3でウクライナ戦争を終わらせる方法を聞いてみた
GPT-3でウクライナ戦争を終わらせる方法を聞いてみた

ウクライナ政府とロシア政府が協議を行い、協定に基づいて、ウクライナ戦争を終わらせるためには、双方が戦闘を停止し、双方の強制力を撤退し、安全な状況を確保するための国際的な監視を行うことが必要です。また、双方が紛争解決に関する国際的な協議を行うことで、問題を解決するための合意形成を行う必要があります。最後に、ウクライナ政府とロシア政府が和平協定を締結することで、ウクライナ戦争を終わらせることができます。

OpenAIに「ウクライナ戦争を終わらせるには?」を聞いてみた

この素晴らしい「text-davinci-003」GPT3自然言語処理モデルを、API経由でうちの過疎サイトでも利用できるというのが凄い感じです。早速APIキーの作成に進みます。

OpenAI APIキーの取得

OpenAIのAPIキー作成方法
OpenAIのAPIキー作成方法

OpenAIのダッシュボードに戻り、アカウント部分をクリックしてドロップダウンを表示すると、「API keys」に関する項目が現れると思います。既にキーを作成済みのため「View API Keys」となっていますが、未作成の時は別の表記だったかもしれません。ここからAPIキーの管理画面に進みます。

既にキーを一つ作成済なのでリストに表示されていますが、「Create new secret key」を押せばキーを作成することができます。これで準備完了OKです。取得したAPIキーは大切に保管して下さい。

OpenAIのAPIキー管理画面
OpenAIのAPIキー管理画面

OpenAI APIをPHPで使う

ドキュメントの中に「API REFERENCE」というものがあり、ここにMaking requestsというAPIリクエストの作り方マニュアルがありました。

OpenAIのAPIリファレンス
OpenAIのAPIリファレンス

こちらはコンソール経由でcurlを使ってJSONを投げてデータを取っているようなので、PHPからもcurlでJSONをとってみます。

cURLは、以前にTikTokの短縮URL解析や、ディレクトリ型検索エンジンの登録リンク生存確認でも使った、HTTP/HTTPSなど様々なプロトコルを使って通信ができる毎度おなじみの便利なライブラリです。

サンプルPHPコード

細かいパラメータとかも付けられますが、最低限これだけ付けてあげればOpenAIからのレスポンスが取れました。実際に使う場合は、「temperature」「max_tokens」「top_p」などの制御パラメータを付けてあげると、しっかりと文章が取れると思います。

$OpenAiAPIUrl = 'https://api.openai.com/v1/completions';
$OpenAiAPIkey = 'あなたのAPIキー';
$text = 'OpenAI APIに聞きたい質問';

//APIのリクエストヘッダは先ほどのマニュアル通りに
$header = array(
   'Content-type: application/json',
   'Authorization: Bearer '.$OpenAiAPIkey,
);

//配列にAPIモデルと質問テキストをセットしてJSONに
$params = json_encode(array(
   'prompt'=> $text,
   'model' => 'text-davinci-003',
));

//curlの初期化
$curl = curl_init($OpenAiAPIUrl);

//curlのオプション設定
curl_setopt_array($curl, $options);

//curl実行
if($OpenAiBuff = curl_exec($curl)){
   //APIのレスポンスデータを取得
   $OpenAiJson = json_decode($OpenAiBuff ,false);
}

dtn.jpの検索プログラムに組み込み

OpenAI APIからのデータ取得ができたので、早速dtn.jpの検索窓にAI検索をオプションで付け足してみました。Twitter APIへのリクエストを投げた時のように、チェックボックスでAI検索をON/OFFできるようにしています。

検索エンジンdtn.jpの検索からOpenAIに接続
検索エンジンdtn.jpの検索からOpenAIに接続

試しに、「ディレクトリ型検索エンジンとは何ですか」を聞いた結果が下の画像です。カテゴリ検索結果と登録サイト検索結果の間に、OpenAIのレスポンスを差し込んであります。

ディレクトリ型検索エンジンとは何ですかをdtn.jpで検索した結果
ディレクトリ型検索エンジンとは何ですかをdtn.jpで検索した結果

検索に組み込んでみて分かった問題

実際にサイトに組み込みをしてみると、OpenAI API利用で色々と分かったことがありました。せっかくなので、合わせてご紹介したいと思います。

OpenAI APIのレスポンスが悪い

OpenAIダッシュボードの「Playground」で遊んだことがあれば分かると思いますが、AIからの返答はパパっと返ってきません。裏でもの凄い自然言語処理をしつつ文章を生成して返してくれているので、これは当たり前といえば当たり前ですが。

dtn.jpの検索は、検索されたワードを検索用PHPにPOSTで投げて結果セットを表示するといった昔ながらの作りになっています。このため、APIのレスポンスを取ってレンダリングが終わるまでは画面が変化しないので、正直イライラして使い物にならないといった感じになっていると思います。

OpenAI APIのレスポンスだけ、非同期処理でくるくる待つみたいな作りに変えないとダメとは思いました。が、面倒なのでそこまではやってませんです。

自然文検索とキーワード検索の違い

最新の自然言語処理モデルで動くOpenAIなので、

ディレクトリ型検索エンジンとは何ですか?

といったアホな質問文もしっかり理解してくれますが、dtn.jpの検索は、SQLに登録された「サイトタイトル」「サイト説明文」などをLIKE検索するだけなので、LIKE ‘%ディレクトリ型検索エンジンとは何ですか%’とやってみたところでヒットするわけもありません。

SELECT * FROM 登録サイト WHERE サイトタイトル LIKE "%ディレクトリ型検索エンジンとは何ですか%";

とはいえ、できれば「ディレクトリ型検索エンジンdtn」とタイトルがついているdtn.jpくらいにはヒットさせてあげたい気がします。

クエリでヒットさせるためには、「ディレクトリ型検索エンジンとは何ですか」を「ディレクトリ型」「検索エンジン」「とは」「何ですか」といった感じで単語にバラして、副詞とかを除いた名詞だけでLIKE検索をする形に変えてあげないといけません。

Yahoo日本語形態素解析API

こういった自然言語を品詞に分解していくことを「形態素解析」というらしいです。なるほどと思いつつ、APIでそんなものがないかなと思っていたら、毎度お世話になってるYahooのAPIにしっかりと用意がされていました。

日本語形態素解析(V2)

流石はYahoo Japan!しかもVersion2になってるくらい昔からあったということで、APIユーザにとってYahooは神すぎますね。

Yahooの日本語形態素解析APIについては、また別途ご紹介したいと思いますが、このAPIを使うことで、質問文から「名詞」だけ見事抜き出すことができたので、自然文検索であっても、サイトやカテゴリをヒットさせることができるようになりました。

おわりに

OpenAI APIから始まって、検索ワードの日本語形態素解析にまで話が広がりましたが、いかがでしたでしょうか。

OpenAIの18ドルクレジットは有効期間が3カ月らしいです。dtn.jpでは過疎サイトすぎて、18ドル分を消費する前に有効期限が終わってしまいそうですが、AIみたいな超最新機能をインターネットの化石となったディレクトリ型検索に組み込むことができて、凄い面白かったです。

Googleも対話型のAI「Bard」?を近々リリースといったニュースも出ていましたし、AI絡みでもっと色々なサービスが登場するのが楽しみですね。