Back to all posts
Tutorial

如何使用 Cloudflare 从零开始构建 0 成本的 Agentic RAG AI 助手

如果你还在为托管向量数据库每月支付 20 美元,并在冷启动的无服务器函数上托管你的 AI 聊天机器人,那你就做错了。

当我决定在我的作品集中添加一个 AI 助手时,我有两个严格的要求:它必须是零延迟的,并且运行它的成本必须恰好为 0 美元。

通过将整个 AI 架构转移到边缘计算,我实现了这两个目标。在本教程中,我将向您展示如何使用 Cloudflare 开发者平台从零开始构建一个有状态的 Agentic RAG(检索增强生成)系统。


0 美元技术栈架构

为了在保持企业级性能的同时将成本保持在零,我们完全依赖 Cloudflare 的免费层:

  • Cloudflare Workers:边缘计算运行时。(每天免费 100,000 次请求)。
  • Cloudflare Vectorize:用于语义搜索的向量数据库。(每月免费查询 3000 万个维度)。
  • Cloudflare D1:用于聊天记录的无服务器 SQLite 数据库。(每天免费读取 500 万行)。
  • Cloudflare AI Gateway:用于缓存 LLM 请求并防止速率限制。

我们构建的不是一个仅仅将文档塞进提示词中的被动 RAG 系统,而是一个智能体 (Agentic) 系统。这意味着 AI 运行在一个 "ReAct"(推理和行动)循环中,配备了自定义工具,它可以根据用户输入动态调用这些工具。


第 1 步:初始化边缘 Worker

首先,我们需要启动一个 Cloudflare Worker。这将作为我们操作的大脑。

npm create cloudflare@latest agentic-assistant
cd agentic-assistant

打开您的 wrangler.toml 文件。这是奇迹发生的地方。我们需要将 D1 数据库和 Vectorize 索引直接绑定到 Worker 环境,以便它们以近乎零延迟执行。

name = "agentic-assistant"
main = "src/index.ts"
compatibility_date = "2026-05-01"

[[d1_databases]]
binding = "DB"
database_name = "chat_history"
database_id = "your-d1-id"

[[vectorize]]
binding = "KNOWLEDGE_BASE"
index_name = "rag-index"

第 2 步:摄取知识库

在我们的 Agent 能够回答问题之前,它需要数据。我创建了一个简单的 rag-data.ts 文件,其中包含我的职业背景、服务和定价。

要将这些数据嵌入到 Cloudflare Vectorize 中,我们使用 Cloudflare 原生的 Workers AI 文本嵌入模型。这比调用 OpenAI 嵌入 API 便宜得多(也快得多)。

import { Ai } from '@cloudflare/ai';

export default {
  async fetch(request, env) {
    const ai = new Ai(env.AI);
    
    // 1. 在边缘生成向量嵌入
    const { data } = await ai.run('@cf/baai/bge-small-en-v1.5', {
      text: "Elvis Li 是一名专注于 AI 的独立全栈开发者。"
    });

    // 2. 直接插入到 Vectorize
    await env.KNOWLEDGE_BASE.upsert([{
      id: "bio-1",
      values: data[0],
      metadata: { category: "background" }
    }]);

    return new Response("Knowledge Base updated!");
  }
}

第 3 步:构建调用工具的 ReAct 循环

这就是系统成为 Agentic 的原因。标准 RAG 只会盲目搜索向量数据库。我们的系统要求 LLM 决定 它是否需要搜索。

我通过 Cloudflare AI Gateway 使用 Gemini 1.5 Pro。我们为 Gemini 提供可用工具的 JSON Schema。

const tools = [
  {
    name: "query_knowledge_base",
    description: "使用此工具搜索关于 Elvis 的事实的向量数据库。",
    parameters: {
      type: "object",
      properties: {
        query: { type: "string" }
      },
      required: ["query"]
    }
  }
];

当用户询问 “你构建什么样的 AI 系统?” 时,Worker 会拦截请求并触发 Agent 循环:

  1. 请求 (The Request):Worker 将用户的消息和工具列表发送给 Gemini。
  2. 思考 (The Thought):Gemini 意识到它不知道答案,但它知道 query_knowledge_base 工具知道。它返回一个 tool_call 响应。
  3. 行动 (The Action - RAG):Worker 拦截工具调用,获取 Gemini 生成的搜索查询,通过 Workers AI 将其嵌入,并查询 Cloudflare Vectorize。
  4. 解析 (The Resolution):Worker 将向量搜索结果反馈给 Gemini,Gemini 随后综合出一个自然的、类人的响应。

所有这些都发生在物理位置靠近用户的单个边缘节点内,从而实现令人难以置信的快速响应时间。


第 4 步:使用 Cloudflare D1 持久化状态

如果 AI 患有健忘症,那么它是没用的。为了使聊天机器人具有对话能力,我们必须保留消息历史记录。

我们使用 Cloudflare D1,而不是设置外部 PostgreSQL 实例。它是构建在 Durable Objects 上的 SQLite,这意味着它与我们的 Worker 一起在边缘运行。

// 在边缘本地保存对话
await env.DB.prepare(`
  INSERT INTO messages (session_id, role, content) 
  VALUES (?, ?, ?)
`).bind(sessionId, 'user', userQuery).run();

在每个传入请求中,Worker 只需使用 SELECT * FROM messages WHERE session_id = ? 在访问 LLM 之前重建聊天历史记录。由于 D1 是无服务器的分布式数据库,此查询几乎没有增加任何开销。

结果:企业级,零成本

通过利用 Cloudflare Workers、Vectorize 和 D1,您无需使用昂贵的托管向量数据库、冷启动的 Lambda 以及专用的数据库服务器。

结果是一个完全自主的、有状态的 Agentic RAG 系统,其运营成本为 0 美元,响应速度比几乎任何商业替代品都要快。如果您正在构建个人作品集、初创公司登录页面或内部工具,这是 2026 年的终极架构。