Gemini 2.5 Pro 실전 사용 리뷰 — ChatGPT와 다른 3가지 포인트
Gemini 2.5 Pro를 3주 동안 메인 AI로 써봤어요. ChatGPT에서 건너온 사람이 꼭 알아야 할 차이점 3가지를 실제 예시로 정리했어요.
AI 기술을 누구나 쉽게 활용할 수 있도록 실전 가이드를 작성합니다. ChatGPT, Claude, AI 자동화, SEO 분야를 전문으로 다룹니다.
📋 목차
AI 애플리케이션이나 챗봇을 개발하면서, 학습 데이터만으로는 한계를 느끼신 적 많으실 겁니다. 최신 실시간 정보나 외부 서비스와의 매끄러운 연동이 절실할 때가 그렇죠. 예를 들어, 고객에게 바로 지금의 날씨를 알려주거나, 특정 상품의 실시간 재고를 조회해야 한다면? 기존 모델만으로는 이런 복합적인 기능을 처리하기 어렵습니다.
바로 이때, Gemini API의 함수 호출(Function Calling) 기능이 강력한 해결책이 됩니다. 본 가이드에서는 Gemini 모델이 어떻게 외부 도구와 '지능적으로 소통'하며 기능을 혁신적으로 확장하는지, 그 실전 노하우를 단계별로 상세히 안내해 드리겠습니다.
Gemini API의 함수 호출은 AI 모델이 개발자가 미리 정의한 외부 함수나 API를 마치 사람처럼 '요청'하고 '실행'할 수 있게 하는 혁신적인 메커니즘입니다. 모델은 사용자의 대화 맥락을 깊이 이해하여 외부 도구가 필요한 순간을 정확히 판단하고, 해당 도구의 호출 스펙을 구조화된 형태로 개발자에게 '능동적으로' 제안합니다.
이 모든 과정은 크게 다음 다섯 단계로 이루어집니다.

