# 7.2 예제: 계산기, 날씨 API, DB 조회기

Function Calling 기능을 통해 GPT 모델에게 구조화된 도구를 사용하게 하여 다양한 외부 기능과의 연동 기반 작업을 수행할 수 있습니다. 본 절에서는 대표적인 세 가지 연동 예제를 중심으로 Function Calling의 실전 활용을 보여드립니다.

* 계산기 (산술 연산 API)
* 날씨 조회 (외부 API 호출)
* 데이터베이스 조회기 (DB 쿼리 실행)

이 예제들은 GPT의 인공지능 능력과 구조화된 프로그래밍 호출 방식의 결합을 보여 주는 훌륭한 데모입니다.

## 7.2.1 계산기 함수 예제

가장 기본적이면서도 GPT로 수행하기에는 부정확할 수 있는 대표적인 작업이 바로 산술 연산입니다. “3.87 곱하기 12.5는 얼마야?”와 같은 질문은 언뜻 단순해 보이지만, AI 모델은 종종 부정확한 결과를 출력합니다.

### 함수 정의

계산을 위한 간단한 함수는 다음과 같이 구성됩니다:

```python
def calculate(operator: str, a: float, b: float) -> float:
    if operator == "add":
        return a + b
    elif operator == "subtract":
        return a - b
    elif operator == "multiply":
        return a * b
    elif operator == "divide" and b != 0:
        return a / b
    else:
        raise ValueError("잘못된 연산자 또는 0으로 나누기")
```

### Function Schema 정의

OpenAI API에 이 함수를 사용할 수 있도록 명세합니다.

```python
function_def = {
    "name": "calculate",
    "description": "두 숫자에 대해 지정된 사칙연산을 수행합니다.",
    "parameters": {
        "type": "object",
        "properties": {
            "operator": {
                "type": "string",
                "enum": ["add", "subtract", "multiply", "divide"],
                "description": "수행할 연산: add, subtract, multiply, divide"
            },
            "a": {
                "type": "number",
                "description": "첫 번째 숫자"
            },
            "b": {
                "type": "number",
                "description": "두 번째 숫자"
            }
        },
        "required": ["operator", "a", "b"]
    }
}
```

### GPT 호출 예시

```python
from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4",
    messages=[
        {"role": "user", "content": "128 나누기 4는 얼마야?"},
    ],
    functions=[function_def],
    function_call="auto"
)
```

GPT는 사용자의 질문을 이해하고 `calculate` 함수를 호출하도록 응답할 수 있습니다:

```json
{
  "function_call": {
    "name": "calculate",
    "arguments": "{\"operator\":\"divide\",\"a\":128,\"b\":4}"
  }
}
```

이후 해당 함수 호출 결과를 가지고 GPT에게 다시 전달하면 최종 응답이 생성됩니다.

## 7.2.2 날씨 API 연동

GPT가 실시간 정보를 알 수 없다는 가장 큰 제약을 극복하는 방법 중 하나가 Function Calling입니다. 여기서는 외부 날씨 API(OpenWeatherMap 등)를 연동해 GPT가 실시간 날씨 정보를 사용자에게 전달하도록 해보겠습니다.

### 예시: OpenWeatherMap API 호출 함수

```python
import requests

def get_weather(city: str) -> str:
    API_KEY = "YOUR_OPENWEATHERMAP_API_KEY"
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}&units=metric"
    response = requests.get(url)
    data = response.json()
    weather = data["weather"][0]["description"]
    temp = data["main"]["temp"]
    return f"{city}의 현재 날씨는 {weather}이며 기온은 {temp}°C입니다."
```

### Function Schema 정의

```python
weather_function = {
    "name": "get_weather",
    "description": "지정한 도시의 현재 날씨를 조회합니다.",
    "parameters": {
        "type": "object",
        "properties": {
            "city": {
                "type": "string",
                "description": "조회할 도시 이름 (예: Seoul, New York)"
            }
        },
        "required": ["city"]
    }
}
```

