[RAG 시리즈] ChatBot 구축하기 : Rule Base 부터 LangGraph 까지

Judy·2025년 2월 15일
0

[글또] RAG 시리즈

목록 보기
8/8

보험사, 금융사, 사내 메뉴얼 등 문서를 참조하는 챗봇에서 RAG가 사용되는 경우가 많은데요,
다시 말해, 좋은 챗봇을 구축하는 일 또한 RAG개발에 수반되는 업무입니다.

이번 포스팅에서는 Rule Base 로 챗봇을 구축한 경험을 공유하고,
최근 AI Agent 개발에 쓰이는 LangGraph 를 간단하게 소개합니다.
(튜토리얼 코드는 없습니다.)

공통 요구사항

챗봇을 개발할 때, 공통적으로 요구받은 사항은 다음과 같습니다.

  • 고객이 챗봇 로직을 직접 개선할 수 있어야 함
    • 고객이 간단히 스크립트 또는 시나리오를 수정하여 챗봇을 개선할 수 있도록 지원
    • 개발사의 유지보수 비용 절감
  • Fallback 처리 필요
    • 도메인과 관련 없는 질의에 대응할 수 있어야 함
  • 다수 유저의 동시 접속 처리
    • 서로 다른 다수의 사용자가 동시에 챗봇을 사용할 수 있어야 함
      • '사망보험금의 지급사유', '골절 상해 시 지급 금액' 와 같은 질문을 동시에 챗봇에 입력했을 때, 챗봇은 각 질의에 맞는 답변을 각각의 사용자에게 정확히 제공해야 함.
  • 현재 상태/단계 (level, depth 라고도 표현) 에 맞는 답변 제공
    • 보험종류 선택(생명/자동차/연금 중 생명보험 선택) -> 상품명 선택 단계의 경우 상품명만 고를 수 있어야 함.
      • '자동차보험 선택' 과 같은 질의가 들어올 경우 이전 단계에 대한 질의이므로 처리하지 않아야 함
  • (선택사항) Multi-turn
    • 이전 대화를 참조하여 답변 제공

Rule Base

위 요구조건에 따라 if문을 사용하여 직접 코딩할 수도 있지만
채팅을 쉽게 구현할 수 있도록 돕는 스크립트나 프레임워크를 사용하면 더 쉽게 챗봇을 개발할 수 있습니다.

저는 텍스트 챗봇 개발에 Rivescript 를, 음성 챗봇에 JSGF 를 사용했습니다.
(음성 챗봇 관련 포스팅 : https://velog.io/@judy_choi/글또-음성-명령어-인식-라이브러리-소개-JSGF-Voice2Json-Rhasspy)

RiveScriptJSGF (Java Speech Grammar Format)는 둘 다 자연어 처리에 사용되지만, 목적과 방식이 다릅니다.
다음은 각 스크립트 및 문법을 ChatGPT 가 정리 및 비교해 준 결과입니다.


🔹 RiveScript vs. JSGF 비교

요소RiveScript 📝JSGF (Java Speech Grammar Format) 🎤
기능패턴 기반 챗봇 스크립트음성 인식을 위한 문법 정의
방식정규식 + 룰 기반BNF(Backus-Naur Form) 문법
주요 역할텍스트 기반 대화 응답음성 인식 시스템의 명령 처리
언어 지원Python, JS, Java 등Java, CMU Sphinx, Kaldi, Rhasspy 등
인터넷 필요 여부필요 없음필요 없음 (음성 인식 엔진 필요)
사용 예시텍스트 챗봇, FAQ음성 명령어 정의 (예: "Turn on the light")

🔹 RiveScript란?

역할:

  • 패턴 매칭을 사용한 챗봇 제작
  • 정해진 텍스트 입력에 대한 응답 제공

예제 (RiveScript)

+ hello bot
- Hello, human!

+ my name is *
- Nice to meet you, <star>!

+ → 사용자의 입력 패턴
- → 챗봇의 응답
<star> → 와일드카드 (변수를 저장)


🔹 JSGF (Java Speech Grammar Format)란?

역할:

  • 음성 인식(Speech Recognition)용 문법을 정의하는 표준
  • Java 기반 음성 인식 엔진(CMU Sphinx, Kaldi 등)에서 사용됨

예제 (JSGF)

#JSGF V1.0;

grammar lights;

public <command> = (turn on | switch on | activate) the (light | lamp);

grammar lights; → 문법의 이름
public <command> → 공개된 명령어 정의
(turn on | switch on | activate) → 가능한 입력 패턴
(light | lamp) → "light" 또는 "lamp" 인식


🔹 핵심 차이점 요약

비교 항목RiveScript 📝JSGF 🎤
주요 목적텍스트 챗봇 제작음성 인식용 문법 정의
사용 환경텍스트 기반음성 인식 엔진과 함께 사용
입력 방식정규식 기반BNF 문법 기반
응용 분야고객지원 챗봇, 게임 NPC스마트홈, 음성 명령 제어

결론

텍스트 챗봇을 만들고 싶다면RiveScript
음성 인식 시스템을 구축하고 싶다면JSGF

즉, RiveScript는 대화형 응답을 위한 스크립트, JSGF는 음성 인식 엔진을 위한 문법입니다! 🚀


개인적으로 rivescript 를 이용할 때에는 명령어가 들어왔을 때 매칭되는 함수를 호출할 때 편리했고,
JSGF는 미리 intent, entity, slot 을 지정해 두고
정해진 명령어가 들어왔을 때 각각의 intent, entity, slot 을 매칭시켜 추출할 때 편리했습니다.

만약 대화 내용을 기억해야 할 경우에는 rivescript 와JSGF 모두 메모리 기능을 따로 지원하지 않으므로
Redis 또는 RDBMS 를 연동해야 합니다.

LangGraph

최근에는 LangGraph 를 이용해 AI Agent 를 개발합니다.
기존 챗봇의 경우 FAQ 및 고객센터용 챗봇처럼 정해진 질문과 답변이 있고
패턴 매칭 방식을 이용해 가볍고 빠르게 예측 가능한 응답을 제공하였으나
최근에는 LangGraph 를 이용해 자율적이고 지능적인 의사결정이 가능한 챗봇 (주어진 목표를 스스로 해결)을 개발할 수 있습니다.

아래는 AI Agent 와 일반 챗봇(기존) 을 비교한 ChatGPT 답변입니다.

AI Agent vs. 일반 챗봇의 차이

📌 기본 개념

  • 일반 챗봇 → 미리 정의된 규칙 또는 스크립트 기반으로 작동하는 챗봇
  • AI Agent자율적이고 지능적인 의사결정이 가능한 챗봇 (주어진 목표를 스스로 해결)

🔹 1. 주요 차이점 비교

비교 항목일반 챗봇 🤖AI Agent 🧠
작동 방식정해진 규칙, 스크립트 기반자율적 의사결정, AI 기반
자연어 이해 (NLU)제한적 (정해진 패턴만 이해)강력한 이해 능력 (LLM 활용)
상황 적응력낮음 (예상 질문만 대응 가능)높음 (새로운 상황에 적응 가능)
멀티태스킹단일 태스크 수행여러 개의 작업을 동시에 수행 가능
의사결정 능력없음 (단순한 응답만 수행)있음 (자율적으로 해결책 찾음)
상태 기억제한적 (이전 대화 기억 어려움)강력한 메모리 기능 (장기 기억 가능)
API 연동단순한 API 호출복잡한 API 조합 및 활용 가능
사용 사례FAQ 챗봇, 고객센터 봇AI 비서, 자동화된 상담사, 연구 보조

🔹 2. 작동 방식 차이

📌 (1) 일반 챗봇의 작동 방식

규칙 기반 (Rule-Based) 챗봇

  • 미리 정해진 패턴과 응답에 따라 작동
  • 예) RiveScript, AIML 기반 챗봇

