우리가 만든 도구를 직접 사용하다 (Drinking our own champagne) n8n에서는 사내 AI 어시스턴트를 재구축할 때, 우리의 워크플로 솔루션만으로 이를 완성할 수 있을지 도전해 보기로 했습니다. 명령줄에서 작업하던 기존 방식에서 벗어나, 워크플로를 통해 직접 구축해 보는 것은 개발자로서 꽤 흥미로운 일이었습니다. 몇 달간의 작업 끝에 성공적으로 만들어냈고, 그 과정에서 배운 값진 교훈들을 공유하고자 합니다. 혹시 AI 툴을 구축하시려는 분들이라면 저희 경험이 도움이 되길 바랍니다. 하드코딩, 그리고 반복의 어려움 사실 우리는 이미 사내용으로 하드코딩된 AI 어시스턴트를 운영 중이었습니다. 하지만 이건 반복(Iterate) 과정이 너무 까다로웠고, 프로젝트 매니저(PM) 동료들이 AI 로직을 조금이라도 수정하거나 개선하려면 매우 높은 진입 장벽을 마주해야 했습니다. 프롬프트를 살짝 수정하거나 효율성을 높이고 싶어도, 결국 코드를 깊이 파고들어야 했죠. 엔지니어링 퀄리티 자체는 나쁘지 않았지만, AI 어시스턴트를 가장 필요로 하는 사람들에게는 너무나도 접근성이 떨어졌습니다. 우리는 기존 어시스턴트에 사용했던 기술 스택을 좋아했기 때문에, LangChain으로 오케스트레이션을 유지하고 GPT-4를 메인으로 활용하는 방향은 고수하기로 했습니다. 하지만 동시에 “과연 n8n만으로 이처럼 복잡한 AI 사용 사례를 전부 구현할 수 있을까?”를 테스트해보고 싶었고, 결국 워크플로만으로 대규모 AI 어시스턴트를 구축하는 데 도전하게 되었습니다. AI 어시스턴트 n8n의 AI 어시스턴트는 크게 다음 세 가지 용도로 운영됩니다: 사용자 에러 디버깅 자연어 기반 채팅 질문 응답 사용자 자격 증명(Credentials) 설정 지원 백엔드에는 두 개의 대규모 벡터 소스가 내부 지식 베이스(KB)를 구성하고 있습니다. 하나는 n8n의 문서(Documentation)이고, 다른 하나는 n8n 포럼(Forum)입니다. 어시스턴트가 우선 문서를 먼저 살펴보도록 하여 ‘환각(Hallucination)’을 줄이고, 그 후 포럼으로부터 추가 정보를 얻도록 했습니다. 데이터는 ‘청크(Chunk)’ 단위로 쪼개서 저장하며, 각 청크에는 자신이 어떤 문서의 어느 부분인지, 그리고 주변 맥락이 무엇인지에 대한 정보가 담깁니다. 당연히 n8n 워크플로를 통해 주 3회씩 문서를 스크레이핑하여 DB를 업데이트하고, 동시에 포럼에서 ‘질문-답변’ 쌍을 찾아 KB에 함께 저장하도록 자동화했습니다. 말 그대로 우리가 만든 도구(n8n)를 적극적으로 활용한 셈이죠. 또한 AI Service와 워크플로가 호스팅되는 내부 인스턴스 모두에 개발 환경과 프로덕션 환경을 따로 두어, 바로 프로덕션 버전을 건드리지 않고도 자유롭게 실험할 수 있게 했습니다. 어시스턴트 주요 구성 요소 개요 n8n 프론트엔드 사용자가 어시스턴트 채팅 사이드바에서 메시지를 보내면, 내부적으로 호스팅하는 AI Service로 먼저 전송됩니다. AI Service 들어오는 요청에 대한 인증을 처리하고, 검증된 요청만 n8n 웹훅으로 전달합니다. 여기서도 인증 과정을 거쳐, 오직 AI Service에서 오는 요청만 워크플로가 받아들일 수 있도록 합니다. 어시스턴트 워크플로 내부 인스턴스에 호스팅되어 있습니다. 하나의 메인(게이트웨이) 워크플로가 웹훅 요청을 받아, 사용자 모드에 따라 적절한 에이전트로 라우팅합니다. 이렇게 내부적으로는 4개의 독립된 에이전트가 서로 다른 AI 사용 사례를 처리합니다. 각 사용 사례별로 요구되는 입력 맥락과 기능이 다르기 때문에 에이전트를 나눈 것이죠. 사용자가 어시스턴트를 켜면, n8n의 Switch 노드로 요청을 받아 4개 중 하나의 에이전트로 분기합니다. 다만 한 가지 단점은, 에이전트가 일단 대화를 시작하면, 그 세션 안에서는 다른 에이전트로 전환할 수 없다는 점입니다. 즉, 사용자가 다른 에이전트의 도움을 받으려면 새로운 세션을 시작해야 합니다.