Gemini Function Calling은 AI 애플리케이션의 잠재력을 혁신적으로 끌어올립니다. 모델이 단순히 학습된 지식에만 의존하는 것을 넘어, 실시간으로 외부 세계와 능동적으로 '소통'하고 상호작용할 수 있도록 돕기 때문입니다.
결론적으로, 이 기능은 실시간 정보를 제공하는 스마트 챗봇, 외부 시스템을 능숙하게 제어하는 AI 에이전트, 그리고 복잡한 비즈니스 워크플로우를 혁신적으로 자동화하려는 모든 개발자에게 필수적인 강력한 무기가 될 것입니다.
이제 Python SDK를 활용하여 Gemini API 함수 호출 기능을 여러분의 애플리케이션에 적용하는 구체적인 단계를 자세히 살펴보겠습니다. 본 가이드에서는 Google Generative AI 라이브러리(google-generativeai)를 사용합니다.
가장 먼저, AI 모델이 '이해하고' 호출할 수 있도록 외부 함수에 대한 명확한 스키마를 정의해야 합니다. 이 스키마에는 함수의 이름, 기능에 대한 상세한 설명, 그리고 호출에 필요한 매개변수 정보가 담깁니다. 모델은 이 설명을 바탕으로 특정 상황에서 어떤 함수를 어떤 매개변수와 함께 호출할지 정확히 판단합니다.
예를 들어, 현재 날씨를 가져오는 get_current_weather 함수를 정의해 보겠습니다.
import google.generativeai as glm
# 호출할 함수를 정의합니다.
def get_current_weather(location: str, unit: str = "celsius") -> str:
"""
지정된 위치의 현재 날씨 정보를 반환합니다.
Args:
location: 날씨를 알고 싶은 도시 또는 지역 이름. (예: "서울", "도쿄")
unit: 온도의 단위. "celsius" (섭씨) 또는 "fahrenheit" (화씨) 중 하나. 기본값은 "celsius".
Returns:
현재 날씨에 대한 설명을 포함하는 문자열.
"""
if location == "서울":
if unit == "celsius":
return "서울의 현재 날씨는 맑고 기온은 25도(섭씨)입니다."
else:
return "서울의 현재 날씨는 맑고 기온은 77도(화씨)입니다."
elif location == "부산":
return "부산은 흐리고 비가 오며 기온은 20도(섭씨)입니다."
else:
return "해당 지역의 날씨 정보를 찾을 수 없습니다."
# 모델에 전달할 함수 스키마를 정의합니다.
weather_tool = glm.Tool(
function_declarations=[
glm.FunctionDeclaration(
name="get_current_weather",
description="지정된 위치의 현재 날씨 정보를 반환합니다.",
parameters=glm.Schema(
type=glm.Type.OBJECT,
properties={
"location": glm.Schema(type=glm.Type.STRING, description="날씨를 알고 싶은 도시 또는 지역 이름"),
"unit": glm.Schema(type=glm.Type.STRING, description="온도의 단위: 'celsius' 또는 'fahrenheit'", enum=["celsius", "fahrenheit"]),
},
required=["location"],
),
)
]
)
이 weather_tool 객체는 get_current_weather 함수에 대한 모델의 이해를 돕는 역할을 합니다.
이제 우리가 정의한 툴 스키마를 Gemini 모델에 전달하고, 대화를 시작할 차례입니다. 모델은 이 툴 정보를 기반으로 대화의 흐름 속에서 언제 어떤 함수를 호출해야 할지 스스로 판단합니다.
import os
# API 키 설정 (실제 환경에서는 환경 변수 사용 권장)
# os.environ["GOOGLE_API_KEY"] = "YOUR_API_KEY"
glm.configure(api_key=os.environ["GOOGLE_API_KEY"])
# Gemini 모델 초기화 및 함수(tool) 등록
model = glm.GenerativeModel('gemini-pro', tools=[weather_tool])
chat = model.start_chat()
함수 설명(description)과 각 매개변수 설명(description)을 최대한 명확하고 구체적으로 작성하는 것이 핵심입니다. 그래야 모델이 함수를 정확하게 이해하고 올바르게 호출할 확률이 비약적으로 높아집니다. 어떤 상황에서 이 함수를 사용해야 하는지, 각 매개변수가 무엇을 의미하며 어떤 값을 기대하는지 상세하게 작성할수록 좋습니다.
사용자가 질문하면, 모델은 단순히 텍스트 응답 대신, 상황에 맞는 '함수 호출'을 제안할 수 있습니다. 우리는 모델의 응답을 세심하게 확인하여 함수 호출이 포함되어 있는지 검사하고, 만약 있다면 해당 호출 정보를 정확히 추출해야 합니다.
user_question = "서울 날씨 어때?"
response = chat.send_message(user_question)
# 모델의 응답 확인
if response.candidates[0].content.parts[0].function_call:
function_call = response.candidates[0].content.parts[0].function_call
function_name = function_call.name
function_args = function_call.args
print(f"모델이 함수 호출을 제안합니다: {function_name} with args {function_args}")
# 예시 출력: 모델이 함수 호출을 제안합니다: get_current_weather with args {'location': '서울'}
elif response.text:
print(f"모델의 응답: {response.text}")
else:
# 에러 처리 또는 추가 로깅 (예: 후보 응답이 없는 경우)
print("모델 응답에 텍스트나 함수 호출이 없습니다.")
모델이 제안한 함수 이름과 인자를 바탕으로 실제 Python 함수(예: get_current_weather 등)를 실행합니다. 그리고 이 실행을 통해 얻은 결과를 다시 모델에 전달하여 대화의 맥락을 매끄럽게 이어갑니다.
if function_name == "get_current_weather":
# 실제 get_current_weather 함수 실행
weather_info = get_current_weather(**function_args)
print(f"함수 실행 결과: {weather_info}")
# 실행 결과를 모델에 다시 전달
response = chat.send_message(
glm.ToolOutput(
tool_code=[
glm.ToolCode(
name=function_name,
result=weather_info
)
]
)
)
# 예시 출력: 함수 실행 결과: 서울의 현재 날씨는 맑고 기온은 25도(섭씨)입니다.
외부 API 호출 시 네트워크 지연이나 예측 불가능한 오류가 발생할 수 있다는 점을 항상 염두에 두어야 합니다. 실제 프로덕션 환경에서는 반드시 try-except 블록을 활용하여 외부 함수 실행 중 발생할 수 있는 모든 예외를 견고하게 처리하는 로직을 추가해야 합니다. 또한, 민감한 API 키 관리 등 보안 측면에도 각별히 신경 써야 합니다.
함수 실행 결과라는 핵심 정보를 전달받은 모델은 이제 이 모든 맥락을 종합하여 사용자에게 가장 자연스럽고 완벽한 최종 답변을 생성합니다.
# 최종 응답 출력
print(f"모델의 최종 응답: {chat.last.text}")
# 예시 출력: 모델의 최종 응답: 서울의 현재 날씨는 맑고 기온은 25도(섭씨)입니다.

