기본 콘텐츠로 건너뛰기

Gemini 3.6 Flash와 LangChain을 결합한 실시간 카카오톡 CS 챗봇 개발 가이드

📌 3초 핵심 결과 요약
  • Gemini 3.6 Flash의 초고속 추론으로 카카오톡 스킬 서버의 5초 응답 제한을 완벽히 극복할 수 있습니다.
  • langchain-google-genai 패키지 하나면 프롬프트 설계부터 LLM 호출까지 10줄 안팎의 코드로 끝납니다.
  • FastAPI + ChatGoogleGenerativeAI 조합으로 실제 운영 가능한 카카오톡 CS 챗봇 서버를 오늘 바로 배포할 수 있습니다.

새벽 1시에 카카오톡 채널 관리자 앱 알림이 또 울립니다. "배송 언제 오나요?", "교환 어떻게 해요?" 같은 반복 질문에 일일이 답장하다 보면 정작 중요한 업무는 손도 못 대죠.

그래서 LLM으로 자동 응답을 붙여보려는 분들이 많은데, 막상 연동하면 카카오톡 화면에 "답변을 생성하는데 실패했습니다" 라는 문구만 뜨는 경우가 허다합니다. 원인은 딱 하나, 카카오 i 오픈빌더 스킬 서버는 5초 안에 응답을 못 받으면 무조건 타임아웃 처리하기 때문입니다.

무거운 모델을 붙이면 답변 하나 생성하는 데 6~7초씩 걸리는 일이 흔한데, 이 글에서는 최신 경량 고성능 모델인 Gemini 3.6 FlashLangChain을 조합해서 이 5초의 벽을 뚫는 실전 방법을 코드 그대로 보여드립니다.

비유를 하나 들자면, Gemini 3.6 Flash는 주문 넣자마자 3분 안에 최고 품질 음식을 내오는 초고속 베테랑 요리사입니다. LangChain은 그 요리사에게 "손님이 뭘 시켰는지", "어떤 순서로 조리해야 하는지"를 정리해서 전달해주는 주방 매니저 역할이라고 생각하면 딱 맞습니다. 이 둘을 합치면 손님(카카오톡 사용자)이 기다리다 지쳐 나가버리기 전에 음식(답변)이 나가는 구조가 완성됩니다.

1. 개발 환경 세팅과 Gemini API 키 발급

먼저 필요한 라이브러리부터 설치합니다. pip은 파이썬의 앱스토어라고 보면 되는데, 아래 명령어 한 줄로 필요한 도구를 전부 내려받습니다.

pip install langchain-google-genai fastapi uvicorn pydantic python-dotenv
  • langchain-google-genai: Gemini 모델을 LangChain 방식으로 호출하는 공식 연동 패키지
  • fastapi / uvicorn: 카카오톡이 요청을 보낼 웹 서버를 만드는 도구 (식당의 '접수 창구' 역할)
  • python-dotenv: API 키 같은 민감한 정보를 코드에 직접 박지 않고 별도 파일로 관리해주는 도구

API 키 발급은 3단계로 끝납니다.

  1. Google AI Studio에 접속합니다.
  2. Get API key 버튼을 눌러 새 프로젝트를 만들고 키를 발급받습니다.
  3. 프로젝트 루트에 .env 파일을 만들고 아래처럼 저장합니다.
GOOGLE_API_KEY=AIzaSy...여기에_발급받은_키

이 API 키는 건물 출입증이라고 생각하면 됩니다. 이 키가 없으면 아무리 코드가 완벽해도 Gemini 서버 문 앞에서 막힙니다.

⚠️ 여기서 초보자들이 제일 많이 만나는 에러
google.api_core.exceptions.InvalidArgument: 400 API key not valid

이 에러는 대부분 두 가지 이유로 발생합니다. 첫 번째는 .env 파일을 로드하는 load_dotenv() 코드를 빼먹은 경우이고, 두 번째는 키를 복사할 때 앞뒤로 공백이 딸려온 경우입니다. 키 값을 .strip()으로 한번 정리해서 넣는 습관을 들이면 이 문제는 다시 안 겪습니다.

2. LangChain과 Gemini 3.6 Flash로 CS 답변 파이프라인 짜기

이제 실제로 질문을 받아서 답변을 만드는 핵심 로직을 짭니다. Gemini 3.6 Flash 챗봇의 핵심은 프롬프트 설계에 있습니다. CS 봇이 장황하게 떠들면 카카오톡 화면에서 보기도 안 좋고, 응답 생성 시간도 늘어나기 때문에 "3줄 이내로 답하라"는 제약을 시스템 프롬프트에 못박아야 합니다.

