ぴょこりんブログ

裏垢です。

テキスト埋め込みで遊ぶ

はじめに

この記事はサステナブルなぴょこりんクラスタアドベントカレンダーのために書きました。

単語埋め込みとかテキスト埋め込み

自然言語を対象に機械学習の簡単なタスクに落とし込みたいとき、この文章とかいう長さが可変のよくわからんデータをどう扱えばいいんだよみたいな感じになるわけですが、単語埋め込み、テキスト埋め込みはこれをいい感じになんとかしてくれる類の技術です。要は単語やテキストを入力として、固定長のベクトルの値が返ってくるみたいな学習済みモデルですね。

ちょっと概要図が欲しくなったんだけどつくるのめんどくさいからChatGPT 4くんに頼んでみましょう。

なんにもわからん!気を取り直して。

性質としては似たような言葉や文章は空間上で近くなるとのことなので、例えば検索などで素直に単語一致で検索するよりも表記ブレに強いとかなんとか。実際どんな感じなのか試してみましょう。

簡単なブログ検索

概要

このブログで取り扱うトピックとして最適かつまとまった数のテキストを考えてみたところ、まぁこのブログ自体の記事ですねってことで、試しにこのブログの記事の検索システムっぽいものを試作してみましょう。ざっくりな図は以下の通り。

急いでつくったけど酷い。ユーザがクエリを入力すると、そのクエリをGCPのtext EmbeddingのAPIにぶん投げて対応する埋め込みベクトルを得ます。この埋め込みベクトルと、ブログの記事の文書(行や句点で分割され、それぞれに対して埋め込みベクトル取得済み)のデータを参照して、最近傍の埋め込みベクトルに対応する記事を見つけます。

近似最近傍のベクトルを見つけるにはそれこそGCPのVertex AI Matching Engineやfacebookのfaissなどを使うのもアリだったのですが、ブログの記事数が少なくて全部の文書に対して距離計算してもリアルタイムな応答に全く問題が無かったので、今回は使いませんでした。

ベクトル間の比較なので距離尺度を決めなきゃいけないのですが、Vertex AI Matching Engineでコサイン距離の代わりに DOT_PRODUCT_DISTANCE + UNIT_L2_NORM を使うことを推奨していたので、まぁこれに倣うことにしました。

cloud.google.com

というわけで、記事とマッチする文書が得られるので、

『記事名』がおすすめです。『○○』という記載がありました。

というフォーマットで返してくれる感じにしてみましょう。

動かしてみる

ガワはこの前のを使いまわしです。

まずは検索システムについて考えてるので検索システムについて聞いてみましょう。

確かに昔elasticsearch触って遊んだ記事があった気がします。

このブログでは実はこれまで「数学」って一回も言及してないんですよね。近い概念を拾ってくれるでしょうか。

おととしの記事ですね。「計算」、なるほどね。まぁ確かに「計算」は近い概念っぽい。

けいおんについても聞いてみましょう。

2016年の記事だ・・・。でけいおんって文字列もあったと思うんだけどなんで?????

しかしまぁベクトル検索、思ったより近い概念を拾ってくれるみたいです。ただまぁ、一番距離が近かった一文挙げられても説得力に欠けますよね。全体を俯瞰して、どういった点でその記事を読むべきなのか、そういうのを説明してほしいわけです。そういう人の温かみが必要な(?)作業は大規模言語モデルに任せましょう。

ブログ検索+LLMにおすすめ理由を問う

概要

というわけで対話用の大規模言語モデルくんにすべての記事を読んでもらうのは申し訳ないけれど、おすすめする1記事位読んでくれてもええのでは?ということで、さっきの構成でおすすめすると決めた記事とクエリをPaLM 2 for Chat ( chat-bison ) にぶん投げてその結果を返してみましょう。先ほどのような『こんな該当箇所がありました』というよりは文章全体を俯瞰した良いおすすめポイントを説明してくれるはずです。

酷い図パートⅡ。赤字がさっきとの差分です。

動かしてみる

まずはガパオライスの作り方でも聞いてみましょう。

2017年にガパオライスをつくった記事です。悪くないんじゃないかな?

圧倒的成長をしたいので自己啓発におすすめな記事なども。

2021年の総括記事。確かに総括を挙げるのは悪くないんだけどその記事で鏡音リンちゃんについてそんなにわかんないんじゃないかな・・・。

おわりに

GCPの大規模言語モデル周りのAPIをたたいて簡易検索+おすすめの仕組みをつくってみた。今回は小規模すぎて総当たりで距離計算できてしまったので、faissみたいな近似近傍探索の適用は今後の課題。

蛇足なのだけれど、手元にあるデカいテキストデータって意味では、本当はせっかくお馬さんデータ集めたからそっちでやりたかったんだけど(推しを探してこの記事の伏線回収をする流れ!)、サイズ的に10000倍位あったのででどれくらいお金かかるか見通しつかずとりあえず断念してしまった。