Gadget 43:Vectorize と AI アプリ構成

ベクターデータベース Vectorize を使った RAG 形式の AI アプリ構成

Vectorize と AI アプリ構成

「ドキュメントを読み込んで質問に答える」AI アプリ(RAG)を、Cloudflare だけで組み上げます。

目的

  • Embedding → Vectorize → 回答生成の一連の流れを体験する
  • 個人用ナレッジ検索・メモ検索の構成を作る

前提条件

  • Workers AI(37-workers-ai
  • 公式: https://developers.cloudflare.com/vectorize/

RAG の流れ

[ドキュメント] --Embedding--> [Vectorize(ベクトルDB)]
[質問] --Embedding--> [類似検索 topK] --結果--> [LLM に再構成] --回答-->

手順

1. インデックスを作成(次元をモデルに合わせる)

npx wrangler vectorize create cfos-knowledge \
  --dimensions=1024 \
  --metric=cosine

@cf/baai/bge-large-en-v1.5 の出力次元 1024 に合わせます)

[[vectorize]]
binding = "VECTORIZE"
index_name = "cfos-knowledge"

2. Embedding して保存

const embeddings = await env.AI.run("@cf/baai/bge-large-en-v1.5", {
  text: "Cloudflare OS を NAS で常駐運用する",
});
await env.VECTORIZE.upsert([
  { id: "note-001", values: embeddings.data[0], metadata: { title: "QNAP 運用" } },
]);

3. 質問して回答する

const q = await env.AI.run("@cf/baai/bge-large-en-v1.5", { text: "NAS でどう動かす?" });
const matches = await env.VECTORIZE.query(q.data[0], { topK: 3, returnValues: false });
const ctx = matches.matches.map(m => m.metadata.title).join(", ");
const res = await env.AI.run("@cf/meta/llama-3-8b-instruct", {
  prompt: `以下を参考に簡潔に答えて: ${ctx}`,
});

よくある失敗

症状 原因 対処
検索結果が空 次元不一致 or upsert 失敗 インデックス次元とモデル出力を照合
回答が支離滅裂 プロンプトに文脈が入っていない metadata(本文)を prompt に埋め込む
コストを食う 全ドキュメントを毎回再エンべット 更新分だけ upsert、定期的な保全
日本語がイマイチ モデルとの相性 日本語向けモデルや要約を検討

確認

次に読む