CodeAct 에이전트는 DSPy 시그니처를 기반으로 특정 작업을 수행하도록 정의됩니다.
시그니처 정의 (The Signature)
ResearchQuery클래스: 에이전트의 목표를 명확히 정의합니다.- 설명: “웹 콘텐츠를 가져오고 분석하기 위한 Ruby 코드를 생성하여 주제를 연구합니다.”
- 입력:
query(연구 질문),context(사용 가능한 라이브러리 및 가이드라인) - 출력:
answer(연구 결과 기반의 답변)
- 이 시그니처는 에이전트가 어떤 정보를 받아 어떤 결과를 도출해야 하는지 LLM에게 지시하는 역할을 합니다.
컨텍스트 제공 (The Context)
RESEARCH_CONTEXT상수는 에이전트가 활용할 수 있는 Ruby 라이브러리(Net::HTTP,URI,JSON)와 유용한 API 엔드포인트(GitHub API, Wikipedia API)를 문자열 형태로 제공합니다. 이는 LLM이 코드를 생성할 때 참고할 수 있는 환경 정보가 됩니다.
에이전트 실행 과정 (Running the Agent)
-
DSPy 설정 후
DSPy::CodeAct인스턴스를 생성하고,query와context를 전달하여 에이전트를 호출합니다. -
실행 예시: “rails/rails 리포지토리는 몇 개의 별을 가지고 있나요?”라는 쿼리에 대해 에이전트는 GitHub API를 사용하여 별 개수를 성공적으로 가져옵니다.
-
Three Phases: 에이전트는 다음 세 단계를 반복하여 작업을 수행합니다.
- Think (사고): 접근 방식에 대해 추론합니다. (예: GitHub API 사용 결정)
- Code (코드 생성 및 실행): Ruby 코드를 생성하고 실행합니다. (예:
Net::HTTP를 사용하여 API 호출) - Observe (관찰): 작업 완료 여부를 판단하거나 다음 단계를 결정합니다.
시그니처를 통한 전문화 (Specializing via Signatures)
- 시그니처를 변경함으로써 다양한 목적의 에이전트를 생성할 수 있습니다.
AnalyzeCSV: CSV 데이터를 분석하고 통계를 계산하는 데이터 분석 에이전트.ExplainCode: 코드 스니펫을 실행하여 동작을 이해하고 설명하는 코드 설명 에이전트.
- 각 시그니처는 LLM의 접근 방식을 안내하고, 입출력 필드는 에이전트의 데이터 흐름을 정의합니다.
사용 시점 (When to Use This)
-
CodeAct: 유연한 데이터 페치 또는 변환, 여러 API 조합, 파싱 및 파생 값 계산이 필요할 때 적합합니다. 도구 정의 없이 자율적으로 코드를 생성합니다.
-
ReAct: 잘 정의된 인터페이스를 가진 도구가 있거나, 에이전트의 동작을 엄격하게 제어해야 할 때 더 적합합니다.
샌드박싱 옵션 (Sandboxing Options)
-
CodeAct는 생성된 코드 실행을 위해
eval을 사용하므로 보안 위험이 있습니다. - 프로덕션 환경 대안:
- Docker 컨테이너:
trusted-sandboxGem을 사용하여 격리된 환경에서 리소스 제한과 함께 코드 실행. (오버헤드: ~100ms+) - V8 엔진:
ruby_boxGem을 통해 Ruby 코드를 JS로 컴파일 후 V8에서 실행. (빠르지만 Ruby 호환성 제한) - 프로세스 격리:
safe_rubyGem을 사용하여 화이트리스트 메서드와 함께 프로세스 포크. (중간 오버헤드) - WebAssembly (WASM):
wasmer-rubyGem을 사용하여 메모리 안전한 WASM 샌드박스. (복잡한 설정)
- Docker 컨테이너:
- 제한적인 실험용 가드레일:
SaferCodeAct와 같이 특정 패턴 차단 및 타임아웃을 적용하는 방식은 완벽한 샌드박스가 아니므로, 신뢰할 수 없는 입력에 대해서는 Docker나 WASM과 같은 강력한 격리 방안을 고려해야 합니다.