[langgraph] 도구 추가하기
원문 출처: https://langchain-ai.github.io/langgraph/tutorials/get-started/2-add-tools/
이 튜토리얼에서는 챗봇이 "기억"만으로 답변할 수 없는 질문을 처리하기 위해 웹 검색 도구를 통합하는 방법을 다룹니다. 챗봇은 이 도구를 사용해 관련 정보를 찾아 더 나은 답변을 제공할 수 있습니다.
이 튜토리얼은 기본 챗봇 만들기를 기반으로 합니다.
사전 요구사항
- Tavily Search Engine의 API 키가 필요합니다.
1. 검색 엔진 설치
Tavily Search Engine을 사용하기 위한 패키지를 설치하세요:
pip install -U langchain-tavily
2. 환경 설정
검색 엔진 API 키를 환경 변수로 설정하세요:
_set_env("TAVILY_API_KEY")
TAVILY_API_KEY: ········
3. 도구 정의
웹 검색 도구를 정의합니다:
from langchain_tavily import TavilySearch
tool = TavilySearch(max_results=2)
tools = [tool]
tool.invoke("What's a 'node' in LangGraph?")
이 결과는 챗봇이 답변에 활용할 수 있는 페이지 요약입니다.
4. 그래프 정의
이전 튜토리얼에서 만든 StateGraph
에 LLM이 사용할 도구를 알려주기 위해 bind_tools
를 사용합니다.
LLM 선택 예시
OpenAI
pip install -U "langchain[openai]"
import os
from langchain.chat_models import init_chat_model
os.environ["OPENAI_API_KEY"] = "sk-..."
llm = init_chat_model("openai:gpt-4.1")
Anthropic
pip install -U "langchain[anthropic]"
import os
from langchain.chat_models import init_chat_model
os.environ["ANTHROPIC_API_KEY"] = "sk-..."
llm = init_chat_model("anthropic:claude-3-5-sonnet-latest")
Azure
pip install -U "langchain[openai]"
import os
from langchain.chat_models import init_chat_model
os.environ["AZURE_OPENAI_API_KEY"] = "..."
os.environ["AZURE_OPENAI_ENDPOINT"] = "..."
os.environ["OPENAI_API_VERSION"] = "2025-03-01-preview"
llm = init_chat_model(
"azure_openai:gpt-4.1",
azure_deployment=os.environ["AZURE_OPENAI_DEPLOYMENT_NAME"],
)
Google Gemini
pip install -U "langchain[google-genai]"
import os
from langchain.chat_models import init_chat_model
os.environ["GOOGLE_API_KEY"] = "..."
llm = init_chat_model("google_genai:gemini-2.0-flash")
AWS Bedrock
pip install -U "langchain[aws]"
from langchain.chat_models import init_chat_model
# 자격 증명 구성: https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started.html
llm = init_chat_model(
"anthropic.claude-3-5-sonnet-20240620-v1:0",
model_provider="bedrock_converse",
)
StateGraph에 도구 바인딩
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
class State(TypedDict):
messages: Annotated[list, add_messages]
graph_builder = StateGraph(State)
# LLM에 사용할 도구를 바인딩
llm_with_tools = llm.bind_tools(tools)
def chatbot(state: State):
return {"messages": [llm_with_tools.invoke(state["messages"])]}
graph_builder.add_node("chatbot", chatbot)
# 도구 노드 추가 및 조건부 엣지 정의 등은 공식 문서 참고
7. 그래프 시각화 (선택 사항)
그래프를 시각화하려면 get_graph
와 draw_ascii
또는 draw_png
를 사용할 수 있습니다.
from IPython.display import Image, display
try:
display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
# 추가 종속성이 필요하며 선택 사항입니다
pass
8. 챗봇에 질문하기
이제 챗봇에 훈련 데이터에 없는 질문도 할 수 있습니다.
def stream_graph_updates(user_input: str):
for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):
for value in event.values():
print("Assistant:", value["messages"][-1].content)
while True:
try:
user_input = input("User: ")
if user_input.lower() in ["quit", "exit", "q"]:
print("Goodbye!")
break
stream_graph_updates(user_input)
except:
user_input = "What do you know about LangGraph?"
print("User: " + user_input)
stream_graph_updates(user_input)
break
9. Prebuilt 사용하기
코드를 더 간결하게 만들기 위해 LangGraph의 prebuilt 컴포넌트를 사용할 수 있습니다. 예를 들어, ToolNode
와 tools_condition
을 활용하면 병렬 API 실행 등 내장 기능을 쉽게 사용할 수 있습니다.
from typing import Annotated
from langchain_tavily import TavilySearch
from langchain_core.messages import BaseMessage
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
class State(TypedDict):
messages: Annotated[list, add_messages]
graph_builder = StateGraph(State)
tool = TavilySearch(max_results=2)
tools = [tool]
llm_with_tools = llm.bind_tools(tools)
def chatbot(state: State):
return {"messages": [llm_with_tools.invoke(state["messages"])]}
graph_builder.add_node("chatbot", chatbot)
tool_node = ToolNode(tools=[tool])
graph_builder.add_node("tools", tool_node)
graph_builder.add_conditional_edges(
"chatbot",
tools_condition,
)
graph_builder.add_edge("tools", "chatbot")
graph_builder.add_edge(START, "chatbot")
graph = graph_builder.compile()
축하합니다!
이제 챗봇이 검색 엔진을 활용해 최신 정보를 찾아 답변할 수 있습니다. 더 다양한 질문에 대응할 수 있게 되었습니다.
다음 단계에서는 챗봇이 과거 대화를 기억할 수 있도록 메모리 기능을 추가합니다.