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 年的終極架構。