슬랙 문의 채널을 3개 AI 에이전트로 완전 자동화한 이유
카테고리: IT 최신동향 | 작성자: Tech Reporter | 발행일: 2026-07-31
요약: 32개월간 846건의 슬랙 운영 문의와 평균 2.6시간의 지연을 해결하기 위해 구축한 Amazon Bedrock 기반 3-에이전트 아키텍처 실무 기록입니다.
평일 오후 3시, 머릿속으로 수십 개의 백엔드 호출 트레이스를 그리며 배포 전 마지막 도메인 로직을 검증하던 순간이었습니다. 모니터 한구석에서 쨍한 슬랙 알림 소리가 울렸습니다. 사내 #운영개발문의 채널에서 저를 찍은 멘션이 날아온 겁니다. "OO님, 폼 웹에서 미수 관리 화면 조회가 안 된다는데 캡처 확인 부탁드립니다."
화면 캡처 속에는 흔디흔한 일반 에러 모달 하나만 덩그러니 떠 있었습니다. 컨트롤러 URL이 '/accounting'인지, 아니면 이번 주 배포에 포함된 2개의 PR 중 어떤 녀석이 터진 건지 파악하기 위해 네트워크 탭 캡처를 요청했습니다. 하지만 운영팀 담당자도 현업에 확인해야 한다며 답변이 오기까지 30분이 걸렸습니다. 그 사이 제가 유지하고 있던 깊은 몰입의 고리는 완전히 산산조각 났습니다.
더 심각한 건 이런 맥락 전환(Context Switching)의 고통이 비단 저만의 문제가 아니었다는 점입니다. 저희 서비스 개발 조직은 폼(IMSform), 렌카(rencar), 차온다 등 16개에 달하는 서비스 레포지토리를 동시에 운용하고 있습니다. 지나간 32개월 치 슬랙 채널 데이터를 전수 조사해 보니, 수집된 운영 문의만 무려 846건에 달했습니다. 월평균 26건의 문의가 쏟아졌고, 첫 답변이 나가기까지 걸린 평균 시간은 2.6시간이었습니다.
단순히 사람이 부족해서 생긴 문제가 아니었습니다. 문의 하나를 풀기 위해 내부 문서 Wiki를 뒤지고, 코드를 추적하고, DB에 직접 접속해 쿼리를 날려보아야 하는 파편화된 조회 프로세스가 원인이었습니다. 이 고리를 끊지 않으면 개발자는 영원히 '운영 문의 처리용 인간 API Gateway' 역할을 벗어날 수 없겠다는 위기감이 들었습니다. 오늘 글을 한 줄로 요약하면 이겁니다. **단일 LLM 호출이라는 환상을 버리고 목적에 맞게 분깃된 3-에이전트(Knowledge·Code·DB) 멀티 에이전트 아키텍처를 도입할 때 비로소 엔지니어링 운영 병목이 해소됩니다.**
---
### 1. 종합병원 전문의 체계로 전환된 3-에이전트 아키텍처
처음에는 하나의 거대한 LLM 프롬프트에 사내 Wiki 문서, 소스 코드 검색 API, DB 조회 권한을 몰아넣으면 다 해결될 줄 알았습니다. 하지만 이는 마치 동네 구멍가게 점원 한 명에게 상품 안내, 재고 관리, 회계 장부 작성, 가전제품 수리까지 모두 맡기는 꼴이었습니다. 결과는 참담했습니다. 질의가 들어왔을 때 모델은 어느 도구를 호출해야 할지 갈팡질팡했고, 수천 줄의 코드와 DB 스키마가 혼재된 컨텍스트 속에서 환각(Hallucination)을 쏟아냈습니다.
우리는 이 문제를 해결하기 위해 시스템을 '종합병원 전문의 진료 체계'로 재설계했습니다. 접수 창구에서 환자의 증상을 듣고 정형외과, 내과, 영상의학과로 보낼지를 결정하듯, 슬랙으로 들어오는 오케스트레이터 에이전트를 두고 그 뒤에 3개의 특화 에이전트를 배치했습니다. 바로 Knowledge 에이전트, Code 에이전트, DB 에이전트입니다.
* **Knowledge 에이전트**: Amazon Bedrock Knowledge Base와 연동되어 사내 노션, Confluence, 배포 노트 등 비정형 운영 문서를 검색합니다. "미수 관리 정책이 어떻게 되나요?" 같은 도메인 정책 질문을 담당합니다.
* **Code 에이전트**: 16개 서비스 레포지토리의 AST(구문 분석 트리)와 메서드 호출 그래프를 파악하여 "미수 관리 조회 API가 어느 라인에서 에러를 뱉을 수 있는지" 코드를 역추적합니다.
* **DB 에이전트**: Read-only 레플리카 DB에 연결되어 샌드박스 환경에서 파라미터화된 SQL을 안전하게 생성하고 실행합니다. "특정 법인 고객의 최근 미수금 상태가 왜 안 보이는지" 실제 데이터 상태를 검증합니다.
* **Amazon Bedrock AgentCore Runtime**: 3개 에이전트의 실행 상태와 대화 세션 맥락을 서버리스 환경에서 격리된 채로 유연하게 유지하고 확장하는 핵심 기반 역할을 수행합니다.
* **Strands Agents SDK**: 각 에이전트 간의 핸드오프(Handoff) 및 루프 제어 흐름을 코드 레벨에서 선언적으로 정의하여 멀티 에이전트 조율을 가속화합니다.
이렇게 아키텍처를 분리하자놀라운 정량적 수치 변화가 관측되었습니다. 수 시간씩 늘어지던 첫 답변 시간이 단 몇 분 수준으로 단축되었고, 3건 이상 답변이 왔다 갔다 하던 소통 핑퐁 비중이 획기적으로 줄어들었습니다. 무엇보다 개발자가 슬랙 알림 때문에 몰입을 깨트리는 횟수가 기존 대비 80% 이상 절감되었습니다.
---
### 2. 단일 프롬프트의 과욕이 불러온 시행착오 잔혹사
하지만 3-에이전트 시스템이 처음부터 매끄럽게 작동했던 것은 아닙니다. 구축 초기, 우리는 오케스트레이터 없이 하나의 거대한 Bedrock Agent에 모든 툴(Tool)을 등록해 두는 단순한 방식을 시도했었습니다. 이것이 첫 번째 잔혹사의 시작이었습니다.
개발 문의 중 "A 렌터카 업체의 오늘 자 대차 승인 실패 원인을 확인해 주세요"라는 질문이 들어왔다고 가정해보겠습니다. 단일 에이전트는 도메인 정책 문서를 읽어오는 툴, 16개 레포지토리에서 승인 로직을 찾는 툴, 생산 DB의 승인 테이블을 조회하는 툴을 동시에 불필요하게 전부 호출했습니다.
이로 인해 몇 가지 치명적인 문제가 발생했습니다. 첫째는 토큰 폭발과 응답 시간 지연입니다. 세 가지 영역의 컨텍스트가 한 번에 프롬프트로 쏟아지면서 TTFT(첫 토큰 생성 시간)가 40초를 넘어섰고, 단 한 번의 슬랙 답변을 생성하는 데 수천 토큰이 낭비되었습니다. 둘째는 DB 쿼리 실행의 치명적 환각이었습니다. 모델이 소스 코드 내부의 변수명을 실제 DB의 컬럼명과 혼동하여, 존속하지 않는 컬럼으로 SELECT 문을 만들다 에러를 뿜어냈습니다.
심지어 어떤 경우에는 DB 에이전트 역할을 하던 프롬프트가 사용자의 입력 문장에 휩쓸려 UPDATE성 문장을 실행하려 드는 보안 위협 노출 가능성까지 포착되었습니다. 아무리 시스템 프롬프트로 "너는 SELECT만 해야 해"라고 제약을 걸어도, 유저의 교묘한 프롬프트 인젝션에 환각이 겹치면 완벽하게 제어할 수 없었습니다.
우리는 이 참혹한 실패를 통해 중요한 진리를 깨달았습니다. LLM에게 모든 연장을 손에 쥐여주고 "알아서 잘 써봐"라고 하는 것은 재앙의 지름길이라는 점입니다. 각 에이전트가 접근할 수 있는 도구와 데이터의 경계를 물리적으로 완벽히 격리해야만 시스템의 안정성과 예측 가능성이 확보됩니다.
---
### 3. 실무에 즉시 적용하는 3-에이전트 오케스트레이션 구축 3단계
그렇다면 현실의 복잡한 운영 문의를 깔끔하게 처리하기 위해 어떤 단계로 에이전트망을 구축해야 할까요? 제가 실제 아키텍처를 개편하며 정리한 3단계 핵심 가이드라인은 다음과 같습니다.
* **1단계: Bedrock Knowledge Base 기반의 비정형 문서 체계화**: 슬랙 채널의 지난 파편화된 답변들과 노션 문서를 덩어리째 벡터 DB에 넣지 마세요. 질문과 답변 쌍(Q&A Pair), 서비스별 기능 정의서 단위로 텍스트를 청킹(Chunking)하고, 메타데이터에 서비스 이름(IMSform, rencar 등)을 반드시 태깅해야 합니다. 그래야 오케스트레이터가 질문의 맥락을 보고 특정 서비스 문서만 정밀하게 필터링할 수 있습니다.
* **2단계: Code 에이전트의 레포지토리 문맥 최소화**: 16개 레포지토리의 전체 소스 코드를 LLM에 밀어 넣는 것은 불가능합니다. 각 서비스 레포지토리의 API 엔드포인트 매핑 테이블과 핵심 도메인 서비스 클래스 명세만 미리 추출해 'Lightweight Index'를 생성하세요. Code 에이전트는 이 인덱스를 먼저 탐색한 뒤, 진짜 필요한 특정 파일의 함수 로직 50~100줄만 핀포인트로 읽어 들여 해석하도록 설계해야 합니다.
* **3단계: DB 에이전트의 트랜잭션 물리 격리 및 Read-only 검증**: DB 에이전트가 접근하는 데이터베이스는 운영 마스터 DB가 아닌, 실시간 읽기 전용 레플리카(Read Replica)여야 합니다. 또한 에이전트가 생성한 SQL 문을 실행하기 전, Python 차원의 AST 파서(SQLGlot 등)를 거쳐 'SELECT' 외의 DDL/DML 문장이 포함되어 있는지 2중으로 검증하는 안전장치(Guardrail)를 반드시 두어야 합니다.
---
### 결론: 사람의 몰입을 지키는 AI 에이전트 오케스트레이션
슬랙 채널의 질문을 AI 에이전트로 넘기는 것은 단순히 답변 속도를 높이는 문제를 넘어섭니다. 그것은 조직 내부 엔지니어들의 가장 소중한 자산인 '연속된 몰입 시간(Maker's Schedule)'을 되찾아주는 아키텍처적 결단입니다.
단일 LLM에 의존하던 방식에서 벗어나 Knowledge, Code, DB라는 명확한 책임을 가진 Multi-Agent 아키텍처로 전환했을 때, 비로소 시스템은 환각 없이 단단하게 동작했습니다. 여러분의 팀도 매일 반복되는 운영 문의 알림 때문에 개발 흐름이 깨지고 있다면, 지금 당장 슬랙 채널 뒤에 서 있는 에이전트들의 역할 분담표부터 다시 그려보시길 강력히 권합니다.
* **참고 원문**: [AWS Korea 기술 블로그](https://aws.amazon.com/ko/blogs/tech/a1mobilsoft-ops-automation-1/)
내일 출근 직후 여러분의 서비스에 멀티 에이전트 오케스트레이션을 검토하고 적용해 볼 수 있도록, 실전 아키텍처 점검 체크리스트와 Bedrock 프롬프트 오케스트레이션 템플릿을 준비했습니다. 복사해서 바로 활용해 보세요.
```text
===============================================================================
[실전 무기 1] 멀티 에이전트 전환 아키텍처 점검 체크리스트
===============================================================================
[ ] 1. 도메인 문서 메타데이터 태깅
- 서비스별(예: IMSform, rencar) 문서가 벡터 DB에 정확한 서비스 식별자 메타데이터와 함께 저장되어 있는가?
[ ] 2. DB 에이전트 물리적 권한 격리
- DB 에이전트용 DB 계정이 Read-Only 전용 계정이며, Read Replica 엔드포인트만 바라보고 있는가?
[ ] 3. SQL 실행 전 Guardrail 파서 작동 여부
- LLM이 생성한 Query에 DROP, DELETE, UPDATE, INSERT 구문이 섞였을 때 애플리케이션 단에서 즉시 Reject되는가?
[ ] 4. Code 에이전트의 레포지토리 맥락 최소화
- 소스 코드 전체가 아닌, API Routing Table 및 핵심 Controller/Service 인덱스만 1차적으로 탐색하도록 설계되었는가?
[ ] 5. 오케스트레이터의 에이전트 핸드오프 로직 유효성
- 질문 맥락에 따라 Knowledge -> Code -> DB 에이전트 간의 핑퐁이 최대 3회 이내로 제한(Max Iteration)되어 있는가?
===============================================================================
[실전 무기 2] Bedrock 오케스트레이터 및 3-에이전트 시스템 프롬프트 템플릿
===============================================================================
[시스템 역할 정의]
당신은 사내 슬랙 #운영개발문의 채널을 전담하는 중앙 오케스트레이터 에이전트입니다.
사용자의 질문을 분석하여 아래 3개의 전문 에이전트 중 가장 적합한 에이전트를 선택하여 호출하고, 결과를 종합하여 최종 답변을 작성하세요.
[하위 에이전트 명세]
1. Knowledge_Agent:
- 역할: 사내 도메인 지식, 업무 프로세스, 배포 노트, FAQ 답변
- 사용 도구: Bedrock Knowledge Base Search Tool
- 호출 조건: "정책", "방법", "원칙", "의미" 등의 비정형 가이드 질문 시
2. Code_Agent:
- 역할: 16개 레포지토리 내 소스 코드 추적, 에러 발생 위치 파악, API 로직 분석
- 사용 도구: GitHub Repository AST Search Tool
- 호출 조건: "코드", "API", "어느 파일", "로직", "에러 모달" 관련 질문 시
3. DB_Agent:
- 역할: 실시간 DB 상태 데이터 조회 및 데이터 불일치 원인 검증
- 사용 도구: ReadOnly SQL Generator & Executor Tool
- 호출 조건: "특정 ID 데이터 조회", "상태값 확인", "DB 데이터 불일치" 관련 질문 시
[오케스트레이션 규칙]
- 단일 질문에 여러 에이전트의 협력이 필요한 경우(예: 코드 로직 확인 후 DB 데이터 검증):
1단계로 Code_Agent를 호출하여 실행 쿼리 조건 파악 -> 2단계로 DB_Agent를 호출하여 데이터 확인 순으로 연쇄 호출(Chaining)을 수행하십시오.
- 모든 답변에는 사용자에게 혼선을 주지 않도록 "어떤 에이전트가 어떤 근거로 분석했는지" 출처를 명시하십시오.
- DB_Agent 호출 시 절대로 DML/DDL 문이 실행되지 않도록 입력 파라미터를 엄격히 검증하십시오.
[출력 포맷 예시]
---
[분석 결과 요약]
- **문의 유형**: [도메인 정책 / 소스코드 분석 / DB 데이터 상태 확인]
- **참조 에이전트**: [Knowledge_Agent / Code_Agent / DB_Agent]
[상세 답변]
1. 원인 분석: ...
2. 관련 소스/데이터 상태: ...
3. 권장 조치 사항: ...
---
```
최신 IT & Mind 리포트 더보기
댓글 0