APIを用いた類似語検索を自作しましたこんにちはみなさん何らかのアイテムのフリーワード検索をするとき、従来であれば部分一致検索や全文検索を使って検索しているのではないでしょうか。部分一致検索や全文検索は、検索語句の全部もしくは一部が含まれていないと、アイテムが抽出対象になりません。正確な検索をするためには、説明のキーワードを抜き出して、検索語句にピンポイントに当たるようなアイテムを抽出するようにしなければなりませんが、中々難しいです。そこで、語句自体で検索をすることを諦め、語句やアイテムを一旦コンピューターが扱いやすい形に変換し、新しい検索にチャレンジしたくなるわけです。今回はこの変換部分をOpenAIに任せ、検索部分のみを実装することで、省力化しつつ類似語検索を実現してみましょう。何をしたのかそもそも、どうして類似語検索をする必要が出てきたかということを説明します。とある機能でユーザーにキーワードを選んでもらうところがあるのですが、選択肢が1000個以上あって、時間の少ないユーザーにこの中から適切なものを選んでもらうのって相当ストレスじゃないかな?という話が出ました。これが1000個くらいありますかといって自由入力にしちゃうと、集計やカテゴライズが不便になってしまうというところで、何とか、選択肢でいきたいわけです。検索をしてキーワードを選んでもらうのかというと、検索語句がキーワードにかすっていないと出てきません。そこで、ユーザーが入力した検索語句に対し、いい感じの類似後検索で選択可能なキーワードをサジェストする機能を足してやろうということになりました。陶芸家になりたいで調べて、近い感じのが出てくる?単語・文章のembedding単語や文章を特定次元のベクトルに変換することをembeddingと言います。なんのこっちゃという感じの方もいるかもしれませんが、簡単にいうと、単語や文章を一定数の数値の組みにしちゃおうという試みです。みたいな感じにしちゃうわけです。文言のベクトル化ベクトルは一方で矢印として捉えることができるので、2つの単語や文章のベクトルが同じような方向を向いていれば、その二つは類似していると捉えることができます。Word2Vecがあげられますし、OpenAIは文章自体を一つのベクトルに変換するAPIを提供しています。こんなことができるのかについては後で少しだけ解説できればと思います。利用する1ことで、文章や単語のベクトル化を実現しました。類似度の算出と並べ替えベクトル化はOpenAIに委ねましたが、残りの類似度算出からアイテムの抽出までをプロダクトの中、つまりPHPで実装します。一般のベクトルの類似度と内積に関する詳しい話は別記事を参照してください。APIを使ってベクトル化しておきます。APIでベクトル化し、あらかじめベクトル化した検索対象のアイテムのベクトルとの内積をとります。APIで生成したベクトルは単位ベクトルですので、内積がそのまま類似度になります。内積=類似度が算出できれば、あとはその値が大きい順に並び替えます。embeddingを使った並び替え本プロダクトでは単純に類似度が高い順に並べた上で、上位の一定数をサジェストする実装にしています。これをPHPで実装すると以下のようになります。APIを利用してベクトル化したキーワードと検索語句を用いて、類似検索を実現したというお話でした。API自体がChatGPTの前処理みたいなものなので、ある程度長い文章でないと距離が計りにくいのかなと思ったりしています。現在、検索精度の改善のために、以下のような施策を検討しています。し、そのキーワードに対する解像度を上げた上で、ベクトル化してみるこれらの施策により、より的確な検索結果を提供できると考えています。今回はこんなところです。モデルにアクセスしています。変更点5選!みなさんどうもこんにちは。