AI開発実践:ベクトルデータベースと埋め込み(Embedding)の実践 ── 記憶の仕組みをローカルに構築する

AI

前回の記事では、現代AIの心臓部である「トランスフォーマー」の仕組みと、個人開発における現実的な戦略についてお話ししました。
LLMという巨大な知能を、いかにしてコストを抑えつつ「自分専用」に育て上げるか。
その答えが、今回から始まる「外部記憶」の実装です。

どれほど賢いAIであっても、学習データに含まれていない最新の攻略情報や、あなただけが持つプライベートな知識をそのまま語ることはできません。
そこで必要になるのが、AIがいつでも参照できる「教科書」を、あなたのPCの中に構築することです。

「データベースなんて、設定が難しそうだし、高価なサーバーが必要なのでは?」

そのように思われる読者にとって、今回の内容は驚きの連続になるかもしれません。
今回私たちが手にするのは、Pythonライブラリを一つ導入するだけで構築できる、軽量かつ強力な「ベクトルデータベース(ChromaDB)」です。

本記事では、言葉を「数値」に変換し、AIが意味を理解して情報を探し出す「埋め込み(Embedding)」のマジックを、あなたのローカルPC環境で実際に動かしながら学んでいきます。

第1章:はじめに ── なぜLLMには「外部記憶」が必要なのか

LLM(大規模言語モデル)を使っていると、もっともらしい嘘をつく「ハルシネーション」や、昨日起きたばかりの出来事を知らないという現象に直面します。
これらは、モデルが持つ知識が「学習を終えた時点」で固定されているために起こる、構造的な課題です。

1.1. 「暗記」に頼る限界と「カンニング」の有効性

AIに新しい知識を授けるには、大きく分けて2つの方法があります。

  1. ファインチューニング(再学習): AIの脳そのものを書き換えて知識を「暗記」させる。
  2. RAG(検索拡張生成): AIに「教科書」を渡し、質問のたびに必要な箇所を「カンニング」させる。

個人の開発環境において前者は非常に高いコスト(計算資源)がかかります。
一方、後者のRAGは、今回紹介するベクトルデータベースさえあれば、あなたのPC一台でリーズナブルに、かつ正確な情報提供を実現できるのです。

1.2. ベクトルデータベースがAIの「記憶」を司る

従来のデータベース(SQLなど)は、「特定の単語が含まれているか」などといったキーワードの一致で検索を行います。
しかし、これでは「勇者の弱点は?」という問いに対し、「主人公の苦手な属性は火です」という、言葉が違うけれど意味が同じ回答を探し出すことができません。

ベクトルデータベースは、言葉を「意味の空間上の位置(ベクトル)」として保存します。
これにより、言葉の表面的な一致ではなく、「意味の近さ」で情報を引き出すことが可能になります。
これが、AIに「文脈に沿った記憶」を持たせるための仕組みです。

第2章:埋め込み(Embedding)の仕組み ── 言葉を「地図上の座標」に変える

コンピューターは「言葉」そのものを理解することはできませんが、「数値」の計算は大の得意です。
埋め込み(Embedding)とは、一言で言えば「言葉の意味を、多次元地図上の座標(数値のリスト)に変換する技術」のことです。

2.1. 意味が近いと、数値も近くなる

私たちは、言葉の意味を感覚的に捉えています。例えば「リンゴ」と「バナナ」はどちらも「果物」なので近い言葉だと感じますが、「リンゴ」と「タイヤ」は全く別物だと判断します。

埋め込みの技術を使うと、これらの言葉は例えば以下のような数値(ベクトル)に変換されます。

  • リンゴ: [0.9, 0.1, 0.8, ...]
  • バナナ: [0.8, 0.2, 0.7, ...]
  • タイヤ: [-0.5, 0.9, -0.1, ...]

この数値は、いわば「意味の空間」における住所です。
「リンゴ」と「バナナ」の数値が似ているのは、この地図上でお互いに近い場所に住んでいることを示しています。

面白いことに、この「住所」を使えば、言葉の計算もできるようになります。
有名な例として、「王様」のベクトル(数値)から「男性」の数を引き、「女性」の数を足すと、その結果は「女王様」のベクトルに限りなく近くなるという性質があります。

