[실무 강의] ChatGPT 함수 호출(Tool Use)로 실시간 웹 정보 연동 자동화 스크립트 만들기 완벽 마스터 튜토리얼

[학습 목표]

안녕하십니까. 2026년 현재, 우리는 인공지능 기술의 급변하는 흐름 속에서 그 잠재력을 최대한 활용하는 방법을 끊임없이 모색하고 있습니다. 본 강의는 ChatGPT의 강력한 ‘함수 호출(Function Calling)’ 또는 ‘Tool Use’ 기능을 활용하여 실시간 웹 정보를 자동으로 연동하고 처리하는 스크립트를 직접 구축하는 것을 목표로 합니다. 이 과정을 통해 여러분은 단순히 LLM(Large Language Model)을 사용하는 것을 넘어, LLM이 외부 세계와 상호작용하며 특정 작업을 자동화하는 원리와 실질적인 구현 방법을 완벽하게 마스터하게 될 것입니다.

  • ChatGPT 함수 호출(Tool Use)의 개념과 동작 원리를 정확히 이해합니다.
  • 파이썬을 사용하여 외부 웹 데이터를 실시간으로 가져오는 커스텀 도구(Tool)를 정의하고 구현합니다.
  • ChatGPT API와 연동하여 정의된 도구를 호출하고 그 결과를 바탕으로 복잡한 질의에 응답하는 자동화 스크립트를 개발합니다.
  • 실제 비즈니스 및 개인 생산성 향상을 위한 LLM 기반 자동화 시스템 구축의 기초를 다집니다.
  • 오픈소스 라이브러리(requests, BeautifulSoup)를 활용한 웹 스크래핑 기법을 익힙니다.

이 강의를 마치면, 여러분은 ChatGPT가 단순한 챗봇을 넘어 강력한 자동화 에이전트로서 어떻게 기능할 수 있는지에 대한 깊이 있는 통찰력과 함께, 실제 애플리케이션 개발에 필요한 실용적인 기술을 갖추게 될 것입니다.

[사전 준비 사항]

본 실습을 원활하게 진행하기 위해 다음 환경 설정을 권장합니다. 안정적인 개발 환경은 실습 성공의 핵심입니다.

  • 통합 개발 환경(IDE): Visual Studio Code (최신 안정 버전)
  • 운영 체제(OS): Windows 10/11, macOS Ventura 이상, 또는 Ubuntu 22.04 LTS 이상
  • 파이썬(Python) 버전: 3.9 이상 (권장: 3.10 또는 3.11). 가상 환경(venv) 사용을 강력히 권장합니다.
  • 필수 설치 라이브러리: 터미널 또는 명령 프롬프트에서 다음 명령어를 실행하여 필요한 라이브러리를 설치합니다.
pip install openai python-dotenv requests beautifulsoup4

각 라이브러리의 역할은 다음과 같습니다:

  • openai: OpenAI API와 상호작용하기 위한 공식 파이썬 라이브러리입니다.
  • python-dotenv: 환경 변수를 .env 파일에서 로드하여 API 키와 같은 민감 정보를 안전하게 관리하는 데 사용됩니다.
  • requests: HTTP 요청을 쉽게 보낼 수 있도록 해주는 라이브러리입니다. 웹 페이지의 HTML 내용을 가져오는 데 사용됩니다.
  • beautifulsoup4: HTML 및 XML 파일에서 데이터를 파싱(parsing)하고 추출하는 데 특화된 라이브러리입니다. 웹 스크래핑의 핵심 도구입니다.

이 모든 준비가 완료되었다면, 이제 본격적인 실습을 시작할 준비가 된 것입니다.

[단계별 실습 과정]

1단계: 프로젝트 환경 설정 및 필수 라이브러리 설치

먼저, 프로젝트를 위한 새로운 디렉터리를 생성하고 그 안에서 파이썬 가상 환경을 활성화합니다. 이는 프로젝트별 의존성 관리를 용이하게 하고 시스템 전역 파이썬 환경을 오염시키지 않는 모범 사례입니다.