예제 (RiveScript)

+ hello
- Hi there! How can I help you?

📌 "hello"라는 입력이 들어오면 항상 같은 응답을 반환

기본적인 API 연동 가능

  • 예) "날씨 알려줘" → 특정 API 호출 후 응답

작동 방식
사용자 입력 → 정해진 패턴 매칭 → 미리 정의된 응답 제공
🚨 새로운 질문이 들어오면 대응 불가능!


📌 (2) AI Agent의 작동 방식

자율적인 의사결정 (LLM 활용)

  • GPT-4, LangGraph, AutoGPT 등과 같은 AI 기술을 사용하여 새로운 상황에도 적응 가능

멀티에이전트 협력 가능

  • 여러 AI가 서로 다른 역할을 맡아 문제 해결 가능

예제 (LangGraph)

from langgraph.graph import StateGraph
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(model="gpt-4")

class ChatState:
    def __init__(self, messages=None):
        self.messages = messages or []

def ai_agent(state: ChatState):
    response = llm(state.messages)
    return ChatState(messages=state.messages + [response])

graph = StateGraph(ChatState)
graph.add_node("ai_agent", ai_agent)
graph.set_entry_point("ai_agent")
graph.set_finish_point("ai_agent")

state = ChatState(messages=["Can you summarize today's news?"])
result = graph.invoke(state)

print(result.messages[-1].content)

📌 자율적으로 질문을 이해하고 답변 생성 가능!
📌 기존 챗봇과 달리 API 호출, 문서 요약 등 다양한 작업 수행 가능


🔹 3. 실제 활용 사례

사용 사례일반 챗봇 🤖AI Agent 🧠
FAQ 챗봇가능 (고정된 응답 제공)가능 (더 자연스러운 대화 가능)
고객 지원제한적 (간단한 질문 응답)복잡한 요청 처리 가능
AI 비서불가능가능 (작업 자동화, 일정 관리 등)
문서 요약/검색불가능가능 (LLM 활용)
자동화된 연구 분석불가능가능 (다양한 데이터 분석 및 학습)

4. 결론: 언제 어떤 걸 선택해야 할까?

🔹 일반 챗봇이 적합한 경우

✅ 정해진 질문과 답변이 있는 챗봇 (FAQ, 고객센터)
✅ 가벼운 시스템을 원할 때
✅ 빠르고 예측 가능한 응답이 필요할 때
예제: RiveScript, Dialogflow(룰 기반 모드)

🔹 AI Agent가 적합한 경우

✅ 복잡한 자연어 이해 및 응답이 필요할 때
✅ 새로운 질문에도 대응할 수 있어야 할 때
✅ 여러 작업을 수행하는 AI가 필요할 때 (예: AI 비서, 자동화 챗봇)
예제: LangGraph, AutoGPT, ChatGPT API


🎯 최종 정리

1️⃣ FAQ 챗봇, 간단한 고객지원 챗봇 → 일반 챗봇 (RiveScript, Dialogflow 등)
2️⃣ AI 비서, 연구 보조, 복잡한 대화 관리 → AI Agent (LangGraph, AutoGPT 등)

즉, 단순한 패턴 매칭 챗봇이라면 일반 챗봇,
자율적인 AI 역할 수행이 필요하다면 AI Agent가 더 적합합니다! 🚀

profile
NLP Researcher

0개의 댓글

관련 채용 정보