검색해서 넣으면 끝? 당신의 RAG가 자신 있게 틀리는 4가지 순간 — LangGraph로 스스로 검색을 고치는 에이전틱 RAG(CRAG), 노드 6개로 끝내기
사내 문서로 RAG 챗봇을 만들어 돌려 보면 꼭 이런 순간이 옵니다. "작년 AKS 업그레이드 때 뭐가 문제였지?"라고 물었는데, 검색기가 엉뚱한 GKE 문서를 끌어오고, 모델은 그 문서를 근거로 자신 있게 틀린 답을 합니다. 검색이 틀렸다는 걸 아무도 확인하지 않았기 때문입니다. 지난 글에서 LangChain으로 30줄짜리 RAG를 만들었는데, 그건 "검색 → 프롬프트 → 생성"이 한 방향으로 흐르는 체인(Chain) 이었습니다. 이 구조는 한 번 틀리면 되돌릴 방법이 없습니다. 오늘은 그 한계를 LangGraph 로 푸는 이야기입니다. 검색 결과를 스스로 평가하고, 엉터리면 질문을 고쳐 다시 검색하고, 답변에 근거가 없으면 다시 쓰는 RAG. 요즘 에이전틱 RAG(Agentic RAG) 라고 부르는 그것을, 논문 이름으로는 CRAG(Corrective RAG)라고 부르는 패턴을 중심으로, 노드 6개짜리 그래프로 직접 만들어 봅니다. 단순 RAG가 틀리는 4가지 순간 체인 RAG의 문제는 성능이 아니라 구조 에 있습니다. 첫째, 검색 결과가 엉터리여도 그대로 답변합니다. 벡터 유사도 상위 4개를 가져왔을 뿐, 그게 질문과 정말 관련 있는지는 아무도 보지 않습니다. 둘째, 질문이 모호해도 다시 묻거나 고쳐 쓰지 않습니다. "그거 설정 어떻게 해?" 같은 질문은 검색 자체가 실패합니다. 셋째, 답변이 검색된 문서에 근거하고 있는지 확인하지 않습니다. 모델이 문서를 무시하고 자기 지식으로 답해도 막을 수 없습니다. 넷째, 그래서 한 번 틀리면 끝입니다. 재시도라는 개념이 없습니다. 지난 글에서 "청킹 튜닝, 하이브리드 검색, 리랭커를 붙이면 품질이 오른다"고 했는데, 그건 모두 검색을 더 잘하게 만드는 방법입니다. 그래도 검색은 실패합니다. 에이전틱 RAG는 접근이 다릅니다. 검색이 실패할 것을 전제하고, 실패를 감지해서 고치는 루프 를 넣습니다. LangChain은...