번역 자료 / / 2025. 5. 23. 06:55

[langgraph] 기본 챗봇 만들기

[langgraph] 기본 챗봇 만들기

원문 출처: https://langchain-ai.github.io/langgraph/tutorials/get-started/1-build-basic-chatbot/

이 튜토리얼에서는 기본 챗봇을 구축합니다. 이 챗봇은 이후 일련의 튜토리얼의 기반이 되며, 점진적으로 더 정교한 기능을 추가하고 과정에서 핵심 LangGraph 개념들을 배우게 될 것입니다. 시작해 봅시다! 🌟

사전 요구사항

이 튜토리얼을 시작하기 전에 OpenAI, Anthropic 또는 Google Gemini와 같은 도구 호출 기능을 지원하는 LLM에 접근할 수 있는지 확인하세요.

1. 패키지 설치

필요한 패키지를 설치하세요:

pip install -U langgraph langsmith

LangSmith에 가입하여 LangGraph 프로젝트의 문제를 빠르게 발견하고 성능을 향상시키세요. LangSmith를 사용하면 추적 데이터를 활용하여 LangGraph로 구축된 LLM 앱을 디버깅, 테스트 및 모니터링할 수 있습니다. 시작하는 방법에 대한 자세한 내용은 LangSmith 문서를 참조하세요.

2. StateGraph 생성

이제 LangGraph를 사용하여 기본 챗봇을 만들 수 있습니다. 이 챗봇은 사용자 메시지에 직접 응답합니다.

먼저 StateGraph를 생성합니다. StateGraph 객체는 챗봇의 구조를 "상태 머신"으로 정의합니다. 우리는 챗봇이 호출할 수 있는 llm과 함수를 나타내는 nodes와 봇이 이러한 함수 간에 어떻게 전환해야 하는지 지정하는 edges를 추가할 것입니다.

API 참조: StateGraph | START | add_messages

from typing import Annotated

from typing_extensions import TypedDict

from langgraph.graph import StateGraph, START
from langgraph.graph.message import add_messages


class State(TypedDict):
    # Messages는 "list" 타입을 가집니다. 어노테이션의 `add_messages` 함수는
    # 이 상태 키가 어떻게 업데이트되어야 하는지 정의합니다
    # (이 경우, 메시지를 덮어쓰는 대신 목록에 추가합니다)
    messages: Annotated[list, add_messages]


graph_builder = StateGraph(State)

이제 그래프는 두 가지 주요 작업을 처리할 수 있습니다:

  1. 노드는 현재 State를 입력으로 받아 상태 업데이트를 출력할 수 있습니다.
  2. messages에 대한 업데이트는 Annotated 구문과 함께 사용된 기본 제공 add_messages 함수 덕분에 덮어쓰지 않고 기존 목록에 추가됩니다.

개념

그래프를 정의할 때 첫 번째 단계는 State를 정의하는 것입니다. State에는 그래프의 스키마와 상태 업데이트를 처리하는 리듀서 함수가 포함됩니다. 우리 예제에서 State는 하나의 키인 messages를 가진 TypedDict입니다. add_messages 리듀서 함수는 이전 값을 덮어쓰는 대신 새 메시지를 목록에 추가하는 데 사용됩니다. 리듀서 어노테이션이 없는 키는 이전 값을 덮어씁니다. 상태, 리듀서 및 관련 개념에 대해 자세히 알아보려면 LangGraph 참조 문서를 참조하세요.

3. 노드 추가

다음으로 "chatbot" 노드를 추가합니다. 노드는 작업 단위를 나타내며 일반적으로 일반 Python 함수입니다.

먼저 채팅 모델을 선택해 보겠습니다:

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",
)

이제 채팅 모델을 간단한 노드에 통합할 수 있습니다:

def chatbot(state: State):
    return {"messages": [llm.invoke(state["messages"])]}


# 첫 번째 인수는 고유한 노드 이름입니다
# 두 번째 인수는 노드가 사용될 때마다 호출될 함수나 객체입니다.
graph_builder.add_node("chatbot", chatbot)

