단순히 묻고 답하는 챗봇을 넘어, AI가 스스로 판단하여 검색엔진이나 계산기 같은 '도구'를 직접 사용할 수 있다면 어떨까요? 이번 글에서는 스스로 외부 도구를 호출하여 문제를 해결하는 Tool Calling Agent의 개념을 알아보고, 실시간 웹 검색 도구인 Tavily API를 LangChain에 연동하는 방법까지 정리해 보겠습니다.
1. Tool Calling Agent란?
Tool Calling Agent는 자신이 학습한 내부 지식에만 의존하지 않고, 외부 도구(API, 데이터베이스, 코드 실행기 등)를 능동적으로 호출해 문제를 해결하는 지능형 에이전트입니다.
- 작동 방식: 사용자의 질문을 이해한 뒤 $\rightarrow$ 필요한 경우 적절한 도구를 선택하고 $\rightarrow$ 알맞은 입력값을 구성해 도구를 호출하며 $\rightarrow$ 반환된 결과를 다시 가공해 최종 자연어 답변을 생성합니다.
- 핵심 의의: 단순히 텍스트를 생성하는 AI가 아니라, "필요할 때 계산기를 두드리고, 최신 뉴스를 검색하며, 사내 DB를 조회할 줄 아는" 실행 능력을 갖춘 AI입니다.