このように、言葉の「意味」を数学的に扱えるようになるのです。

2.2. Embeddingモデルの役割 ── 変換を担当する専用AI

テキストをベクトルの数値に変換してくれるのが、Embeddingモデルと呼ばれる専用のAIです。

これまでの伝統的な機械学習では、「この単語が出たら1、出なければ0」といった単純な変換(One-hotエンコーディング)を人間が設計していましたが、Embeddingモデルは以下のことを自動で行ってくれます。

  1. 文脈の理解: 「銀行(Bank)」と「土手(River Bank)」のように、同じワードを含んでいながらも文脈によって異なる意味を持つ言葉を、別の数値として描き分けます。
  2. 高次元での特徴抽出: 実際には、言葉の住所は数次元ではなく、数百〜数千次元という極めて複雑な地図上に配置されます。「性別」「食べ物かどうか」「高級感」「時代背景」といった膨大な要素(次元)を、AIが勝手に分析して数値化してくれるのです。
  3. 効率的な圧縮: 何万種類もある単語を、数百個程度の数値リストにギュッと凝縮します。これにより、膨大な知識を効率よく検索可能な形に変換できます。

つまり、私たちが攻略Wikiなどの文章をベクトルデータベースに保存するとき、裏側ではこのEmbeddingモデルが「文章をAIが計算しやすい座標に翻訳する」という重要な仕事をしてくれているということです。

第3章:ChromaDBの導入 ── Pythonだけで作れる軽量な記憶装置

ここからは、実際にベクトルデータベースを自身のPCにインストールして、使えるようにしてみましょう。

Pythonなどの開発環境の構築がお済みでない方は、まずは入門シリーズ 第1回記事を参照のうえ、環境構築の作業を完了させておいてください。

3.1. なぜChromaDBなのか ── 設定不要、サーバー不要のメリット

数あるベクトルデータベースの中で、なぜ今回ChromaDBを選ぶのか。その最大の理由は、使っているPython環境に「部品を追加する感覚」で導入できる手軽さにあります。

通常、データベースを導入するとなると「専用のサーバーソフトをインストールして、パスワードを設定し、常に裏側で起動させておく」などの手間がかかります。
しかし、ChromaDBは「組み込み型(Embedded)」という方式を採用しており、以下のメリットがあります。

  • pip一発で完了: 必要なインストーラーを検索し、ダウンロードしてからインストールといった手順は不要です。
  • サーバー管理不要: あなたの書いたPythonプログラムが動くときだけ、一緒に起動します。
  • データはただの「フォルダ」: 保存されたデータは、指定したフォルダの中にファイルとして書き込まれます。バックアップや移動も、そのフォルダをコピーするだけです。

3.2. インストールと準備 ── pip install で始める開発環境

それでは、実際にお手元のターミナル(またはAntigravity環境のコンソール)で、以下のコマンドを実行してみましょう。

pip install chromadb

これだけで準備は完了です。

もし以前のシリーズから Antigravity を使っている方であれば、ライブラリの追加によって開発がさらに加速します。
ChromaDBは内部で「ベクトル計算を高速化するライブラリ」なども自動的にインストールしてくれますが、これらすべてがあなたのPCのCPUパワーだけで十分に動作するように設計されています。

インストール中にいくつか依存ライブラリ(pydanticやnumpyなど)が同時に読み込まれますが、基本的にはそのまま待つだけでOKです。

エラーが出る場合は、Pythonのバージョンが3.8以上であることを確認してください。

これで、AIのための「記憶の器」が手元に用意されました。

第4章:【実践】ベクトルデータベースを動かしてみる

ここでは、実際にChromaDBを動かすための最小限かつ最も重要なステップを解説します。
お手元のPython環境(Antigravity、VS Code 等)で実行できる形式で進めます。

任意の作業フォルダの中に vector_test.py というファイルを作成して、コードを書いていきましょう。

4.1. ファイル構成のイメージ

本章の作業を進めると、フォルダ内は次のような構成になります。