주목할 점chatbot 노드 함수가 현재 State를 입력으로 받아 "messages" 키 아래에 업데이트된 messages 목록을 포함하는 사전을 반환한다는 것입니다. 이것이 모든 LangGraph 노드 함수의 기본 패턴입니다.

우리 Stateadd_messages 함수는 LLM의 응답 메시지를 이미 상태에 있는 메시지에 추가할 것입니다.

4. entry 포인트 추가

그래프에게 각 실행할 때마다 작업을 시작할 위치를 알려주기 위해 entry 포인트를 추가합니다:

graph_builder.add_edge(START, "chatbot")

5. 그래프 컴파일

그래프를 실행하기 전에 컴파일해야 합니다. 그래프 빌더에서 compile()을 호출하여 이 작업을 수행할 수 있습니다. 이렇게 하면 상태에 대해 호출할 수 있는 CompiledGraph가 생성됩니다.

graph = graph_builder.compile()

6. 그래프 시각화 (선택 사항)

get_graph 메서드와 draw_ascii 또는 draw_png와 같은 "draw" 메서드 중 하나를 사용하여 그래프를 시각화할 수 있습니다. 각 draw 메서드에는 추가 종속성이 필요합니다.

from IPython.display import Image, display

try:
    display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
    # 이것은 몇 가지 추가 종속성이 필요하며 선택 사항입니다
    pass

기본 챗봇 다이어그램

7. 챗봇 실행

이제 챗봇을 실행해 봅시다!

언제든지 quit, exit 또는 q를 입력하여 채팅 루프를 종료할 수 있습니다.

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:
        # input()을 사용할 수 없는 경우 대체
        user_input = "What do you know about LangGraph?"
        print("User: " + user_input)
        stream_graph_updates(user_input)
        break
Assistant: LangGraph는 언어 모델을 사용하여 상태 기반 다중 에이전트 애플리케이션을 구축하는 데 도움이 되도록 설계된 라이브러리입니다. 여러 AI 에이전트 또는 언어 모델 상호 작용을 조정하기 위한 워크플로우 및 상태 머신을 생성하는 도구를 제공합니다. LangGraph는 LangChain 위에 구축되어 그 구성 요소를 활용하면서 그래프 기반 조정 기능을 추가합니다. 특히 단순한 쿼리-응답 상호 작용을 넘어서는 더 복잡한 상태 기반 AI 애플리케이션을 개발하는 데 유용합니다.
Goodbye!

축하합니다! LangGraph를 사용하여 첫 번째 챗봇을 구축했습니다. 이 봇은 사용자 입력을 받아 LLM을 사용하여 응답을 생성함으로써 기본 대화에 참여할 수 있습니다. 위 호출에 대한 LangSmith 추적을 검사할 수 있습니다.

다음은 이 튜토리얼의 전체 코드입니다:

API 참조: init_chat_model | StateGraph | START | add_messages

from typing import Annotated

from langchain.chat_models import init_chat_model
from typing_extensions import TypedDict

from langgraph.graph import StateGraph, START
from langgraph.graph.message import add_messages


class State(TypedDict):
    messages: Annotated[list, add_messages]


graph_builder = StateGraph(State)


llm = init_chat_model("anthropic:claude-3-5-sonnet-latest")


def chatbot(state: State):
    return {"messages": [llm.invoke(state["messages"])]}


# 첫 번째 인수는 고유한 노드 이름입니다
# 두 번째 인수는 노드가 사용될 때마다 호출될 함수나 객체입니다.
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph = graph_builder.compile()

다음 단계

봇의 지식이 훈련 데이터에 있는 내용으로 제한되어 있다는 것을 알아차렸을 수 있습니다. 다음 부분에서는 봇의 지식을 확장하고 더 능력 있게 만들기 위해 웹 검색 도구를 추가할 것입니다. [mcp] Python SDK 공식 README

목차

  • 개요
  • 설치
    • Python 프로젝트에 MCP 추가하기
    • 독립 실행형 MCP 개발 도구 실행
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유