해커톤에 나가거나 새로운 프로젝트를 기획할 때, 가장 막막한 순간은 언제인가요? 혁신적인 아이디어는 머릿속에 가득한데, 정작 이를 문서화하는 제안서(RFP) 작성 단계에서 멈칫하거나, 포맷팅에 시간을 뺏겨 본질적인 솔루션에 집중하지 못했던 경험, 다들 한 번쯤 있으실 겁니다.
저희 팀 역시 마감 시간에 쫓기며 문서를 작성하던 고통(?)을 겪었고, “이걸 해결해 줄 수 있는 똑똑한 도구를 만들어보자”는 생각으로 RFP-Agent 프로젝트를 시작했습니다.
이번 포스팅에서는 LangGraph와 RAG를 활용해 어떻게 ‘사용자와 상호작용하며 제안서를 써주는 에이전트’를 개발했는지, 그 과정에서의 시행착오와 배운 점을 공유하려 합니다.
💡 The Problem & Solution
“아이디어는 좋은데, 문서가 발목을 잡는다.”
많은 팀이 제안서의 구조를 잡거나 비즈니스적인 톤을 맞추는 데 어려움을 겪습니다. RFP-Agent는 이 문제를 해결하기 위해 대화형 AI 에이전트로 설계되었습니다.
입력만 하면 초안 완성: 문제 정의, 해결책, 목표 등 핵심 키워드만 입력하면 전문적인 RFP 초안을 생성합니다.
RAG 기반의 맞춤형 제안: 단순히 글만 쓰는 게 아니라, RAG(Retrieval-Augmented Generation)를 통해 사용자의 도메인과 유사한 ‘실제 제안서 사례’를 검색하고 참고합니다. 이를 통해 해당 분야의 전문 용어와 톤을 반영한 고품질의 문서를 만들어냅니다.
반복적인 수정(Refinement): 한 번에 끝나는 것이 아니라, 사용자의 피드백을 받아 문서를 계속해서 다듬어 나갑니다.
🧩 Architecture & Tech Stack
저희는 상태(State) 기반의 복잡한 워크플로우를 제어하기 위해 LangGraph를 백엔드로, 사용자와의 인터랙션을 위해 Streamlit을 프론트엔드로 사용했습니다.
(여기에 파이프라인 다이어그램 이미지를 삽입하세요)
LangGraph: 단순한 질의응답이 아니라, ‘초안 생성 -> 사용자 피드백 -> 수정 -> 최종 완료’로 이어지는 다단계 흐름(Stateful Workflow)을 관리합니다.
RAG Integration: 벡터 데이터베이스에 저장된 우수 제안서들을 검색하여 LLM이 “맨땅에 헤딩”하지 않고, 모범 사례를 참고하여 작성하도록 유도합니다.
Streamlit: LangGraph의 상태 변화를 시각적으로 보여주고, 채팅 인터페이스를 통해 사용자와 소통합니다.
⚠️ Challenges: 개발 과정에서의 난관들
LangGraph라는 비교적 새로운 프레임워크를 도입하면서 여러 기술적 난관에 부딪혔습니다.
- Graph Architecture 설계의 어려움
LangGraph는 모듈화에 강점이 있지만, 분기(Branching) 로직이나 조건부 입력 처리가 복잡해질수록 그래프 구조를 짜는 것이 까다로웠습니다. 특히 사용자의 다양한 수정 요청을 처리하는 과정에서 ‘상태 폭발(State Explosion)’ 위험이 있어, 그래프를 최대한 효율적으로 설계하는 데 많은 고민이 필요했습니다.
- Frontend(Streamlit)와 Backend(LangGraph)의 동기화
LangGraph는 엔드투엔드 배포에 최적화되어 있는 반면, Streamlit은 독자적인 UI 로직을 가집니다. 사용자가 입력을 줄 때마다 LangGraph의 상태(State)를 업데이트하고, 그 결과를 다시 UI에 반영하는 세션 관리 로직을 구현하는 것이 꽤 까다로웠습니다.
- RAG와 Context 주입의 밸런스
RAG를 통해 유사 사례를 가져올 때, 너무 많은 정보를 주입하면 오히려 생성을 방해하거나 템플릿에 갇힌 듯한 결과물이 나왔습니다. ‘영감을 주되, 창의성을 해치지 않는’ 최적의 프롬프트와 검색 범위를 찾는 과정이 필요했습니다.
- 부분 수정(Refinement)을 위한 프롬프트 엔지니어링
사용자가 “이 부분 좀 고쳐줘”라고 했을 때, 전체 문서를 다시 쓰는 게 아니라 변경된 부분만 스마트하게 수정하도록 만드는 것이 중요했습니다. 이를 위해 LLM이 전체 문맥을 이해하면서도 수정 범위만 타게팅할 수 있도록 정교한 프롬프트 엔지니어링을 수행했습니다.
📚 What We Learned (회고)
프로젝트를 마무리하며 팀원들과 다음과 같은 인사이트를 얻었습니다.
상태 기반 에이전트의 강력함: LangGraph를 통해 복잡한 의사결정 트리를 가진 에이전트를 제어하는 방법을 익혔습니다.
RAG의 힘: 단순히 LLM만 쓰는 것보다, RAG로 실제 사례(Grounding)를 제공했을 때 결과물의 퀄리티와 개인화 수준이 훨씬 높아짐을 확인했습니다.
UX가 경험을 결정한다: “이대로 괜찮나요?”라고 묻는 것보다, “어떤 부분을 수정하고 싶으신가요?”라고 구체적으로 묻는 작은 UX의 변화가 사용자의 참여도를 크게 높인다는 것을 배웠습니다.
🚀 마치며
RFP-Agent는 저희 팀이 필요해서 시작했지만, 결과적으로는 제안서 작성에 어려움을 겪는 모든 분들(특히 비영어권 사용자나 비기술직군)에게 도움을 줄 수 있는 도구로 발전했습니다. Upstage의 오픈소스 도구들이 지향하는 ‘AI의 민주화’ 처럼, 저희 프로젝트도 누구나 쉽게 자신의 아이디어를 세상에 내놓을 수 있도록 돕는 역할을 하길 바랍니다.
저희의 프로젝트 시연 영상은 아래 링크에서 확인하실 수 있습니다!
📺 Demo Video: [https://www.youtube.com/watch?v=gGHJzMS3DhY]