埋め込みとは?
- 「埋め込み」とは、コンテンツを「浮動小数点数の配列」に変換すること
- この配列の核心は、「コンテンツ内容の長さ」に関係なく「配列のサイズ」が常に同じであること
- 配列のサイズは使用する埋め込みモデルによって決まり、300、1000、1536 など
- この数値配列を考える最もよい方法は、これを「非常に奇妙な多次元空間の座標」として想像すること
- なぜコンテンツを多次元空間に配置するのか? コンテンツの位置、特に近くにある他のコンテンツをもとに、そのコンテンツについての興味深い情報を学べるから
- 空間における位置は、埋め込みモデルの「奇妙で、たいていは理解できない世界理解」に従ったコンテンツの「意味的意味(Semantic Meaning)」を表す
- 埋め込まれたコンテンツの色、形、概念、その他あらゆる種類の特性を捉えられる
- これら個々の数値が何を意味するのかを完全に理解している人はいないが、その位置がコンテンツに関する有用な情報を見つけるのに使えることは分かっている
埋め込みを使って関連コンテンツを見つける
- 私が埋め込みで最初に解決した問題は、自分の TIL ブログの「Related Content」機能を作ることだった
- OpenAI の
text-embedding-ada-002 モデルを利用した。API 経由で利用可能
- 現在、自分のサイトには 472 本の記事があり、各記事について 1536 次元の埋め込みベクトル(浮動小数点数の配列)を計算し、そのベクトルを自分のサイトの SQLite DB に保存した
- 特定の記事に対する関連記事を見つけるには、その記事の埋め込みベクトルと DB 内の他の記事とのコサイン類似度(Cosine Similarity)を計算し、距離順で最も近い一致 10 件を返せばよい
- コサイン類似度のために使った Python コードは次のとおり
def cosine_similarity(a, b):
dot_product = sum(x * y for x, y in zip(a, b))
magnitude_a = sum(x * x for x in a) ** 0.5
magnitude_b = sum(x * x for x in b) ** 0.5
return dot_product / (magnitude_a * magnitude_b)
- OpenAI の埋め込み API は非常に安価で簡単
- 自分の TIL ウェブサイトで約 40 万トークンを埋め込んだが、1000 トークンあたり $0.0001 なので全体でわずか $0.04 しかかからなかった
- API キーと一緒にテキストを POST するだけで、浮動小数点数からなる JSON Array が返ってくる
- ただし、これは独自モデルであり、数か月前には OpenAI が埋め込みモデルの一部を終了させたこともあった
- つまり、そのモデルで大量の埋め込みを保存していた場合、新しいモデル向けには埋め込みを再計算しなければならない
- OpenAI は新しいモデルへの再埋め込みにかかる費用を補償すると述べていたが、独自モデルには注意が必要
- これは強力なオープンライセンスのモデルで回避できる
こうしたものが Word2Vec モデルでどう動くのかを知る
- Google Research は 10 年前、Word2Vec という初期の埋め込みモデルを説明する影響力の大きい論文を発表した
- 2013 年に発表された「Efficient Estimation of Word Representations in Vector Space」で、埋め込みへの関心を呼び起こした
- Word2Vec は単一の単語を取り、それを 300 個の数値のリストに変えるモデル。その数値リストは関連する単語の意味に関する情報を捉える
- 単語を検索すると、その単語の Word2Vec 表現とのコサイン距離にもとづいて類似語を見つけられる
- 「france」を検索すると、「french : 0.70007~」「belgium: 0.69331~」「paris: 0.63349~」「germany: 0.62707~」のような値が得られる
- これはフランス的なものとヨーロッパの地理が混ざったものだ
- ここで本当に面白いのは、これらのベクトルに対して算術演算を行えること
- 「germany」のベクトルに「paris」を加え、「france」を引くと、結果のベクトルは「berlin」に最も近くなる
- このモデルは、算術を使って世界に関する追加の事実を探れるような、国籍と地理に関するアイデアを捉えていた
- Word2Vec は 16 億語のコンテンツで学習されており、今日使われている埋め込みモデルはさらに大規模なデータセットで学習され、基本的な関係についてはるかに豊かな理解を捉えている
自分のツールを使って埋め込みを計算・検索する
- 私は LLM という CLI 兼 Python ライブラリを作っている
- LLM とやり取りするための CLI として使え、OpenAPI 連携も可能
- 数か月前、このツールにプラグイン経由で埋め込みモデルを実行する機能も追加した(SentenceTransformers ライブラリが利用可能)
- 埋め込みコレクションを選択し、似たものを見つける Vibes-based 検索が可能
- Python コードベースでシンボルを見つける Symbex ツールも作っている。これにより、コードの関数に対する埋め込みを計算してコード検索エンジンを構築できる
- (詳細な実装部分は省略)
CLIP を使ってテキストと画像を一緒に埋め込む
- 現在、最も好んでいる埋め込みモデルは CLIP
- OpenAI が 2021 年 1 月に公開したモデルで、「テキストと画像」の両方を埋め込め、同じベクトル空間に含まれる
- 「dog」を埋め込むと、512 次元空間内の位置が得られる(CLIP の構成によって異なる)
- 犬の写真を埋め込んでも同じ空間内の位置が得られ、文字列「dog」の位置に距離的に近くなる
- つまり、テキストを使って関連画像を検索したり、画像を使って関連テキストを検索したりできる
- ビーチの写真を入れると、「beach: 26.946%」「city: 19.839%」「sunshine: 24.146%」のような類似度スコアを得られる
CLIP で蛇口を探す
- Drew Breunig は
llm-clip プラグインで蛇口検索エンジンを構築した
- 2 万枚の蛇口写真を集めて CLIP を実行
- 他の蛇口と似た蛇口を見つけ、その中から似ていてなおかつ安い選択肢を探せるようになった
RAG で質問に答える
- ChatGPT を使ったことがある人たちの最後の質問は、みな同じだ
「どうすれば自分のノートや自社の文書について答えさせられるのか?」
- 人々は、そのコンテンツにもとづくカスタムモデルを莫大な費用をかけて訓練することだと思いがちだが、
- 実際にはその必要はない。LLM と RAG(Retrieval Augmented Generation)によって可能になる
- 核心となるアイデアは「ユーザーが質問する」ということ
- あなたの個人的な文書から、その質問に関連するものを見つけて
- そのコンテンツの抜粋を元の質問と一緒に LLM に渡せばよい
- そうすれば LLM は、あなたが追加で提供したコンテンツにもとづいて質問に答えられるようになる
- この安価なトリックは驚くほど効果的
- ただし、この作業を可能にする基本バージョンを動かすのは簡単ではない
- ユーザーが尋ねうる無限の質問セットを考えると、できるだけうまく機能するようにしなければならない
- RAG の主な問題は、LLM に送るプロンプトに含めるべき最適なコンテンツの抜粋を見極めること
- 埋め込みによって駆動される「Vibes-based」セマンティック検索は、ユーザーの質問に答えるのに役立つ関連性の高いコンテンツを集めるために必要な機能
- 自分は「ブログの内容」に対するバージョンを構築して公開した
- その結果、RAG は 1 行の Bash スクリプトで可能になった
5件のコメント
この記事を見て週末に試してみました。韓国語モデルも試そうとしたのですが、環境構築が簡単ではなかったので、ada v2 を使い、合計で 0.03 ドルかかりましたね。ChatGPT をまだ使ったことのない新規ユーザーなら、無料クレジット 5 ドルで十分試せそうです(笑)。
コサイン類似度まで計算して比較してみましたが、納得できる結果でした。記事の共有ありがとうございます。
週末に一度試してみないとですね
ありがとうございます〜
少しは理解できた気がします。
ありがとうございます。
普段から気になってはいたものの、よく分かっていなかった部分について多くを知ることができました。いつも良質なコンテンツをありがとうございます。