코딩 에이전트의 기본 구성
코딩 에이전트는 본질적으로 도구 접근 권한을 가진 AI 챗 에이전트입니다. 대부분의 최신 대규모 언어 모델(LLM)은 도구를 사용할 수 있으며, 이 도구들은 목적과 매개변수가 설명된 함수 형태로 LLM이 인식할 수 있도록 포맷됩니다. 기본적인 AI 챗 에이전트는 사용자 프롬프트 읽기, LLM에 전달, 응답 출력의 반복 루프로 구성됩니다.
필수 도구 구현
간단한 코딩 에이전트를 위해서는 단 세 가지 핵심 도구가 필요합니다.
-
파일 읽기 (ReadFile): 주어진 파일 경로의 내용을 반환합니다.
File.read(path)한 줄로 구현되며, 오류 처리 로직을 포함하여 LLM이 스스로 오류를 복구할 수 있도록 돕습니다. -
파일 목록화 (ListFiles): 주어진 디렉토리 경로의 파일 및 디렉토리 목록을 반환합니다. 디렉토리 이름에는
/를 붙여 파일과 구분합니다.Dir.glob을 사용하여 구현됩니다. -
파일 편집 (EditFile): 파일 경로, 기존 문자열, 새 문자열을 받아 파일을 업데이트합니다.
old_str을new_str로 대체하며, 파일이 존재하지 않으면 새로 생성하여 LLM이 새 파일을 작성할 수 있게 합니다.File.write(path, content.sub(old_str, new_str))를 사용합니다.
RubyLLM 젬 활용
이러한 도구들은 RubyLLM 젬의 RubyLLM::Tool 클래스를 상속받아 구현됩니다. description과 param을 통해 LLM에게 도구의 목적과 매개변수를 명확하게 전달합니다. Agent 클래스 내에서 @chat.with_tools 메서드를 통해 구현된 도구들을 LLM에 등록하여 사용할 수 있습니다. RubyLLM 젬은 LLM과 도구 간의 JSON 통신 및 응답 처리를 자동으로 관리하여 개발자가 복잡한 부분을 신경 쓰지 않도록 합니다.
에이전트 개선: 셸 명령 실행 도구
초기 에이전트는 코드를 생성만 할 뿐 실행할 수는 없었습니다. RunShellCommand 도구를 추가하여 에이전트가 셸 명령을 실행하고 그 결과를 바탕으로 코드를 테스트하고 개선할 수 있도록 합니다. 사용자 확인 과정을 거쳐 안전하게 명령을 실행하며, 이를 통해 에이전트는 생성한 코드의 테스트 실패를 스스로 진단하고 수정하는 능력을 갖추게 됩니다. 이로써 총 94줄의 Ruby 코드로 강력한 코딩 에이전트가 완성됩니다.