name: cloudflare-vectorize description: Cloudflare Vectorize 向量数据库,用于语义搜索和RAG。适用于向量索引、嵌入、相似性搜索,或遇到维度不匹配、过滤器错误时。 关键词:向量化、向量数据库、向量索引、向量搜索、相似性搜索、语义搜索、 最近邻、knn搜索、ann搜索、RAG、检索增强生成、与数据聊天、 文档搜索、语义问答、上下文检索、bge-base、@cf/baai/bge-base-en-v1.5、 text-embedding-3-small、text-embedding-3-large、Workers AI 嵌入、openai 嵌入、 插入向量、更新向量、查询向量、删除向量、元数据过滤、命名空间过滤、 topK 搜索、余弦相似性、欧几里得距离、点积、wrangler vectorize、元数据索引、 创建向量化索引、向量化维度、向量化度量、向量化绑定 license: MIT
Cloudflare Vectorize
Cloudflare Vectorize 的完整实现指南 - 一个全球分布的向量数据库,用于使用 Cloudflare Workers 构建语义搜索、RAG(检索增强生成)和 AI 驱动的应用程序。
状态: 生产就绪 ✅ 最后更新: 2025-11-21 依赖项: cloudflare-worker-base(用于 Worker 设置)、cloudflare-workers-ai(用于嵌入) 最新版本: wrangler@4.50.0, @cloudflare/workers-types@4.20251014.0 令牌节省: ~65% 预防的错误: 8 节省的开发时间: ~3 小时
这个技能提供什么
核心功能
- ✅ 索引管理: 创建、配置和管理向量索引
- ✅ 向量操作: 插入、更新、查询、删除和列出向量
- ✅ 元数据过滤: 每个索引最多 10 个元数据索引的高级过滤
- ✅ 语义搜索: 使用余弦、欧几里得或点积度量查找相似向量
- ✅ RAG 模式: 完整的检索增强生成工作流
- ✅ Workers AI 集成: 使用 @cf/baai/bge-base-en-v1.5 进行原生嵌入生成
- ✅ OpenAI 集成: 支持 text-embedding-3-small/large 模型
- ✅ 文档处理: 文本分块和批量摄取管道
包含的模板
- basic-search.ts - 使用 Workers AI 的简单向量搜索
- rag-chat.ts - 带有上下文检索的完整 RAG 聊天机器人
- document-ingestion.ts - 文档分块和嵌入管道
- metadata-filtering.ts - 高级过滤示例
关键设置规则
⚠️ 插入向量前必须执行
# 1. 使用固定维度和度量创建索引
bunx wrangler vectorize create my-index \
--dimensions=768 \
--metric=cosine
# 2. 立即创建元数据索引(在插入向量之前!)
bunx wrangler vectorize create-metadata-index my-index \
--property-name=category \
--type=string
bunx wrangler vectorize create-metadata-index my-index \
--property-name=timestamp \
--type=number
原因: 元数据索引必须在向量插入前存在。在元数据索引创建前添加的向量将无法在该属性上进行过滤。
索引配置(后续无法更改)
# 维度必须匹配嵌入模型输出:
# - Workers AI @cf/baai/bge-base-en-v1.5: 768 维度
# - OpenAI text-embedding-3-small: 1536 维度
# - OpenAI text-embedding-3-large: 3072 维度
# 度量决定相似性计算:
# - cosine: 最适合归一化嵌入(最常见)
# - euclidean: 向量之间的绝对距离
# - dot-product: 用于非归一化向量
Wrangler 配置
wrangler.jsonc:
{
"name": "my-vectorize-worker",
"main": "src/index.ts",
"compatibility_date": "2025-10-21",
"vectorize": [
{
"binding": "VECTORIZE_INDEX",
"index_name": "my-index"
}
],
"ai": {
"binding": "AI"
}
}
TypeScript 类型
export interface Env {
VECTORIZE_INDEX: VectorizeIndex;
AI: Ai;
}
interface VectorizeVector {
id: string;
values: number[] | Float32Array | Float64Array;
namespace?: string;
metadata?: Record<string, string | number | boolean | string[]>;
}
interface VectorizeMatches {
matches: Array<{
id: string;
score: number;
values?: number[];
metadata?: Record<string, any>;
namespace?: string;
}>;
count: number;
}
常见操作
快速参考
| 操作 | 方法 | 关键点 |
|---|---|---|
| 插入 | insert([...]) |
如果 ID 存在,则保留第一个 |
| 更新 | upsert([...]) |
如果 ID 存在,则覆盖(用于更新) |
| 查询 | query(vector, { topK, filter }) |
返回相似向量 |
| 删除 | deleteByIds([...]) |
按 ID 数组删除 |
| 获取 | getByIds([...]) |
检索特定向量 |
过滤操作符
| 操作符 | 示例 | 描述 |
|---|---|---|
$eq |
{ category: "docs" } |
相等(隐式) |
$ne |
{ status: { $ne: "archived" } } |
不相等 |
$in |
{ category: { $in: ["a", "b"] } } |
在数组中 |
$nin |
{ category: { $nin: ["x"] } } |
不在数组中 |
$gte/$lt |
{ timestamp: { $gte: 123 } } |
范围查询 |
📄 完整操作指南: 加载 references/vector-operations.md 以获取完整的插入/更新/查询/删除示例代码。
嵌入生成
| 模型 | 提供商 | 维度 | 最适合 |
|---|---|---|---|
@cf/baai/bge-base-en-v1.5 |
Workers AI | 768 | 免费,通用 |
text-embedding-3-small |
OpenAI | 1536 | 平衡质量/成本 |
text-embedding-3-large |
OpenAI | 3072 | 最高质量 |
📄 集成指南:
- 加载
references/integration-workers-ai-bge-base.md以获取 Workers AI 设置 - 加载
references/integration-openai-embeddings.md以获取 OpenAI 集成
元数据最佳实践
关键限制
| 限制 | 值 |
|---|---|
| 最大元数据索引 | 每个索引 10 个 |
| 最大元数据大小 | 每个向量 10 KiB |
| 字符串索引 | 前 64 字节(UTF-8) |
| 过滤器大小 | 最大 2048 字节 |
无效键字符
键不能:为空、包含 .(保留用于嵌套)、包含 " 或以 $ 开头。
📄 完整元数据指南: 加载 references/metadata-guide.md 以获取基数最佳实践、嵌套元数据和高级过滤模式。
RAG 模式(完整示例)
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { question } = await request.json();
// 1. 为用户问题生成嵌入
const questionEmbedding = await env.AI.run('@cf/baai/bge-base-en-v1.5', {
text: question
});
// 2. 在向量数据库中搜索相似内容
const results = await env.VECTORIZE_INDEX.query(
questionEmbedding.data[0],
{
topK: 3,
returnMetadata: 'all',
filter: { type: "documentation" }
}
);
// 3. 从检索到的文档构建上下文
const context = results.matches
.map(m => m.metadata.content)
.join('
---
');
// 4. 使用上下文通过 LLM 生成答案
const answer = await env.AI.run('@cf/meta/llama-3-8b-instruct', {
messages: [
{
role: "system",
content: `基于此上下文回答:
${context}`
},
{
role: "user",
content: question
}
]
});
return Response.json({
answer: answer.response,
sources: results.matches.map(m => m.metadata.title)
});
}
};
文档分块策略
推荐分块大小: 300-500 个字符以保持语义连贯性。
分块的关键元数据:
doc_id: 父文档 IDchunk_index: 在文档中的位置content: 用于检索显示的文本
📄 完整分块实现: 参见 templates/document-ingestion.ts 以获取完整的分块管道。
常见错误及解决方案
错误 1: 在向量插入后创建元数据索引
问题: 现有向量上的过滤无效
解决方案: 删除并重新插入向量或在插入前创建元数据索引
错误 2: 维度不匹配
问题: "向量维度与索引配置不匹配"
解决方案: 确保嵌入模型输出匹配索引维度:
- Workers AI bge-base: 768
- OpenAI small: 1536
- OpenAI large: 3072
错误 3: 无效的元数据键
问题: "无效的元数据键"
解决方案: 键不能:
- 为空
- 包含 .(点)
- 包含 "(引号)
- 以 $(美元符号)开头
错误 4: 过滤器过大
问题: "过滤器超过 2048 字节"
解决方案: 简化过滤器或拆分为多个查询
错误 5: 在高基数字段上进行范围查询
问题: 查询缓慢或准确性降低
解决方案: 对范围查询使用低基数字段,或对时间戳使用秒而不是毫秒
错误 6: 插入与更新混淆
问题: 索引中的更新未反映
解决方案: 使用 upsert() 覆盖现有向量,而不是 insert()
错误 7: 缺少绑定
问题: "VECTORIZE_INDEX 未定义"
解决方案: 在 wrangler.jsonc 中添加 [[vectorize]] 绑定
错误 8: 命名空间与元数据混淆
问题: 不清楚何时使用命名空间与元数据过滤
解决方案:
- 命名空间: 分区键,在元数据过滤器之前应用
- 元数据: 在命名空间内的灵活键值过滤
Wrangler CLI 参考
基本命令:
# 创建索引(维度/度量是永久性的)
bunx wrangler vectorize create <name> --dimensions=768 --metric=cosine
# 创建元数据索引(必须在插入向量之前!)
bunx wrangler vectorize create-metadata-index <name> --property-name=category --type=string
# 获取索引信息
bunx wrangler vectorize info <name>
📄 完整 CLI 参考: 加载 references/wrangler-commands.md 以获取所有 vectorize 命令。
性能提示
- 批量操作: 以 100-1000 个向量为批次插入/更新
- 选择性返回: 仅在需要时使用
returnValues: true(节省带宽) - 元数据基数: 保持索引元数字段为低基数以进行范围查询
- 命名空间过滤: 在元数据过滤器之前应用命名空间过滤器(先处理)
- 查询优化: 使用 topK=3-10 以获得最佳延迟(较大值增加搜索时间)
何时使用此技能
✅ 使用 Vectorize 当:
- 构建文档、产品或内容的语义搜索
- 实现带有上下文检索的 RAG 聊天机器人
- 创建基于相似性的推荐引擎
- 构建多租户应用程序(使用命名空间)
- 需要全球分布和低延迟
❌ 不要使用 Vectorize 用于:
- 传统关系型数据(使用 D1)
- 键值查找(使用 KV)
- 大型文件存储(使用 R2)
- 实时协作状态(使用 Durable Objects)
何时加载参考
| 参考文件 | 加载时机… |
|---|---|
references/vector-operations.md |
需要完整的插入/更新/查询/删除代码示例 |
references/metadata-guide.md |
设置元数据索引,过滤最佳实践 |
references/wrangler-commands.md |
使用 Vectorize CLI 命令 |
references/integration-workers-ai-bge-base.md |
集成 Workers AI 嵌入 |
references/integration-openai-embeddings.md |
集成 OpenAI 嵌入 |
references/embedding-models.md |
比较嵌入模型选项 |
references/index-operations.md |
索引生命周期管理 |
模板
| 模板 | 用途 |
|---|---|
templates/basic-search.ts |
简单向量搜索 |
templates/rag-chat.ts |
完整 RAG 聊天机器人 |
templates/document-ingestion.ts |
文档分块管道 |
templates/metadata-filtering.ts |
高级过滤 |
官方文档
版本: 1.0.0 状态: 生产就绪 ✅ 令牌节省: ~65% 预防的错误: 8 个主要类别 节省的开发时间: 每个实现约 2.5 小时