지난 글에서는 RAG(Retrieval-Augmented Generation)을 통해 LLM이 가진 최신성이나 전문성 같은 한계를 극복하는 방법을 살펴봤습니다. RAG은 필요한 정보를 문서에서 찾아 참고하는 방식으로, 모델 자체의 한계를 효과적으로 해결할 수 있었죠.
그런데 단순히 정보를 참조하는 방식을 넘어, 실제로 LLM이 다양한 외부 기능이나 도구를 직접 활용하여 더 많은 작업을 수행할 수 있다면 어떨까요?
이번 글에서는 Tool(도구)이라는 개념이 무엇이고, LLM이 왜 이런 Tool을 직접 활용할 수 있어야 하는지에 대해서 구체적으로 살펴보고, 이런 Tool을 LLM이 실제로 사용할 수 있게 해주는 OpenAI의 함수 호출(Function Calling) 기능까지 자연스럽게 설명해 보겠습니다.
1. Tool(도구)이란 무엇인가?
- Tool(도구)은 쉽게 말해, LLM이 스스로 처리하기 어려운 작업을 대신 처리하거나, LLM의 능력을 보완하기 위해 사용하는 외부 기능을 의미합니다.
기본적으로 LLM은 언어 모델이기 때문에 아래와 같은 작업에서 명확한 한계가 있습니다.
- 최신의 실시간 정보를 얻는 것
- 정확한 계산이나 복잡한 분석 작업
- 사용자 개인의 데이터를 바탕으로 개인화된 정보를 제공하는 작업
- 사용자의 요청을 실제 행동으로 수행하는 작업
이런 한계를 극복하기 위해 LLM이 직접 사용할 수 있는 다양한 Tool이 필요합니다.
2. LLM이 활용할 수 있는 Tool의 종류와 그 필요성
실제로 LLM이 활용할 수 있는 대표적인 Tool과, 그 Tool이 필요한 이유를 자세히 살펴봅시다.
1. 최신 정보 및 실시간 데이터 제공 Tool
- 날씨 API (OpenWeatherMap 등)
LLM은 현재 시점의 날씨 정보를 알 수 없기 때문에, 날씨 API를 이용하면 사용자의 위치나 특정 지역의 최신 날씨 정보를 정확히 전달할 수 있습니다.
- 웹 검색 API (Google, Bing)
최신 뉴스나 최근 정보는 LLM이 자체적으로 학습하지 못한 정보이기 때문에 웹 검색을 통해 실시간으로 조회해야만 정확한 최신 정보를 제공할 수 있습니다.
최신 정보가 중요한 서비스라면, LLM이 직접 최신 데이터를 가져와야 정확한 답변이 가능합니다. 예를 들어, 오늘의 뉴스나 최신 주가 정보를 사용자가 요청했을 때 모델이 자체적으로 답변할 수 없으므로, 이런 Tool이 필수적입니다.
2. 정확한 계산 및 전문 분석을 위한 Tool
- 계산기
복잡한 수식이나 정밀한 계산 작업에서 LLM의 자체 계산 결과는 오류 가능성이 큽니다. 계산기를 활용하면 정확한 값을 얻을 수 있습니다.
- Wolfram Alpha API
수학, 물리, 화학, 통계 등의 전문적인 데이터 분석이 필요한 질문을 처리할 때 Wolfram Alpha API를 사용하면 정밀한 결과를 제공할 수 있습니다.
LLM은 텍스트 기반 모델이기 때문에 수치적 정확성이 필요한 분야에서는 외부 Tool의 지원이 필수입니다. 금융 서비스, 공학 계산 등 정확한 분석이 필수적인 경우 매우 유용합니다.
3. 개인화된 데이터 조회를 위한 Tool
- 관계형 데이터베이스 (PostgreSQL/MySQL)
특정 기업이나 사용자의 개인 데이터를 조회하고, 그 데이터를 기반으로 개인화된 응답을 제공할 수 있습니다.
- NoSQL 데이터베이스 (MongoDB, DynamoDB, Firebase)
실시간으로 변하는 사용자의 활동 데이터나, 유연한 데이터 구조가 필요한 상황에서 신속한 개인 맞춤형 응답을 제공할 수 있습니다.
사용자가 자신의 개인 정보나 맞춤형 정보를 요청했을 때 LLM이 이를 직접 알 수 없기 때문에, 데이터베이스 조회 Tool이 필수적으로 필요합니다.
4. 외부 작업 자동화를 위한 Tool
- 이메일 발송 API (SendGrid 등)
사용자가 "회의 결과를 메일로 보내줘"와 같은 요청을 했을 때, 실제 메일을 발송하는 작업을 처리합니다.
- 예약 관리 API (Calendly, Google Calendar)
실제로 사용자 요청을 캘린더 예약이나 일정으로 연결하여 작업을 처리할 수 있게 합니다.
단순히 텍스트 답변을 제공하는 것을 넘어 실제 사용자의 요청을 수행하는 서비스를 구축할 때 외부 작업 처리 도구가 필요합니다. 이런 도구들을 활용하면 더 많은 작업을 자동화하고 편리한 서비스를 제공할 수 있습니다.
3. LLM이 직접 Tool을 사용하는 방법: OpenAI의 함수 호출(Function Calling)
이렇게 다양한 Tool을 실제로 LLM이 사용할 수 있게 하는 기술이 바로 OpenAI에서 제공하는 함수 호출(Function Calling) 기능입니다.
이 기능은 사용자의 질문을 분석하고 필요한 경우 외부 함수를 직접 호출하도록 LLM이 스스로 결정할 수 있게 만들어 줍니다.
작동 과정은 다음과 같습니다:
(1) 사용자 질문
(2) LLM이 함수 호출 판단
(3) 외부 함수 실행
(4) 함수 결과를 다시 LLM에 전달
(5) LLM의 최종 답변 생성실제 구현 과정에서 중요한 요소는 다음과 같습니다:
- 함수 정의(Functions Definition)
어떤 외부 기능을 사용할 수 있는지 미리 정의하여 모델에 알려줍니다.
- 함수 호출 옵션 설정
모델이 함수 호출이 필요하다고 판단하면 자동으로 함수를 호출하도록 설정할 수 있습니다.
- 함수 호출 결과 재전달
호출된 함수의 결과를 다시 LLM에 전달하여 최종 답변을 생성하게 합니다.
이 방식이 중요한 이유는, LLM이 필요할 때 스스로 외부 작업을 판단하고 호출할 수 있도록 만들어주기 때문입니다. 결국 이를 통해 더 강력하고 능동적인 서비스를 구축할 수 있습니다.
4. 실제로 Tool을 활용하는 구체적인 예시: 계산기 함수 호출하기
이제 앞서 살펴본 함수 호출 방식을 더 쉽게 이해할 수 있도록,
간단한 계산기 도구를 실제로 LLM이 호출하여 사용하는 예시를 만들어 보겠습니다.
아래는 기본적인 수학 연산을 처리하는 간단한 계산기 함수의 예시입니다.
1. 계산기 Tool(함수) 정의하기
먼저, LLM에게 제공할 계산기 함수를 정의합니다.
calculator_function = {
"name": "calculator",
"description": "두 숫자 사이의 간단한 계산을 처리합니다.",
"parameters": {
"type": "object",
"properties": {
"num1": {
"type": "number",
"description": "첫 번째 숫자"
},
"num2": {
"type": "number",
"description": "두 번째 숫자"
},
"operation": {
"type": "string",
"enum": ["add", "subtract", "multiply", "divide"],
"description": "수행할 연산의 종류 (add, subtract, multiply, divide 중 하나)"
}
},
"required": ["num1", "num2", "operation"]
}
}이렇게 하면 LLM이 어떤 인자들을 이용해서 계산기 Tool을 호출해야 하는지 명확히 알 수 있습니다.
2. LLM이 계산기 함수를 호출하는 과정
사용자가 아래와 같은 질문을 했다고 가정해 봅시다.
사용자 질문:"512 곱하기 24는 얼마야?"
이 질문을 받은 LLM은 다음처럼 동작합니다.
(1) 질문을 분석하여 함수 호출 여부 결정
LLM은 이 질문이 정확한 계산을 요구하는 작업이라고 판단하여, 앞에서 정의한 calculator 함수를 호출하기로 결정합니다.
(2) 함수 호출 요청 (LLM이 생성한 요청)
LLM은 다음과 같은 형태로 요청을 생성합니다.
{
"name": "calculator",
"arguments": {
"num1": 512,
"num2": 24,
"operation": "multiply"
}
}
(3) 실제 계산 수행 (외부에서 처리)
실제로 위 함수를 기반으로 외부에서 다음과 같은 작업이 수행됩니다.
# 실제 계산 수행 함수 (예시)
def calculator(num1, num2, operation):
if operation == "add":
return num1 + num2
elif operation == "subtract":
return num1 - num2
elif operation == "multiply":
return num1 * num2
elif operation == "divide":
return num1 / num2
else:
return "지원하지 않는 연산입니다."
# 호출된 예시의 실제 처리
result = calculator(512, 24, "multiply")
# 결과: 12288이렇게 계산이 정확히 수행된 결과인 12288을 다시 LLM에 전달합니다.
(4) 최종적으로 사용자에게 제공되는 답변
최종적으로 LLM은 전달받은 함수의 결과를 토대로 자연스러운 답변을 생성합니다.
LLM의 최종 답변:"512 곱하기 24는 12,288입니다."
마무리
지금까지 살펴본 Tool과 함수 호출 기능은 LLM의 능력을 한 단계 더 높여주는 중요한 기술입니다. 그리고 이런 기술들을 적극적으로 활용해 더욱 복잡하고 다양한 작업을 처리할 수 있게 만들어 주는 것이 바로 에이전트(Agent) 개념입니다.
Agent는 LLM이 하나 이상의 Tool을 스스로 선택하고, 복합적인 작업을 수행하여 사용자의 요청을 더 지능적으로 처리하는 개념인데, 이에 대해서는 다음 글에서 더 자세히 알아볼 예정입니다.