디지털 시대의 고객 경험을 혁신하는 대화형 AI 챗봇은 이제 비즈니스의 필수 요소가 되었습니다.

하지만 복잡한 자연어 처리와 데이터 통합 문제로 인해 많은 개발자들이 진입 장벽에 부딪히곤 합니다.

LangChain은 이러한 문제를 해결하며 빠른 시간 안에 지능형 챗봇을 구축할 수 있는 강력한 프레임워크를 제공합니다.

이 가이드에서는 환경 설정부터 RAG 기반의 고급 기능 확장까지, 실제 프로덕션에 바로 적용 가능한 단계별 구현 방법을 소개합니다.

환경 설정 및 필수 라이브러리 설치

필수 패키지 설치

pip install langchain langchain-openai python-dotenv faiss-cpu tiktoken

환경 변수 설정 (.env 파일)

OPENAI_API_KEY="your-api-key"

언어 모델 초기화

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model_name="gpt-3.5-turbo",
    temperature=0.5,
    max_tokens=500
)

프롬프트 템플릿 설계

from langchain.prompts import (
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
    ChatPromptTemplate
)

system_template = """당신은 전문 고객 지원 AI입니다. 다음 규칙을 준수하세요:
1. 친절하고 공손한 어조 유지
2. 사용자 질문에 솔직한 이해로 답변
3. 모르는 내용은 솔직히 고백"""

system_prompt = SystemMessagePromptTemplate.from_template(system_template)
human_prompt = HumanMessagePromptTemplate.from_template("{question}")
chat_prompt = ChatPromptTemplate.from_messages([system_prompt, human_prompt])

메모리 관리 구현

대화 기록 저장소 설정

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

외부 데이터 통합 (RAG)

문서 처리 파이프라인

from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS

# 문서 로드
loader = WebBaseLoader("https://example.com/knowledge-base")
docs = loader.load()

# 텍스트 분할
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)

# 벡터 저장소 생성
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(splits, embeddings)
retriever = vectorstore.as_retriever()

체인 및 에이전트 구성

LCEL을 이용한 체인 생성

from langchain_core.runnables import RunnablePassthrough

rag_chain = {
    "context": retriever, "question": RunnablePassthrough()}
    | chat_prompt
    | llm
}

대화형 인터페이스 구축 (Streamlit)

app.py

import streamlit as st
from langchain_community.callbacks import StreamlitCallbackHandler

st.title("AI 고객 지원 챗봇")

if "messages" not in st.session_state:
    st.session_state.messages = []

for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

if prompt := st.chat_input("질문을 입력하세요"):
    st.session_state.messages.append({"role": "user", "content": prompt})
    
    with st.chat_message("assistant"):
        st_callback = StreamlitCallbackHandler(st.container())
        response = rag_chain.invoke(prompt, {"callbacks": [st_callback]})
        st.markdown(response.content)
    
    st.session_state.messages.append({"role": "assistant", "content": response.content})

고급 기능 확장

실시간 알림 시스템 연동

from twilio.rest import Client

def send_sms_alert(message):
    account_sid = os.getenv('TWILIO_SID')
    auth_token = os.getenv('TWILIO_TOKEN')
    client = Client(account_sid, auth_token)
    
    client.messages.create(
        body=f"🚨 긴급 알림: {message}",
        from_='+12345678901',
        to=os.getenv('ADMIN_PHONE')
    )

테스트 및 최적화 전략

  • 부하 테스트: 동시 100회 요청 시 응답 시간 측정
  • 정확도 검증: 500개 샘플 질문으로 정답률 평가
  • 프롬프트 최적화: A/B 테스트를 통한 최적 응답 형식 탐색
  • 모니터링: Prometheus + Grafana로 API 호출 추적

배포 아키텍처 구성요소

구성 요소역할통신 프로토콜
Streamlit Frontend사용자 인터페이스 제공HTTP/JSON
FastAPI Backend비즈니스 로직 처리REST API
Redis Vector DB벡터 데이터 저장 및 검색Redis Protocol
OpenAI API언어 모델 서비스 제공HTTPS/API Calls

문제 해결

  • 환경 변수 미작용 시: python-dotenv로 .env 파일 로드 확인
  • 응답 지연 발생: max_tokens 값 조정 및 캐싱 기능 추가
  • 정확도 저하: 검색 결과 상위 3개 문서 컨텍스트 변경
  • 메모리 누수: 대화 기록 10회로 제한하는 Middleware 추가

결론

OpenAI API와의 원활한 통합, FAISS를 활용한 지식 기반 검색 생성, Streamlit으로 구현하는 직관적인 UI까지, 모든 요소가 하나의 파이프라인으로 연결됩니다.

특히 RAG 기술을 접목하면 단순한 질의응답을 넘어 문서를 활용한 전문성 있는 답변이 가능해집니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글