<aside> 🔥
Agent의 핵심 구성 요소인 Tool(도구)에 대해서 알아봅니다.
</aside>
AI Agent의 중요한 특징 중 하나는 행동(Action)을 취할 수 있는 능력입니다. 이러한 액션은 도구를 통해 이루어집니다.
이번에는
에 대해서 알아봅니다. Agent에 적절한 Tool을 제공하고 간결하면서 명확한 Tool 사용 가이드를 제공한다면 여러분의 AI Agent Model 성능이 드라마틱하게 상승할 것입니다.
Tool(도구)이란 LLM에게 주는 function(함수)입니다. 이러한 function은 명확한 목적을 수행하는 역할을 합니다.
다음은 AI 에이전트에서 자주 사용되는 도구의 예시입니다.
| 도구 | 설명 |
|---|---|
| 웹 검색(Web Search) | 인터넷에서 최신 정보를 가져올 수 있습니다. |
| 이미지 생성(Image generation) | 텍스트 설명을 기반으로 이미지를 생성합니다.(Image AI Model) |
| 검색 및 추출 (Retrieval) | 외부 소스에서 필요한 정보를 검색하여 가져옵니다. (RAG) |
| API 인터페이스(API Interface) | 외부 API(Github, YouTube, Spotify 등)와 상호작용합니다. |
위 도구들은 하나의 예시에 불과하며, 여러분만의 특정 use case에 따라 적절한 tool을 정의할 수 있습니다!
적절한 도구 사용은 LLM의 능력을 보완해주는 역할을 합니다.
예를 들어, 여러분들이 계산이 필요한 작업이라면, 계산기 도구를 LLM에 같이 제공을 해준다면 도구가 없는 LLM 보다 더 높은 성능을 얻을 수 있습니다.
또한, 최신 정보를 활용해야 하는 경우 LLM 모델이 학습하지 않은 내용이 포함되어 성능이 저하될 수 있습니다. 이러한 경우 web 검색 등을 이용해서 최신 정보도 활용할 수 있도록 도와줘야 합니다.

