에이전트 🇷🇺 04.08.2026 05:01

개발자가 LLM 챗봇이 스크립트를 안정적이고 저렴하게 따르도록 하는 FSM 기반 프레임워크 구축

한 개발자가 다중 호출 에이전트 아키텍처에 의존하는 대신, 유한 상태 머신과 언어 모델을 결합하여 LLM 기반 챗봇이 미리 정의된 대화 스크립트를 엄격히 따르도록 강제하는 커스텀 오픈 소스 라이브러리를 구축한 과정을 설명합니다. tg-statemachine-bot이라는 이 프로젝트는 대화를 YAML 파일에 정의된 단계로 나누고, 모델에 현재 단계와 관련된 지침만 제공하여 컨텍스트를 작게 유지하고 동작을 예측 가능하게 만듭니다.
비즈니스 챗봇을 개발하던 저자는, 대형 언어 모델(LLM, Large Language Model)이 넓은 컨텍스트 윈도우(context window)로 인해 길고 상세한 스크립트를 안정적으로 따르지 못하고, 긴 지시문에서 구조를 잃어버리는 문제를 발견했다. 또한 작업을 단계별로 나누는 기존의 에이전트 기반 해결책은 모델 호출 횟수를 늘려 대화당 비용을 증가시킨다는 점도 확인했다. 이를 저비용으로 해결하기 위해 저자는 유한 상태 기계(FSM, Finite State Machine)가 전체 대화 그래프를 관장하고, 특정 순간에 LLM에 전달되는 단계별 지시문을 제어하는 오픈소스 라이브러리를 만들었다. 이 방식에서는 모델이 전체 스크립트가 아니라 현재 단계와 관련된 지시문만을 보게 된다. 이 아키텍처는 세 개의 모듈로 구성된다. 대화 그래프와 사용자 상태를 추적하는 FSM 모듈, 변경 이력과 함께 대화 변수를 저장하는 vars_memory 모듈, 그리고 LLM 호출을 조율하는 conversation_core 모듈이다. 매 턴마다 모델은 사용자에게 보낼 메시지, 전이 신호, 구조화된 단계 결과, 단계 요약이라는 고정된 네 가지 필드로 응답해야 한다. 만약 모델이 이 규약을 위반하면(유효하지 않은 JSON, 존재하지 않는 전이 신호, 결과 누락 등) 시스템은 자동으로 수정 요청을 다시 보낸다. 단계 전환 간의 대화 연속성은 OpenAI의 Responses API에 있는 previous_response_id 체이닝 기능을 이용해 유지되며, 이는 더 저렴한 캐시 읽기 가격 정책을 통해 비용도 절감해준다. 전체 대화 스크립트는 YAML 파일로 기술되며, 상세한 단계별 지시문은 별도의 파일에 보관된다. 이 덕분에 하부 엔진을 수정하지 않고도 서로 다른 챗봇 도메인에 재사용할 수 있다. YAML을 직접 편집하는 데서 오는 복잡성을 관리하기 위해, 저자는 YAML을 draw.io 다이어그램으로 변환해 사람이 더 쉽게 검토할 수 있게 해주는 스크립트를 만들었다. 아울러 테스트 대화를 채팅 형태로 살펴볼 수 있는 로그 뷰어 도구도 만들었는데, 이 도구는 확장 가능한 시스템 로그를 제공하며 로컬에서 디버깅할 때 실시간 업데이트도 지원한다. 시연을 위해 저장소에는 1인 개발자가 프로젝트 요구사항의 범위를 정하는 것을 돕는 예시 '분석가 봇(analyst bot)'이 포함되어 있다. 저자에 따르면 이 봇은 사용자 메시지당 약 1.03회의 LLM 호출만으로도 스크립트를 안정적으로 따르면서 구조화된 정보를 수집할 수 있었다고 한다. 다만 이 데모 봇의 프롬프트 엔지니어링(prompt engineering)은 다듬지 않은 상태로 남겨두었다.
출처: Habr — хаб NLP — 원문
관련 게시물 ↓
새로운 뉴스