2. 웹 검색을 하는 챗봇 만들기: Tavily API
Tavily는 AI 에이전트가 실시간으로 웹을 검색해 최신 정보와 정확한 사실 기반의 답변을 할 수 있도록 최적화된 AI 전용 검색·브라우징 API 플랫폼입니다.
2-1 기본 설정 및 TavilyClient 사용법
먼저 API 키를 발급받고 환경 변수를 설정합니다.
import getpass
import os
def _set_env(var: str):
if not os.environ.get(var):
os.environ[var] = getpass.getpass(f"{var}: ")
_set_env("TAVILY_API_KEY")
_set_env("OPENAI_API_KEY")
기본적인 TavilyClient를 통해 다양한 형태의 검색 결과를 얻을 수 있습니다.
from tavily import TavilyClient
tavily_client = TavilyClient()
# 1. 일반 검색 (가장 관련성 높은 결과 3개 반환)
response = tavily_client.search("What is AI Agent?", max_results=3)
# (참고) 검색 옵션 추가 가능:
# topic="news" (뉴스 기사 위주 검색)
# days=10 (최근 10일 이내 자료만 검색)
# 2. 문맥 추출 (여러 검색 결과에서 중요한 내용만 추려 하나의 문자열로 제공)
context = tavily_client.get_search_context(query="What is AI Agent?")
# 3. 직접적인 답변 도출 (Tavily가 자체적으로 한두 문장으로 요약한 최종 답변 반환)
answer = tavily_client.qna_search(query="What is AI Agent?")
3. LangChain과 Tavily 도구 연동
LangChain 생태계에서는 Tavily를 쉽게 가져다 쓸 수 있도록 전용 툴 클래스를 제공합니다.
3-1 TavilySearch (langchain_tavily)
from langchain_tavily import TavilySearch
tool = TavilySearch(max_results=3)
# 방법 A: 단순 문자열로 호출
tool.invoke("What's a 'node' in LangGraph?")
# 방법 B: 툴 호출 이벤트(Tool Call Event) 형식인 JSON(딕셔너리) 구조로 전달
invoke_with_toolcall = tool.invoke({
"args": {"query": "What's a 'node' in LangGraph?"},
"type": "tool_call",
"id": "foo",
"name": "tavily_search"
})
print(invoke_with_toolcall.content)
3-2 TavilySearchResults (langchain_community)
결과의 원본 데이터(Artifact)까지 세밀하게 확인하고 싶을 때 사용합니다.
from langchain_community.tools.tavily_search import TavilySearchResults
tool = TavilySearchResults(max_results=2)
invoke_with_toolcall = tool.invoke({
"args": {'query': "What's a 'node' in LangGraph?"},
"type": "tool_call",
"id": "foo",
"name": "tavily"
})
# 검색 결과 데이터 확인
print(invoke_with_toolcall.content)
# 모델의 모든 실행 결과(메타데이터 포함) 확인
print(invoke_with_toolcall.artifact)
4. 도구 바인딩 (Tool Binding)
에이전트가 도구를 사용하려면, 우리가 만든 함수를 LLM이 인식하고 호출할 수 있는 '도구(Tool)' 형태로 만들어 연결(바인딩)해 주어야 합니다.
4-1 @tool 데코레이터와 Docstring의 중요성
함수 위에 @tool 데코레이터를 붙이면 LangChain 도구로 변환됩니다.
이때 반드시 Docstring(함수 설명글)을 작성해야 합니다. LLM은 이 설명을 읽고 "아, 이럴 때 이 도구를 써야 하는구나!"라고 판단하기 때문입니다.
from langchain_core.tools import tool
@tool
def add(a: int, b: int) -> int:
"""Add two integers and return the result.""" # LLM을 위한 도구 사용 설명서
return a + b
@tool
def multiply(a: int, b: int) -> int:
"""Multiply two integers and return the result."""
return a * b
tools = [add, multiply]
4-2 LLM에 도구 쥐여주기 (bind_tools)
LLM 객체에 bind_tools()를 사용하여 도구 목록을 연결합니다.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model='gpt-5.4-2026-03-05')
llm_with_tools = llm.bind_tools(tools)
# 1. 도구가 필요한 질문
query = "What is 3 * 12? Also, what is 11 + 49?"
print(llm_with_tools.invoke(query).tool_calls)
# 결과: add와 multiply 도구를 호출하기 위한 파라미터(인자)를 반환함
# 2. 도구가 필요 없는 질문
query = "What is 12 % 2?"
print(llm_with_tools.invoke(query).tool_calls)
# 결과: [] (가진 도구 중에 적합한 것이 없으므로 빈 리스트 반환)
4-3 특정 도구 사용 강제하기 (tool_choice)
모델이 무조건 특정 도구를 사용하도록 강제할 수도 있습니다.
# 무조건 multiply 함수를 사용하도록 설정
llm_with_tools = llm.bind_tools(
tools,
tool_choice={"type": "function", "function": {"name": "multiply"}}
)
resp = llm_with_tools.invoke("What is 3 * 12? Use tool.")
print(resp.tool_calls) # multiply 도구 호출 정보가 담겨 출력됨
4-4 검색 도구 실전 바인딩
앞서 배운 Tavily 검색 도구도 동일한 방식으로 LLM에 바인딩할 수 있습니다.
tool = TavilySearch(max_results=2)
tools = [tool]
llm_with_tools = llm.bind_tools(tools)
# 도구 없이 답변 가능한 일상 대화
llm_with_tools.invoke('안녕~')
# 도구 사용 여부를 LLM이 스스로 판단
llm_with_tools.invoke("What is langgraph?")
# 명시적으로 도구 사용 요청
llm_with_tools.invoke("What is langgraph? Use tool.")

'개념 정리 step2 > AI Agent' 카테고리의 다른 글
| [RAG 시스템 구축] 벡터 데이터베이스부터 앙상블 리트리버까지 (1) (0) | 2026.03.31 |
|---|---|
| [LangGraph] LLM 도구 사용법 (Tool Calling & Agents) (5) (0) | 2026.03.23 |
| [LangGraph] 상태 업데이트 및 워크플로우 제어 (3) (0) | 2026.03.19 |
| [AI Agent] 랭체인과 랭그래프 핵심 정리 및 구현 (2) (0) | 2026.03.18 |
| [Agent 개념] AI 에이전트(Agent)부터 에이전틱 RAG 워크플로우까지 (1) (0) | 2026.03.16 |