### GPT 호출 및 함수 실행 흐름

```python
response = client.chat.completions.create(
    model="gpt-4",
    messages=[
        {"role": "user", "content": "서울의 날씨 알려줘"}
    ],
    functions=[weather_function],
    function_call="auto"
)
```

GPT의 응답이 다음과 같다면:

```json
{
  "function_call": {
    "name": "get_weather",
    "arguments": "{\"city\":\"Seoul\"}"
  }
}
```

해당 함수 결과:

```python
weather_info = get_weather("Seoul")
```

결과 메시지를 GPT에게 전달:

```python
[
    {"role": "assistant", "content": None, "function_call": {...}},
    {"role": "function", "name": "get_weather", "content": weather_info}
]
```

## 7.2.3 데이터베이스 조회기 (DB 조회)

기업 내 시스템, 예컨대 고객 정보, 재고 현황, 직원 데이터 등을 GPT를 통해 조회하도록 만들 수 있습니다.

### SQLite를 활용한 예시: 사용자 이메일 조회

데이터베이스 구성 예시:

```sql
CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT,
    email TEXT
);
```

샘플 데이터:

```sql
INSERT INTO users (name, email)
VALUES ('홍길동', 'hong@example.com'), ('김영희', 'kim@example.com');
```

파이썬 함수:

```python
import sqlite3

def get_user_email(name: str) -> str:
    conn = sqlite3.connect("users.db")
    cursor = conn.cursor()
    cursor.execute("SELECT email FROM users WHERE name=?", (name,))
    result = cursor.fetchone()
    conn.close()
    if result:
        return f"{name}님의 이메일은 {result[0]}입니다."
    else:
        return f"{name}님을 찾을 수 없습니다."
```

### Function Schema 정의

```python
db_function = {
    "name": "get_user_email",
    "description": "사용자의 이름을 기반으로 이메일 주소를 조회합니다.",
    "parameters": {
        "type": "object",
        "properties": {
            "name": {
                "type": "string",
                "description": "이메일을 조회할 사람의 이름"
            }
        },
        "required": ["name"]
    }
}
```

### GPT 호출 및 워크플로우

```python
response = client.chat.completions.create(
    model="gpt-4",
    messages=[
        {"role": "user", "content": "김영희님의 이메일 주소가 뭐야?"}
    ],
    functions=[db_function],
    function_call="auto"
)
```

GPT가 다음과 같이 응답하면:

```json
{
  "function_call": {
    "name": "get_user_email",
    "arguments": "{\"name\":\"김영희\"}"
  }
}
```

이를 함수로 처리:

```python
email = get_user_email("김영희")
```

이후 메시지 흐름에 결과 연결:

```python
[
    {"role": "assistant", "content": None, "function_call": {...}},
    {"role": "function", "name": "get_user_email", "content": email}
]
```

## 마무리 및 확장 아이디어

Function Calling은 GPT가 내부 “지식 기반”이 아닌 “외부 도구나 데이터”와 실시간으로 상호작용하는 인터페이스를 제공합니다.

| use case  | 사용 도구                  | 활용 포인트       |
| --------- | ---------------------- | ------------ |
| 계산기       | 내부 정의된 연산 함수           | 정확성 높이기      |
| 날씨        | 외부 API(OpenWeatherMap) | 실시간 외부 정보 연동 |
| 데이터베이스 조회 | SQLite, SQLAlchemy 등   | 기업 전산시스템 통합  |

추가적으로 Function Calling은 다음과 같은 방향으로 확장될 수 있습니다:

* 검색 엔진과 연동하여 최신 정보 전달
* ERP, CRM 시스템과 연결
* 금융 데이터 실시간 조회기 구현
* 사용자 맞춤형 추천 시스템

이 기능은 AI를 하나의 ‘스마트 허브’로 진화시키는 강력한 통로입니다.

다음 절에서는 이 Function Calling 기술과 JSON Mode를 결합하여 구조화된 응답을 강제하는 방법에 대해 설명하겠습니다.