mkdir chatgpt_tool_use_web_automation
cd chatgpt_tool_use_web_automation
python -m venv venv
# Windows
.\venv\Scripts\activate
# macOS/Linux
source venv/bin/activate

가상 환경이 활성화되면, 앞서 언급한 필수 라이브러리들을 설치합니다.

pip install openai python-dotenv requests beautifulsoup4

설치가 완료되면, 프로젝트의 기본 골격이 갖춰진 것입니다.

2단계: OpenAI API 키 설정

OpenAI API를 사용하기 위해서는 API 키가 필요합니다. 이 키는 민감한 정보이므로 코드 내에 직접 하드코딩하는 대신, 환경 변수로 관리하는 것이 보안상 안전합니다. 프로젝트 루트 디렉터리에 .env 파일을 생성하고 다음과 같이 API 키를 입력합니다.

OPENAI_API_KEY="YOUR_OPENAI_API_KEY_HERE"

YOUR_OPENAI_API_KEY_HERE 부분은 여러분의 실제 OpenAI API 키로 대체해야 합니다. OpenAI 웹사이트에서 발급받을 수 있습니다. 이 .env 파일은 Git과 같은 버전 관리 시스템에 업로드되지 않도록 .gitignore 파일에 추가하는 것이 좋습니다.

3단계: 실시간 웹 정보 연동을 위한 도구(Tool) 정의

이제 ChatGPT가 호출할 수 있는 사용자 정의 도구를 파이썬 함수로 구현할 차례입니다. 이 도구는 특정 웹사이트에서 실시간 정보를 가져오는 역할을 수행할 것입니다. 여기서는 간단한 예시로 특정 검색어에 대한 뉴스 기사 제목과 링크를 가져오는 함수를 만들어 보겠습니다. main.py 파일을 생성하고 다음 코드를 추가합니다.

import requests
from bs4 import BeautifulSoup

def get_naver_news_headlines(query: str) -> str:
    """
    네이버 뉴스에서 특정 검색어에 대한 최신 기사 제목과 링크를 가져옵니다.
    Args:
        query (str): 검색할 키워드.
    Returns:
        str: 검색 결과로 찾은 기사들의 제목과 링크를 포함하는 문자열. 
             결과가 없으면 '검색 결과가 없습니다.'를 반환합니다.
    """
    if not query:
        return "검색어가 비어있습니다."

    base_url = "https://search.naver.com/search.naver"
    params = {
        'where': 'news',
        'query': query,
        'sm': 'tab_opt',
        'sort': '0' # 관련도순 (최신순은 '1')
    }

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }

    try:
        response = requests.get(base_url, params=params, headers=headers, timeout=5)
        response.raise_for_status() # HTTP 오류 발생 시 예외 발생
        
        soup = BeautifulSoup(response.text, 'html.parser')
        news_items = soup.select('div.news_area') # 네이버 뉴스 검색 결과 영역
        
        results = []
        for item in news_items[:5]: # 상위 5개 기사만 가져옵니다.
            title_tag = item.select_one('a.news_tit')
            link_tag = item.select_one('a.news_tit')
            
            if title_tag and link_tag:
                title = title_tag.get_text(strip=True)
                link = link_tag['href']
                results.append(f"- {title}: {link}")

        if not results:
            return f"'{query}'에 대한 뉴스 검색 결과가 없습니다."
        
        return "\n".join(results)

    except requests.exceptions.RequestException as e:
        return f"웹 요청 중 오류 발생: {e}"
    except Exception as e:
        return f"뉴스 정보를 가져오는 중 오류 발생: {e}"

get_naver_news_headlines 함수는 requests를 이용해 네이버 뉴스 검색 페이지에 HTTP 요청을 보내고, BeautifulSoup으로 응답받은 HTML을 파싱하여 기사 제목과 링크를 추출합니다. 실제 서비스에서는 더 견고한 웹 스크래핑 로직이 필요할 수 있지만, 본 강의에서는 개념 이해에 초점을 맞춥니다.

