만들 것: 사내 문서를 학습한 AI 질의응답 봇
이 가이드에서 만들 챗봇의 동작 방식은 이렇습니다. 직원이 Slack에서 '@AI봇 환불 정책이 뭐야?'라고 질문하면, 봇이 사내 문서(Notion, Google Drive, PDF)에서 관련 내용을 검색하고, GPT-4o가 검색 결과를 바탕으로 자연어 답변을 생성하여 Slack에 응답합니다. 답변에는 출처 문서 링크가 포함되어 신뢰성을 확보합니다.
전체 아키텍처는 다음과 같습니다. [Slack Webhook] → [n8n: 질문 수신] → [Embedding 변환] → [Supabase Vector 검색] → [관련 문서 Top 3 추출] → [GPT-4o: 답변 생성] → [Slack: 답변 전송]. 이를 n8n의 시각적 편집기에서 노드를 연결하여 구축합니다. 코딩은 필요 없지만, 각 서비스의 API 키 설정이 필요합니다.
필요한 서비스와 예상 비용입니다. n8n Cloud(월 €20, 또는 셀프 호스팅 시 무료) + Supabase Free Tier(500MB, 무료) + OpenAI API(월 $5-10 예상) + Slack(무료 플랜 OK). 총 월 $25-30 수준이며, 셀프 호스팅하면 $5-10으로 줄일 수 있습니다. 사내 50명이 하루 평균 10건 질문한다고 가정하면, 월 15,000건의 질의를 처리할 수 있는 규모입니다.

Step 1: 사내 문서를 벡터 DB에 인덱싱하기
먼저 Supabase에서 벡터 검색을 위한 테이블을 생성합니다. Supabase 대시보드 > SQL Editor에서 다음 SQL을 실행하세요: CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE documents (id bigserial PRIMARY KEY, content text, metadata jsonb, embedding vector(1536)); CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100); 이 테이블은 문서 내용(content), 출처 정보(metadata), AI 임베딩 벡터(embedding)를 저장합니다.
n8n에서 문서 인덱싱 워크플로우를 만듭니다. 노드 구성: [Manual Trigger] → [Google Drive: Get Files] → [Extract Text] → [Text Splitter] → [OpenAI Embeddings] → [Supabase: Insert]. Text Splitter 노드에서는 Chunk Size를 500 토큰, Overlap을 50 토큰으로 설정합니다. 문서가 길면 작은 청크로 분할해야 검색 정확도가 높아집니다.
OpenAI Embeddings 노드에서는 모델을 'text-embedding-3-small'로 선택합니다. 이 모델은 1536 차원의 벡터를 생성하며, 비용은 100만 토큰당 $0.02로 매우 저렴합니다. 100페이지 분량의 문서를 인덱싱하는 데 약 $0.01도 들지 않습니다. Supabase Insert 노드에서는 content에 텍스트 청크, embedding에 벡터, metadata에 {"source": "파일명", "page": 번호}를 매핑합니다.
Notion 문서를 인덱싱하려면 Google Drive 대신 Notion 노드를 사용합니다. n8n의 Notion 노드에서 데이터베이스를 선택하고, 각 페이지의 내용을 가져옵니다. HTTP Request 노드로 Notion API를 직접 호출하면 더 세밀한 제어가 가능합니다. 인덱싱 워크플로우는 매일 새벽 Schedule Trigger로 자동 실행하여, 새로 추가되거나 수정된 문서가 자동으로 벡터 DB에 반영되도록 설정합니다.

Step 2: Slack 챗봇 워크플로우 구축하기
Slack 봇 설정부터 합니다. api.slack.com/apps에서 'Create New App' > 'From scratch'를 선택합니다. Bot Token Scopes에 chat:write, app_mentions:read를 추가합니다. Event Subscriptions에서 app_mention 이벤트를 활성화하고, Request URL에 n8n의 Webhook URL을 입력합니다. Install to Workspace를 클릭하면 Bot User OAuth Token(xoxb-로 시작)이 발급됩니다.
n8n에서 챗봇 워크플로우를 구성합니다. [Webhook: POST] → [Set: 질문 추출] → [OpenAI Embeddings: 질문 벡터화] → [Supabase: 유사 문서 검색] → [ChatGPT: 답변 생성] → [Slack: 메시지 전송]. Webhook 노드의 HTTP Method를 POST로 설정하고, Path를 '/slack-bot'으로 지정합니다. Slack은 3초 내 응답을 요구하므로, Webhook 노드에서 'Respond Immediately'를 체크하여 먼저 200 OK를 반환하고 처리는 비동기로 진행합니다.
Supabase 검색 노드에서는 RPC 함수를 호출합니다. 먼저 Supabase SQL Editor에서 검색 함수를 생성하세요: CREATE OR REPLACE FUNCTION match_documents(query_embedding vector(1536), match_count int DEFAULT 3) RETURNS TABLE (id bigint, content text, metadata jsonb, similarity float) LANGUAGE plpgsql AS $$ BEGIN RETURN QUERY SELECT d.id, d.content, d.metadata, 1 - (d.embedding <=> query_embedding) AS similarity FROM documents d ORDER BY d.embedding <=> query_embedding LIMIT match_count; END; $$; n8n에서는 Supabase 노드의 Operation을 'Execute RPC'로 설정하고 이 함수를 호출합니다.
ChatGPT 답변 생성 노드의 System Instructions가 핵심입니다: '당신은 [회사명]의 사내 AI 어시스턴트입니다. 제공된 참고 문서만을 근거로 답변하세요. 참고 문서에 없는 내용은 "해당 내용은 사내 문서에서 찾을 수 없습니다. [담당부서]에 문의해주세요."라고 답변하세요. 답변 마지막에 "📄 출처: [문서명]"을 반드시 포함하세요. 추측하거나 외부 지식을 사용하지 마세요.' User Message에는 '질문: {질문내용}\n\n참고 문서:\n{검색된 문서 3개의 content}'를 삽입합니다.

