📚 시리즈 — RAG 품질
- ① 평가 — MLflow Evaluation 기반 검색·생성 품질 정량 측정
- ② 개선 — 임베딩·하이브리드·Rerank·Self-RAG 단계별 누적 개선 실험
- ③ 아키텍처 — LangGraph 기반 Agentic RAG 검색 처리 흐름 — 현재 글
1. 개요
본 에이전트는 LangGraph 기반 ReAct 구조로 동작합니다. 핵심은 두 노드의 반복(루프)입니다.
- Agent 노드 — LLM(Gemini 3 Flash)이 검색 쿼리를 생성하거나 최종 답변을 작성합니다.
- 검색 노드 — 하이브리드 검색(시맨틱 + 키워드)을 수행하고 Self-RAG 평가로 적합성을 판정합니다.
ReAct(Reasoning + Acting) 구조란 — LLM이 추론(Reasoning)으로 "다음에 무엇을 할지"를 판단하고 행동(Acting)으로 도구를 호출한 뒤, 그 결과(관찰)를 바탕으로 다시 추론하는 과정을 목표 달성까지 반복하는 에이전트 패턴입니다. 한 번의 질의응답으로 끝나는 단순 RAG와 달리, 검색이 부족하면 스스로 다시 검색하는 자율적 반복이 특징입니다. 본 에이전트에서는 Agent 노드의 추론(검색 필요 여부·검색 쿼리 판단)과 검색 노드의 행동·관찰(하이브리드 검색 실행 + Self-RAG 적합성 판정)이 번갈아 도는 루프가 ReAct 사이클에 해당합니다.
검색 결과가 충분하지 않으면 직전 문서를 제외하고 재검색하며, 충분하면 그 문서를 근거로 답변을 생성합니다. 검색 결과는 두 갈래로 전달됩니다 — 하나는 답변 생성을 위해 LLM 입력으로, 다른 하나는 화면 표시를 위해 검색 문서 목록·인용 출처로 사용됩니다.
기술 스택
- 오케스트레이션 — LangGraph (ReAct ·
StateGraph/ToolNode) - 서빙·관측 — MLflow (
ResponsesAgent서빙, Tracing, Prompt Registry) - 검색 — Databricks Vector Search (HNSW ANN + Full-Text/BM25), Kiwi 형태소 분석, Qwen3 임베딩
- LLM — Gemini 3 Flash (응답) / GPT-5-4-nano (Self-RAG Judge)
- 저장소 — Delta 원본 테이블 + Spark (원문 조회)
2. 전체 흐름도
사용자 질문부터 하이브리드 검색 · Self-RAG 적합성 평가 · 재검색 루프를 거쳐 출처 기반 답변까지의 전체 처리 흐름입니다.