이제 위에서 배운 모든 단계를 조합하여 실제 비즈니스 시나리오를 가정한 '주식 정보 조회 챗봇'을 함께 만들어 보겠습니다. 가상의 get_stock_price 함수를 사용해 특정 주식 종목의 현재 가격을 조회하는 실용적인 상황을 예로 들어보죠.
import google.generativeai as glm
import os
glm.configure(api_key=os.environ["GOOGLE_API_KEY"])
# 1. 호출할 함수 정의
def get_stock_price(symbol: str) -> float:
"""
지정된 주식 종목의 현재 가격을 반환합니다.
Args:
symbol: 주식 종목 코드 또는 이름. (예: "AAPL", "삼성전자")
Returns:
현재 주식 가격 (실제로는 외부 API에서 가져와야 함).
"""
stock_prices = {
"삼성전자": 85000,
"SK하이닉스": 170000,
"LG전자": 95000,
"AAPL": 175.50,
"GOOG": 150.20
}
return stock_prices.get(symbol, -1) # -1은 찾을 수 없을 때
# 모델에 전달할 함수 스키마 정의
stock_tool = glm.Tool(
function_declarations=[
glm.FunctionDeclaration(
name="get_stock_price",
description="지정된 주식 종목의 현재 가격을 반환합니다.",
parameters=glm.Schema(
type=glm.Type.OBJECT,
properties={
"symbol": glm.Schema(type=glm.Type.STRING, description="주식 종목 코드 또는 이름"),
},
required=["symbol"],
),
)
]
)
# 2. Gemini 모델에 함수 등록 및 대화 시작
model = glm.GenerativeModel('gemini-pro', tools=[stock_tool])
chat = model.start_chat()
# 사용자 질문
user_question_1 = "삼성전자 주가 알려줘."
print(f"사용자: {user_question_1}")
# 3. 모델의 응답 확인 (함수 호출 제안)
response_1 = chat.send_message(user_question_1)
if response_1.candidates[0].content.parts[0].function_call:
function_call = response_1.candidates[0].content.parts[0].function_call
function_name = function_call.name
function_args = function_call.args
print(f"모델 (함수 호출 제안): {function_name} with args {function_args}")
# 4. 실제 함수 실행 및 결과 반환
if function_name == "get_stock_price":
stock_price = get_stock_price(**function_args)
print(f"함수 실행 결과: {stock_price}")
response_2 = chat.send_message(
glm.ToolOutput(
tool_code=[
glm.ToolCode(
name=function_name,
result=stock_price
)
]
)
)
# 5. 모델의 최종 답변 받기
print(f"AI 챗봇: {chat.last.text}")
# 예상 출력: AI 챗봇: 삼성전자 주식은 현재 85000원입니다.
else:
print(f"AI 챗봇: 알 수 없는 함수 호출입니다: {function_name}")
else:
print(f"AI 챗봇: {response_1.text}")
print("\n----------------------------------\n")
# 다른 질문 예시 (함수 호출이 필요 없는 경우)
user_question_2 = "오늘 날씨는 어때?"
print(f"사용자: {user_question_2}")
response_3 = chat.send_message(user_question_2)
if response_3.candidates[0].content.parts[0].function_call:
print(f"모델 (함수 호출 제안): {response_3.candidates[0].content.parts[0].function_call.name}")
else:
print(f"AI 챗봇: {response_3.text}")
# 예상 출력: AI 챗봇: 죄송합니다. 저는 현재 날씨 정보를 직접 제공할 수 없습니다.
이 예제 코드는 기능을 이해하기 쉽게 간략화한 것입니다. 실제 운영 환경에서는 API 키 보안 관리, 상세한 에러 로깅, 성능 최적화 등 훨씬 더 많은 추가 고려 사항이 필요합니다. 또한, 외부 데이터 소스와의 연동은 반드시 실제 API 호출 로직으로 대체되어야 합니다.

