AI 블로그 완성기(4)- 챗봇의 컨텍스트 윈도우 확장
AI 요약
이 블로그 포스트에서는 Ollama의 컨텍스트 윈도우를 8,192 토큰으로 확장하여 AI 챗봇의 성능을 개선한 내용을 소개합니다. 기존 2,048 토큰 컨텍스트에서 RAG 검색 결과와 대화 기록을 더 풍부하게 사용할 수 있게 되었으며, 이로 인해 응답 품질이 향상되었습니다. 특히, 8K 컨텍스트를 활용하여 시스템 프롬프트에 필요한 정보량을 확장하고, RAG 검색 결과와 대화 기록의 크기를 증가시켜 챗봇의 정확성과 효율성을 높였습니다. 이러한 변화는 블로그 포스트의 질문에 대한 정확한 답변과 관련된 정보를 제공하는 데 도움을 줄 것입니다.
AI 블로그 완성기(4)- 챗봇의 컨텍스트 윈도우 확장
Ollama의 기본 컨텍스트 윈도우(2,048 토큰)를 8,192 토큰으로 확장했습니다. RTX 4070 SUPER의 12GB VRAM 여유분을 활용해서, RAG 검색 결과를 2배 이상 늘리고 응답 품질을 개선한 기록입니다.
문제: 2K는 너무 좁습니다
이 블로그의 AI 챗봇은 Ollama + qwen3:8b로 돌아갑니다. RAG로 블로그 포스트를 검색해서 컨텍스트에 넣고, 방문자 질문에 답하는 구조입니다.
문제는 Ollama의 기본 컨텍스트 윈도우가 2,048 토큰이라는 점입니다. 이 안에 시스템 프롬프트, RAG 결과, 대화 기록, 그리고 모델 출력까지 전부 들어가야 합니다.
실제로 겪은 문제들입니다:
-
시스템 프롬프트만 ~800 토큰 → 남는 공간 1,200 토큰
-
RAG 청크 5개를 넣으면 대화 기록이 잘립니다
-
모델이 답변 중간에 끊기는 현상이 발생합니다 (
num_predict: 800이어도 입력이 길면 합산 초과)
VRAM 분석: 넉넉한 여유
RTX 4070 SUPER는 VRAM이 12GB입니다. qwen3:8b를 기본 양자화(Q4_K_M)로 로드하면 모델 가중치가 약 5GB를 차지합니다.
전체 VRAM: 12,282 MB (12GB)
모델 가중치: ~5,000 MB
KV 캐시(8K): ~1,500 MB
남는 VRAM: ~5,700 MB ← 여유 충분
8K 컨텍스트의 KV 캐시는 약 1.5GB를 추가로 사용합니다. 그래도 5.7GB가 남으니 OOM 걱정은 없습니다.
실측 결과: 8K 쿼리 후 nvidia-smi 기준 6,977MB / 12,282MB 사용. 약 43%의 여유가 있었습니다.
8K 토큰 예산 분배
넓어진 공간을 어떻게 쓸지가 핵심입니다. 무작정 늘리면 비효율적이니까 역할별로 예산을 배분했습니다.
| 영역 | 비율 | 토큰 | 역할 |
|---|---|---|---|
| 시스템 프롬프트 | ~10% | ~800 | 페르소나, 답변 규칙, 할루시네이션 방지 |
| RAG 검색 결과 | ~50% | ~4,000 | 블로그 포스트 청크 3-5개 |
| 대화 기록 | ~15% | ~1,200 | 최근 3-4턴 기억 |
| 답변 생성 | ~25% | ~2,000 | 모델 출력 버퍼 |
가장 큰 변화는 RAG 비중입니다. 2K 환경에서는 청크 하나도 제대로 못 넣었는데, 이제 4,000 토큰 = 청크 3-4개를 여유 있게 밀어넣을 수 있습니다.
구현: 바꾼 것 4가지
1. Ollama 옵션 확장
// route.ts — Ollama API 호출
options: {
temperature: 0.1,
num_ctx: 8192, // 2K → 8K
num_predict: 2000, // 800 → 2000
repeat_penalty: 1.3,
}
num_ctx: 8192가 핵심입니다. 이걸 안 넣으면 Ollama가 기본 2K로 잘라버립니다.
num_predict도 800에서 2000으로 올렸습니다. 긴 컨텍스트를 받았으니 답변도 여유 있게 생성할 수 있어야 합니다.
2. 청크 크기 확대 (500 → 1000 chars)
// rag.ts — chunkPost()
// Before: 200-500 chars per chunk
// After: 600-1000 chars per chunk
2K에서는 청크를 잘게 쪼개야 했습니다. 8K에서는 그럴 필요가 없습니다. 오히려 큰 청크가 문맥 유지에 유리합니다.
한국어 기준으로 1000자는 약 400-500 토큰입니다. 청크 4개면 ~2,000 토큰. RAG 예산 4,000 토큰의 절반이니까 메타데이터와 링크를 포함해도 여유 있습니다.
3. 마크다운 유지
기존에는 블로그 포스트를 stripMarkdown()으로 plain text 변환 후 벡터 DB에 저장했습니다. 이제는 마크다운 원본을 그대로 넣습니다.
qwen3는 마크다운 이해력이 뛰어납니다. # 제목, - 리스트, ```코드``` 형태를 그대로 보면 구조를 파악하고 더 정확하게 답변합니다. 이미지 링크만 제거해서 임베딩 노이즈를 줄였습니다.
4. 시스템 프롬프트 보강
8K 덕분에 시스템 프롬프트에 넣을 수 있는 정보량도 늘었습니다. ~300 토큰이던 자기소개를 ~600 토큰으로 확장했습니다:
-
경력 전환 스토리 상세화 (42서울 200+ 피어 리뷰, DirectX11 등)
-
핵심 역량 5개 분야로 구조화
-
차별화 포인트 4가지 명시
-
프로젝트/에이전트별 핵심 수치 포함
결과
최적화 전후 비교입니다:
| 지표 | Before (2K) | After (8K) |
|---|---|---|
| 컨텍스트 윈도우 | 2,048 토큰 | 8,192 토큰 |
| RAG 청크 크기 | 200-500 chars | 600-1000 chars |
| 최대 응답 길이 | 800 토큰 | 2,000 토큰 |
| VRAM 사용 | ~5.5GB | ~6.8GB |
| VRAM 여유 | ~6.5GB | ~5.3GB |
실제 체감 차이입니다:
-
"Gats Lee의 차별화 포인트가 뭔가요?" 같은 질문에 시스템 프롬프트 기반으로 정확한 답변이 나옵니다
-
RAG 결과가 풍부해져서 관련 포스트 링크가 더 정확해졌습니다
-
긴 설명이 필요한 질문에서 답변이 중간에 끊기지 않습니다
정리
Ollama의 기본값을 그대로 쓰면 모델의 절반도 못 쓰는 셈입니다. num_ctx 하나 바꾸는 건 5초짜리 작업인데, 챗봇 품질에 미치는 영향은 큽니다. VRAM이 허락하는 한 컨텍스트는 넓을수록 좋습니다.
4070 SUPER 기준 qwen3:8b는 8K가 sweet spot입니다. 16K도 가능하겠지만, KV 캐시가 ~3GB로 올라가면 동시 요청 처리에 부담이 생깁니다. 혼자 쓰는 포트폴리오 사이트라면 괜찮지만, 여유분을 남겨두는 게 운영상 안전합니다.
댓글 (0)
아직 댓글이 없습니다.