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、定期的な保全 |
| 日本語がイマイチ | モデルとの相性 | 日本語向けモデルや要約を検討 |
確認
次に読む
- Workers AI → 37-workers-ai
- 全体像 → 34-cloudflare-overview
- ワークフロー・費用 → 25-quotas-and-spend-control