このレッスンのロックを解除するには、まず「AIエージェントをSQLデータベースに接続する」を完了してください。前のレッスンに戻る

AIエージェント向けNoSQLとベクターデータベースの入門

AIエージェントには単なる構造化テーブル以上のものが必要です。非構造化コンテンツ、セマンティック検索、大規模な埋め込みを扱う場合、従来のリレーショナルデータベースは力不足です。そこで登場するのが、NoSQLドキュメントストアとベクターデータベースです。

MongoDBのようなドキュメントデータベースは、柔軟なJSON形式のレコードを保存します。これは、エージェントがさまざまなペイロードを扱う場合に最適です。例えば、任意フィールドを持つユーザープロファイル、スクレイピングしたウェブページ、会話ごとに構造が異なるチャット履歴などです。

Pinecone、Weaviate、Chromaなどのベクターデータベースは、高次元の埋め込みを保存し、エージェントに類似度検索を可能にします。キーワードの完全一致ではなく、クエリに意味的に最も近いアイテムを取得します。これがRAGパイプライン、メモリシステム、推薦機能を支えます。

エージェントとドキュメントストアの連携

一般的なワークフローでは、エージェントがデータベース操作をラップするツールや関数を呼び出します。プロンプト内に生のクエリを書く代わりに、get_user_profileやlog_conversationのような安全でパラメータ化されたアクションを公開します。

python
from pymongo import MongoClient
client = MongoClient("mongodb://localhost:27017")
db = client["agent_store"]
def log_conversation(session_id: str, messages: list):
db.conversations.update_one(
{"session_id": session_id},
{"$set": {"messages": messages}},
upsert=True
)
def get_user_context(user_id: str) -> dict:
return db.users.find_one({"user_id": user_id})

このパターンでは、エージェントがユーザーのリクエストに基づいて呼び出す関数を決定し、関数がすべてのデータベース操作を裏側で処理します。データベーススキーマは柔軟性を保ち、MongoDBは保存するどんな形式でも受け入れてくれます。

エージェントがリクエストを受け取り、ドキュメントストアクエリとベクター検索のいずれかを選択し、統合された応答を返すことを示すフローチャート

セマンティック検索のためのベクターデータベース活用

ベクターデータベースは、OpenAIのtext-embedding-3-smallやローカルのsentence-transformerのようなモデルを使って、テキストを数値配列(埋め込み)に変換します。保存された後、類似度はコサイン距離またはドット積で測定されます。

python
from openai import OpenAI
import chromadb
client = OpenAI()
chroma = chromadb.PersistentClient(path="./vector_store")
collection = chroma.get_or_create_collection("docs")
def embed(text: str) -> list:
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
def add_document(doc_id: str, content: str):
collection.add(ids=[doc_id], embeddings=[embed(content)], documents=[content])
def search_similar(query: str, top_k: int = 3) -> list:
results = collection.query(query_embeddings=[embed(query)], n_results=top_k)
return results["documents"][0]

ユーザーの質問がエージェントの学習カットオフを超える知識を必要とする場合、エージェントはsearch_similarを呼び出します。取得されたチャンクは、その後言語モデルのコンテキストとしてプロンプトに注入されます。

ドキュメントストアとベクターストアの選択

ドキュメントデータベースは、正確なルックアップ、柔軟なスキーマ、従来のフィルタリングが必要な場合の正しい選択です。例えば、IDによる注文の取得や、テナントの全セッションの一覧表示など。

ベクターデータベースは、ファジーな意味ベースの検索が必要な場合の正しい選択です。例としては、ユーザーの言い回しに関連するヘルプ記事の発見、履歴書と職務記述書のマッチング、現在のトピックに類似した過去の会話の検索などがあります。

実際には、本番環境のほとんどのエージェントは両方を組み合わせています。ベクターデータベースが意味的に関連するアイテムを見つけ、ドキュメントデータベースがそれらのアイテムに関連する完全な構造化レコードを取得します。例えば、過去のチケットの類似マッチの後、完全なユーザープロファイルを取得するような場合です。

よくある落とし穴とベストプラクティス

よくある間違いは、大きな埋め込みをドキュメントデータベース内に保存することです。可能なことですが、インデックス作成速度とクエリパフォーマンスを損ないます。埋め込みは専用のベクターストアに保持し、ドキュメントストアには参照(ドキュメントIDなど)を保持してください。

もう一つの落とし穴は、埋め込みモデルの変更に対応することを忘れることです。モデルを切り替える場合、データセット全体を再度埋め込む必要があります。古いベクトルと新しいベクトルは比較可能ではないからです。

最後に、ベクタークエリには必ずメタデータフィルタを設定してください。数百万のベクトル全体を検索するのはコストがかかるため、類似度計算の前に日付、ユーザー、カテゴリで絞り込んでください。

python
results = collection.query(
query_embeddings=[embed(query)],
n_results=5,
where={"user_id": "u_123", "created_at": {"$gt": 1700000000}}
)

まとめ

NoSQLドキュメントデータベースは、AIエージェントにさまざまな実世界のデータに対応するスキーマ柔軟性を提供します。ベクターデータベースは、従来のSQLでは実現できないセマンティック検索を加えます。本番エージェントにとっての最適なパターンはハイブリッドです。構造化状態と正確なルックアップにはドキュメントストアを、意味ベースの検索にはベクターストアを使用します。埋め込みは専用のストアに保持し、早めにフィルタリングし、将来のモデルアップグレードを計画しましょう。

レッスンの練習

レッスンのチェックポイント

学んだ内容を復習し、回答へのフィードバックを受けましょう。

0/7
01AIエージェントにとって、ベクターデータベースの従来のドキュメントストアに対する主な利点は何ですか?
02示されたドキュメントストアパターンで、log_conversationがupsert=Trueを使用する理由は何ですか?
03テキストをベクターデータベース用の数値表現に変換するために使用される関数はどれですか?
04レッスンで推奨されているハイブリッドアーキテクチャは何ですか?
05ベクターデータベースを入力した後に埋め込みモデルを切り替えるとどうなりますか?
06最終的なコード例で、collection.query()にwhereフィルタを使用する理由は何ですか?
07ベクターデータベースではなく、ドキュメントデータベースが最適なのはどのようなシナリオですか?
回答済み · 0/7