AI 에이전트와 전통적인 로직 사이의 재귀적인 <제어 역전(IoC)>을 통해 두 시스템 사이의 장점을 취하는 설계 방식에 대한 생각을 정리했다. 최근에 했던 두 가지 시도([반구조적 소프트웨어 명세서 (s4)](/pages/Semi-structured%20software%20spec.txt), [과정에 담긴 가치의 증강](/pages/Augmenting%20values%20in%20the%20process.txt))에 담긴 공통점이기도 하다. ## AI 에이전트의 도구 사용과 제어 역전 초기에는 전통적인 방식의 프로그램에서 호환 등을 호출하여 [LLM](/pages/Large%20language%20model.txt)을 활용하는 방식의 시도가 많았는데, <2025년>에는 [LLM](/pages/Large%20language%20model.txt)이 전통적인 방식의 프로그램을 호출하는 소위 'AI 에이전트와 도구'라는 접근이 유행하고 있다. 혹자는 2025년이 '에이전트의 해'라고 주장하기도 한다. 전통적 방식이 순방향의 제어라면 AI 에이전트가 도구를 활용하는 설계는 <제어 역전>이라고 볼 수 있다. 상위 수준의 흐름을 AI 에이전트가 제어하고 도구는 에이전트의 호출에 의해 구체적인 하위 수준의 작업을 수행한다는 점에서 그렇다. ## 재귀적 제어 역전 [반구조적 소프트웨어 명세서](/pages/Semi-structured%20software%20spec.txt)의 `s4`는 특정 형식을 따르는 yaml 명세서(`s4.yaml`)와 소스 코드를 정적 분석하여 다음에 해야할 일이 무엇인지를 출력하는 전통적인 프로그램이다. `s4`를 실행하면 1. 명세서에 내적 일관성이 있는지(모든 비즈니스 목표에 한 개 이상의 구체적 기능이 존재하는지, 기능 사이의 의존 관계에 순환이 없는지, 모든 기능에 한 개 이상의 인수 기준이 존재하는지 등) 2. 명세서와 코드 사이가 일치하는지(명세서 상 인수 기준에 대응되는 인수 테스트가 코드에 존재하는지) 3. 명세서에 등록된 모든 검사(인수 테스트, 단위 테스트, 커버리지, 타입 검사 등)를 통과하는지를 검사한 후 문제가 발견되면 가장 먼저 해결해야할 문제가 무엇인지, 해당 문제를 해결하기 위해 필요한 뭘 하면 되는지 등을 출력한다. 이 도구를 AI 에이전트에게 줘어주면 재미난 일이 일어난다. 1. 가장 추상적인 상위 수준의 제어는 AI 에이전트가 담당한다. 에이전트는 언제 `s4`를 호출할지를 결정한다. 2. `s4`는 정해진 로직에 따라 각종 검사를 수행하고 그 결과를 출력한다. 3. AI 에이전트는 `s4`의 출력을 참고하여 구체적 작업을 수행한다. 이 단계에서 에이전트는 또다른 하위 단계의 도구들(diff, patch, [MCP](/pages/Model%20context%20protocol.txt) server 등) 사용한다. 2-3 단계에서 사이에서 벌어지는 일이 흥미로운데, `s4`는 구체적인 작업(즉, 실질적인 코딩)을 직접 하지 않는다. 대신 AI 에이전트가 뭘 해야하는지 알려줄 뿐이다. 기술적으로만 보자면 `s4`는 그저 분석 결과를 텍스트로 출력할 뿐이고 AI 에이전트는 이를 참고할 뿐이지만, 실제로 일어나는 일을 의미적으로 해석해보면 `s4`가 AI 에이전트에게 다음에 해야할 일을 지시하고 에이전트가 이에 따라 가장 구체적인 하위 수준의 작업(코딩)을 수행한다고 볼 수 있다. [분산된 기능적 분해](/pages/Distributed%20functional%20decomposition.txt)라는 관점에 따라 해석해보면 `s4`가 에이전트를 호출하여 일을 시키는 방향으로 다시한번 <제어 역전>이 일어난 것이다. ## 또다른 사례 [과정에 담긴 가치의 증강](/pages/Augmenting%20values%20in%20the%20process.txt)에서는 [위키 정원 관리](/pages/Wiki%20gardening%20rules.txt)를 하는 맥락에서 전통적인 그래프 분석 알고리즘과 [LLM](/pages/Large%20language%20model.txt)을 섞어 쓴 사례를 소개한다. 1. 사용자가 AI 에이전트에게 추상적인 수준의 명령을 내리면("위키를 개선하고 싶어"), 에이전트는 그래프 분석을 수행하는 CLI 스크립트를 호출한다. 2. CLI 스크립트는 그래프 분석 결과 가장 멀리 떨어진 두 문서를 이어주는 경로를 맥락과 함께 출력하고 AI 에이전트가 특정 작업([리버스 사전 탐색](/pages/LLM%20as%20a%20reverse%20dictionary%20lookup%20algorithm.txt))을 수행하도록 유도한다. 3. AI 에이전트는 CLI의 출력이 유도하는대로 구체적 작업을 수행한다. 이 사례에서도 마찬가지로 재귀적 제어 역전이 일어났다. ## 일반화 두 사례를 일반화해보면 일반적인 에이전트-도구 사이의 인터랙션과 재귀적 제어 역전이 일어나는 방식 사이의 차이를 알 수 있다. 에이전트가 호출하는 도구가 단지 수동적으로 정보를 제공하는 역할을 하는지, 에이전트의 특정 행동을 강하게 유도하는(그래서 기능적으로는 에이전트를 호출하는 것과 동일한) 역할을 하는지가 유일한 차이점이다. 전자가 "신경-기호 제어 역전Neuro-symbolic IoC"이라면 후자는 "재귀적 신경-기호 제어 역전Recursive neuro-symbolic IoC"이라고 부를 수 있겠다. 에이전트가 도구의 호출 여부를 제어하고, 호출된 도구는 에이전트가 잘 하지 못하는 종류의 작업을 수행한 뒤에 도구가 잘 하지 못하는 종류의 작업을 다시 에이전트에게 지시하여 에이전트의 작업을 촉발하는 패턴이다. 이때 에이전트는 다시 다른 도구들(예: `git diff`, `grep`, [MCP](/pages/Model%20context%20protocol.txt) 서버 등)을 호출해가며 작업을 수행하게 되므로 재귀적이다. 기술적으로는 아주 작은 차이지만 활용 가치가 큰 패턴이라고 생각한다. 결정론적 특성의 전통적 도구와 확률적 생성 모델의 일종인 [LLM](/pages/Large%20language%20model.txt) 기반 AI 에이전트를 [상호보완적인 방식으로 결합](/pages/Design%20is%20beneficially%20relating%20elements.txt)할 수 있는 패턴 중 하나로 다양하게 써먹을 수 있겠다.