Gemini API의 함수 호출은 분명 강력하고 혁신적인 기능이지만, 이를 완벽히 활용하려면 반드시 이해하고 대비해야 할 몇 가지 한계점과 주의사항이 있습니다.
description)을 최대한 명확하고 상세하게 작성하고, 모델의 호출 제안에 대한 철저한 유효성 검사 로직을 추가하는 것이 핵심입니다. 더 깊이 이해하고 싶다면, AI 챗봇의 비정상적인 답변(환각) 줄이기 방법을 참고해볼 수 있습니다.send_message를 호출하게 되어 토큰 사용량이 자연스럽게 늘어날 수 있습니다. 게다가 외부 API 호출 자체에도 비용이 발생할 수 있으므로, 불필요한 비용 발생을 막으려면 사용량과 비용을 면밀히 모니터링해야 합니다.Gemini API의 함수 호출 기능은 AI 애플리케이션의 가능성을 무한히 넓혀주는 강력한 도구이지만, 위에서 언급된 한계점과 주의사항들을 충분히 이해하고 철저히 대비하는 것이 무엇보다 중요합니다. 특히 보안과 오류 처리에 있어서는 그 어떤 타협도 없이 각별히 신경 써야 합니다.
결론적으로, Gemini API의 함수 호출(Function Calling) 기능은 AI 모델이 외부 시스템과 유기적으로 연동하며 기능을 혁신적으로 확장하도록 돕는 매우 강력한 핵심 도구입니다. 이 기능을 능숙하게 활용하면 챗봇이 실시간 정보를 정확히 조회하고, 외부 서비스를 유연하게 제어하며, 심지어 복잡한 비즈니스 프로세스까지 지능적으로 자동화할 수 있습니다. 초기 설정과 구현에 면밀한 주의가 필요하지만, 이를 통해 여러분의 AI 애플리케이션은 기존의 한계를 넘어 무궁무진한 활용 가능성을 열어줄 것입니다.
지금 바로 Gemini API의 함수 호출 기능을 직접 구현해보고, 여러분의 AI 애플리케이션을 다음 단계로 과감히 발전시켜 보세요! 이 강력한 도구로 AI의 새로운 지평을 열어가시길 바랍니다.
개발자는 모델이 제안한 함수를 실행할 때 발생할 수 있는 네트워크 오류, API 응답 오류 등을 대비해야 합니다. 실행 중 예외가 발생하면 이를 적절히 처리하고, 모델에 실패 또는 에러 메시지를 다시 전달하여 사용자에게 상황을 알리거나 다른 대안을 제시할 수 있도록 설계하는 것이 중요합니다. 경우에 따라 재시도 로직을 구현하거나 사용자에게 다른 질문을 유도할 수도 있습니다.
모델이 제안한 함수를 실행하기 전, 매개변수 값의 유효성을 검증하여 악의적인 입력을 차단해야 합니다. 또한, 외부 API 키나 민감한 정보는 안전하게 관리하고, 함수 호출로 접근하는 외부 시스템에 대한 접근 권한을 최소한으로 설정하는 것이 좋습니다. 입력 값 검증 및 권한 관리가 중요합니다.
Gemini 모델은 제공된 함수 스키마와 대화 맥락을 기반으로 가장 적합한 함수를 하나 제안하려고 시도합니다. 만약 여러 함수가 유사하게 적합하다면 모델의 내부 추론에 따라 하나를 선택할 수 있으며, 개발자는 이를 검토해야 합니다. 어떤 함수와도 명확히 일치하지 않으면 모델은 함수 호출을 제안하지 않고 일반적인 텍스트 응답을 생성하거나 추가 질문을 할 수 있습니다.
네, 함수 호출 기능은 모델이 함수를 제안하고, 개발자가 외부 함수를 실제로 실행한 후 그 결과를 다시 모델에 전달하는 일련의 과정을 거치기 때문에 일반적인 텍스트 생성보다 응답 시간이 길어질 수 있습니다. 외부 API의 응답 속도, 네트워크 지연, 함수 실행 로직의 복잡성 등이 전체 응답 시간에 영향을 미칩니다. 효율적인 함수 설계와 빠른 외부 시스템 연동이 중요합니다.
Gemini API의 함수 호출 자체에 대한 별도의 추가 요금은 일반적으로 없습니다. 하지만 함수 호출 과정에서 사용되는 모델의 입력(프롬프트, 함수 스키마) 및 출력(함수 호출 제안, 최종 응답) 토큰에 대해 Gemini 모델 사용량에 따른 표준 요금이 부과됩니다. 또한, 호출되는 외부 API나 서비스에 따라 해당 서비스의 요금이 발생할 수 있습니다.
모델은 개발자가 정의한 JSON 스키마를 바탕으로 함수와 매개변수를 이해합니다. 스키마가 명확하고 상세할수록 모델의 이해도가 높아지지만, 복잡하거나 모호한 설명의 경우 매개변수를 잘못 해석할 가능성이 있습니다. 존재하지 않는 함수를 제안하는 경우는 드물지만, 드물게 모델의 추론 오류로 인해 정의되지 않은 함수명을 제안할 수도 있습니다. 명확하고 구체적인 함수 설명을 제공하는 것이 중요합니다.