なぜ従来の検索エンジンはあなたが買いたいものを見つけられないのか?
RAGシステムが「カンニングペーパー」をどう探すかを理解する前に、まず従来の検索技術の問題点を見てみましょう。
あなたが衣料品のECサイトを運営しているとします。ある客が「雪の日でも暖かく過ごせる上着」を探しています。 彼はサイトの検索バーに「極度の防寒着」と入力します。
もしあなたのサイトが従来の検索エンジン(いわゆる「キーワードマッチング」)を使っている場合、検索結果は「該当商品が見つかりません」となるでしょう。 なぜでしょうか?データベースにある商品名は「特級ダウン防寒コート」だからです。 従来のデータベ��スは非常に融通が利きません。完全に一致する「文字」しか認識しないのです。「極度の防寒着」という6文字は「特級ダウン防寒コート」に含まれていないため、これらは無関係と判断されます。
しかし人間の頭脳では、「防寒」と「防寒」は同義語であり、「着」は「コート」を含むと理解できます。私たちは「意味(セマンティック)」を理解しているのです。
RAGシステムで膨大な企業文書から質問に答える段落を正確に見つけ出すには、従来のキーワードマッチングに頼らず、コンピュータに「意味を理解させる」必要があります。 ここで、AI界の革命的発明が登場しました:**Embedding(ベクトル化)**です。
Embeddingとは?文字を「座標」に変える魔法
Embeddingは抽象的に聞こえますが、「言葉の3D位置付けゲーム」と想像するとわかりやすいでしょう。
「りんご」、「バナナ」、「犬」という3つの単語があるとします。 AIモデルにこれらをEmbeddingさせると、これらの単語は3組の「数字座標」に変換され、立体的な空間に配置されます。
- 「りんご」の座標:[0.9, 0.1, 0.2](フルーティーで少し甘い)
- 「バナナ」の座標:[0.8, 0.2, 0.1](同じくフルーツだが形が異なる)
- 「犬」の座標:[0.1, 0.9, 0.9](動物らしく、吠える)
ここで魔法のようなことが起こります!数学的空間では、「りんご」と「バナナ」の座標距離は非常に近く、「犬」の座標は遥か遠くにあるのです!
これがEmbeddingの強力な力です。人間の複雑な「意味」を、コンピュータが最も得意とする「数字座標(ベクトル)」に変換します。 Embeddingを使えば、客が「極度の防寒着」と検索した時、AIはそれを座標に変換し、データベース内の「特級ダウン防寒コート」の座標と比較して、空間内の距離が非常に近いことを発見します。こうしてAIはこのコートを客に推薦できるのです。
この文字面ではなく意味を見る検索技術を「セマンティック検索(Semantic Search)」と呼びます。これがRAGシステムの心臓部なのです!
ベクトルデータベース(Vector Database)の台頭
企業の数千ページに及ぶ文書を全て細かく切り、「数十万組の座標数字(ベクトル)」に変換する場合、PostgreSQLやMySQLなどの従来のリレーショナルデータベースでは、これらの幾何学的距離を迅速に計算できません。
そこで、AI時代のために設計された全く新しいデータベースが市場に登場しました:**ベクトルデータベース(Vector Database)**です。 最も著名なベクトルデータベースには以下があります:
- Chroma:軽量、オープンソース、ローカル環境に直接インストール可能。RAG開発テスト時の第一選択肢。
- Pinecone:クラウドの王者。企業向けの最速選択肢だが、コストは高め。
- Qdrant / Milvus:非常に強力なオープンソースのベクトルデータベース。
RAGシステムにおいて、これらのベクトルデータベースは「スーパー図書館司書」の役割を果たします。 質問を座標に変換して渡すと、数百万の段落から0.数秒で、座標距離が最も近い(意味的に最も関連性の高い)5つの段落を見つけ出して返してくれます。
Vibe Prompt実践:LangChainでEmbeddingモデルを呼び出す
文字を座標に変換するには、言語モデル(例えばOpenAIのtext-embedding-3-smallモデル)の力を借ります。
LangChainを使えば、たった2行のコードで実現できます!
【Embedding体験Prompt】 LangChainとOpenAIのEmbedding技術を学んでいます。 Pythonで短いサンプルコードを書いてください:
langchain_openaiのOpenAIEmbeddingsモデルを使用。- 「これは一台の極速旋風扇風機です」という文章をEmbedding(ベクトル化)。
- ベクトル結果の最初の5つの数字を表示し、「座標」の見た目を確認。
- 日本語のコメントを付加。
AIが生成したデモコード:
import os
from langchain_openai import OpenAIEmbeddings
# OpenAIのAPI Keyを設定(実際のプロジェクトでは.envに保存)
os.environ["OPENAI_API_KEY"] = "sk-あなたのキー"
def demo_embedding():
# 1. OpenAIのEmbeddingモデルを呼び出し(デフォルトは最高性能のtext-embedding-3-small)
embeddings_model = OpenAIEmbeddings()
text = "これは一台の極速旋風扇風機です"
print(f"文字をベクトル座標に変換中:'{text}'")
# 2. ベクトル化の魔法を実行!
vector = embeddings_model.embed_query(text)
# 3. 結果を表示(OpenAIのベクトルは通常1536次元、最初の5つだけ表示)
print(f"変換成功!この文章は{len(vector)}次元の座標数字になりました。")
print(f"座標の最初の5つの数字:{vector[:5]}")
demo_embedding()
# ターミナル出力結果:
# 文字をベクトル座標に変換中:'これは一台の極速旋風扇風機です'
# 変換成功!この文章は1536次元の座標数字になりました。
# 座標の最初の5つの数字:[0.012, -0.045, 0.088, 0.001, -0.023]
ご覧ください!これがAIの見る世界です。扇風機に関する日本語の文章が、精密な浮動小数点数の座標に変換されました。
今、私たちは意味を理解する魔法と、それを格納するデータベースを手に入れました。 しかし問題が残っています:500ページにも及ぶPDFマニュアルを、どうやってこのシステムに自動的に取り込むか? 次章では、LangChainで最も実用的な構成要素:**Document Loaders(文書読み込み器)とText Splitters(テキスト分割器)**を学び、知識ベースを自動加工する生産ラインを構築します!