AWS 기반의 실제 RAG 파이프라인: Terraform을 활용한 모델 불가지론적(Model-Agnostic) 내부 문서 Q&A
요약
AWS Bedrock Knowledge Base와 Terraform을 사용하여 모델 교체가 용이한 RAG 파이프라인 구축 방법을 소개합니다. S3, OpenSearch Serverless를 활용하며, 변수 설정을 통해 임베딩 및 생성 모델을 코드 수정 없이 쉽게 변경할 수 있는 구조를 제안합니다.
핵심 포인트
- Terraform을 활용한 IaC 기반의 RAG 인프라 자동화
- tfvars 변경만으로 임베딩 및 생성 모델 교체 가능
- Bedrock Knowledge Base를 통한 청킹 및 인제스션 자동화
- S3와 OpenSearch Serverless를 결합한 프로덕션급 아키텍처
모든 기업은 동일한 문제를 겪고 있습니다. 고객 지원 요원과 직원들이 내부 문서에 파묻힌 답변을 찾지 못한다는 점입니다. 여기 Bedrock Knowledge Base를 사용하여 구축된, 단 한 줄의 tfvars 변경만으로 임베딩(Embedding) 및 생성(Generation) 모델을 교체할 수 있도록 설계된 간단하고 프로덕션 환경에 즉시 적용 가능한 RAG 파이프라인이 있습니다.
거의 모든 기업이 이와 같은 벽에 부딪힙니다. 제품 문서, FAQ, 정책 PDF 파일들이 공유 드라이브에 쌓여가고, 지원 요원들은 적절한 답변을 충분히 빠르게 찾지 못하며, 직원들은 매주 같은 질문을 들고 같은 Slack 채널에 메시지를 보냅니다. 이것이 업계에서 가장 흔한 RAG 유스케이스인 **내부 지식 Q&A (internal knowledge Q&A)**입니다.
이 포스트는 바로 그 파이프라인을 구축합니다. S3에 문서를 저장하고, 검색(Retrieval)을 위한 Bedrock Knowledge Base를 사용하며, 인용(Citation)과 함께 문서에 근거하여 질문에 답변하는 어시스턴트를 만듭니다. 전체 과정은 Terraform으로 구성되며, 모든 모델 참조는 변수(Variable)로 처리됩니다. 즉, 임베딩 모델을 업그레이드하거나 생성 모델을 교체하는 것은 코드 재작성이 아닌 tfvars 변경만으로 가능합니다. 🎯
🏗️ 아키텍처 (The Architecture)
문서 (PDF/HTML/TXT) → S3 버킷 (S3 bucket)
↓
Bedrock Knowledge Base (청킹 (chunking) + 임베딩 (embedding))
...
Bedrock Knowledge Bases는 청킹(chunking), 임베딩 생성(embedding generation), 검색(retrieval)을 내부적으로 처리합니다. 별도의 인제스션(Ingestion) 코드를 작성할 필요가 없습니다. S3를 지정하기만 하면 나머지는 알아서 처리됩니다.
🔧 Terraform: 전체 파이프라인
변수 - 설계 단계부터 모델 불가지론적 (Model-Agnostic by Design)
# variables.tf
variable "embedding_model" {
...
이것이 핵심 비결입니다. 모든 다운스트림 리소스는 var.embedding_model.id 및 var.generation_model_id를 참조합니다. tfvars에서 버전을 올리고 terraform apply를 실행하면 끝납니다.
소스 문서를 위한 S3 버킷 (S3 Bucket for Source Documents)
# storage.tf
resource "aws_s3_bucket" "docs" {
...
OpenSearch Serverless (벡터 스토어 (Vector Store))
# opensearch.tf
resource "aws_opensearchserverless_security_policy" "encryption" {
...
IAM 역할 (IAM Role)
# iam.tf
resource "aws_iam_role" "knowledge_base" {
...
Knowledge Base (모델 불가지론적 핵심 (Model-Agnostic Core))
# knowledge_base.tf
resource "aws_bedrockagent_knowledge_base" "support" {
...
embedding_model_arn은 전적으로 var.embedding_model.id를 통해 구축된다는 점에 유의하세요. Titan Embed v2에서 Cohere Embed로, 또는 향후 출시될 Titan v3로 전환하는 것은 변수 하나만 변경하는 것을 의미합니다. 리소스 구조를 재구성할 필요가 없습니다.
📐 환경 설정 (Environment Configuration)
# environments/dev.tfvars
environment = "dev"
embedding_model = {
...
나중에 업그레이드하려면: embedding_model.id를 "cohere.embed-english-v3" 또는 더 최신 버전의 Titan으로 변경한 후, terraform apply를 실행하세요. Bedrock은 다음 데이터 소스 동기화 시점에 다시 임베딩 (re-embeds)을 수행합니다. generation_model_id에 대해서도 동일한 패턴이 적용됩니다. 코드 변경 없이 Haiku를 Sonnet으로, 또는 Sonnet을 향후 출시될 모델로 교체할 수 있습니다.
🐍 파이프라인 쿼리 (Query the Pipeline)
import boto3
client = boto3.client("bedrock-agent-runtime")
...
🧪 소규모 평가: 업그레이드가 실제로 도움이 되었는가?
모델 업그레이드를 운영 환경 (prod)에 적용하기 전에, 빠른 회귀 테스트 (regression check)를 수행하세요. 이는 의도적으로 가볍게 설계되었습니다. 정답이 알려진 대표적인 질문 세트를 고정하여, 검색 적중률 (retrieval hit rate)과 답변 관련성 (answer relevance)을 기준으로 점수를 매깁니다.
# evaluate.py
import boto3
...
모델을 교체할 때마다 이 작업을 실행하세요. 만약 retrieval_hit_rate가 떨어진다면, 임베딩 모델 (embedding model) 변경이 검색 품질을 저하시킨 것이므로 운영 환경에 적용하기 전에 조사해야 합니다. 만약 avg_keyword_coverage가 향상되었다면, 새로운 생성 모델 (generation model)이 더 완전한 답변을 생성하고 있다는 뜻입니다. 실제 지원 티켓에서 가져온 10~20개의 실제 질문만으로도 회귀 현상을 포착하기에 충분합니다. 이러한 무결성 검사 (sanity check)를 위해 거대한 평가 프레임워크가 필요하지는 않습니다.
⚠️ 주의 사항 및 팁 (Gotchas and Tips)
모델 변경 후에는 반드시 재동기화하세요. embedding_model을 변경하면 이전 벡터들이 이전 모델의 차원 (dimensions)을 사용했기 때문에, 데이터 소스를 다시 인제스션 (re-ingesting, start-ingestion-job)해야 합니다.
dimensions를 모델과 일치시키세요. Titan v2는 1024 차원을 출력합니다. Cohere Embed v3는 설정에 따라 1024 또는 384 차원을 출력합니다. 차원이 일치하지 않으면 인제스션 (ingestion) 실패가 발생하므로, 전환하기 전에 모델 문서를 확인하세요.
OpenSearch Serverless 프로비저닝에는 5~10분이 소요됩니다. 첫 번째 terraform apply 시 이 시간을 고려하여 예산을 잡으세요.
평가 데이터셋(Eval set)을 작고 실제적인 것으로 유지하세요. 합성 데이터(Synthetic data)가 아닌, 고객 지원 티켓이나 Slack에서 실제 질문을 추출하세요. 잘 만들어진 10개의 질문이 지어낸 100개의 질문보다 훨씬 낫습니다.
문서에 기반하여 실제 고객 지원 질문에 답변하며, 다음 모델 업그레이드가 실제로 성능을 개선하는지 확인할 수 있는 내장된 방법을 갖춘 모델 불가지론적 (Model-agnostic) RAG 파이프라인입니다. 이 모든 것이 Terraform으로 구현됩니다. 🔍
이 내용이 도움이 되었나요? 다음에 이어질 GCP 및 Azure 버전도 팔로우하여 확인하세요! 💬
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기