Step 3: 성능 개선과 고도화
검색 정확도를 높이는 핵심 기법은 Hybrid Search입니다. 벡터 유사도 검색만으로는 키워드가 정확히 일치하는 문서를 놓칠 수 있습니다. Supabase에서 Full Text Search를 추가로 활용합니다. ALTER TABLE documents ADD COLUMN fts tsvector GENERATED ALWAYS AS (to_tsvector('korean', content)) STORED; CREATE INDEX ON documents USING gin(fts); 검색 시 벡터 유사도 점수와 키워드 매칭 점수를 0.7:0.3 비율로 결합하면 정확도가 크게 향상됩니다.
대화 컨텍스트 유지도 중요합니다. 사용자가 연속 질문을 할 때 이전 대화를 기억해야 자연스럽습니다. n8n에서 Redis나 Supabase에 대화 이력을 저장하는 노드를 추가합니다. 사용자 ID를 키로, 최근 5개 대화를 값으로 저장하고, ChatGPT 호출 시 이전 대화를 함께 전달합니다. 대화 이력은 24시간 후 자동 삭제하여 메모리를 관리합니다.
피드백 루프를 구축하세요. 봇의 답변 아래에 Slack의 이모지 반응(👍/👎)을 유도하고, 반응 이벤트를 n8n으로 수집합니다. 👎을 받은 답변은 Google Sheets에 자동 기록하여, 주간 단위로 검토하고 지식 베이스를 보완합니다. 이 피드백 데이터가 축적되면 어떤 주제의 문서가 부족한지, 어떤 유형의 질문에 봇이 약한지를 파악할 수 있습니다.
보안 설정도 빠뜨리지 마세요. Slack Webhook에서 전달되는 요청의 X-Slack-Signature 헤더를 검증하여 외부 요청을 차단합니다. n8n의 Function 노드에서 HMAC-SHA256으로 서명을 검증하는 로직을 추가합니다. 또한 Supabase의 Row Level Security를 활성화하고, n8n에서 사용하는 서비스 키의 권한을 SELECT만으로 제한합니다.

운영 비용 분석과 확장 시나리오
50명 규모 기업에서 하루 500건 질의를 처리하는 경우의 월간 비용을 계산합니다. 임베딩(질문 벡터화): 500건 × 30일 × 100토큰 = 150만 토큰, $0.03. GPT-4o mini(답변 생성): 500건 × 30일 × 500토큰 = 750만 토큰, $4.50. Supabase Free Tier: $0. n8n Cloud: €20($22). 총 월 $26.53입니다. 이는 사내 헬프데스크 담당자 1명의 인건비(월 300-400만원)의 1% 미만입니다.
확장 시나리오 1: 웹 채팅으로 확장. n8n에 별도의 Webhook 엔드포인트를 만들고, 사내 포털에 간단한 채팅 위젯을 추가합니다. Slack을 사용하지 않는 직원도 웹 브라우저에서 AI 봇에 질문할 수 있습니다. 프론트엔드는 10줄의 HTML + fetch API로 구현 가능합니다.
확장 시나리오 2: 다국어 지원. 해외 지사 직원을 위해 영어, 일본어 질의도 처리합니다. ChatGPT의 System Instructions에 '사용자의 질문 언어와 동일한 언어로 답변하세요'를 추가하면, 별도 번역 없이 다국어 지원이 가능합니다. 문서는 한국어 원본만 인덱싱해도 GPT가 번역하여 답변합니다.
확장 시나리오 3: 자동 학습. 새 Notion 페이지가 생성되거나 Google Drive에 파일이 업로드되면, n8n이 자동으로 감지하여 벡터 DB에 인덱싱합니다. Notion의 'Page Updated' 트리거와 Google Drive의 'New File' 트리거를 활용합니다. 이렇게 하면 지식 베이스가 항상 최신 상태를 유지하며, 수동 관리가 필요 없어집니다.

이 글이 도움이 되셨다면 공유해 주세요.



