10.3 다중 기능 챗봇 구성 전략

단순히 사용자와 대화를 주고받는 수준을 넘어, 하나의 챗봇이 여러 기능을 수행하도록 구성하는 것은 실전 서비스 구현에서 필수 요소입니다. 사용자의 의도(intent)에 맞춰 다양한 기능(요약, 번역, 날씨 조회, DB 검색 등)을 자연스럽게 연결하는 챗봇을 만들기 위해서는 여러 가지 설계 요소를 고려해야 합니다.

이 절에서는 OpenAI 기반으로 "다기능 챗봇(Multi-functional chatbot)"을 구성하는 전략을 다음과 같은 단계로 나누어 상세히 설명합니다.

    1. 다기능 챗봇이 필요한 이유와 주요 구성 요소

    1. 사용자 의도 추론 (Intent Detection)

    1. 프롬프트 설계와 기능 스위칭 전략

    1. 상태 관리 방식 (메모리 구조)

    1. 함수 호출(Function calling) 기반 조합 전략

    1. 예제: 요약 + 번역 + 날씨 API + 계산기 기능 통합

10.3.1 다기능 챗봇이란 무엇인가?

다기능 챗봇은 단일 대화 인터페이스 안에서 다양한 유형의 사용자 요청을 분석하고 각 요청에 해당하는 기능을 연결하여 실행할 수 있는 챗봇입니다.

예시:

  • "이 문서 요약해줘." → 문서 요약

  • "이메일을 영어로 번역해서 정중하게 써줘." → 번역 + 정중체화

  • "서울 내일 날씨 알려줘." → 날씨 API 호출

  • "234 * (45 + 2) 계산해줘." → 계산기 기능 호출

이러한 기능의 다양성은 사용자가 별도의 메뉴를 마주하지 않고도, 자연어로 다양한 기능을 요청할 수 있도록 하는 목표와 연결됩니다.

이를 위해서는 챗봇 내에서 다음을 구현해야 합니다:

  • 사용자의 입력을 분석해 어떤 기능을 원하는지를 판단 (의도 분류)

  • 관련 기능에 맞는 처리 로직으로 연결

  • 처리 결과를 사용자와 자연스럽게 이어지는 대화 형태로 전달

  • 연속 대화에서 앞의 요청 정보(예: 파일, 문맥 등)를 활용하는 컨텍스트 유지

10.3.2 사용자 의도 추론 (Intent Detection)

가장 먼저 수행되어야 하는 것은 사용자의 입력이 어떤 "기능 요구"에 해당하는지를 분류하는 것입니다. 이를 의도 추론(Intent detection)이라고 하며, 대표적인 전략은 다음과 같습니다.

  1. GPT 모델을 이용하여 자연어로 의도 분석:

system_prompt = """
당신은 사용자의 요청을 분석하여 아래 기능 중 어떤 것인지 분류해야 합니다.
- 요약
- 번역
- 계산
- 날씨 조회
- 기타

사용자의 요청을 기능 이름 중 하나로만 출력하십시오.
"""

user_input = "내일 부산 날씨 알려줘."

response = openai.ChatCompletion.create(
  model="gpt-4",
  messages=[
    {"role": "system", "content": system_prompt},
    {"role": "user", "content": user_input}
  ],
  temperature=0
)
  1. 분류 기준을 사전에 정의하고 키워드 매칭 (간단한 경우):

if "날씨" in user_input and ("서울" in user_input or "부산" in user_input):
    intent = "날씨 조회"
elif "요약" in user_input:
    intent = "요약"
# ...
  1. OpenAI Function Calling 기능 활용: 호출 가능한 함수(function)를 정의하고 메시지 내에서 GPT가 적절한 함수를 선택하도록 맡길 수 있습니다.

(자세한 구현은 Chapter 7. 참조)

GPT-4는 높은 유연성으로 의도 분류 성능이 뛰어나므로, 초기에는 별도 모델 또는 분류기를 두지 않고 GPT 기반의 분류 시스템으로 시작해도 충분합니다. 다만, 기능이 확대되면 정교한 Intent Matching 구조(LangChain Router 등)로 확장할 필요가 있습니다.

10.3.3 프롬프트 설계와 기능 스위칭 전략

의도를 추론한 뒤에는 해당 기능에 맞는 처리 로직과 프롬프트로 전환해야 합니다. 이때 사용할 수 있는 전략은 다음과 같습니다:

1. 시스템 메시지를 동적으로 구성

사용자의 요청에 따라 시스템 메시지를 수정하여 적절한 문맥을 제공하는 방법입니다.