3. 단계별 상세
3.1 질의 입력과 Agent
- 사용자가 질문을 입력하면 검색 범위 필터(문서 분류 기준)를 함께 지정할 수 있습니다. 검색 대상을 특정 문서군으로 한정하며, 미지정 시 전체를 검색합니다.
- ① Agent (LLM · Gemini 3 Flash) 가 질문을 보고 검색이 필요하다고 판단하면 자연어 검색 쿼리를 생성합니다. 재검색 단계에서는 평가 결과의 힌트를 반영해 쿼리를 다시 작성합니다. 이 자연어 쿼리는 두 검색 채널(시맨틱·키워드)의 공통 입력이 됩니다.
3.2 하이브리드 검색
검색 도구는 두 검색을 병렬로 실행합니다. 두 검색이 쿼리를 다루는 방식이 다른 점에 유의합니다.
- Vector Search (시맨틱) — ①이 생성한 원본 자연어 질의를 그대로 임베딩하여 의미 기반 ANN(HNSW) 검색을 수행합니다(형태소 재작성을 거치지 않음).
- Full-Text Search (키워드) — 질의를 Kiwi 토크나이저로 형태소 분석·동의어 확장한 뒤 BM25 키워드 검색을 수행합니다. 이 전처리는 키워드 검색에만 적용됩니다.
①의 "검색 쿼리 생성"은 LLM이 무엇을 검색할지 자연어 질의를 만드는 단계이고, Kiwi 처리는 그 질의를 키워드 검색용 토큰으로 변환하는 전처리입니다. 둘은 역할이 다릅니다.
이어서 다음 순서로 처리합니다.
- 하이브리드 융합 — 두 검색의 점수를 Min-Max 정규화한 뒤 가중 합산하여 상위 문서를 정렬합니다.
- 원문 조회 — 검색으로 식별한 청크의 전체 본문과 메타데이터를 원본 테이블에서 조회해 결합합니다(Claim-Check 패턴).
3.3 Self-RAG 적합성 평가와 재검색
- ③ Self-RAG 적합성 평가(Judge LLM) 가 후보 문서 전체를 한 번의 호출로 묶어 각 문서의 적합성(적합 / 부적합)과 검색 충분성(충분 / 불충분)을 동시에 판정합니다(문서별 개별 호출이 아닙니다).
- 적합 판정된 문서만 최종 컨텍스트로 전달되므로, LLM에 전달되는 문서 수는 0~5건으로 가변입니다(
num_results상한). - 적합 문서가 0건이면 빈 컨텍스트를 막기 위해 융합 점수 상위 문서를
num_results건까지 보충(NOT_RELEVANT_SUPPLEMENTED)하고, 동시에 추가 검색이 필요함을 표시합니다. - 불충분(또는 적합 0건)으로 판정되면, 직전에 검색된 문서를 제외하고 평가 힌트(
REASON)를 반영해 재검색합니다. - 재검색은 최대 2회로 제한됩니다. 한도에 도달하면 더 이상 검색하지 않고 확보된 문서로 답변을 작성합니다.
3.4 응답 생성과 출력
- 검색 결과가 충분하면 ④ Agent (LLM · Gemini 3 Flash) 가 해당 문서를 근거로 최종 답변을 생성합니다. ①과 ④는 동일한 응답 LLM(같은 Agent 노드)이며, 별도 LLM은 Self-RAG 평가(③ · GPT-5-4-nano)뿐입니다.
LLM 호출 횟수 — 기본 경로(검색 1회로 충분)에서 응답 LLM(Gemini 3 Flash)은 2번 호출됩니다(① 쿼리 생성 → ④ 최종 답변). 재검색이 발생하면 3번(① → 재검색 쿼리 → ④)이 됩니다. Self-RAG Judge(GPT-5-4-nano)는 검색 라운드 수만큼(1~2회) 호출됩니다. - 응답은 두 가지로 구성됩니다. - 답변 본문 — 실제로 인용한 출처를 본문에 함께 표기합니다. - 검색된 문서 목록 · 참고 출처 — 검색 단계에서 확보한 문서 목록을 별도로 제공합니다.
4. 주요 파라미터
| 구분 | 설정값 | 비고 |
|---|---|---|
| 응답 LLM | databricks-gemini-3-flash |
장애 시 databricks-claude-sonnet-4-6 로 폴백 |
| 임베딩 | databricks-qwen3-embedding-0-6b |
시맨틱 검색용 |
| 검색 결과 수 | 검색기별 Top-K = 10 → 최종 5건 | top_k=10, num_results=5 |
| 융합 방식 | Min-Max 정규화 + 시맨틱 가중치 0.5 | fusion_method=min_max, semantic_weight=0.5 |
| Self-RAG 평가 | 사용 (databricks-gpt-5-4-nano) |
적합성·충분성 판정 |
| Judge 컨텍스트 상한 | 문서당 최대 40,000자 | judge_doc_max_chars=40000 |
| 재검색 한도 | 최대 2회 | max_iterations=2 |
5. 관련 문서
- rag-agent-improvement-cases.md — 케이스별 실험·성능 측정 결과 (임베딩·검색·필터·LLM 비교)
- rag-agent-evaluation-guide.md — 평가 방법론·Scorer 정의
- kiwi-tokenizer-dict-guide.md — Kiwi 형태소 분석·동의어 사전 구축
📚 시리즈 — RAG 품질
- ① 평가 — MLflow Evaluation 기반 검색·생성 품질 정량 측정
- ② 개선 — 임베딩·하이브리드·Rerank·Self-RAG 단계별 누적 개선 실험
- ③ 아키텍처 — LangGraph 기반 Agentic RAG 검색 처리 흐름 — 현재 글
'Databricks > RAG' 카테고리의 다른 글
| RAG 품질 ② 개선 — 임베딩·하이브리드·Rerank·Self-RAG 단계별 누적 개선 실험 (0) | 2026.07.04 |
|---|---|
| RAG 품질 ① 평가 — MLflow Evaluation 기반 검색·생성 품질 정량 측정 (0) | 2026.07.04 |
| 한국어 RAG 검색 (Kiwi) ④ 부록 — 동의어 적용 위치·IATA 사전 생성/검증·품사·Nori 비교 (0) | 2026.06.28 |
| 한국어 RAG 검색 (Kiwi) ③ 검색 품질 개선·사전 관리·Vector Search 통합 (0) | 2026.06.28 |
| 한국어 RAG 검색 (Kiwi) ② 사용자·동의어 사전과 복합명사 처리 (0) | 2026.06.28 |
댓글