- LLM은 애플리케이션의 판단 주체가 아니라, 사용자 입력을 API 기반 로직과 오가는 자연어 인터페이스로 제한하는 편이 안전함
- 체스 봇 예시는 상태 유지와 의사결정을 LLM에 맡기면 성능, 디버깅, 테스트, 비용에서 전문 엔진이나 일반 코드보다 불리해짐을 보여줌
- 게임 공격, 협상 에이전트, 무작위 선택처럼 결과가 중요한 영역에서는 LLM이 결정하지 않고 검증 가능한 시스템이 처리해야 함
- LLM이 잘하는 일은
attack(target="orc", weapon="sword")같은 구조화 변환, 오류 메시지의 자연어화, 의도 분류, 인간식 표현 해석임 - 모델 성능이 계속 좋아져도 핵심 로직을 별도 시스템에 두면 추론, 유지보수, 실행 비용, 버전 관리가 더 다루기 쉬워짐
핵심 로직에서 LLM을 빼야 하는 이유
- 대부분의 애플리케이션에서 LLM은 사용자와 애플리케이션 로직 API 사이의 사용자 인터페이스에 머물러야 함
- 체스 봇 예시에서는 사용자가 WhatsApp으로 “비숍으로 나이트를 잡겠다” 같은 자연어 명령을 보내고, 봇이 체스를 둠
- LLM이 체스판 상태를 유지하고 그럴듯하게 플레이할 가능성은 있지만, 그렇게 설계할 이유는 없음
- 관련 예시로 체스 글이 제시됨
- 전문 체스 엔진은 LLM보다 더 빠르고, 더 잘 두며, 더 저렴한 체스 플레이어가 될 수 있음
- Stockfish 같은 현대 체스 엔진은 신경망을 포함하더라도 명확한 입력과 평가 함수를 가진 목적 특화 시스템임
- 일반 목적 LLM이 텍스트만으로 게임 상태를 유지하는 방식과는 다름
- LLM이 어떤 결정을 왜 내렸는지 추론하고 디버깅하기 어려워, 의사결정 방식을 조정하기도 까다로움
- 고차원 의미 공간에서 어떤 경로로 답에 도달했는지 이해하기 어렵고, LLM 자체도 이를 잘 설명하지 못함
- Anthropic의 언어 모델 사고 추적 연구 같은 진전에도 일반 LLM의 관측 가능성은 여전히 어렵게 남아 있음
- 운영 측면에서도 LLM은 핵심 로직에 맞지 않는 제약이 많음
- LLM 출력 테스트는 알려진 코드 경로의 단위 테스트보다 어려움
- 수학은 CPU보다 못하고, 무작위 숫자 선택도 충분히 좋지 않음
- 버전 관리와 감사가 어려워지고, 모니터링과 관측 가능성도 복잡해짐
- 자연어 기반 상태 관리는 취약하며, API 속도 제한과 비용에 좌우됨
- 모든 흐름이 프롬프트를 통과하면 보안 경계가 흐려짐
LLM이 맡기 좋은 일
- 사용자가 “vorpal sword로 player X를 공격하겠다”고 말해도, LLM이 해당 무기 보유 여부나 전투 결과를 판단해서는 안 됨
- 자유 텍스트를 API 호출로 바꾸고, 시스템이 낸 결과를 다시 사용자에게 설명하는 데 집중해야 함
- 협상 에이전트에서도 LLM은 협상 판단을 직접 내리지 않음
- 제안을 포장해 협상 엔진에 넘기고, 결과를 사용자에게 전달하는 역할이 적합함
- 사용자 응답에 무작위 선택이 필요할 때도 LLM이 선택자가 되어서는 안 됨
- LLM의 강점은 변환, 해석, 분류, 커뮤니케이션에 있음
- “hit the orc with my sword”를
attack(target="orc", weapon="sword")로 바꿀 수 있음 {"error": "insufficient_funds"}를 “You don’t have enough gold for that.”으로 바꿀 수 있음- 사용자의 의도가 전투 명령인지, 인벤토리 확인인지, 도움 요청인지 라우팅할 수 있음
- “blade”가 아마도 sword이고 “smash”가 아마도 attack이라는 인간 개념을 이해할 수 있음
- “hit the orc with my sword”를
- LLM이 계속 개선돼 이런 사례를 꽤 잘 처리하게 되더라도, 핵심 로직은 목적 특화 시스템에 두는 구조가 유지보수와 비용, 버전 관리에 더 적합함