4단계: ChatGPT 함수 호출을 활용한 자동화 스크립트 작성

이제 OpenAI API와 연동하여 우리가 정의한 도구를 ChatGPT가 적절하게 호출하도록 스크립트를 작성합니다. main.py 파일에 다음 코드를 추가합니다.

import os
from dotenv import load_dotenv
from openai import OpenAI # 최신 OpenAI 라이브러리 사용
import json

# .env 파일에서 환경 변수 로드
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# OpenAI 클라이언트 초기화
client = OpenAI(api_key=OPENAI_API_KEY)

# 우리가 정의한 도구에 대한 스키마 정의
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_naver_news_headlines",
            "description": "네이버 뉴스에서 특정 검색어에 대한 최신 기사 제목과 링크를 가져옵니다.",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "description": "검색할 키워드 (예: '인공지능', '주식 시장', '2026년 경제 전망')"
                    }
                },
                "required": ["query"]
            }
        }
    }
]

def run_conversation():
    messages = [
        {"role": "system", "content": "당신은 사용자의 질문에 답변하기 위해 필요한 경우 도구를 사용하는 유능한 어시스턴트입니다. 항상 최신 정보를 활용하여 답변하려고 노력하세요."},
        {"role": "user", "content": "2026년 현재, 인공지능 관련 최신 뉴스 기사 몇 개를 알려줘."}
    ]

    # 1차 API 호출: 사용자 질문과 도구 목록 전달
    response = client.chat.completions.create(
        model="gpt-4o", # 또는 "gpt-3.5-turbo"
        messages=messages,
        tools=tools,
        tool_choice="auto" # 모델이 필요하다고 판단하면 도구를 호출
    )

    response_message = response.choices[0].message
    tool_calls = response_message.tool_calls

    # 모델이 도구 호출을 요청했는지 확인
    if tool_calls:
        print("\n[ChatGPT가 도구 호출을 요청했습니다...]\n")
        # 메시지에 모델의 도구 호출 요청 추가
        messages.append(response_message)
        
        # 도구 호출 실행
        available_functions = {
            "get_naver_news_headlines": get_naver_news_headlines,
        }
        
        for tool_call in tool_calls:
            function_name = tool_call.function.name
            function_to_call = available_functions[function_name]
            function_args = json.loads(tool_call.function.arguments)
            
            # 정의된 파이썬 함수 실행
            function_response = function_to_call(
                query=function_args.get("query")
            )
            
            print(f"[도구 '{function_name}' 실행 결과:]\n{function_response}\n")
            
            # 도구 실행 결과를 메시지에 추가
            messages.append(
                {
                    "tool_call_id": tool_call.id,
                    "role": "tool",
                    "name": function_name,
                    "content": function_response,
                }
            )
        
        # 2차 API 호출: 도구 실행 결과를 포함하여 다시 모델에 전달
        second_response = client.chat.completions.create(
            model="gpt-4o", # 또는 "gpt-3.5-turbo"
            messages=messages
        )
        print("\n[ChatGPT의 최종 답변:]\n")
        return second_response.choices[0].message.content
    else:
        # 도구 호출 없이 바로 답변하는 경우
        print("\n[ChatGPT의 답변 (도구 미사용):]\n")
        return response_message.content

if __name__ == "__main__":
    final_answer = run_conversation()
    print(final_answer)

이 스크립트는 다음과 같은 흐름으로 작동합니다.

  1. 사용자 질문을 messages 리스트에 추가합니다.
  2. client.chat.completions.create를 호출할 때, 정의된 tools 리스트를 함께 전달합니다. tool_choice="auto"는 모델이 필요하다고 판단할 때 도구를 호출하도록 합니다.
  3. 모델이 도구 호출을 결정하면, 응답에 tool_calls가 포함됩니다. 이 정보를 바탕으로 실제 파이썬 함수(예: get_naver_news_headlines)를 실행합니다.
  4. 실행된 도구의 결과(웹 스크래핑 데이터)를 다시 messages 리스트에 추가하고, role="tool"로 지정하여 모델에 다시 보냅니다.
  5. 모델은 도구의 결과를 바탕으로 최종 답변을 생성하여 반환합니다.