날씨 정보를 가져온 LLM 결과 (출처 : ‣)
위의 예시처럼, 날씨 Web 검색을 이용해서 좀더 정확한 결과를 얻을 수 있습니다.
정리해보자면, 도구는 다음을 반드시 포함해야 합니다.
LLM은 오직 text으로만 입력을 받고 text으로만 출력을 generate할 수 있습니다. 따라서, LLM은 스스로 도구를 직접 호출하는 방법은 없습니다. 그렇다면 어떻게 LLM이 도구를 사용할까요?
우리가 Agent에 도구를 제공한다. 라는 표현은 LLM에게 다음 정보를 제공하는 것입니다.
예를 들어, 인터넷에서 특정 지역의 날씨를 조회하는 Web Search 도구를 제공한 뒤, LLM에게 “파리의 날씨는 어떻습니까?” 라고 물으면 LLM은 이 질문이 자신이 배운 “날씨 조회 도구”를 사용하기에 적합한 상황임을 인식하게 됩니다.
그런 다음, LLM은 해당 도구를 호출하는 형태의 텍스트(일반적으로는 코드 형태)를 generate하게 됩니다. 여기서 Agent는 LLM이 생성한 출력을 분석하여 도구 호출이 필요하다는 것을 파악하고, 대신하여 실제 도구를 호출하는 역할을 합니다.
이 호출된 도구를 사용한 출력 결과를 다시 LLM으로 전달하며, LLM은 이를 바탕으로 User에게 제공할 최종적인 대답을 generate합니다.
도구를 호출하여 generate한 출력 결과는 Conversation(대화) 내의 또 다른 Message로 사용됩니다.
일반적으로 아래의 과정은 User에게 보여주지 않습니다.
- Agent가 converstation을 retrive(검색)합니다.
User에게는 마치 LLM이 직접 도구를 사용한 것처럼 보이지만, 실제로는 Agent가 도구를 호출한 것입니다.
전체 설명이 다소 복잡해 보일 수 있지만, 간단히 말하면 System Message(System prompt) 를 통해 사용 가능한 도구들에 대한 텍스트 설명을 모델에게 제공하는 방식입니다.
system_message = """
You are an AI assistant designed to help users efficiently and accurately. Your primary goal is to provide helpful, precise, and clear responses.
You have access to the following tools
{tools_description}
"""
위와 같이 system message에 {tools_description}을 같이 넣어줘서 도구에 대한 설명을 같이 넣어줄 수 있습니다.
{tools_description}에 대해 아래와 같은 설명을 넣어줘야 합니다.
위 2가지 내용을 매우 명확하고 정확하게 제공해야만 합니다. 그렇기에, 보통은 컴퓨터 언어(Python 등)나 JSON 형태로 {tools_description}을 정의합니다(다른 명확한 방법이 있다면 위의 방식이 필수는 아닙니다).
예를 들어보면, 두 정수 타입(integer)을 곱하는 계산기 함수를 정의한다고 해봅시다. 이것을 python 함수로 나타내면 아래와 같습니다.
def calculator(a: int, b: int) -> int:
"""Multiply two integers."""
return a * b
위의 tool을 calculator라고 부르고, 이 calcluator는 두개의 정수 타입을 곱하는 함수입니다. 이 함수는 아래와 같은 입력(Arguments)를 필요로 합니다.
도구의 출력은 다른 정수 타입의 한 숫자로 다음과 같이 나타낼 수 있습니다.
a and b.그러면 LLM이 알아들을 수 있도록 text 형태로 우리의 tool을 설명하는 textual description으로 바꿔보면 아래와 같습니다.
Tool Name: calculator, Description: Multiply two integers., Arguments: a: int, b: int, Outputs: int
위와 같은 text를 LLM에 입력하면, 모델은 이것이 “도구라는 것”을 인식하고, 입력으로 무엇을 전달해야 하는지, 출력으로 무엇이 나와야 하는지를 알 수 있습니다.
만약 우리가 도구를 추가하고 싶다면, 우리는 위와 비슷한 형태로 일관성있게 도구를 제공해야 합니다. 이러한 방식은 (당연히) 실수가 발생할 수 있고, 잘못하면 중요한 세부사항을 빠뜨릴 수 있습니다.
그렇기에 더 좋은 방법으로 도구를 정의해봅시다!
우리의 tool은 Python 언어로 작성되고, 이 구현 방식 자체가 이미 필요한 모든 정보를 제공하고 있습니다.
calculator위처럼 표현력이 뛰어나면서 간결하고 정확하게 표현할 수 있기 때문에 프로그래밍 언어를 주로 사용합니다.
Python 코드를 사용한다면, LLM에게 도구를 설명할 때 도구의 Python 소스코드를 제공할 수도 있지만 도구가 어떤 방식으로 구현되었는지 그 자세한 내용은 중요하지 않습니다. 중요한 것은 아래 4가지 입니다.
이러한 4가지 정보를 자동으로 생성하기 위해 우리는 Python 인트로스펙션(Introspection) 기능을 사용합니다. 우리는 소스코드로부터 관련된 부분을 추출하는 인트로스펙션 코드를 작성합니다.
인트로스펙션 코드를 작성한 후에, 우리는 오직 Python decorator를 사용해서 calculator 함수를 정의할 수 있습니다.
@tool
def calculator(a: int, b: int) -> int:
"""Multiply two integers."""
return a * b
print(calculator.to_string())
위 코드를 실행하면, 우리는 데코레이터에서 제공하는 함수인 to_string 함수를 통해서 소스코드에 있는 정보를 자동으로 가져와 다음과 같은 텍스트를 가져올 수 있습니다.
Tool Name: calculator, Description: Multiply two integers., Arguments: a: int, b: int, Outputs: int
위의 결과물은 우리가 이전에 직접 작성한 방식과 동일합니다! 그러면 @tool은 어떻게 만들 수 있을까요?