🔧 스킬이란 무엇인가?
AI 에이전트의 맥락에서, skill (또한 다음과 같이 호출됨 tool or function) 는 패키지화된 재사용 가능한 기능으로서 LLM이 컨텍스트 창 밖의 세계와 상호작용하기 위해 호출할 수 있습니다. 스킬은 언어 이해와 실제 행동 사이의 간극을 메웁니다.
각 스킬은 네 가지 구성요소를 가집니다:
- Name — 모델이 스킬을 참조할 때 사용하는 고유 식별자 (예:
web_search) - Description — 스킬이 무엇을 하는지, 언제 사용해야 하는지 설명하는 자연어 텍스트; LLM은 이것을 읽고 언제 스킬을 호출할지 결정합니다
- 입력 스키마 — 인수의 구조화된 정의(JSON Schema); 모델은 작업에 따라 이를 채웁니다
- Implementation — 실제로 실행되는 코드: API 호출, 데이터베이스 쿼리, 셸 명령 또는 기타 작업
예: A get_weather 스킬의 설명이 "도시의 현재 날씨를 가져옴"이고, 입력으로 { "city": "string" } 를 받아 날씨 API를 호출합니다. LLM은 API 키나 HTTP 호출을 직접 보지 못하며 — 단지 결과를 텍스트로 반환받습니다.
⚙️ 도구 호출의 동작 방식
에이전트가 스킬에 접근할 수 있을 때, LLM은 이를 직접 호출하지 않습니다 — 그것은 requests 구조화된 출력을 생성하여 호출을 수행합니다. 런타임(귀하의 애플리케이션 코드)이 실제 호출을 실행하고 결과를 반환합니다. 전체 사이클은 다음과 같습니다:
- 도구 등록 — 귀하의 코드가 사용 가능한 스킬 목록과 그 설명 및 스키마를 모델에 보냅니다
- 모델 추론 — LLM은 작업과 사용 가능한 도구들을 읽고 어떤 도구를 어떤 인수로 호출할지 결정합니다
- 도구 호출 요청 — 모델이 구조화된 "tool call" 메시지를 출력합니다 (예:
{ "tool": "web_search", "args": { "query": "current Gemini models" } }) - Execution — 귀하의 런타임 코드는 실제 함수, API 또는 서비스를 호출합니다
- 결과 주입 — 그 결과가 대화 컨텍스트에 다시 추가됩니다
- 추가 추론 — 모델은 결과를 읽고 다른 도구를 호출하거나 후속 질문을 하거나 최종 답변을 생성합니다
이 루프는 한 번의 턴에서 여러 번 반복될 수 있습니다. 복잡한 에이전트 작업은 최종 응답을 생성하기 전에 10~20개의 도구를 순차적으로 호출할 수 있습니다.
📊 스킬 vs 플러그인 vs MCP 서버
용어는 빠르게 진화했습니다. 개념들이 역사적으로 어떻게 연관되는지 설명합니다:
| Era | Name | 작동 방식 | Status |
|---|---|---|---|
| 2023 | ChatGPT 플러그인 | OpenAPI 스펙을 가진 사용자가 설치 가능한 확장; ChatGPT가 HTTP를 통해 호출함 | 사용 중단(대체: GPTs + tools) |
| 2023 | OpenAI Function Calling | API 수준의 JSON Schema 정의; 모델이 구조화된 함수 호출을 출력하고 귀하의 코드가 이를 실행함 | 활성 — "tool use"로 이름 변경됨 |
| 2023– | Tool Use / Skills | 함수 호출과 동일; Anthropic이 "tool use"를 만들었고, 다른 이들은 "skills" 또는 "functions"를 사용합니다 | 활성 — 현재 표준 |
| 2024– | MCP 서버 | 표준화된 프로토콜(Anthropic, 2024년 12월)로 도구 서버를 패키징하고 배포하기 위한 규격; 어떤 MCP 클라이언트든 어떤 MCP 서버와도 연결할 수 있음 | 활성 — 성장 중인 생태계 |
핵심 차이점: 전통적인 도구 사용은 애플리케이션 코드에 인라인으로 정의됩니다. MCP 서버는 도구를 표준화된 프로토콜을 통해 노출하는 독립 실행형 프로세스입니다 — 이를 통해 다양한 AI 클라이언트(Claude Desktop, Cursor, VS Code, 맞춤형 에이전트)에서 재사용할 수 있습니다. 자세히 보기: MCP란 무엇인가.
🗂️ 도구 분류 및 위험 수준
모든 도구가 동일한 위험을 지니지는 않습니다. 위험 수준별 분류는 에이전트의 행동 공간 및 사람 개입 체크포인트를 추가할 위치:
| Category | Examples | Risk | Recommendation |
|---|---|---|---|
| Read-only | web_search, read_file, get_weather, list_dir | Low | 자율 허용; 모든 호출 로깅 |
| 쓰기(로컬) | write_file, create_dir, edit_code | Medium | 샌드박스된 작업 디렉터리로 범위를 제한 |
| 네트워크 / 외부 | send_email, post_to_slack, call_api | 중간–높음 | 되돌릴 수 없는 전송은 HITL 승인 필요 |
| OS / Shell | run_command, execute_script, install_package | High | 컨테이너화된 환경으로 제한; HITL 필요 |
| Destructive | delete_file, drop_table, revoke_access | Critical | 항상 명시적인 사람 확인 필요 |
🏗️ 좋은 스킬의 구조
스킬 설계에서 가장 중요한 결정은 description모델은 어떤 도구를 호출할지 결정하기 위해 설명을 읽습니다 — 설명이 부실하면 잘못된 도구 선택, 호출 누락 또는 인수 모호성이 발생합니다.
설명이 효과적이게 만드는 요소
- 언제 사용해야 하는지 명확히 하라 — "사용자가 실시간 데이터나 최신 이벤트에 대해 물을 때 이 도구를 사용"은 "웹을 검색"보다 더 낫습니다
- 무엇을 하지 않는지 명시하라 — "30일 이전의 과거 데이터는 반환하지 않음"
- 출력 형식을 설명하라 — "제목, url, 스니펫 필드를 가진 검색 결과의 JSON 배열을 반환"
- 200단어 이내로 유지하라 — ~200 토큰보다 긴 설명은 많은 도구가 등록된 경우 모델의 주의를 과도하게 소모할 수 있습니다
스키마 설계 원칙
- 필수 vs 선택 — 필드를 정말로 필요로 하는 경우에만 필수로 표시하세요; 기본값이 있는 선택 필드는 모델 오류를 줄입니다
- 제한된 값에는 열거형을 사용하라 —
"format": {"enum": ["json", "markdown", "text"]}이는 환각된 값을 방지합니다 - 멱등성 있는 도구를 선호하라 — 안전하게 재시도할 수 있는 도구(읽기, 조회)는 일회성 동작(전송, 삭제)보다 더 안전합니다
- 구조화된 데이터를 반환하라 — JSON 응답은 모델이 구조화되지 않은 텍스트 블롭보다 추론하기 쉽습니다
💡 실제 사례
| 스킬 이름 | 무엇을 하는지 | 핵심 인수 | Risk |
|---|---|---|---|
web_search | 검색 엔진을 질의하여 상위 결과 반환 | query: string, num_results?: number | Low |
read_file | 워크스페이스 디렉터리에서 파일을 읽기 | path: string, offset?: number, limit?: number | Low |
write_file | 파일 생성 또는 덮어쓰기 | path: string, content: string | Medium |
run_tests | 프로젝트 테스트 스위트를 실행하고 결과 반환 | filter?: string | Medium |
browser_screenshot | URL로 이동하여 스크린샷 반환 | url: string | Medium |
send_email | 한 명 이상의 수신자에게 이메일 전송 | to: string[], subject: string, body: string | 높음 — 항상 HITL |
run_shell | 임의의 셸 명령을 실행 | command: string, cwd?: string | 높음 — 샌드박스 필요 |
✅ 모범 사례
최소 권한
각 에이전트에 그 특정 작업에 필요한 도구만 부여하세요. FAQ에 답하는 에이전트는 write_file or send_email. 액션 공간이 작을수록 에이전트가 조작되었을 때 발생하는 영향 범위가 작아집니다. 참고: 과도한 에이전시.
모든 도구 호출 감사
모든 도구 호출과 그 인수 및 결과를 로깅하세요. 이는 디버깅, 비용 귀속 및 이상 행동(예: 에이전트가 ~/.ssh/ 프로젝트 디렉터리만 접근해야 할 때 접근하는 경우)을 탐지할 수 있게 합니다. LangSmith와 같은 AgentOps 플랫폼이 이를 쉽게 만듭니다.
되돌릴 수 없는 동작에 대한 사람 개입
되돌리기 어렵거나 불가능한 모든 동작 — 메시지 전송, 데이터 삭제, 구매 등 — 은 실행 전에 명시적인 사람 확인이 필요합니다. HITL 체크포인트를 프롬프트가 아니라 에이전트 런타임에 구축하세요. 프롬프트는 무시될 수 있지만 코드에는 그렇지 않습니다.
도구 중독에 주의하라
에이전트가 MCP 서버를 동적으로 설치하거나 발견하게 허용하면, 악의적인 서버가 숨겨진 지시문을 포함한 설명으로 도구를 등록할 수 있습니다. 도구를 에이전트 레지스트리에 추가하기 전에 항상 도구 설명을 검토하세요. 참고: 도구 중독.
명확한 오류 반환 작성
도구가 실패할 때는 모델이 복구하거나 대체 도구를 사용하거나 사용자에게 우아하게 알릴 수 있도록 충분한 컨텍스트를 담은 구조화된 오류를 반환하세요 — 생 예외 스택 트레이스는 피하세요. 예: { "error": "rate_limited", "retry_after": 5 }. 잘 설명된 오류는 에이전트가 재시도하거나 대체 도구를 사용하거나 사용자에게 적절히 알리도록 합니다.