주뇽's 저장소

Part 2.2: LangGraph와 웹 검색 도구를 활용한 지능형 챗봇 구현하기 🔍 본문

LangGraph

Part 2.2: LangGraph와 웹 검색 도구를 활용한 지능형 챗봇 구현하기 🔍

뎁쭌 2025. 1. 18. 17:39
728x90
반응형

Part 2.2: LangGraph와 웹 검색 도구를 활용한 지능형 챗봇 구현하기 🔍

이번 글에서는 LangGraph와 Tavily 검색 도구를 활용하여 실시간 정보를 검색할 수 있는 지능형 챗봇을 구현하는 방법을 설명한다.

1. 프로젝트 구조 설정 🛠️

import os
from dotenv import load_dotenv
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
from langgraph.prebuilt import ToolNode, tools_condition

load_dotenv()

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

2. 그래프 설정 및 검색 도구 구현 🌐

def setup_graph():
    graph_builder = StateGraph(State)

    # 검색 도구 설정
    tool = TavilySearchResults(max_results=2)
    tools = [tool]

    # AI 모델 설정
    llm = ChatOpenAI(
        model="gpt-4",
        temperature=0.7,
        streaming=True
    )
    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)
    graph_builder.add_node("tools", ToolNode(tools=[tool]))
    graph_builder.add_conditional_edges("chatbot", tools_condition)
    graph_builder.add_edge("tools", "chatbot")
    graph_builder.add_edge(START, "chatbot")

    return graph_builder.compile()

3. 테스트 기능 구현 🧪

def test_chatbot(graph, question: str):
    print("\n" + "="*50)
    print(f"😀 사용자: {question}")
    print("="*50)

    try:
        for event in graph.stream({"messages": [("human", question)]}):
            for value in event.values():
                if "messages" in value:
                    message = value["messages"][-1]
                    if hasattr(message, "content"):
                        print("\n🤖 AI:", message.content)
                    if hasattr(message, "tool_calls") and message.tool_calls:
                        print("\n🔍 검색 중...")
                        for tool_call in message.tool_calls:
                            print(f"- 검색어: {tool_call['args'].get('query', '')}")
    except Exception as e:
        print(f"\n❌ 오류 발생: {str(e)}")

4. 실행 코드 구현 ▶️

def main():
    test_questions = [
        "안녕하세요!",
        "2024년 가장 인기있는 프로그래밍 언어는 뭐야?",
        "1 + 1은 뭐야?",
        "파이썬이란 무엇인가요?",
        "어제 있었던 월드컵 결과 알려줘",
        "2025년 IT 최신 트렌드를 알려줘"
    ]

    print("🔄 챗봇 초기화 중...")
    graph = setup_graph()
    print("✅ 챗봇 준비 완료!\n")

    for question in test_questions:
        test_chatbot(graph, question)
        print("\n" + "-"*50)

5. 실행 결과 예시 📝

==================================================
😀 사용자: 2024년 가장 인기있는 프로그래밍 언어는 뭐야?
==================================================

🤖 AI: 이 정보를 찾아보겠습니다.

🔍 검색 중...
- 검색어: 2024 most popular programming languages current trends

🤖 AI: 2024년 현재 가장 인기 있는 프로그래밍 언어들은 다음과 같습니다:

1. Python
   - 데이터 과학, AI, 웹 개발에서 강세
   - 쉬운 문법과 풍부한 라이브러리

2. JavaScript
   - 웹 개발에서 필수적
   - Node.js를 통한 백엔드 개발도 가능

3. Java
   - 기업용 소프트웨어 개발에서 강세
   - 안드로이드 앱 개발에 사용

6. 주요 포인트 정리 ⭐

  1. 검색 도구 활용

    • Tavily API를 통해 실시간 웹 검색을 수행한다
    • max_results=2로 검색 결과를 제한한다
  2. 조건부 검색

    • AI가 필요하다고 판단할 때만 검색을 수행한다
    • 간단한 질문은 직접 답변한다
  3. 에러 처리

    • 검색 실패 시 적절한 에러 메시지를 표시한다
    • 안전한 예외 처리를 구현한다

7. 웹 검색 챗봇의 특징 🎯

  1. 장점

    • 실시간 정보 제공 가능
    • 광범위한 주제에 대한 답변 가능
    • 자동으로 검색 필요성 판단
  2. 주의사항

    • API 키 필요 (Tavily, OpenAI)
    • 검색 결과의 신뢰성 확인 필요
    • 적절한 검색어 선택 중요

8. 활용 예시 💡

  1. 뉴스 검색 봇

    question = "최근 IT 업계 주요 뉴스는?"
    test_chatbot(graph, question)
  2. 기술 트렌드 조사

    question = "최신 AI 개발 트렌드는?"
    test_chatbot(graph, question)

이렇게 LangGraph와 웹 검색 도구를 활용하여 실시간 정보를 제공하는 지능형 챗봇을 구현할 수 있다. 다음 글에서는 이 챗봇에 메모리 기능을 추가하여 대화 맥락을 유지하는 방법을 알아본다. 🚀