개발자 입장에서 본 LLM 에이전트: 개념, 도구 호출
1. 애플리케이션 개발 관점에서 본 AI 에이전트: LLM과 도구의 만남
LLM(대규모 언어 모델)의 발전은 AI 에이전트라는 새로운 지평을 열었습니다. 특히, LLM이 추론, 계획, 도구 사용까지 가능해지면서, AutoGPT, BabyAGI와 같은 자율형 에이전트가 등장하고, 빅테크 기업들의 투자와 개발 프레임워크(LangChain 등)의 발전은 AI 에이전트를 애플리케이션 개발의 핵심 요소로 만들었습니다.
그렇다면, 애플리케이션 개발 관점에서 LLM을 확용한 AI 에이전트는 무엇이며, 개발자에게 어떤 의미를 가질까요?
-
좁은 의미: 사용자의 개입 없이 스스로 목표를 설정하고, 이를 달성하기 위한 계획 수립, 도구 선택 및 실행, 결과 평가까지 전 과정을 자율적으로 수행하는 지능형 시스템을 좁은 의미에서 agent라고 말합니다. 흔히 이런 시스템을 자율형 agent라고 부릅니다. (예: 사용자가 “이번 주말에 상영하는 최신 SF 영화 중 가장 평점이 높은 영화 두 좌석 예매해줘.” 라고 요청하면, Agent가 영화를 추천해주고, 극장에 예약까지 수행)
-
넓은 의미: 넓은 의미에서 LLM 에이전트는 단순히 정해진 작업을 수행하는 것을 넘어, 대규모 언어 모델(LLM)의 추론 능력을 활용하여 애플리케이션의 전체적인 흐름(Flow)을 제어하는 모든 것을 포함합니다. 이는 LLM이 상황을 판단하여 다음에 어떤 동작을 할지 스스로 결정하는 것을 의미합니다. 예를 들면 다음과 같습니다.
-
조건에 따른 분기 처리(router): 사용자의 입력이나 외부 상황에 따라 적절한 작업을 선택하고 실행합니다.
-
다른 LLM 호출: 필요에 따라 특화된 다른 LLM에게 작업을 위임하고 결과를 통합합니다.
-
외부 도구 활용: API 호출 등을 통해 검색, 계산, 데이터베이스 접근 등 외부 도구와 상호작용합니다.
-
-
개발자에게 LLM 에이전트란: 개인적으로 개발자 입장에서 본 LLM 에이전트란 LLM의 ‘도구(Tool) 호출’ 기능을 핵심으로 활용하여, 상황에 맞는 작업을 처리(Action)하는 애플리케이션이라고 할 수 있습니다. LLM의 도구 호출 기능을 통해 단순 메시지 응답의 한계를 벗어나 훨씬 다양하고 복합적인 작업 처리가 가능해지기 때문입니다.
다음 섹션에서 LLM에서 이 도구(Tool) 호출이 실제로 어떻게 이루어지는지 자세히 살펴보겠습니다.
2. 에이전트 동작의 핵심: 도구(Tool)와 도구 호출(Tool Calling)이란 무엇인가?
LLM Tool Calling에서 도구(Tool)이란? LLM이 외부 세계와 상호작용하기 위해 사용하는 인터페이스입니다. 이는 특정 작업을 수행하는 함수(예: 날씨 정보 검색, 데이터베이스 조회) 형태로 제공되며, LLM은 필요에 따라 이 도구들을 호출하여 자신의 기능을 확장합니다.
AI 에이전트가 단순한 챗봇과 다른 점은 도구 호출(Tool Calling) 능력입니다. 도구 호출은 LLM이 외부 API를 호출하거나, 특정 함수를 실행하거나, 다른 소프트웨어와 상호작용하는 것을 의미합니다.
Tool Calling을 활용한 Agent Application 구축 방법:
-
도구 정의: 에이전트가 사용할 수 있는 도구들을 정의합니다. (예: 검색 엔진, 계산기, 번역기, 데이터베이스 등)
-
도구 설명: LLM에게 각 도구의 기능, 입력/출력 형식 등을 설명합니다. (OpenAI Function Description과 같은 형식 활용)
-
LLM 추론: LLM은 사용자 요청과 도구 설명을 기반으로 어떤 도구를 호출할지, 어떤 파라미터를 사용할지 결정합니다.
-
도구 실행: LLM의 요청에 따라 실제 도구를 실행하고, 그 결과를 LLM에게 반환합니다.
-
결과 종합: LLM은 도구 실행 결과를 종합하여 사용자에게 최종 응답을 제공합니다.
3. LLM에 도구 등록하기: 마법 지팡이 쥐어주기
LLM에게 외부 도구를 사용하게 하려면, 마치 마법사에게 지팡이를 쥐여주듯 도구를 등록해야 합니다. 이 과정은 다음과 같습니다.
-
도구 정의: Python 함수와 같이 실행 가능한 형태로 도구를 만듭니다. 각 도구에는 이름, 기능 설명(description), 입력 매개변수(parameters)를 명확히 정의합니다.
# 예시: 두 수의 합을 계산하는 도구 def add_numbers(a: float, b: float) -> float: """두 숫자를 더합니다.""" return a + b -
도구 등록: LangChain, OpenAI Functions 등 LLM 프레임워크의 API를 사용하여 도구를 등록합니다. 프레임워크는 이 정보를 LLM이 이해할 수 있는 JSON 형식 등으로 자동 변환합니다.
# LangChain 예시 (개념적) from langchain.tools import StructuredTool tool = StructuredTool.from_function( func=add_numbers, name="SumCalculator", description="두 숫자를 더하는 도구", ) # agent에 tool 추가 -
System Prompt 통합: 등록된 도구 정보는 자동으로 system prompt에 포함되어, LLM이 어떤 도구를 사용할 수 있는지 알게 됩니다. 사용자는 별도로 명시할 필요가 없습니다.
4. LLM에게 도구를 설명하는 방법: OpenAI Function Description
LLM에게 도구를 효과적으로 설명하는 방법 중 하나는 OpenAI Function Description 형식을 사용하는 것입니다. 이 형식은 JSON 스키마를 사용하여 도구의 이름, 설명, 매개변수 등을 정의합니다.
도구의 등록은 결국 LLM이 도구의 기능과 파라미터 등 사용법을 System prompt에 추가하여 LLM이 이해하게 하는 과정이라고 볼수 있습니다.
{
"name": "get_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}
}
OpenAI Function Description의 장점:
-
표준화된 형식: LLM이 이해하기 쉬운 표준화된 형식으로 도구를 설명할 수 있습니다.
-
명확한 정의: 도구의 기능, 입력/출력 형식을 명확하게 정의하여 LLM의 오해를 줄일 수 있습니다.
-
자동화 가능: LangChain과 같은 프레임워크를 사용하면 OpenAI Function Description을 자동으로 생성하고 관리할 수 있습니다.
5. LLM이 Tool Calling을 수행하는 과정 – with Prompt 예제
각 단계별로 LLM이 내부적으로 어떤 처리를 하는지, 그리고 사용자는 어떤 입/출력을 주고받게 되는지 예시와 함께 자세히 설명하겠습니다.
-
사용자 입력:
-
사용자: (자연어 형태로 LLM에게 요청) “오늘 서울 날씨 어때? 섭씨 온도로 알려줘.”
-
-
도구 목록 확인:
-
LLM (내부): 시스템에 등록된 사용 가능한 도구 목록 (OpenAI Function Description 형식)을 확인합니다.
-
[
{
"name": "get_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}
},
{
"name": "search_internet",
"description": "Search the internet for a given query",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "The search query"
}
},
"required": ["query"]
}
}
]
-
도구 선택 및 파라미터 추론:
-
LLM (내부): 사용자 요청 (“오늘 서울 날씨 어때? 섭씨 온도로 알려줘.”)과 도구 목록을 비교/분석합니다.
-
LLM (내부 추론 과정 – 예시):
-
“사용자가 날씨를 묻고 있다. -> get_weather 도구가 적합하다.”
-
“서울’이라는 위치 정보가 있다. -> location 파라미터는 ‘서울’이다.”
-
“섭씨 온도로 알려달라고 했다. -> unit 파라미터는 ‘celsius’이다.”
-
-
-
함수 호출(Function Call) 생성:
-
LLM (출력 – Function Call):
-
{
"name": "get_weather",
"arguments": {
"location": "서울",
"unit": "celsius"
}
}
이 JSON 객체는 어떤 도구 (get_weather)를 어떤 파라미터 (location: “서울”, unit: “celsius”)와 함께 호출할지를 나타냅니다. 이것은 사용자에게 직접 보여주는 것이 아니라, 백엔드 시스템(개발자가 구현한 코드 또는 LangChain과 같은 프레임워크)에 전달됩니다.
-
도구 실행:
-
개발자/프레임워크 (역할): LLM이 생성한 Function Call (JSON)을 받아서, 실제로 get_weather 함수(또는 API)를 실행합니다.
-
get_weather(“서울”, “celsius”) 와 같이 함수를 호출.
-
-
외부 API, 데이터베이스 등으로부터 날씨 정보를 가져옵니다.
-
도구 (실행 결과 – 예시):
-
{
"temperature": 25,
"condition": "맑음",
"humidity": 60
}
-
응답 생성:
-
도구 실행결과 LLM에 전달: 개발자/프레임워크는 도구 실행 결과(위의 JSON)를 다시 LLM에게 전달.
-
LLM (내부): 도구 실행 결과를 바탕으로 최종 응답을 생성합니다.
-
LLM (최종 출력 – 사용자에게 보여지는 응답): “오늘 서울 날씨는 맑고, 온도는 25℃입니다. 습도는 60%입니다.”
-
Prompt와 응답의 흐름 (정리):
-
사용자 Prompt (입력): “오늘 서울 날씨 어때? 섭씨 온도로 알려줘.”
-
LLM (내부 처리): 도구 목록 확인, 도구 선택, 파라미터 추론, Function Call 생성
-
Function Call (LLM 출력 → 개발자/프레임워크):
{
"name": "get_weather",
"arguments": {
"location": "서울",
"unit": "celsius"
}
}
-
도구 실행 (개발자/프레임워크): Function Call에 따라 실제 get_weather 도구 실행
-
도구 실행 결과 (개발자/프레임워크 → LLM):
{
"temperature": 25,
"condition": "맑음",
"humidity": 60
}
-
최종 응답(LLM 출력 → 사용자): “오늘 서울 날씨는 맑고, 온도는 25℃입니다. 습도는 60%입니다.”
이처럼 LLM은 사용자의 자연어 요청을 이해하고, 필요한 도구를 선택하여 실행하고, 그 결과를 종합하여 사용자에게 자연어 형태로 응답하는 복잡한 과정을 수행합니다. 이 과정에서 OpenAI Function Description과 같은 형식이 LLM과 개발자/프레임워크 간의 효율적인 소통을 가능하게 합니다.
6. Tool Calling을 활용한 최종 결과: 무한한 가능성
Tool Calling을 통해 LLM 에이전트는 단순한 질의응답을 넘어 실제 세계와 상호작용할 수 있게 됩니다. 몇 가지 예시를 살펴보겠습니다.
-
개인 비서: 이메일 관리, 일정 예약, 정보 검색, 알림 설정 등 다양한 작업을 자동화합니다.
-
데이터 분석: 데이터베이스 쿼리, 데이터 시각화, 보고서 작성 등을 자동화합니다.
-
고객 지원: FAQ 답변, 문제 해결, 티켓 생성 등 고객 지원 업무를 효율화합니다.
-
콘텐츠 생성: 블로그 게시물 작성, 소셜 미디어 콘텐츠 생성, 광고 카피 작성 등을 자동화합니다.
-
코드 생성: 코드 작성, 디버깅, 테스트, 배포 등 개발 프로세스를 자동화합니다.
7. 결론: LLM 에이전트, 소프트웨어 개발의 미래를 엿보다
LLM 에이전트는 단순한 생산성 도구를 넘어 소프트웨어 개발 방식에 혁신적인 변화를 가져올 잠재력을 지니고 있습니다. 개발자는 LLM 에이전트를 활용함으로써, 이전보다 훨씬 복잡하고 지능적인 애플리케이션을 더욱 빠르고 효율적으로 개발할 수 있게 됩니다.
본 게시글에서 소개된 내용은 현재 시점에서 LLM 활용의 한 단면일 뿐입니다. 앞으로 AI 에이전트는 더욱 발전하여, 마치 인간처럼 스스로 판단하고 행동하는, 상상 속의 인공지능 비서와 같은 역할을 수행하며 우리의 기대를 뛰어넘는 혁신을 가져올 것입니다.
이 글이 LLM 에이전트에 대한 이해를 높이고, 실제 개발에 활용하는 데 유용한 인사이트를 제공했기를 바랍니다. LLM 에이전트 기술은 앞으로도 끊임없이 발전하며 우리 삶에 더 큰 영향력을 미칠 것입니다.