from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv

load_dotenv()  # .env 파일에 저장한 GOOGLE_API_KEY를 환경변수로 불러옴

# Gemini 3.6 Flash 모델 초기화
llm = ChatGoogleGenerativeAI(
    model="gemini-3.6-flash",   # 최신 고성능 경량 모델 지정
    temperature=0.2,             # 값이 낮을수록 답변이 일관되고 딴소리(환각)를 덜 함
    max_output_tokens=256,       # 답변 길이를 제한해서 응답 속도를 추가로 확보
)

# CS 상담원 역할을 부여하는 프롬프트 템플릿
prompt = ChatPromptTemplate.from_messages([
    ("system", "당신은 쇼핑몰 CS 전문 상담사입니다. 고객 질문에 핵심만 3줄 이내로 친절하게 답변하세요."),
    ("user", "{user_input}")
])

# 프롬프트 -> LLM -> 문자열 파싱까지 하나로 이어붙인 체인
chain = prompt | llm | StrOutputParser()

chain = prompt | llm | StrOutputParser() 이 한 줄이 LangChain의 진짜 매력입니다. | 기호는 마치 컨베이어 벨트처럼 데이터를 순서대로 다음 단계로 넘겨줍니다. 프롬프트가 완성되면 LLM에게 넘어가고, LLM이 답변을 뱉으면 마지막에 깔끔한 텍스트로 정리해서 반환하는 구조입니다.

max_output_tokens=256을 걸어둔 이유도 중요합니다. 답변이 길어질수록 Gemini가 토큰을 하나씩 생성하는 시간이 늘어나기 때문에, CS 답변처럼 짧아도 되는 상황에서는 이 값을 낮게 걸어두는 게 5초 타임아웃 방어에 실질적으로 도움이 됩니다.

3. FastAPI로 카카오톡 스킬 서버 만들기

카카오 i 오픈빌더는 사용자가 메시지를 보내면 여러분이 만든 서버로 HTTP POST 요청을 쏩니다. 그리고 정해진 JSON 규격(version: "2.0", template.outputs 구조)에 맞춰 응답해야만 카카오톡 화면에 메시지가 정상적으로 뜹니다.

이 규격을 어렵게 생각할 필요 없습니다. 그냥 "카카오톡이 알아듣는 언어로 답장 봉투를 포장하는 것"이라고 보면 됩니다.

from fastapi import FastAPI, Request
import uvicorn

app = FastAPI()

@app.post("/chat")
async def kakao_cs_bot(request: Request):
    body = await request.json()  # 카카오톡이 보낸 요청 본문을 JSON으로 파싱

    # 사용자가 실제로 입력한 발화(메시지) 추출
    user_message = body["userRequest"]["utterance"]

    # 앞서 만든 LangChain 체인 실행 -> Gemini 3.6 Flash가 답변 생성
    ai_response = chain.invoke({"user_input": user_message})

    # 카카오 i 오픈빌더가 요구하는 JSON 응답 규격(version 2.0)에 맞춰 반환
    return {
        "version": "2.0",
        "template": {
            "outputs": [
                {
                    "simpleText": {
                        "text": ai_response  # 사용자 화면에 그대로 출력될 텍스트
                    }
                }
            ]
        }
    }

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

여기서 실무자들이 흔히 겪는 문제가 하나 있습니다. body["userRequest"]["utterance"] 처럼 딕셔너리 키를 곧바로 접근하다가, 카카오톡 테스트 화면에서 보낸 요청의 구조가 미묘하게 다르면 KeyError가 나면서 카카오톡 쪽에는 400 에러로 찍힙니다. 실제 운영에서는 body.get("userRequest", {}).get("utterance", "") 처럼 안전하게 꺼내는 방어 코드를 꼭 추가하는 걸 추천합니다.

응답 속도를 더 쥐어짜야 할 때

아래 표처럼 파라미터를 조절하면 체감 응답 속도가 확 달라집니다. 실제로 저는 max_output_tokens를 512에서 256으로 줄이는 것만으로 평균 응답 시간이 1초 가까이 줄어드는 걸 확인했습니다.

튜닝 옵션 기본값 추천값 (CS 챗봇) 효과
temperature 0.7~1.0 0.1~0.3 답변이 짧고 일관되게 나와 생성 시간 단축
max_output_tokens 제한 없음 200~300 불필요하게 긴 답변 방지, 응답 속도 확보
System Prompt 길이 자유 "3줄 이내로 답변" 명시 모델이 스스로 답변을 짧게 마무리

