🚀 챗봇을 넘어: 더 스마트한 디버깅을 위한 멀티 에이전트 AI 시스템 구축
🤖 만약 AI가 단순히 오류를 설명하는 것을 넘어설 수 있다면 어떨까요? 문제를 조사하고, 자체 가정을 검증하며, 근본 원인을 추천하기 전에 증거를 확인해 볼 수 있다면요?
이것이 바로 제가 개발한 AI-Incident-Root-Cause-Analyzer 프로젝트의 아이디어입니다.
🔗 프로젝트 살펴보기: GitHub의 AI-Incident-Root-Cause-Analyzer
대부분의 AI 디버깅 데모는 깨끗한 오류 메시지에서 시작하여 자신감 있는 답변으로 끝납니다.
실제 사고(incident)들은 그 정도로 간단하지 않습니다. 😅
모든 것이 통과하는 배포 파이프라인을 상상해 보세요. 마지막 단계까지 모든 것이 정상입니다. 로그에는 HTTP 403 오류가 표시됩니다. JSON 파서가 예상치 못한 문자에 대해 불평합니다. 여러 가지 가능한 원인이 그럴듯하게 보입니다.
인증 문제일까요? 게이트웨이 문제일까요? 아티팩트(artifact) 문제일까요? 환경별 설정 문제일까요?
진짜 문제는 설명을 찾는 것이 아닙니다. 증거가 실제로 어떤 설명을 뒷받침하는지 알아내는 것입니다.
세 단계의 멀티 에이전트 아키텍처가 이 문제를 어떻게 접근할 수 있는지 살펴보겠습니다.
🧠 아키텍처: 세 개의 에이전트, 세 가지 책임
모든 것을 한 번에 진단하도록 하나의 LLM(대규모 언어 모델)에게 요청하는 대신, 조사를 세 단계로 분리합니다.
📋 원본 로그 + 사고 컨텍스트
|
▼
...
각 단계는 명확한 책임이 하나 있습니다:
- 🔍 Parser(파서): 우리가 무엇을 알고 있는가?
- 🧠 Generator(제너레이터): 무엇이 원인일 수 있는가?
- 🛡️ Validator(검증기): 증거가 무엇을 뒷받침하는가?
이제 이 접근 방식을 실제로 적용해 보겠습니다.
🚨 사고 발생: 마지막 단계까지는 모두 정상…
인증, 리소스 생성, 설정 연결, 백엔드 준비 확인 등 모든 것이 성공적으로 완료되는 배포 자동화 워크플로우를 상상해 보세요.
그런 다음, 마지막 단계에서 설치 프로그램 다운로드 URL을 가져오는 데 실패합니다.
다음은 간소화되고 익명화된 오류입니다:
Fetching installer information...
Request failed: HTTP 403 Forbidden
...
언뜻 보기에는 JSON 파싱 문제처럼 보입니다.
하지만 눈에 띄는 곳에 단서가 숨어 있습니다. 👀
응답이 <로 시작하는 것은 클라이언트가 JSON을 기대했지만 HTML을 받았음을 자주 나타냅니다.
해당 HTML은 접근 거부 페이지, 게이트웨이 응답, 프록시 오류 또는 다른 상위(upstream) 응답일 수 있습니다.
💡 핵심 시사점: 파싱 예외는 근본적인 원인이라기보다는 실패의 증상일 수 있습니다.
이제 체계적으로 조사해 봅시다.
🔍 에이전트 1: 로그 파서(Log Parser) — 노이즈를 사실로 전환하기
첫 번째 에이전트는 진단하지 않습니다. 추출합니다.
그 역할은 가정 없이 비정형화된 로그를 구조화된 인시던트 요약으로 변환하는 것입니다.
예시의 경우:
| 신호(Signal) | 관찰 내용(Observation) |
|---|
| HTTP 상태 코드 | 403 Forbidden |
| ... | |
빠진 것을 주목하세요: 성급한 결론입니다.
파서는 "인증에 문제가 있다"고 말하지 않습니다. 로그가 실제로 보여주는 것을 기록할 뿐입니다.
이것이 왜 중요할까요?
초기 단계에서 문제점을 인증 실패로 규정하는 순간, 후속 분석은 그 설명 쪽으로 편향될 수 있기 때문입니다.
추출과 진단을 분리하면 조사가 관찰 가능한 사실에 기반을 두고 유지되도록 할 수 있습니다.
결과: 오류 신호, 맥락, 범위를 포함하는 정규화된 인시던트 요약본.
🧠 에이전트 2: 가설 생성기(Hypothesis Generator) — 가능성으로 생각하기
이제 두 번째 에이전트는 이러한 구조화된 사실들을 받아 경쟁적인 설명들을 생성합니다.
가장 그럴듯한 첫 번째 답변에 매몰되기보다는, 여러 가지 가설을 탐색합니다.
🔐 가설 #1: 인증 또는 권한 실패(Authentication or authorization failure)
토큰이 만료되었거나, 자격 증명이 유효하지 않거나, 요청에 필요한 권한이 부족할 수 있습니다.
요청이 403을 반환했기 때문에 이는 그럴듯합니다.
하지만 상태 코드만으로는 어떤 구성 요소가 요청을 거부했는지 또는 그 이유가 무엇인지는 알 수 없습니다.
리버스 프록시, 게이트웨이, CDN 또는 보안 계층이 요청을 가로채어 자체적인 HTML 오류 페이지를 반환했을 수 있습니다.
이것은 403 오류와 예상치 못한 응답 형식 모두를 설명할 수 있습니다.
이는 유력한 가설이지만, 확증 증거가 확보될 때까지는 여전히 가설에 불과합니다.
📦 가설 #3: 아티팩트(Artifact) 사용 가능성 또는 구성 문제
아티팩트가 사용 불가능하거나, 잘못 구성되었거나, 선택된 다운로드 경로를 통해 접근할 수 없을 수 있습니다.
다운로드 URL을 검색하는 과정에서 실패하더라도, 아티팩트 메타데이터와 환경별 구성은 여전히 확인해 볼 가치가 있습니다.
🎯 에이전트는 이를 어떻게 순위화해야 할까요?
목표는 가장 익숙한 설명을 고르는 것이 아닙니다. 사용 가능한 증거에 가장 잘 맞는 가설을 식별하고, 대안들을 구별할 수 있는 추가적인 확인 사항이 무엇인지 파악하는 것입니다.
유용한 증거에는 다음이 포함될 수 있습니다:
- 응답 헤더 및 HTML 오류 본문.
- 게이트웨이 또는 프록시 로그.
- 인증(Authentication) 및 권한 부여(Authorization) 추적 기록.
- 다른 환경에서의 성공적인 요청과의 비교.
출력: 순위가 매겨진 가설, 지지하는 증거와 모순되는 증거, 그리고 필요한 다음 확인 사항들.
🛡️ 에이전트 3: 증거 검증기(Evidence Validator) — 신뢰할 수 있는 증거에 의존하고, 자신감만 믿지 않기
여기서 조사가 흥미로워집니다.
그럴듯한 설명이 반드시 정확한 설명인 것은 아닙니다. 세 번째 에이전트는 주요 가설이 독립적인 관찰 결과와 일치하는지 확인합니다.
✅ 확인 1: 자동화 외부에서 실패 재현하기
동일한 요청을 독립적인 경로를 통해, 동일한 환경과 동등한 권한 부여 컨텍스트를 사용하여 반복합니다.
만약 실패가 재현된다면, 이는 문제가 자동화 코드 경로에 국한되지 않음을 시사합니다.
이것 자체로 근본 원인을 확립하지는 못하지만, 조사를 좁히는 데 도움을 줍니다.
🌍 확인 2: 환경 비교하기
다른 환경에서 동일한 아티팩트, 버전 및 플랫폼을 검색해 봅니다.
만약 다른 곳에서는 성공했지만 한 환경에서 실패한다면, 다음 사항들의 차이점을 조사합니다:
- 환경별 권한(Environment-specific permissions).
- 게이트웨이 또는 보안 정책(Gateway or security policies).
- 라우팅 및 프록시 구성(Routing and proxy configuration).
- 자격 증명 및 접근 제어 설정(Credentials and access-control settings).
이는 근본 원인을 성급하게 가정하지 않고 범위를 좁히는 데 도움이 됩니다.
🕵️♀️ 점검 3: 최근 변경 사항과의 상관관계 분석
실패가 시작된 시점 주변의 관련 구성 변경, 자격 증명 업데이트, 라우팅 수정 및 게이트웨이 로그를 검토합니다.
애플리케이션 코드 변경이 없다는 것은 유용한 맥락이지만, 애플리케이션이나 그 의존성이 관여하지 않았음을 증명하는 것은 아닙니다.
목표는 관찰된 동작을 특정 증거와 연결하는 것입니다.
📊 다음 단계는 무엇인가요?
독립적인 재현(independent reproduction), 환경 비교, 게이트웨이 로그가 모두 동일한 설명을 뒷받침한다면, 해당 가설에 대한 신뢰도가 높아집니다.
결정적인 증거가 누락된 경우, 보고서에는 그 사실을 명시해야 합니다.
증거가 없으면? 근본 원인이 확정되었다고 가장하지 않습니다.
이것은 중요한 설계 원칙입니다. AI 시스템은 확실성을 만들어내기보다 불확실성을 전달할 수 있어야 합니다.
출력: 증거, 해결되지 않은 질문, 신뢰도 평가 및 권장 다음 단계를 포함하는 검증 보고서(validation report).
⚡ 한눈에 보는 전체 워크플로우
다음은 완전한 조사 라이프사이클입니다:
📥 INCIDENT
Raw logs + context
|
...
장점은 추적 가능성(traceability)입니다.
RCA가 잘못되었을 때, 엔지니어는 조사를 검사하고 문제가 불완전한 추출, 약한 가설, 또는 불충분한 검증 중 어디에서 발생했는지 판단할 수 있습니다.
단순히 답변만 받는 것이 아니라, 조사가 어떻게 진행되었는지를 보여주는 구조화된 흔적(structured trail)을 얻게 됩니다.
🤔 왜 LLM 호출을 하나만 사용하지 않을까요?
좋은 질문입니다.
단일 LLM 호출은 로그 요약이나 간단한 오류 진단에는 완벽하게 충분할 수 있습니다.
하지만 복잡한 인시던트의 경우, 책임을 분리하는 것이 프로세스를 검사하고, 테스트하고, 개선하기 더 쉽게 만듭니다.
단일 패스 AI (Single-pass AI) | 다단계 근본 원인 분석 (Multi-stage RCA)
| --- | ---
| 즉각적인 진단을 생성함 | 사실과 가설을 분리함 |
...|
🔥 진정한 혁신은 에이전트 수를 늘리는 것이 아닙니다. 관찰(observation), 추론(reasoning), 검증(verification) 사이에 명확한 경계를 도입하는 것입니다.
주의할 점이 하나 있습니다. 여러 개의 에이전트가 있다고 해서 시스템이 자동으로 더 정확해지는 것은 아닙니다. 이들은 동일한 오류 가정(mistaken assumptions)을 공유할 수 있으며, LLM이 생성한 신뢰도 점수(confidence score)가 반드시 보정된 확률(calibrated probability)인 것은 아닙니다.
진정한 가치는 결론을 독립적인 증거에 근거하고 불확실성을 가시화하는 데서 나옵니다.
📈 다음 단계는 어디인가?
이 아키텍처는 HTTP 403 오류에만 국한되지 않습니다.
동일한 접근 방식은 다음에도 적용될 수 있습니다:
- 🚀 CI/CD 파이프라인 실패.
- ☸️ Kubernetes 시작 및 준비 상태 문제(readiness issues).
- 🔐 API 인증 및 권한 부여 문제(authorization problems).
- ⚙️ 환경 간 구성 표류(Configuration drift).
- 🔗 종속성 실패 및 간헐적 서비스 오류.
- 🧪 자동화 테스트 실패 및 회귀(regressions).
또한 역사적인 사고에서 학습하고, 반복되는 실패 패턴을 식별하며, 목표 지향적인 진단 검사를 추천할 기회도 있습니다.
원칙은 동일합니다. 검증을 대체하기 위해서가 아니라, 과거 패턴을 활용하여 가설(leads)을 생성하는 것입니다.
🏁 최종 생각
AI 기반 디버깅 시스템을 구축하는 것은 단순히 LLM에게 스택 트레이스(stack trace)를 설명해달라고 요청하는 것 이상의 의미입니다.
이는 다음의 과정을 거치는 반복 가능한 조사 프로세스를 만드는 것입니다:
🔍 결론으로 성급하게 뛰어들지 않고 사실만을 추출함.
🧠 여러 가능한 설명을 탐색함.
🛡️ 증거를 바탕으로 가설을 검증함.
📊 신뢰도, 불확실성, 다음 단계를 전달함.
저에게 있어 다중 에이전트 RCA 파이프라인에서 가장 가치 있는 부분은 단순히 최종 답변 자체가 아닙니다.
그것은 그 답변이 왜 신뢰할 만한지 설명하는 증거의 흔적(evidence trail)이며, 무엇을 추가로 확인해야 하는지에 대한 내용입니다.
이것이 제가 GitHub에서 진행하고 있는 AI-Incident-Root-Cause-Analyzer 프로젝트를 통해 탐구하는 방향입니다.
💬 AI 엔지니어링에 대해 이야기해 봅시다
다른 개발자, QA 엔지니어, DevOps 엔지니어, SRE들이 이 문제에 어떻게 접근하고 있는지 궁금합니다.
AI 기반 디버깅에 대한 여러분의 접근 방식은 무엇인가요?
- 🤖 단일 진단 에이전트?
- 🧠 멀티 에이전트 조사 워크플로우?
- ⚙️ 결정론적 검사(deterministic checks)와 인간 승인을 결합한 AI?
댓글에서 여러분의 생각, 접근 방식 또는 배운 교훈을 공유해 주세요. 실제 엔지니어링 워크플로우에서 어떤 것이 효과적인지 듣고 싶습니다.
#AI #AIAgents #DevOps #Debugging #SRE