LLM 에이전트의 도구 사용
AI 에이전트의 핵심 기능 중 하나는 행동(Actions)을 수행하는 능력이다. 이는 단순한 텍스트 생성에 국한되지 않으며, 도구(Tools)를 활용함으로써 확장된다. 적절한 도구를 제공하고, 이를 명확하게 설명하면 AI 에이전트가 보다 복잡한 작업을 수행할 수 있다.
도구란 무엇인가?
도구(Tool)란 LLM이 사용할 수 있도록 제공된 특정 기능을 의미한다. 도구는 특정한 목적을 수행하는 함수로, 대표적인 예시는 다음과 같다.
도구 유형 | 설명 |
웹 검색 | 최신 정보를 인터넷에서 가져옴 |
이미지 생성 | 텍스트 기반의 이미지 생성 |
정보 검색 | 외부 데이터베이스에서 정보 검색 |
API 호출 | GitHub, YouTube 등 외부 API와 상호작용 |
도구는 LLM의 내부 지식이 훈련된 시점까지만 반영된다는 한계를 극복하는 데 유용하다. 예를 들어, 최신 뉴스를 제공하거나, 실시간 날씨 정보를 가져오는 등의 기능을 수행할 수 있다.
도구의 작동 방식
LLM은 본질적으로 텍스트 기반 모델이므로, 자체적으로 도구를 실행할 수 없다. 대신, 도구의 존재를 학습하고, 필요한 경우 이를 호출하는 텍스트 출력을 생성하는 방식으로 동작한다.
- LLM이 특정 요청을 받음 (예: "파리의 날씨는?" )
- 모델이 이를 해결하기 위해 적절한 도구를 호출해야 한다고 판단
- 도구 호출을 위한 텍스트(코드)를 생성 (예: weather_tool("Paris"))
- 에이전트가 LLM의 출력을 해석하여 실제 도구를 실행
- 실행 결과를 다시 LLM에게 제공하여 최종 응답을 생성
사용자는 이러한 과정이 자동으로 이루어지므로, 마치 LLM이 직접 도구를 실행하는 것처럼 보인다.
LLM에 도구 제공하기
LLM이 도구를 올바르게 사용하려면, 도구의 기능을 텍스트로 설명하는 시스템 프롬프트(System Prompt)를 제공해야 한다. 이를 위해 도구의 설명(description), 입력(arguments), 출력(outputs)을 명확히 정의해야 한다.
def calculator(a: int, b: int) -> int:
"""Multiply two integers."""
return a * b
위의 함수는 두 정수를 곱하는 간단한 계산기 도구이다. 이를 LLM이 이해할 수 있도록 텍스트로 변환하면 다음과 같다:
Tool Name: calculator, Description: Multiply two integers., Arguments: a: int, b: int, Outputs: int
이제 시스템 프롬프트에 이 설명을 포함하면, LLM이 적절한 상황에서 해당 도구를 호출할 수 있다.
도구의 중요성
LLM이 단순한 텍스트 생성 모델에서 다양한 기능을 수행하는 AI 에이전트로 발전하려면 도구의 활용이 필수적이다.
- 모델의 한계를 극복: 훈련 데이터 이후의 정보를 제공 가능
- 정확도 향상: 수학 연산, 검색 등 전문적인 작업 수행 가능
- 외부 서비스와의 연결: API 호출을 통해 애플리케이션과 연동 가능
이제 우리는 AI 에이전트가 도구를 어떻게 활용하는지 이해했다. 다음 글에서는 에이전트가 환경을 관찰하고(Observe), 사고하고(Think), 행동하는(Act) 전체적인 워크플로우에 대해 다룰 예정이다.
+) 추가: 데코레이터 이용해서 도구 설명 생성하기
다음과 같이 Python의 introspection 기능을 활용하면 도구의 이름, 설명, 입력 및 출력을 자동으로 추출할 수 있다.
from functools import wraps
def tool(func):
"""데코레이터: 함수의 메타데이터를 자동으로 저장"""
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
# 함수 정보를 자동 추출하여 속성 추가
wrapper.name = func.__name__
wrapper.description = func.__doc__
wrapper.arguments = [(name, param.annotation.__name__)
for name, param in func.__annotations__.items() if name != 'return']
wrapper.outputs = func.__annotations__.get('return', None)
return wrapper
이제 `@tool` 데코레이터를 사용하여 함수를 꾸밀 수 있다.
@tool
def calculator(a: int, b: int) -> int:
"""Multiply two integers."""
return a * b
위 함수는 @tool 데코레이터를 통해 자동으로 메타데이터를 가지게 된다. 아래와 같이 호출하면 해당 정보를 확인할 수 있다.
print(f"Tool Name: {calculator.name}")
print(f"Description: {calculator.description}")
print(f"Arguments: {calculator.arguments}")
print(f"Outputs: {calculator.outputs}")
Tool Name: calculator
Description: Multiply two integers.
Arguments: [('a', 'int'), ('b', 'int')]
Outputs: int
이제 AI 에이전트는 해당 정보를 바탕으로 도구를 호출할 수 있다. 데코레이터를 사용하면 함수를 정의할 때 따로 설명을 적을 필요 없이, 자동으로 구조화된 정보를 추출할 수 있다.
'개인공부&프로젝트 > LLM 에이전트 스터디' 카테고리의 다른 글
LLM Agent의 Thought-Action-Observation Cycle (0) | 2025.02.23 |
---|---|
Message와 Special Token (0) | 2025.02.15 |
Agent의 두뇌, LLM에 대해서 알아보자 (1) | 2025.02.14 |
AI 에이전트에 대해서 알아보자 (feat. LLM) (0) | 2025.02.13 |
댓글