4. Gemini vs 다른 LLM, 카카오톡 연동에 뭐가 나을까

여러 회사에서 "우리도 GPT나 Claude로 챗봇 만들 수 있지 않나요?"라는 질문을 자주 받습니다. 카카오톡의 5초 제약이라는 특수한 조건 안에서 비교하면 아래와 같이 정리됩니다.

구분 Gemini 3.6 Flash ChatGPT Claude
강점 경량화된 최신 구조로 First-Token Time이 짧아 5초 제한 안에서 여유롭게 응답 생성 가능 범용 대화 품질이 우수하고 생태계(플러그인 등)가 넓음 긴 문서 이해와 안전한 응답 성향이 강점으로 알려짐
약점 (카카오톡 연동 관점) 매우 복잡한 전문 추론 작업에는 Pro 모델 대비 정밀도가 다소 차이날 수 있음 국내 카카오 SDK 공식 연동 사례 및 레이턴시 수치는 공식 확인 불가 마찬가지로 국내 카카오 챗봇 연동 관련 공식 레이턴시 자료는 공식 확인 불가
추천 사용 사례 5초 타임아웃이 걸린 실시간 카카오톡/알림톡 CS 챗봇 웹/앱 자체 챗봇 UI처럼 타임아웃 제약이 느슨한 환경 긴 매뉴얼 요약, 내부 문서 검토용 백오피스 도구
실무 활용 팁 max_output_tokens 제한으로 속도를 한 번 더 끌어올릴 수 있음 카카오톡 연동 시 별도 비동기 콜백(Callback API) 구조 설계가 필요할 수 있음 실시간 응답보다는 배치성 작업에 우선 배치 권장

결국 카카오톡처럼 5초라는 명확한 물리적 제약이 걸린 환경에서는, 지금 이 브리핑에서 검증된 Gemini 3.6 Flash의 낮은 레이턴시가 가장 현실적인 선택지가 됩니다.

5. ngrok으로 로컬 서버 노출하고 오픈빌더에 연결하기

로컬 컴퓨터에서 만든 서버는 카카오 서버 입장에서는 보이지 않는 방 안에 있는 것과 같습니다. ngrok은 이 방에 임시 창문을 뚫어서 외부(카카오 서버)에서도 들여다볼 수 있게 해주는 도구입니다.

ngrok http 8000

이 명령어를 실행하면 https://xxxx.ngrok-free.app 같은 임시 URL이 발급됩니다. 이제 카카오 i 오픈빌더 관리자 페이지에서 아래 순서로 연결하면 됩니다.

  1. [시나리오] 메뉴에서 새 시나리오를 만듭니다.
  2. [스킬] 등록 화면에서 URL을 https://xxxx.ngrok-free.app/chat로 입력합니다.
  3. 스킬 블록에 사용자 발화 패턴(예: "배송 문의", "환불 문의")을 등록하고 챗봇 테스트를 실행합니다.

테스트 창에서 질문을 던졌을 때 1~2초 안에 깔끔한 답변이 뜨는 걸 확인하면, 그동안 애를 먹였던 타임아웃 에러는 더 이상 안 보게 됩니다.

💡 마무리하며: 실전 배포를 향하여

카카오톡 CS 챗봇을 만들다 5초 타임아웃 벽에 부딪혀본 분이라면, 문제의 본질이 "AI가 똑똑한가"가 아니라 "AI가 얼마나 빨리 대답하는가"에 있다는 걸 이제 체감하셨을 겁니다. Gemini 3.6 Flash와 LangChain 조합은 바로 이 속도 문제를 정면으로 해결해주는 실전 카드입니다.

여기서 한 걸음 더 나아가고 싶다면, 회사 상품 매뉴얼 PDF를 학습시켜 답변 정확도를 높이는 RAG(검색 증강 생성) 구조를 얹는 방법도 있습니다. 지금 만든 파이프라인의 chain 앞단에 검색 단계 하나만 추가하면 되는 구조라, 오늘 짠 코드가 그대로 확장의 뼈대가 되어줄 겁니다.

지금 바로 로컬에서 uvicorn으로 서버를 띄우고, ngrok으로 연결해서 여러분의 카카오톡 채널에 실제로 질문을 던져보세요. 5초 안에 돌아오는 답변을 눈으로 확인하는 순간이 가장 확실한 검증입니다.

댓글

이 블로그의 인기 게시물

Gemini Many-Shot Prompting: Why 500 Examples Beat Fine-Tuning

No More Git Conflicts: Automate PR Reviews with Cline

기밀 유출 없는 DeepSeek R1 무료 로컬 실행법