Go Micro를 사용한 AI Agent CLI 구축하기

AI agent CLI는 도구 발견(tool discovery), 모델 통합(model integration), 대화 메모리(conversation memory), 그리고 실행 루프(execution loop)라는 네 가지 핵심 구성 요소에 집중함으로써 약 150줄의 코드로 구현할 수 있습니다. 이 접근 방식은 사용자 요청을 특정 서비스로 라우팅하기 위한 수동적인 "if-then" 로직의 필요성을 제거하고, 대신 제공된 설명을 바탕으로 어떤 도구를 호출할지 추론하는 대규모 언어 모델(LLM)에 의존합니다.

도구 호출 에이전트의 네 가지 구성 요소

기능적인 AI 에이전트를 구축하려면 세 가지 주요 문제를 해결해야 합니다: LLM에 사용 가능한 도구 목록을 제공하고, 요청 시 해당 도구를 실행하며, 대화 메모리를 통해 문맥을 유지하는 것입니다.

1. 도구 발견 (Tool Discovery)

LLM은 어떤 함수를 호출할 수 있는지 알아야 합니다. Go Micro 프레임워크에서는 서비스가 요청 유형과 필드 메타데이터를 포함하여 레지스트리에 엔드포인트를 등록합니다. 이를 통해 에이전트는 각 도구가 이름, 설명(핸들러의 doc comments에서 유도됨), 그리고 파라미터 스키마(요청 struct의 필드에서 유도됨)를 포함하는 도구 목록을 자동으로 생성할 수 있습니다.

Go Micro를 사용하지 않는 경우, 이 단계는 엔드포인트를 수동으로 열거하고 LLM을 위한 {name, description, parameters} 목록을 구축하는 과정을 포함합니다.

2. 모델 통합 및 실행 (Model Integration and Execution)

LLM을 통합하려면 제공자 중립적인 인터페이스가 필요합니다. 균일한 ai.Model 인터페이스를 사용함으로써, 개발자는 단 하나의 문자열을 변경하는 것만으로 Anthropic, OpenAI, Gemini, Groq, Mistral, Together, 또는 Atlas Cloud와 같은 제공자 간을 전환할 수 있습니다.

실행은 도구 목록을을 모델에 연결함으로써 처리됩니다. 모델이 특정 도구(예: users_Users_Create)를 호출하기로 결정하면, 핸들러는 요청을 적절한 RPC로 라우팅하고 결과를 모델에 반환합니다.

3. 대화 메모리 (Conversation Memory)

후속 질문을 지원하려면 에이전트에게 메시지 누적기가 필요합니다. Add, Messages, 그리고 Reset 메서드를 가진 단순한 History 객체(메시지 슬라이스)는 사용자의 프롬프트와 어시스턴트의 답변을 추적합니다. 이 누적된 히스토리는 문맥을 유지하기 위해 이후의 모든 호출에서 LLM에 다시 전달됩니다.

4. 실행 루프 (The Execution Loop)

에이전트의 핵심 로직은 다음 시퀀스를 수행하는 루프입니다:

  1. 프롬프트 기록: 사용자의 입력이 히스토리에 추가됩니다.
  2. 모델 호출: 프롬프트, 시스템 지침, 도구 목록, 그리고 대화 히스토리가 LLM에 전송됩니다.
  3. 답변 처리: 어시스턴트의 초기 답변이 출력되고 히스토리에 기록됩니다.
  4. 도구 실행: 모델이 어떤 도구를 호출할지 결정합니다. 핸들러는 이를 실행하고 결과를 보고합니다.
  5. 최종 답변: 모델은 도구 출력에 기반하여 최종 답변을 생성하며, 이는 출력되고 히스리에 기록됩니다.

구현이 간결한 이유

구현의 간결함은 세 가지 아키텍처 선택을 통해 달성됩니다:

  • 자기 기술적 서비스 (Self-Describing Services): 코드 내의 doc comments와 @example 태그를 사용하면 개발자가 별도의 도구 스키마를 작성하지 않고도 LLM이 사용 힌트를 받을 수 있습니다.
  • 균일한 제공자 인터페이스 (Uniform Provider Interface): 여러 LLM 제공자를 위한 단일 인터페이스는 제공자별 결합 코드(glue code)의 필요성을 제거합니다.
  • 자동 실행 연결 (Automatic Execution Wiring): 도구 호출과 RPC 디스패치의 연결은 ai.WithTools(tools)를 통해 자동으로 처리되어, 수동 라우팅 로직의 필요성을 제거합니다.

AI 에이전트 확장하기

기본 루프가 설정되면, 에이전트는 다음과 같은 여러 향상된 기능을 통해 확장될 수 있습니다:

  • 안전성 (Safety): 파괴적인 도구 호출 전에 확인 단계를 추가합니다.
  • 관찰 가능성 (Observability): 모든 도구 호출을 감사 추적(audit trail)에 기록합니다.
  • 권한 제어 (Observability): 도구 목록을 필터링하여 에이전트의 특정 서비스에 대한 접근을 제한합니다.
  • 인터페이스 (Interface): REPL (Read-Eval-Print Loop)을 Slack bot 또는 micro flow를 통한 이벤트 기반 트리거로 교체합니다.

Sources