Cloudflare Vectorize 实战模式全解:从 Workers AI / OpenAI 集成到 RAG、多租户与混合检索
【免费下载链接】autoskillsOne command. Your entire AI skill stack. Installed.项目地址https://gitcode.com/gh_mirrors/au/autoskills点击查看免费下载本文以 autoskills 仓库中 Cloudflare 技能包cloudflare/SKILL.md的 Vectorize 实战模式文档 为核心骨架系统讲解在 Cloudflare Workers 中落地向量检索的六大实战模式Workers AI 与 OpenAI 的 embedding 集成、经典 RAG 流水线、多租户隔离、混合搜索与批量写入并补充仓库内 api.md、configuration.md、gotchas.md 中的接口细节、配额限制与排错要点。读完本文你将能直接照着代码模板在自己的 Worker 中完成从「向量写入 → 语义查询 → 生成式回答」的完整链路。前置准备索引、绑定与向量结构所有实战模式都建立在一个可用的 Vectorize 索引之上。根据 Vectorize 配置文档完整准备步骤包括三件事建索引、配绑定、确认向量格式。创建索引npx wrangler vectorize create my-index --dimensions768 --metriccosine两个关键参数需要提前想清楚因为dimensions维度和 metric距离度量在索引创建后不可修改只能新建索引并迁移数据参数说明选择建议--dimensions向量维度与 embedding 模型输出维度必须严格一致用 BGE base 模型就是 768--metric距离度量方式文本/语义搜索用cosine图像相似度用euclidean推荐系统/已归一化向量用dot-product语义搜索场景中cosine得分越高表示越相似1.0 表示完全相同而euclidean是得分越低越接近0.0 表示完全相同。仓库 Vectorize 总览 给出了度量选择决策树V2 索引单索引可容纳 1000 万向量、最大 1536 维32 位浮点。配置 Worker 绑定在wrangler.jsonc中声明绑定// wrangler.jsonc { vectorize: [ { binding: VECTORIZE, index_name: my-index } ] }对应 TypeScript 侧的Env接口vectorize绑定对应的类型为VectorizeIndex来自cloudflare/workers-types见 bindings/api.mdinterface Env { VECTORIZE: Vectorize; }向量数据结构写入与查询操作都围绕 api.md 定义的VectorizeVector结构interface VectorizeVector { id: string; // 最大 64 字节 values: number[]; // 维度必须与索引一致 namespace?: string; // 可选分区最大 64 字节 metadata?: Recordstring, any; // 最大 10 KiB }其中values的维度必须与建索引时的--dimensions严格匹配这是查询无结果的常见原因之一。模式一与 Workers AI 集成原生 embedding 查询在 Cloudflare 全栈内做语义搜索时最直接的方式是让 Workers AI 生成 query 的 embedding再交给 Vectorize 查询。仓库 patterns.md 给出的核心模板如下// 生成 embedding 查询 const result await env.AI.run(cf/baai/bge-base-en-v1.5, { text: [query] }); const matches await env.VECTORIZE.query(result.data[0], { topK: 5 }); // 必须传 data[0]这里最关键的坑是必须传data[0]而不是data或整个响应对象Workers AI 的 embedding 返回体是{ data: [ { embedding: number[] } ] }形状result.data是数组result.data[0]才是真正的一维向量数组。选错形状会导致维度不匹配或类型错误。Workers AI 的 BGE 英文 embedding 模型族与维度对照建索引前就要选定因为维度不可改模型维度cf/baai/bge-small-en-v1.5384cf/baai/bge-base-en-v1.5768推荐cf/baai/bge-large-en-v1.51024Workers AI 参考文档 对这三个模型的定位是large 质量最高但最贵base 是质量与成本平衡点因此 patterns 标注为 recommendedsmall 最快最省。若涉及多语言文本可改用hf/sentence-transformers/paraphrase-multilingual-minilm-l12-v2。另需注意 AI 推理在本地开发环境不可用调试 embedding 链路要使用wrangler dev --remote。模式二与 OpenAI 集成外部 embedding 服务如果团队已经统一使用 OpenAI 的 embedding 服务则无需 Workers AI直接调用 OpenAI SDK 生成向量再查询const response await openai.embeddings.create({ model: text-embedding-ada-002, input: query }); const matches await env.VECTORIZE.query(response.data[0].embedding, { topK: 5 });注意取向量位置的差异OpenAI 响应中response.data[0]是对象需要继续取.embedding字段而 Workers AI 的result.data[0]本身就是数组。两种服务返回形状不同抽取向量的代码不要混用。模式三经典 RAG 检索增强生成RAG 是 Vectorize 最典型的应用场景。仓库 patterns.md 给出了一条完整的四步流水线同时 Vectorize 总览 提供了等价的变体写法// 1. 对查询文本生成 embedding const emb await env.AI.run(cf/baai/bge-base-en-v1.5, { text: [query] }); // 2. 在向量库中检索相似向量同时取回元数据 const matches await env.VECTORIZE.query(emb.data[0], { topK: 5, returnMetadata: indexed }); // 3. 根据元数据中的 key从 R2/D1/KV 拉取完整文档 const docs await Promise.all(matches.matches.map(m env.R2.get(m.metadata.key).then(o o?.text()))); // 4. 把检索到的文档作为上下文让 LLM 生成回答 const answer await env.AI.run(cf/meta/llama-3-8b-instruct, { prompt: Context:\n${docs.filter(Boolean).join(\n\n)}\n\nQuestion: ${query}\n\nAnswer: });这条链路的两个设计要点向量库里只存向量与轻量元数据不存全文。步骤 2 用returnMetadata: indexed只取回元数据如对象在 R2 的 key步骤 3 再按需拉全文避免把大文档塞进向量条目导致体积膨胀。docs.filter(Boolean)过滤空结果。R2 中可能不存在对应对象o?.text()会得到undefined拼接 prompt 前要剔除防止把undefined文本喂给模型。为何用 RAG 而不是直接生成Workers AI 参考文档 给出的判断标准是回答特定文档/私有数据的问题、需要事实准确性、上下文超过模型窗口4K token、构建知识库问答时应走 RAG而创意写作、通用知识、小上下文 prompt 则直接生成更省成本。模式四多租户隔离方案多租户场景下隔离策略取决于租户数量仓库提供了两条明确的分界线见 patterns.md 与 README.md租户规模如何 ├─ 5 万租户 → 使用 namespaces推荐 │ ├─ 最快先过滤再向量搜索 │ └─ 严格隔离 ├─ 5 万租户 → 使用元数据过滤 │ ├─ 较慢向量搜索后再过滤 │ └─ 需要提前建元数据索引 └─ 每租户独立索引 → 仅在合规强制要求时使用 └─ 付费计划每账户索引上限 5 万个Namespaces租户 5 万最快namespace 是 Vectorize 内置的分区机制查询时先按 namespace 剪枝再计算相似度因此隔离既严格又快// 写入时指定 namespace await env.VECTORIZE.upsert([{ id: 1, values: emb, namespace: tenant-${id} }]); // 查询时限定同一 namespace await env.VECTORIZE.query(vec, { namespace: tenant-${id}, topK: 10 });配额方面见 gotchas.md付费计划支持 5 万 namespaces免费计划仅 1 千。namespace 是大小写敏感的拼写不一致是「查不到结果」的高频原因。元数据过滤租户 5 万当租户数超过 namespace 配额上限时改用元数据过滤方案先创建 tenantId 的元数据索引写入时带上metadata.tenantId查询时用filter限定wrangler vectorize create-metadata-index my-index --property-nametenantId --typestringawait env.VECTORIZE.upsert([{ id: 1, values: emb, metadata: { tenantId: id } }]); await env.VECTORIZE.query(vec, { filter: { tenantId: id }, topK: 10 });注意元数据索引必须在插入数据前创建已存在的数据不会被追溯索引见 configuration.md漏建索引会导致 filter 静默失效。模式五混合检索向量相似度 元数据过滤向量检索与结构化过滤可以叠加使用实现「语义相关 条件约束」的混合搜索。以下示例同时做类目白名单与时间范围过滤const matches await env.VECTORIZE.query(vec, { topK: 20, filter: { category: { $in: [tech, science] }, published: { $gte: lastMonthTimestamp } } });api.md 完整列出了 filter 支持的运算符运算符示例$eq隐式{ category: docs }$ne{ status: { $ne: deleted } }$in/$nin{ tag: { $in: [sale] } }$lt、$lte、$gt、$gte{ price: { $lt: 100 } }使用 filter 的约束条件必须预先建好对应字段的元数据索引filter 表达式最大 2048 字节键名不能包含点号或$值只允许 string / number / boolean / null。嵌套字段可用点号访问如product.category。若按高基数字段过滤如毫秒级时间戳configuration.md 建议先做分桶例如Math.floor(Date.now() / 300000) * 300000归到 5 分钟桶以提升过滤效率。模式六批量写入Batch Ingestion逐条插入吞吐很低gotchas.md 给出的对比是单条插入约 1K/min而批量插入可达 200K/min。patterns 中的批量模板const BATCH 500; for (let i 0; i vectors.length; i BATCH) { await env.VECTORIZE.upsert(vectors.slice(i, i BATCH)); }关于单次批量上限仓库内文档口径略有差异patterns 与 gotchas 建议以500为安全批量值gotchas 备注这是未被官方文档明确写出的限制、超限会被静默截断而 api.md 记载 Workers API 单次上限 1,000、HTTP API 单次上限 5,000。保守起见以 500 分批最稳妥若走 HTTP API 且确信版本支持可适当放大。此外向量文件批量上传NDJSON 格式每行一个{id, values, metadata}对象单文件上限为 5000 条 / 100 MB可通过wrangler vectorize insert my-index --fileembeddings.ndjson导入见 configuration.md。最佳实践清单patterns.md 末尾总结了六条经过验证的实践准则逐条展开如下传data[0]而不是data或整个响应——embedding 抽取形状错误是最常见的问题见模式一、二每次 upsert 批量 500 条——兼顾吞吐与超限截断风险插入数据前先创建元数据索引——索引只对创建之后写入的向量生效事后补建需要重新 upsert 全部向量租户隔离优先用 namespaces——它在向量搜索前就完成过滤比 filter搜索后过滤更快returnMetadata: indexed是速度与数据量的最佳平衡——它返回的字符串元数据仅前 64 字节够用于定位文档又不会拖慢查询异步写入要预留 5–10 秒延迟——insert/upsert/delete 立即返回但向量要等 5–10 秒才可查询写后立即读会查不到。配套陷阱清单与排错要点除上述最佳实践外仓库 gotchas.md 还整理了一批极易踩中的限制写作与排错时值得对照topK 上限会因返回内容而降级returnMetadata: none/indexed且不返回向量时最大 topK 为 100一旦returnMetadata: all或returnValues: true最大 topK 降至20insert与upsert语义不同insert忽略重复 ID保留先写入的upsert覆盖重复 ID保留后写入的批量导入去重要求高时注意区分索引配置不可变维度与度量建好后无法修改需要变更只能新建索引并迁移「查不到结果」排查顺序写入后是否已等 5–10 秒 → namespace 拼写是否一致大小写敏感→ 元数据索引是否已建 → 向量维度是否与索引匹配「filter 不生效」排查顺序索引是否早于数据创建 → 字符串是否超过 64 字节被截断 → 嵌套字段是否用了点号如product.category。在仓库中继续深入本文所有代码与数据均取自 autoskills 仓库的 Cloudflare 技能参考目录如需继续深挖可依次阅读Vectorize 总览 README索引能力、距离度量选择、多租户决策树、关键陷阱速览Vectorize API 参考 api.mdquery/insert/upsert/getByIds/deleteByIds/describe的完整签名、过滤运算符与性能对照表Vectorize 配置 configuration.mdCLI 全套命令、NDJSON 批量上传、生产环境检查清单Vectorize 陷阱 gotchas.md配额表单索引 1000 万向量、最大 1536 维、元数据索引上限 10 个等与排错指南Workers AI 参考embedding 模型选型、RAG 与直接生成的取舍Wrangler 参考wrangler vectorize系列命令在整体 CLI 中的位置。需要说明的是本文引用的是仓库当前快照中记录的版本与配额标注 Last Updated 2026-01-27 的 GA 状态。Cloudflare 的数值型限制、API 签名与定价可能随平台演进变化实际开发前建议以官方最新文档为准仓库 cloudflare/SKILL.md 也明确要求优先检索官方文档而非依赖内置知识。赞分享【免费下载链接】autoskillsOne command. Your entire AI skill stack. Installed.项目地址https://gitcode.com/gh_mirrors/au/autoskills点击查看免费下载相关推荐Cloudflare Vectorize 实战模式全解析从 Workers AI 集成到多租户、混合检索与批量写入Cloudflare Vectorize 实战模式全解析从 Workers AI 集成到多租户、混合检索与批量写入 本篇技术指南以 autoskills 仓库Cloudflare Vectorize 实战模式全解析从 Embedding 集成到多租户 RAG 检索Cloudflare Vectorize 实战模式全解析从 Embedding 集成到多租户 RAG 检索 本篇技术指南以 Cloudflare Vector人工智能AI 技能AI 插件Cloudflare Workers AI 配置完全指南从 Binding 绑定到 RAG 多模型实战Cloudflare Workers AI 配置完全指南从 Binding 绑定到 RAG 多模型实战 本指南以 Cloudflare Workers AI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考