Cloudflare를 사용하여 처음부터 $0 비용으로 Agentic RAG AI 어시스턴트를 구축하는 방법
관리형 벡터 데이터베이스에 매월 20달러를 지불하고 콜드 스타트되는 서버리스 기능에서 AI 챗봇을 호스팅하고 있다면, 당신은 잘못하고 있는 것입니다.
나의 포트폴리오에 AI 비서를 추가하기로 결정했을 때 두 가지 엄격한 요구 사항이 있었습니다. 지연 시간이 제로여야 하고, 실행 비용이 정확히 0달러여야 합니다.
전체 AI 아키텍처를 엣지로 이동시켜 이 두 가지를 모두 달성했습니다. 이 튜토리얼에서는 Cloudflare 개발자 플랫폼을 사용하여 처음부터 상태 저장 Agentic RAG(검색 증강 생성) 시스템을 구축하는 방법을 정확하게 보여 드리겠습니다.
$0 스택 아키텍처
엔터프라이즈급 성능을 유지하면서 비용을 0으로 유지하기 위해 우리는 전적으로 Cloudflare의 무료 계층에 의존합니다.
- Cloudflare Workers: 엣지 컴퓨팅 런타임. (하루 최대 100,000개 요청 무료).
- Cloudflare Vectorize: 의미론적 검색을 위한 벡터 데이터베이스. (월 최대 3,000만 쿼리 차원 무료).
- Cloudflare D1: 채팅 기록을 위한 서버리스 SQLite 데이터베이스. (하루 최대 500만 행 읽기 무료).
- Cloudflare AI Gateway: LLM 요청 캐싱 및 속도 제한 방지용.
단순히 문서를 프롬프트에 채우는 수동적인 RAG 시스템 대신, 우리는 Agentic(에이전트형) 시스템을 구축하고 있습니다. 이는 AI가 "ReAct"(추론 및 행동) 루프에서 실행되며, 사용자 입력에 따라 동적으로 호출할 수 있는 맞춤형 도구를 갖추고 있음을 의미합니다.
1단계: 엣지 워커 초기화
먼저 Cloudflare Worker를 시작해야 합니다. 이것은 우리 작업의 두뇌 역할을 할 것입니다.
npm create cloudflare@latest agentic-assistant
cd agentic-assistant
wrangler.toml 파일을 엽니다. 마법이 일어나는 곳입니다. D1 데이터베이스와 Vectorize 인덱스를 워커 환경에 직접 바인딩하여 거의 대기 시간 없이 실행되도록 해야 합니다.
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단계: 지식 베이스 수집
에이전트가 질문에 답하기 전에 데이터가 필요합니다. 나의 전문적 배경, 서비스 및 가격이 포함된 간단한 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 스키마를 제공합니다.
const tools = [
{
name: "query_knowledge_base",
description: "이것을 사용하여 Elvis에 대한 사실을 벡터 데이터베이스에서 검색합니다.",
parameters: {
type: "object",
properties: {
query: { type: "string" }
},
required: ["query"]
}
}
];
사용자가 "어떤 종류의 AI 시스템을 구축하시나요?" 라고 질문하면 워커가 요청을 가로채어 에이전트 루프를 트리거합니다.
- 요청 (The Request): 워커는 사용자의 메시지와 도구 목록을 Gemini에게 보냅니다.
- 생각 (The Thought): Gemini는 대답을 모르지만
query_knowledge_base도구가 알고 있다는 것을 깨닫습니다. 그리고tool_call응답을 반환합니다. - 행동 (The Action - RAG): 워커는 도구 호출을 가로채고 Gemini가 생성한 검색 쿼리를 가져와 Workers AI를 통해 임베딩한 다음 Cloudflare Vectorize를 쿼리합니다.
- 해결 (The Resolution): 워커는 벡터 검색 결과를 Gemini에 피드백하고, Gemini는 자연스럽고 인간과 같은 응답을 합성합니다.
이 모든 작업은 사용자와 물리적으로 가까운 위치에 있는 단일 엣지 노드 내에서 이루어지므로 응답 시간이 믿을 수 없을 정도로 빠릅니다.
4단계: Cloudflare D1으로 상태 유지
기억 상실증에 걸린 AI는 쓸모가 없습니다. 챗봇을 대화형으로 만들려면 메시지 기록을 유지해야 합니다.
외부 PostgreSQL 인스턴스를 설정하는 대신 Cloudflare D1을 사용합니다. Durable Objects 위에 구축된 SQLite이므로 워커와 함께 엣지에서 실행됩니다.
// 대화를 엣지에 로컬로 저장
await env.DB.prepare(`
INSERT INTO messages (session_id, role, content)
VALUES (?, ?, ?)
`).bind(sessionId, 'user', userQuery).run();
모든 수신 요청에서 워커는 LLM에 접속하기 전에 단순히 SELECT * FROM messages WHERE session_id = ?를 실행하여 채팅 기록을 재구성합니다. D1은 서버리스이고 분산되어 있으므로 이 쿼리는 오버헤드를 거의 추가하지 않습니다.
결과: 엔터프라이즈급, 제로 비용
Cloudflare Workers, Vectorize 및 D1을 활용하면 값비싼 관리형 벡터 데이터베이스, 콜드 스타트되는 Lambda, 전용 데이터베이스 서버가 필요하지 않습니다.
그 결과 운영 비용이 0달러이고 거의 모든 상용 대안보다 빠르게 응답하는 완전히 자율적인 상태 저장 Agentic RAG 시스템이 탄생했습니다. 개인 포트폴리오, 스타트업 랜딩 페이지 또는 내부 도구를 구축하는 경우 이것이 2026년의 가장 확실한 아키텍처입니다.

