技术栈选择与架构设计
良好的架构设计是构建高效、可扩展的 RAG 系统的基础。本章将深入探讨我们为聊天机器人选择的技术栈,包括 Cloudflare Workers、Vectorize 向量数据库以及千问大语言模型等核心组件。我们将详细解析整体架构的各个层次,介绍 Cloudflare 提供的 RAG 参考架构,并分析 Vectorize 在系统中的关键作用。通过理解这些设计决策,您将能够构建出既满足当前需求又具备未来扩展性的 AI 应用。
整体架构概览
我们的 RAG 聊天机器人采用了现代化的无服务器架构,整个系统可以分为数据源层、数据处理层、存储层、计算层、AI 服务层和展示层等核心层次。整个系统的数据流程可以分为数据摄取阶段(离线)和对话交互阶段(实时)两个主要部分。
下图展示了 RAG 聊天机器人的架构。
在数据摄取阶段,系统会从 Hugo 网站的 content/
目录收集 Markdown 文档,使用 fast-ingest.ts
脚本解析并分块文档内容,通过千问或 Gemini API 生成文档嵌入向量,最后将向量和元数据存储到 Cloudflare Vectorize 数据库中。
在对话交互阶段,用户通过网站上的聊天 Widget 发送问题,Cloudflare Worker 接收请求并向量化用户查询,在 Vectorize 中检索最相关的文档片段,构建包含上下文的提示词,调用大语言模型生成回答,最后返回格式化的响应给用户。
Cloudflare RAG 参考架构
Cloudflare 提供了一套 RAG 参考架构,展示了如何在无服务器环境中构建高效、可扩展的 RAG 系统。该架构充分利用了 Cloudflare 的边缘计算平台和相关服务。
在知识库构建阶段,系统会自动从 Hugo 网站的 content/
目录收集 Markdown 文档,通过本地或云端脚本(如 fast-ingest.ts
)进行内容解析和分块,然后调用千问或 Gemini 等嵌入模型生成文档向量,最终将向量及其元数据直接存储到 Cloudflare Vectorize 向量数据库中。整个流程无需消息队列或关系型数据库,简化了架构,提升了处理效率。
在知识查询阶段,用户通过网站聊天 Widget 提交问题,Cloudflare Worker 作为 API 端点接收请求,首先将用户查询转化为向量表示,然后在 Vectorize 中检索最相关的文档片段。检索结果与原始查询一同构建提示词,调用大语言模型(如千问或 Gemini)生成最终回答,并将响应返回给用户。
该架构的主要优势包括:充分利用 Cloudflare Workers 的无服务器特性,自动扩缩容,无需服务器运维;依托全球 200 多个数据中心的边缘计算能力,提供低延迟响应;架构简洁,组件解耦,便于扩展和维护;按使用量计费,具备良好的成本效益。
通过采用这种架构,开发者可以快速构建和部署高性能的 RAG 应用,充分发挥 Cloudflare 全球网络和 Vectorize 服务的优势。
核心技术栈介绍
在后端架构方面,我们选择了 Cloudflare Workers 作为边缘计算平台,提供全球分布的低延迟响应,同时使用 Cloudflare Vectorize 作为向量数据库,存储文档嵌入和处理相似度搜索,并采用 TypeScript 作为开发语言以确保类型安全。
AI 模型服务方面,系统支持千问(Qwen)和 Google 的 Gemini 两种选择。千问是阿里云提供的大语言模型和嵌入模型,特别适合中文内容处理,而 Gemini 是 Google 提供的多模态 AI 模型,适合处理多种类型的内容。嵌入模型可以选择千问的 text-embedding-v4 或 Gemini 的 text-embedding-004。
text-embedding-v4
)和大语言模型(如 qwen-turbo-latest
)都提供了高质量的中文支持,且更具成本优势(只有 Gemini API 约一半的价格)。前端组件方面,我们使用 Widget.js 作为轻量级聊天界面,支持 Markdown 渲染,同时采用 Hugo 作为静态网站生成器进行内容管理,并实现响应式设计以支持桌面和移动设备。
在开发工具方面,使用 Wrangler 作为 Cloudflare Workers 的开发和部署工具,Node.js 作为本地开发和数据处理环境,并采用 npm 或 pnpm 作为包管理器。
Cloudflare Vectorize 架构细节
Vectorize 在整体架构中扮演着关键角色,它连接了数据处理和实时查询两个阶段:
数据流设计
向量生成流程:
Markdown 文档 → 文本分块 → 嵌入模型 → 向量表示 → Vectorize 存储
向量查询流程:
用户查询 → 嵌入模型 → 查询向量 → Vectorize 检索 → 相关文档
数据模型设计
Vectorize 中存储的向量包含以下关键组成部分:
- 向量 ID:唯一标识符,通常基于文档路径和块索引生成
- 向量值:由嵌入模型生成的数值数组
- 元数据:与向量关联的描述性信息
- 命名空间:可选的向量分组标识
示例向量结构:
{
id: "a1b2c3d4-0", // 基于文档路径和块索引生成的唯一 ID
values: [0.12, 0.45, 0.67, /* ... 1024 个维度 ... */], // 1024 维向量
metadata: {
url: "https://jimmysong.io/blog/launch-ai-resource-page", // 文档 URL
title: "RAG 聊天机器人指南", // 文档标题
sourcePath: "content/zh/blog/launch-ai-resource-page/index.md", // 源文件路径
chunkIndex: 0, // 块索引
language: "zh", // 语言
tags: ["AI", "RAG", "Cloudflare"], // 标签
createdAt: "2025-07-31T10:00:00Z", // 创建时间
wordCount: 256 // 字数统计
},
namespace: "zh" // 命名空间(可选)
}
查询优化策略
为了提升查询性能,Vectorize 采用了多项优化措施。首先,系统会自动优化向量索引结构,确保在大规模数据集下依然能够高效检索。默认采用近似搜索算法,在保证检索准确性的同时显著提升响应速度。对于常用的过滤字段,Vectorize 支持元数据索引,便于实现基于标签、语言等属性的高效筛选。此外,通过命名空间机制,可以实现数据的逻辑隔离和针对性查询优化,满足多租户或多语言场景下的需求。
技术栈选择的考量
本系统之所以采用当前的技术栈,主要基于以下几个方面的综合考量:
- 首先,Cloudflare Workers 提供了全球 200 多个数据中心的边缘计算能力,能够实现平均低于 50ms 的响应延迟,并支持自动扩缩容,极大简化了运维工作。
- 按请求计费模式和 Vectorize 的免费额度,使得整体方案具备良好的成本效益,尤其适合个人博客和小型项目的快速上线。
- 在开发体验方面,TypeScript 的类型安全保障和支持热重载的开发环境,使得开发流程更加高效和可靠。结合模块化架构设计,系统能够灵活集成多种 AI 服务商,并原生支持中英文等多语言内容,具备良好的可扩展性。
Vectorize 的独特优势
在众多向量数据库方案中,Cloudflare Vectorize 具备无缝集成 Cloudflare Workers 的能力,配置简单,易于上手。依托 Cloudflare 全球网络,能够为用户提供低延迟的向量检索服务。后台自动优化索引,支持单索引多达 500 万个向量,满足大规模应用需求。计费方式透明,按查询和存储维度计费,无隐藏费用。丰富的元数据支持和命名空间机制,进一步提升了数据管理和查询的灵活性。这些特性共同构成了 Vectorize 在 RAG 应用场景下的核心竞争力,使其成为快速部署和扩展 AI 应用的理想选择。