Capstone 08 — 프로덕션 RAG 챗봇(규제 산업)
Harvey, Glean, Mendable, LlamaCloud는 2026년에 모두 비슷한 프로덕션 형태로 운영됩니다. 문서는 docling 또는 Unstructured로 수집하고, 시각 정보가 많은 문서는 ColPali로 처리합니다. 검색은 하이브리드 검색(hybrid search)을 사용합니다. 재정렬(re-rank)은 bge-reranker-v2-gemma로 수행합니다. 생성 단계에서는 Claude Sonnet 4.7을 사용하고, 프롬프트 캐싱(prompt caching) 적중률을 60-80%까지 끌어올립니다. 안전 계층은 Llama Guard 4와 NeMo Guardrails로 세웁니다. Langfuse와 Phoenix로 관측하고, 200개 질문으로 구성된 골든 세트(golden set)에 대해 RAGAS로 평가합니다. 법률, 임상, 보험처럼 규제가 있는 도메인(domain)에 하나를 직접 만들고, 골든 세트, 레드팀(red team), 드리프트(drift) 대시보드를 통과시키는 것이 이 캡스톤의 목표입니다.
유형: Capstone
언어: Python(파이프라인 + API), TypeScript(채팅 UI)
선수 지식: Phase 5(NLP), Phase 7(transformers), Phase 11(LLM engineering), Phase 12(multimodal), Phase 17(infrastructure), Phase 18(safety)
실습 Phase: P5 · P7 · P11 · P12 · P17 · P18
예상 시간: 30시간
문제
규제 도메인 검색 증강 생성(Retrieval-Augmented Generation; RAG), 예를 들어 법률 계약서, 임상시험 프로토콜, 보험 약관을 대상으로 하는 RAG는 2026년에 가장 많이 실제 배포되는 프로덕션 형태입니다. 투자 대비 효과(ROI)가 분명하고, 실패했을 때의 위험도 구체적이기 때문입니다. Harvey(Allen & Overy)는 이를 법률 업무에 적용했습니다. Mendable은 개발자 문서 형태로 제공합니다. Glean은 기업 검색(enterprise search)을 다룹니다. 패턴은 다음과 같습니다. 문서를 높은 충실도로 수집하고, 하이브리드 검색과 재정렬로 필요한 근거를 찾고, 인용 강제(citation enforcement)와 프롬프트 캐싱을 적용해 답변을 생성하고, 여러 안전 계층으로 보호하고, 드리프트를 계속 모니터링합니다.
어려운 부분은 모델 자체가 아닙니다. 진짜 어려운 부분은 관할권(jurisdiction)을 인식하는 컴플라이언스(compliance), 예를 들어 HIPAA, GDPR, SOC2를 지키는 일입니다. 또한 인용 단위의 감사 가능성(auditability), 비용 제어, RAGAS의 충실성(faithfulness)을 통한 환각(hallucination) 감지, 원본 문서는 업데이트되었지만 색인(index)이 따라가지 못했을 때의 드리프트 감지도 어렵습니다. 프롬프트 캐싱은 적중률이 높을 때 60-90% 수준의 비용 절감을 만들 수 있습니다. 이 캡스톤에서는 레드팀 스위트(red-team suite)와 함께 200개 질문 골든 세트를 통과하는 전체 시스템을 배포해야 합니다.
개념
이 파이프라인은 두 면으로 나뉩니다. 수집(Ingestion)에서는 docling 또는 Unstructured가 구조화 문서를 파싱(parse)합니다. ColPali는 시각 정보가 풍부한 문서를 처리합니다. 청크(chunk)에는 요약, 태그, 역할 기반 접근 라벨(role-based access label)이 붙습니다. 벡터는 5천만 개 미만이면 pgvector + pgvectorscale에 저장하고, 그 이상이면 Qdrant Cloud를 사용합니다. 희소 검색(sparse search)인 BM25도 함께 운영합니다. 대화(Conversation)에서는 LangGraph가 메모리와 멀티턴(multi-turn) 흐름을 맡습니다. 각 질의(query)는 하이브리드 검색을 수행하고, bge-reranker-v2-gemma-2b로 재정렬하고, Claude Sonnet 4.7로 답변을 생성하되 프롬프트 캐싱을 사용합니다. 이후 출력은 Llama Guard 4와 NeMo Guardrails를 통과하고, 인용에 고정된(citation-anchored) 응답으로 반환됩니다.
평가 스택(eval stack)은 네 계층으로 구성됩니다. 골든 세트(Golden set)는 인용이 붙은 200개 라벨링 Q/A를 사용해 정답성을 확인합니다. 레드팀(Red team)은 탈옥(jailbreak), 개인식별정보(PII) 추출 시도, 도메인 밖 질문을 통해 안전성을 검증합니다. RAGAS는 매 턴마다 충실성, 답변 관련성(answer relevance), 문맥 정밀도(context precision)를 자동으로 점수화합니다. 드리프트 대시보드(Drift dashboard)는 Arize Phoenix로 검색 품질과 환각 점수를 매주 관찰합니다.
프롬프트 캐싱은 비용을 움직이는 핵심 레버입니다. Claude 4.5+와 GPT-5+는 시스템 프롬프트와 검색된 문맥의 캐싱을 지원합니다. 적중률이 60-80%에 도달하면 질의당 비용은 3-5배 낮아질 수 있습니다. 높은 캐시 적중률을 얻으려면 시스템 프롬프트와 재정렬된 문맥이 먼저 오는 안정적인 접두부(stable prefix)를 기준으로 파이프라인을 설계해야 합니다.
아키텍처
documents (contracts, protocols, policies)
|
v
docling / Unstructured parse + ColPali for visuals
|
v
chunks + summaries + role-labels + jurisdiction tags
|
v
pgvector + pgvectorscale + BM25 (Tantivy)
|
query + role + jurisdiction
|
v
LangGraph conversational agent
+--- retrieve (hybrid)
+--- filter by role + jurisdiction
+--- rerank (bge-reranker-v2-gemma-2b or Voyage rerank-2)
+--- synthesize (Claude Sonnet 4.7, prompt cached)
+--- guard (Llama Guard 4 + NeMo Guardrails + Presidio output PII scrub)
+--- cite + return
|
v
eval:
RAGAS faithfulness / answer_relevance / context_precision (online)
Langfuse annotation queue (sampled)
Arize Phoenix drift (weekly)
red team suite (pre-release)
스택
- 수집(Ingestion): 구조화 문서는 Unstructured.io 또는 docling으로 처리하고, 시각 정보가 풍부한 PDF는 ColPali로 처리합니다.
- 벡터 DB(Vector DB): 5천만 개 미만 벡터는 pgvector + pgvectorscale을 사용하고, 그 외에는 Qdrant Cloud를 사용합니다.
- 희소 검색(Sparse): 필드 가중치(field weight)를 적용한 Tantivy BM25를 사용합니다.
- 오케스트레이션(Orchestration): 수집에는 LlamaIndex Workflows, 대화에는 LangGraph를 사용합니다.
- 재정렬기(Re-ranker): 자체 호스팅 bge-reranker-v2-gemma-2b 또는 호스팅 Voyage rerank-2를 사용합니다.
- LLM: 프롬프트 캐싱을 적용한 Claude Sonnet 4.7을 사용하고, 자체 호스팅 Llama 3.3 70B를 폴백(fallback)으로 둡니다.
- 평가(Eval): 온라인 RAGAS 0.2, 환각 및 탈옥 스위트에는 DeepEval을 사용합니다.
- 관측성(Observability): 어노테이션 큐(annotation queue)가 있는 self-hosted Langfuse, 드리프트에는 Arize Phoenix를 사용합니다.
- 가드레일(Guardrails): 입력/출력 분류기는 Llama Guard 4, 정책은 NeMo Guardrails v0.12, PII 제거는 Presidio를 사용합니다.
- 컴플라이언스(Compliance): 청크에는 역할 기반 접근 라벨을 붙이고, GDPR/HIPAA 범위를 나타내는 관할권 태그(jurisdiction tag)를 붙입니다.
직접 만들기
-
수집. 실전 빌드라면 1,000-10,000개 문서로 구성된 말뭉치(corpus)를 Unstructured 또는 docling으로 파싱합니다. 스캔 문서나 시각 정보가 많은 페이지는 ColPali로 보냅니다. 요약, 역할 라벨, 관할권 태그가 포함된 청크를 만듭니다.
-
색인. Dense embedding(Voyage-3 또는 Nomic-embed-v2)을 pgvector + pgvectorscale에 넣습니다. Tantivy로 BM25 사이드 색인(side-index)을 만듭니다. 역할과 관할권 필터는 payload로 둡니다.
-
하이브리드 검색. 먼저 역할과 관할권으로 필터링합니다. 그다음 dense 검색과 BM25를 병렬로 실행하고, 상호 순위 융합(reciprocal rank fusion)으로 합칩니다. 상위 20개를 재정렬기로 보내고, 상위 5개를 생성 단계로 보냅니다.
-
프롬프트 캐싱으로 생성. 시스템 프롬프트와 정적 정책은 캐시 헤더(cache header)에 넣습니다. 재정렬된 문맥은 캐시 확장(cache extension)으로 둡니다. 사용자 질문은 캐시되지 않는 접미부(uncached suffix)로 둡니다. 정상 상태(steady state)에서 60-80% 캐시 적중률을 목표로 합니다.
-
가드레일. 입력에는 Llama Guard 4를 적용합니다. NeMo Guardrails의 rail은 도메인 밖 질문이나 정책상 금지된 주제를 차단합니다. Presidio는 출력에서 의도치 않은 PII를 제거합니다. 마지막에는 인용 강제 후처리(post-filter)를 적용합니다.
-
골든 세트. 도메인 전문가가 답변과 인용(answer, citations)을 라벨링한 200개 Q/A 쌍을 만듭니다. 에이전트는 정확한 인용 일치(exact-citation match), 답변 정확성, RAGAS 충실성으로 평가합니다.
-
레드팀. 탈옥(PAIR, TAP), PII 유출 시도, 도메인 밖 질문, 관할권 간 유출(cross-jurisdiction leak)을 포함한 50개 적대적 프롬프트(adversarial prompt)를 만듭니다. 통과/실패와 심각도(severity)로 점수화합니다.
-
드리프트 대시보드. Arize Phoenix가 검색 품질(nDCG, citation faithfulness)을 매주 추적합니다. 5% 하락이 감지되면 알림을 보냅니다.
-
비용 리포트. Langfuse에서 프롬프트 캐싱 적중률, 질의당 토큰 수, 단계별 질의 비용($/query)을 보여줍니다.
사용해보기
$ chat --role=analyst --jurisdiction=GDPR
> what is the data-retention obligation for EU user profiles under our contract?
[retrieve] hybrid top-20 filtered to GDPR + analyst-role
[rerank] top-5 kept
[synth] claude-sonnet-4.7, cache hit 74%, 0.8s
answer:
The contract (Section 12.4, Master Services Agreement dated 2024-03-11)
obligates EU user profile deletion within 30 days of termination per GDPR
Article 17. The DPA amendment (DPA-v2.1, Section 5) extends this to 14 days
for "restricted" category data.
citations: [MSA-2024-03-11 s12.4, DPA-v2.1 s5]
위 예시는 역할이 analyst이고 관할권이 GDPR인 사용자가 계약상 EU 사용자 프로필 보존 의무를 묻는 흐름입니다. 시스템은 먼저 GDPR과 analyst 역할에 맞는 문서만 검색 대상으로 남기고, 하이브리드 검색 결과를 상위 20개까지 가져온 뒤, 상위 5개를 생성에 사용합니다. 답변에는 MSA와 DPA의 구체적인 문서 앵커(anchor)가 인용으로 남아야 합니다.
산출물 만들기
outputs/skill-production-rag.md는 제출해야 할 산출물을 설명합니다. 목표는 컴플라이언스 라벨이 붙은 규제 도메인 챗봇을 배포하고, 아래 루브릭(rubric)을 통과시키며, 실시간 드리프트 모니터링으로 관측하는 것입니다.
| 가중치 | 기준 | 측정 방법 |
|---|
| 25 | RAGAS 충실성 + 답변 관련성 | 골든 세트(200 Q/A)에 대한 온라인 점수 |
| 20 | 인용 정확성 | 검증 가능한 출처 앵커가 포함된 답변 비율 |
| 20 | 가드레일 커버리지 | Llama Guard 4 통과율 + 탈옥 스위트 결과 |
| 20 | 비용 / 지연 시간 엔지니어링 | 프롬프트 캐싱 적중률, p95 지연 시간, 질의당 비용 |
| 15 | 드리프트 모니터링 대시보드 | 주간 검색 품질 추세가 보이는 Phoenix 실시간 대시보드 |
| 100 | | |
연습문제
-
다른 관할권의 두 번째 말뭉치 조각을 만드세요. 예를 들어 GDPR 옆에 HIPAA를 추가합니다. 20개 질문으로 구성된 관할권 간 탐침(probe)에서 역할+관할권 필터링이 교차 유출을 막는다는 점을 보여주세요.
-
일주일간 프로덕션 트래픽에서 프롬프트 캐싱 적중률을 측정하세요. 어떤 질의가 캐시 접두부를 깨는지 식별하고, 구조를 다시 잡으세요.
-
10k 토큰 요약 버퍼(summary buffer)를 사용하는 멀티턴 메모리를 추가하세요. 대화가 길어질수록 충실성이 떨어지는지 측정하세요.
-
Claude Sonnet 4.7을 자체 호스팅 Llama 3.3 70B로 교체하세요. 질의당 비용과 충실성 변화량(delta)을 측정하세요.
-
"확신 없음(unsure)" 모드를 추가하세요. 상위 재정렬 점수가 임계값보다 낮으면 에이전트가 답변하지 않고 "I do not have confident citations"라고 말하게 합니다. 거짓 확신(false confidence)이 얼마나 줄어드는지 측정하세요.
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| 프롬프트 캐싱(Prompt caching) | "시스템 + 문맥을 캐시하는 것" | Claude/OpenAI 기능으로, 캐시된 접두부 토큰이 적중하면 60-90% 할인됩니다. |
| RAGAS | "RAG 평가기" | 충실성, 답변 관련성, 문맥 정밀도를 자동으로 점수화하는 평가 프레임워크입니다. |
| 골든 세트(Golden set) | "라벨링된 평가 데이터" | 인용이 붙은 200개 이상의 전문가 라벨링 Q/A이며, 시스템의 기준 정답입니다. |
| 관할권 태그(Jurisdiction tag) | "컴플라이언스 라벨" | 청크에 붙는 GDPR/HIPAA/SOC2 범위이며, 검색 필터에서 강제됩니다. |
| 인용 충실성(Citation faithfulness) | "근거 있는 답변 비율" | 각 주장이 검색 가능한 원문 span으로 뒷받침되는 비율입니다. |
| 드리프트(Drift) | "검색 품질 저하" | nDCG 또는 인용 점수의 주간 변화이며, 여기서는 5%를 알림 임계값으로 둡니다. |
| 레드팀(Red team) | "적대적 평가" | 출시 전에 수행하는 탈옥, PII 추출, 도메인 밖 질문 탐침입니다. |
더 읽을거리