๊ตฌ๊ธ AI ์คํ๋์ค API ํค ๋ฐ๊ธ: 2024๋ ์ต์ ๊ฐ์ด๋ โ
๊ตฌ๊ธ AI ์คํ๋์ค์์ Gemini API ํค ๋ฐ๊ธ ๊ณผ์ ์ 2024๋ ์ต์ UI ๊ธฐ์ค์ผ๋ก ์ฝ๊ณ ๋ช ํํ๊ฒ ๋จ๊ณ๋ณ ์๋ดํฉ๋๋ค.
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 ์คํค๋ง๋ฅผ ๋ฐํ์ผ๋ก ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ดํดํฉ๋๋ค. ์คํค๋ง๊ฐ ๋ช ํํ๊ณ ์์ธํ ์๋ก ๋ชจ๋ธ์ ์ดํด๋๊ฐ ๋์์ง์ง๋ง, ๋ณต์กํ๊ฑฐ๋ ๋ชจํธํ ์ค๋ช ์ ๊ฒฝ์ฐ ๋งค๊ฐ๋ณ์๋ฅผ ์๋ชป ํด์ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์กด์ฌํ์ง ์๋ ํจ์๋ฅผ ์ ์ํ๋ ๊ฒฝ์ฐ๋ ๋๋ฌผ์ง๋ง, ๋๋ฌผ๊ฒ ๋ชจ๋ธ์ ์ถ๋ก ์ค๋ฅ๋ก ์ธํด ์ ์๋์ง ์์ ํจ์๋ช ์ ์ ์ํ ์๋ ์์ต๋๋ค. ๋ช ํํ๊ณ ๊ตฌ์ฒด์ ์ธ ํจ์ ์ค๋ช ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.