project_folder/         # 自身の環境で選んだプロジェクト用のフォルダ
├── vector_test.py      # 今から作成するメインファイル
└── my_ai_memory/       # 実行後に自動生成されるデータベースフォルダ

4.2. プログラムの実装(vector_test.py)

新規ファイル vector_test.py に、以下のコードをコーディングしてください。
(コピー&ペーストでもOKです。)

import chromadb

# 1. データの保存先を指定してクライアントを起動
client = chromadb.PersistentClient(path="./my_ai_memory")

# 2. 「game_wiki」という名前の棚(コレクション)を作成
collection = client.get_or_create_collection(name="game_wiki")

# 3. 攻略情報を覚えさせる(追加する)
documents = [
    "勇者の剣は火属性の攻撃力を1.5倍にする効果がある。",
    "氷の洞窟に出現するボスは、火属性の攻撃が弱点である。",
    "回復魔法の『ヒール』は、使用者の精神力に比例して回復量が増える。"
]
collection.add(
    documents=documents,
    ids=["doc1", "doc2", "doc3"]
)
print("--- 情報の保存が完了しました ---")

# 4. 意味による検索を実行
query = "氷のボスを倒すのに有効な手段は?"
results = collection.query(
    query_texts=[query],
    n_results=1
)

print(f"質問: {query}")
print(f"AIが見つけた回答: {results['documents'][0]}")

4.3. 実行と結果の確認

ターミナル(コンソール)で以下のコマンドを実行します。

python vector_test.py
実行結果
--- 情報の保存が完了しました ---
質問: 氷のボスを倒すのに有効な手段は?
AIが見つけた回答: ['氷の洞窟に出現するボスは、火属性の攻撃が弱点である。']

4.4. プログラムコードの解説

今回作成したのはほんの短いプログラムでしたが、その中には、現代のAI検索に欠かせない3つの重要なプロセスが凝縮されています。

  1. コレクション(棚)の作成:get_or_create_collection は、図書館でいう「特定のジャンルの棚」を作る作業です。今回はゲーム攻略情報を入れたので、他のアプリを作る際は「日記」や「社内文書」など、棚を分けて管理できます。
  2. 自動Embedding(埋め込み):collection.add を実行した際、ChromaDBは内部で「テキストをベクトル(数値のリスト)に変換する」という作業を自動的に行っています。これにより、私たちは難しい計算式を書くことなく、文章を「意味の空間」に配置することができたのです。
  3. 近似最近傍探索(ANN): collection.query を実行したとき、AIは「質問文のベクトル」と「保存されたデータのベクトル」の距離を計算しています。
    • 質問:「氷のボスを倒すには?」
    • ヒットしたデータ:「……火属性が弱点である」 この2つは言葉自体は違いますが、意味の空間では「非常に近い場所」にあります。AIは一番近い場所にあるデータを「正解」として引き出したのです。

第5章:まとめ ── 次回、ベクトルデータベースとRAGの世界へ

今回の実践で、自身のPCの中に「意味を理解して情報を引き出す」ためのインフラが整いました。

5.1. 本記事の振り返り

  1. 外部記憶の必要性: LLMの「物忘れ」を防ぐには、暗記(再学習)よりもカンニング(RAG)が効率的。
  2. 埋め込み(Embedding): 言葉を「意味の空間上の座標」に変えることで、曖昧な質問にも対応できる。
  3. ChromaDBの威力: Antigravity環境なら !pip だけで導入でき、ローカル環境で爆速な検索を可能にする。

5.2. 次なるステップ:知能と記憶の「合体」

今の状態では、まだ「データベースが関連する文章を見つけてきた」だけです。
このままでは、AIが自然な言葉で回答してくれるわけではなく、拡張性もありません。

そこで次回の記事では、いよいよデータベースとAIを接続します。

2026年現在、APIの利用制限やプライバシーの観点から、あえて「クラウドに頼らない開発」が注目を集めつつあります。
APIキー不要、完全無料で無制限に使える「ローカルLLM(Ollama)」を脳として採用し、自分だけのプライベートRAGを完成させましょう。

コメント

タイトルとURLをコピーしました