함수 호출 (Function Calling in AI Agents)¶
개요¶
함수 호출(도구 호출이라고도 함)은 현대의 LLM 기반 에이전트를 구동하는 핵심 기능 중 하나입니다. Claude 4.6, GPT-5.4, Gemini 2.5 Pro 같은 최신 모델들이 강화된 함수 호출 능력을 제공합니다. 함수 호출이 내부에서 어떻게 작동하는지 이해하는 것은 효과적인 AI 에이전트를 구축하고 문제가 발생할 때 이를 디버깅하는 데 필수적입니다.
함수 호출이란?¶
핵심 개념¶
함수 호출은 LLM이 외부 도구, API, 지식 기반과 상호 작용할 수 있게 하는 메커니즘입니다.
LLM이 훈련 데이터를 넘어서는 정보나 행동이 필요한 쿼리를 받으면, 외부 함수를 호출하여 그 정보를 검색하거나 그 행동을 수행할 수 있습니다.
간단한 예¶
사용자: "서울의 현재 날씨는 어떤가요?"
LLM의 인식: "실시간 날씨 데이터가 필요합니다.
내 훈련 데이터에는 없으므로
날씨 API를 호출해야 합니다."
LLM의 응답:
{
"tool_name": "get_weather",
"parameters": {
"city": "서울",
"country": "한국"
}
}
시스템의 실행: 날씨 API 호출
→ OpenWeatherMap API 결과
LLM의 재개: "서울의 현재 날씨는 맑고, 기온은..."
이 능력은 기본 LLM을 텍스트 생성기에서 실제 세계와 상호 작용할 수 있는 강력한 에이전트로 변환합니다.
함수 호출이 AI 에이전트를 구동하는 방식¶
함수 호출 흐름도¶
┌─────────────────────────────────┐
│ 1. 사용자 쿼리 수신 │
│ "한국 날씨 조회 + 일정 추가" │
└────────────┬────────────────────┘
│
┌────────────▼────────────────────┐
│ 2. 컨텍스트 조립 │
│ - 시스템 메시지 │
│ - 도구 정의 │
│ - 사용자 메시지 │
│ → LLM에 전송 │
└────────────┬────────────────────┘
│
┌────────────▼────────────────────┐
│ 3. LLM이 도구 결정 │
│ "날씨 조회 필요" │
│ "일정 추가 필요" │
└────────────┬────────────────────┘
│
┌────────────▼────────────────────┐
│ 4. 도구 실행 │
│ ├─ get_weather("서울") │
│ └─ add_event(...) │
└────────────┬────────────────────┘
│
┌────────────▼────────────────────┐
│ 5. 결과 수집 (관찰) │
│ - 날씨: 맑음, 18°C │
│ - 일정: 저장됨 │
└────────────┬────────────────────┘
│
┌────────────▼────────────────────┐
│ 6. 응답 생성 │
│ "서울은 현재 맑고... │
│ 일정이 추가되었습니다..." │
└─────────────────────────────────┘
상세 단계 설명¶
1. 사용자 쿼리 - 사용자가 에이전트에 요청을 보냅니다 - 예: "내일 서울에서 회의가 있는데 날씨 확인하고 일정 추가해줄래?"
2. 컨텍스트 조립 - 시스템은 다음을 결합하여 LLM에 전달:
{
"system_prompt": "너는 날씨와 일정을 관리하는 에이전트다",
"tools": [
{
"name": "get_weather",
"description": "특정 도시의 날씨 조회",
"parameters": {...}
},
{
"name": "add_event",
"description": "캘린더에 일정 추가",
"parameters": {...}
}
],
"messages": [
{"role": "user", "content": "내일 서울 날씨는? 회의 추가해줄래?"}
]
}
3. 도구 결정 - LLM이 컨텍스트를 분석합니다 - 필요한 도구들을 식별합니다 - 각 도구에 필요한 매개변수를 결정합니다
4. 도구 실행 - 개발자의 코드가 도구 호출을 받습니다 - 실제 함수를 실행합니다 - 결과를 수집합니다
5. 관찰 (Observation) - 도구의 실행 결과를 에이전트에 제공합니다 - 에이전트가 이 정보를 기반으로 다음 단계를 결정합니다
6. 응답 생성 - 도구 결과와 함께 LLM이 최종 응답을 생성합니다
핵심 통찰¶
LLM은 항상 전체 컨텍스트를 유지합니다:
이 컨텍스트 인식이 에이전트가 다음 수행할 작업과 도구 결과를 최종 응답에 통합하는 방법에 대해 지능적인 결정을 내릴 수 있게 합니다.
도구 정의의 역할¶
도구 정의의 중요성¶
도구 정의는 함수 호출의 가장 중요한 구성 요소입니다. 이것이 LLM이 어떤 도구를 사용할 수 있는지, 그리고 언제 사용할지 알 수 있는 유일한 방법입니다.
도구 정의의 구조¶
도구 정의는 일반적으로 다음을 포함합니다:
필수 요소¶
{
"name": "도구의 고유 식별자",
"description": "도구가 무엇을 하는지, 언제 사용하는지 설명",
"parameters": {
"type": "object",
"properties": {
"매개변수1": {
"type": "string",
"description": "매개변수 설명"
}
},
"required": ["필수_매개변수"]
}
}
실제 예제: 한국 날씨 및 일정 도구¶
도구 1: 날씨 조회¶
{
"name": "get_korea_weather",
"description": "한국의 특정 도시 현재 날씨 조회. 기온, 습도, 강수 확률 등을 반환합니다.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "도시 이름 (예: 서울, 부산, 대구, 인천)"
},
"include_forecast": {
"type": "boolean",
"description": "5일 예보도 포함할지 여부",
"default": false
}
},
"required": ["city"]
}
}
도구 2: 일정 추가¶
{
"name": "add_calendar_event",
"description": "사용자의 캘린더에 새로운 일정을 추가합니다.",
"parameters": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "일정 제목 (예: 회의, 약속)"
},
"date": {
"type": "string",
"description": "일정 날짜 (YYYY-MM-DD 형식)"
},
"time": {
"type": "string",
"description": "일정 시간 (HH:MM 형식, 24시간 체계)"
},
"duration_minutes": {
"type": "integer",
"description": "소요 시간 (분 단위)"
},
"location": {
"type": "string",
"description": "장소 (선택사항)"
},
"notes": {
"type": "string",
"description": "추가 메모 (선택사항)"
}
},
"required": ["title", "date", "time"]
}
}
좋은 도구 정의의 특징¶
✓ 명확한 이름: 도구의 목적이 분명
✓ 상세한 설명: 언제 사용하는지 명확
✓ 구체적인 예제: 사용 사례 포함
✓ 정확한 매개변수: 필수/선택 구분, 타입 명시
✓ 제약 조건: 입력값의 범위나 형식 명시
✓ 반환값 문서화: 결과가 어떤 형식인지 설명
에이전트 루프: 행동과 관찰¶
에이전트 루프의 개념¶
에이전트 루프를 이해하는 것은 AI 에이전트를 디버깅하고 최적화하기 위해 근본적입니다.
루프의 사이클¶
1. 행동 (Action)
- 에이전트가 다음 수행할 행동 결정
- 어떤 도구를 호출할지 선택
↓
2. 환경 응답 (Environment Response)
- 외부 도구 또는 API가 결과 반환
- 성공 또는 실패 응답
↓
3. 관찰 (Observation)
- 에이전트가 결과 수신 및 처리
- 결과 분석
↓
4. 결정 (Decision)
- 에이전트가 다른 행동을 취할지 판단
- 완료? → 최종 응답 생성
- 계속? → 1번으로 돌아가기
실제 예: 한국 출장 준비 에이전트¶
사용자: "내일 부산 출장 가는데 준비해줄래?"
┌─────────────────────────────────┐
│ 1단계 - 행동 │
│ 에이전트: "부산 날씨 확인 필요" │
└────────────┬────────────────────┘
│
┌────────────▼────────────────────┐
│ 2단계 - 환경 응답 │
│ get_korea_weather("부산") │
│ 결과: 맑음, 18°C, 강수확률 10% │
└────────────┬────────────────────┘
│
┌────────────▼────────────────────┐
│ 3단계 - 관찰 │
│ "부산 날씨가 좋네요. │
│ 가벼운 옷차림이 적당해 보입니다" │
└────────────┬────────────────────┘
│
┌────────────▼────────────────────┐
│ 4단계 - 결정 │
│ "하지만 출장 일정도 확인하고, │
│ 교통편도 예약해야 해요" │
│ 계속 → 다음 행동으로 │
└────────────┬────────────────────┘
│
┌────────────▼────────────────────┐
│ 1단계 - 행동 (반복) │
│ 에이전트: "출장 일정 조회 필요" │
│ (다시 루프 시작) │
└─────────────────────────────────┘
루프 종료 조건¶
에이전트가 다음 중 하나를 판단할 때 루프 종료:
1. 작업 완료
"모든 준비가 완료되었습니다"
2. 추가 정보 불가능
"현재 시점에서 더 할 수 있는 것이 없습니다"
3. 사용자 결정 필요
"여기서는 당신의 선택이 필요합니다"
4. 오류/실패
"예약 실패. 다시 시도하시겠습니까?"
함수 호출 디버깅¶
일반적인 문제¶
AI 에이전트를 구축할 때, 에이전트가 예상대로 작동하지 않는 상황을 피할 수 없습니다:
- 잘못된 도구 호출: 에이전트가 부적절한 도구 선택
- 잘못된 인수: 도구에 올바르지 않은 매개변수 전달
- 도구 호출 누락: 필요한 도구를 호출하지 않음
- 무한 루프: 같은 도구를 반복 호출
디버깅 방법¶
1. 로깅 활성화¶
class DebugAgent:
def call_tool(self, tool_name, parameters):
"""도구 호출 로깅"""
print(f"[도구 호출] {tool_name}")
print(f"[매개변수] {parameters}")
# 실제 호출
result = self.tools[tool_name](**parameters)
print(f"[결과] {result}")
return result
2. 단계별 추적¶
각 단계를 로깅:
✓ 입력 수신: 사용자 메시지 내용
✓ 도구 선택: 어떤 도구를 왜 선택했는가
✓ 매개변수: 도구에 전달된 정확한 값
✓ 도구 결과: 도구 실행의 실제 결과
✓ 토큰 사용: 각 단계의 토큰 소비량
3. 중간 단계 가시화¶
n8n과 같은 워크플로우 자동화 도구에서는 "중간 단계 반환"을 활성화하여 내부에서 정확히 무슨 일이 일어나고 있는지 볼 수 있습니다:
호출된 도구들의 순서:
1. get_korea_weather("서울") ✓
2. add_calendar_event("회의", "2025-02-21", "14:00") ✓
3. send_email("상사@company.com", "출장 준비 완료") ✓
각 도구로 전송된 인수:
- get_korea_weather: {"city": "서울"}
- add_calendar_event: {"title": "회의", "date": "2025-02-21", ...}
- send_email: {"to": "상사@company.com", ...}
수신된 관찰:
- 도구 1 결과: {"temp": 18, "condition": "맑음"}
- 도구 2 결과: {"status": "success", "event_id": "12345"}
- 도구 3 결과: {"status": "sent"}
토큰 사용:
- get_korea_weather: 150 토큰
- add_calendar_event: 200 토큰
- send_email: 180 토큰
- 총합: 530 토큰
디버깅 체크리스트¶
□ 도구 정의가 명확한가?
└─ 설명이 충분히 상세한가?
└─ 매개변수 예제가 있는가?
□ LLM이 올바른 도구를 선택하는가?
└─ 로그에서 도구 호출 확인
└─ 선택의 논리가 맞는가?
□ 매개변수 전달이 정확한가?
└─ 필수 매개변수가 모두 있는가?
└─ 데이터 타입이 맞는가?
□ 도구 실행이 성공하는가?
└─ 외부 API가 정상 작동하는가?
└─ 오류 메시지가 있는가?
□ 에이전트가 결과를 올바르게 처리하는가?
└─ 결과를 다음 단계에 사용하는가?
└─ 오류를 감지하고 대응하는가?
💡 실전 팁¶
함수 호출 최적화
-
명확한 도구 이름:
get_weather보다get_korea_weather가 더 구체적 -
예제 포함: 도구 설명에 사용 사례 명시
-
제약 조건 명시:
-
오류 처리: 도구 실패 시 대안 마련
-
토큰 최적화: 불필요한 도구 호출 줄이기
다양한 모델의 함수 호출¶
Claude 4.6 (Anthropic)¶
- 지원: Tool Use API
- 특징: 긴 컨텍스트 (1M 토큰)에서 안정적
- 장점: 복잡한 다단계 도구 호출에 강함
GPT-5.4 (OpenAI)¶
- 지원: Function Calling API
- 특징: 최신 성능, 빠른 처리
- 장점: 신뢰할 수 있는 매개변수 생성
Gemini 2.5 Pro (Google)¶
- 지원: Function Calling
- 특징: 멀티모달 (텍스트 + 이미지)
- 장점: Google 서비스와의 통합
📝 핵심 정리¶
함수 호출의 역할¶
- LLM을 실제 세계와 연결: 정보 수집 및 행동 실행 가능
- 에이전트의 핵심 기능: 도구 없이는 에이전트 불가능
- 자동화 가능: 복잡한 다단계 작업 자동 수행
함수 호출 흐름¶
도구 정의의 중요성¶
- 명확성: LLM이 도구를 이해하는 기초
- 정확성: 올바른 매개변수 전달 가능
- 신뢰성: 예상치 못한 오용 방지
에이전트 루프¶
- 반복적 실행: 도구 호출 → 관찰 → 결정
- 적응성: 결과에 따라 다음 단계 결정
- 완성도: 작업이 완료될 때까지 계속
디버깅¶
- 로깅: 모든 단계 기록
- 단계별 추적: 각 도구 호출 모니터링
- 오류 분석: 잘못된 선택의 원인 파악
시험 포인트¶
- 함수 호출의 기본 메커니즘과 단계
- 효과적인 도구 정의의 작성
- 에이전트 루프의 흐름과 제어
- 일반적인 함수 호출 오류와 해결 방법
- 도구 인수 검증과 오류 처리
- 여러 도구의 순차 호출과 병렬 호출
- 관찰 처리와 다음 행동 결정
- 다양한 모델의 함수 호출 차이
- 실무에서의 디버깅 기법