def get_system_prompt(intent):
    if intent == "요약":
        return "당신은 문서를 한 문단으로 요약하는 요약 전문가입니다."
    elif intent == "번역":
        return "당신은 한국어와 영어 간 번역 전문가입니다."
    elif intent == "날씨 조회":
        return "당신은 사용자의 요청에 따라 날씨 API를 호출해 결과를 알려주는 챗봇입니다."
    elif intent == "계산":
        return "당신은 수학 계산기를 담당합니다. 수식을 정확히 계산하세요."
    else:
        return "당신은 다기능 비서로서 사용자의 요구를 최대한 정확히 수행합니다."

그 다음, system 메시지를 포함한 GPT 호출 메시지를 구축합니다.

2. 함수 호출(Function Calling 또는 명시적 함수 스위칭)

GPT-4 Function Calling 기능을 사용하는 방식은 기능 전환을 구조화된 방식으로 처리할 수 있게 도와줍니다.

  • Function schema를 여러 개 정의하고 메시지 내에서 선택되도록 함

  • 반환된 ToolCall 이름에 따라 실제 기능 모듈을 연결

(자세한 구성은 아래 10.3.5에서 설명)

10.3.4 상태 관리: 기능별 컨텍스트와 메모리 유지

여러 기능이 결합된 챗봇은 대화 상태(Context)를 효과적으로 관리해야 합니다. 다음 요소들을 고려하십시오:

  • 기능별로 따로 컨텍스트 저장 관리 (예: 이전 번역 문장 유지, 요약된 문서 저장)

  • 유저 세션 기반으로 대화 히스토리를 저장하고 각 기능에 따라 분기 처리

  • LangChain Memory 등 외부 툴 활용(Chapter 12 참조)

예시: 사용자가 이전에 날씨 정보를 요청한 후 “거기에 우산 가져가야 할까?”라고 묻는 경우, 이전의 날씨 요청(위치, 날짜)을 문맥으로 저장해야 합니다.

10.3.5 함수 호출 기반의 기능 라우팅 구조

GPT-4의 Function Calling 기능을 사용하면 효과적으로 다기능 챗봇을 구성할 수 있습니다.

예제 함수 정의:

functions=[
  {
    "name": "get_weather",
    "description": "특정 도시의 날씨 정보를 조회하는 함수",
    "parameters": {
        "type": "object",
        "properties": {
            "location": {
                "type": "string",
                "description": "도시 이름, 예: 서울, 부산 등"
            }
        },
        "required": ["location"]
    }
  },
  {
    "name": "translate_text",
    "description": "텍스트를 영어 또는 한국어로 번역합니다.",
    "parameters": {
        "type": "object",
        "properties": {
            "text": {"type": "string"},
            "target_language": {"type": "string", "enum": ["en", "ko"]}
        },
        "required": ["text", "target_language"]
    }
  }
  # 더 많은 함수 추가 가능
]

GPT에 함수 목록과 함께 메시지를 전달하면, 모델이 자동으로 사용자의 요청을 분석하여 호출할 함수를 반환합니다.

응답 예시:

"function_call": {
    "name": "get_weather",
    "arguments": "{ \"location\": \"부산\" }"
}

이를 받아서 실제 Python 코드에서 날씨 정보를 조회한 뒤, 응답을 사용자에게 전달합니다.

10.3.6 실습 예제: 요약 + 번역 + 날씨 조회 + 계산

최종적으로, 하나의 Flask 서버 기반으로 모든 기능을 통합하여 구성할 수 있습니다. 구성 요소는 다음과 같습니다:

  • Flask 웹 서버

  • GPT-4 API + Function Calling

  • 각 기능별 모듈:

    • 요약 기능: GPT 프롬프트 생성 후 요약결과 반환

    • 번역 기능: GPT 프롬프트 또는 Google Translate 연동

    • 날씨 기능: 외부 날씨 API 연동 (예: OpenWeatherMap)

    • 계산 기능: math 라이브러리를 활용한 계산기

구현 예시는 다음 절(10.4)에 Flask 기반 예제로 상세한 코드를 제공할 예정입니다.

10.3.7 요약

다기능 챗봇 구성은 단순 대화 이상의 실질적 가치를 제공하는 OpenAI 기반 서비스의 핵심입니다. 다음 요소가 필수적입니다.

  • 의도 분석 → 기능 분기

  • 각 기능에 맞는 프롬프트 또는 함수 설계

  • 대화 상태를 고려한 컨텍스트 기억

  • GPT Function Calling 기능 적극 활용

이러한 구성을 통해 실제 사용자 응대, 내부 업무 자동화, 다국어 지원 챗봇 등 다양한 AI 서비스로 확장할 수 있습니다.

Last updated