RODY WELFARE AGENT · RAG 02로디 복지 상담 에이전트 · RAG 2공공 문서를 원문 기반 chunk와 검토 가능한 graph 관계로 축적하고 read-only MCP로 제공한 과정부터 읽기01 · FROM ANSWER TO CONSULTATION
근거만으로는 상담이 되지 않습니다
RAG가 관련 법령을 찾았다고 해서 사용자의 일이 끝나는 것은 아닙니다. 기초연금 조건을 확인한 사람은 준비할 서류를 알아야 하고, 긴급복지 지원을 찾은 사람은 가까운 기관과 연락 방법을 확인해야 합니다.
그래서 두 번째 단계에서는 답변을 길게 만드는 대신, 대화와 근거 문서, 기관 지도, 실행 체크리스트를 같은 상담 workspace에 연결했습니다. 사용자가 지금 해야 할 판단에 맞춰 화면이 한 번씩 바뀌도록 설계했습니다.
ARCHITECTURE · ONE CONSULTATION TURN
텍스트 답변, 화면 전환, 음성 재생은 같은 turn에서 시작하지만 서로 다른 책임으로 처리합니다.원본 구조도입력과 전송
- Next.js BFF사용자 요청을 SSE stream으로 상담 runtime에 전달합니다.
상담 runtime
- Main Agent근거를 찾고 상담 답변을 만듭니다.
- Screen · Speech Agent화면 command와 발화문을 별도로 만듭니다.
도구와 결과
- RAG · External MCP법령, 기관, 지도와 현재 정보를 제공합니다.
- workspace · audiotext, UI state, tool result, audio event를 나눠 전달합니다.
02 · RUNTIME
세 Agent, 하나의 상담
Next.js 상담 화면은 BFF의 /api/chat을 호출하고, BFF는 Django ASGI의 SSE stream을 UI message와 data part로 변환합니다. LangGraph runtime 안에서는 Main Agent가 상담 답변과 tool 사용을 맡고, Screen Control Agent와 Speech Text Agent가 그 결과를 각자의 출력으로 바꿉니다.
Main Agent
질문의 목적을 판단하고 RAG MCP 또는 Naver·TMAP·Firecrawl 같은 외부 MCP tool을 사용합니다. 화면 component나 음성 문장을 직접 만들지는 않습니다.
Screen Control Agent
최종 답변과 현재 frontend state snapshot을 보고 다음에 보여줄 surface 하나를 선택합니다. 출력은 JSX가 아니라 schema로 검증되는 workspace command입니다.
Speech Text Agent
화면에서는 유용하지만 소리로 들으면 어색한 문서명, 괄호, 목록 표현을 발화 가능한 문장으로 정리합니다. 정리된 문장은 ElevenLabs TTS node에서 audio chunk로 stream됩니다.
03 · WORKSPACE STATE
화면은 생성하지 않습니다
생성 모델이 임의의 React component를 만들게 두면 화면 구조와 가능한 행동을 제품 코드가 통제하기 어렵습니다. Backend는 Pydantic schema로 command를 검증하고, BFF와 frontend는 같은 계약을 Zod로 다시 확인한 뒤 등록된 surface를 렌더링합니다.
- 근거를 확인할 때는 문서명과 관련 원문을 보여주는 Evidence surface
- 방문할 곳을 찾을 때는 기관 지도·목록·상세 surface
- 신청을 준비할 때는 필수·선택 항목을 나눈 Action Checklist
- 추가 조건이 필요할 때만 여는 Profile Intake
한 번에 surface 하나만 바꾸는 규칙도 뒀습니다. 답변이 생성되는 동안 지도, 문서, 체크리스트가 연달아 바뀌는 것보다 다음 행동 하나가 분명한 편이 상담에 적합하다고 판단했습니다.
04 · VOICE & RODY
로디가 상태를 말하는 법
고령층 사용자를 위한 인터페이스에서 음성은 별도 데모가 아니라 같은 상담의 입력과 출력입니다. 브라우저 dictation으로 받은 질문은 text 요청과 같은 agent flow로 들어가고, 답변은 Speech Text Agent를 거쳐 TTS audio로 돌아옵니다.
로디(Rody)는 Road와 Buddy를 합친 이름입니다. 복잡한 복지 정보를 앞에서 끌고 가기보다 옆에서 길을 알려주는 동반자라는 뜻을 캐릭터에 담았습니다.
대기, 인사, 입력 감지, 듣는 중, 생각 중, 답변 중, 오류 상태를 sprite animation으로 나눴습니다. 별도의 ‘도구 실행 중’ 화면을 계속 띄우는 대신, 현재 상담 상태를 로디의 움직임으로 짧게 전달합니다.
05 · BOUNDARIES
프로토타입의 경계
이 시스템은 법률·복지 전문가를 대체하지 않습니다. 지원 기준과 금액은 바뀔 수 있고, 개인 상황에 따라 담당 기관의 추가 판단이 필요합니다. 그래서 답변만 남기기보다 사용자가 다시 확인할 문서와 기관을 함께 보여주는 방향을 택했습니다.
현재 대화 memory 일부는 process-local state를 사용하며, 장기 상담 기록과 개인정보 보관·삭제 정책까지 갖춘 운영 서비스 단계는 아닙니다. 이 글에서 보여주는 범위는 근거 검색, agent orchestration, 화면 상태와 음성을 하나의 상담 흐름으로 연결한 prototype입니다.
이 프로젝트는 다섯 명의 팀 작업입니다. 나는 팀장으로 전체 흐름과 파트 간 통합 방향을 확인했고, 상세 구현은 RAG, frontend, backend와 기획 담당의 기여를 구분해 기록합니다.