5단계: 스크립트 실행 및 결과 분석

이제 작성된 스크립트를 실행하여 ChatGPT가 어떻게 실시간 웹 정보를 활용하는지 확인해볼 차례입니다. 터미널에서 다음 명령어를 실행합니다.

python main.py

스크립트가 실행되면, 터미널에는 ChatGPT가 도구를 호출하는 과정과 그 결과, 그리고 최종적으로 ChatGPT가 생성한 답변이 순서대로 출력될 것입니다. 여러분은 ‘인공지능 관련 최신 뉴스 기사 몇 개를 알려줘’라는 질문에 대해, ChatGPT가 get_naver_news_headlines 함수를 호출하고, 그 결과를 바탕으로 실제 네이버 뉴스 기사들을 요약하거나 목록으로 제공하는 것을 볼 수 있을 것입니다.

[결과 확인]

스크립트 실행 후, 여러분의 터미널에는 다음과 유사한 출력이 나타나야 합니다. 가장 중요한 것은 ChatGPT가 사용자의 요청을 이해하고, 정의된 get_naver_news_headlines 도구를 정확한 인자(query='인공지능')와 함께 호출했는지, 그리고 그 도구의 실행 결과(네이버 뉴스 기사 목록)를 바탕으로 최종적인 답변을 생성했는지 여부입니다.

[ChatGPT가 도구 호출을 요청했습니다...][도구 'get_naver_news_headlines' 실행 결과:]- 인공지능 신약 개발 '퀀텀 점프'…글로벌 시장 노린다: https://...- [단독] 삼성전자, 인공지능 기반 '온디바이스 통역' 특허 출원: https://...- 챗GPT, 인공지능 넘어 차세대 반도체 시장까지 점령하나: https://...- 2026년, 인공지능이 바꿀 세상…산업 전반의 변화 예측: https://...- 인공지능, 데이터 보안의 새로운 지평을 열다: https://...[ChatGPT의 최종 답변:]2026년 현재, 인공지능 관련 최신 뉴스 기사 몇 가지를 알려드리겠습니다:*   인공지능 신약 개발 '퀀텀 점프'…글로벌 시장 노린다: 인공지능 기술이 신약 개발 과정에 혁신을 가져오며 글로벌 시장에서 경쟁력을 강화하고 있다는 소식입니다. (링크: https://...)*   [단독] 삼성전자, 인공지능 기반 '온디바이스 통역' 특허 출원: 삼성전자가 디바이스 자체에서 AI 통역을 처리하는 온디바이스 AI 기술 관련 특허를 출원하여 기술 선도에 박차를 가하고 있습니다. (링크: https://...)*   챗GPT, 인공지능 넘어 차세대 반도체 시장까지 점령하나: 챗GPT와 같은 대규모 AI 모델의 등장이 반도체 산업에 미치는 영향과 차세대 반도체 시장의 변화에 대한 분석입니다. (링크: https://...)*   2026년, 인공지능이 바꿀 세상…산업 전반의 변화 예측: 인공지능이 2026년 이후 다양한 산업 분야에 가져올 변화와 미래 전망에 대한 기사입니다. (링크: https://...)*   인공지능, 데이터 보안의 새로운 지평을 열다: 인공지능 기술이 데이터 보안 분야에서 새로운 해결책을 제시하며, 보안 위협에 대응하는 방식이 진화하고 있다는 내용입니다. (링크: https://...)이처럼 ChatGPT는 외부 도구를 활용하여 실시간 정보를 가져와 사용자에게 유용한 답변을 제공할 수 있습니다. 이는 단순한 텍스트 생성 모델을 넘어, 실제 세계와 상호작용하는 강력한 에이전트로서의 가능성을 보여줍니다.

댓글 남기기