디지털 시대의 고객 경험을 혁신하는 대화형 AI 챗봇은 이제 비즈니스의 필수 요소가 되었습니다.
하지만 복잡한 자연어 처리와 데이터 통합 문제로 인해 많은 개발자들이 진입 장벽에 부딪히곤 합니다.
LangChain은 이러한 문제를 해결하며 빠른 시간 안에 지능형 챗봇을 구축할 수 있는 강력한 프레임워크를 제공합니다.
이 가이드에서는 환경 설정부터 RAG 기반의 고급 기능 확장까지, 실제 프로덕션에 바로 적용 가능한 단계별 구현 방법을 소개합니다.
pip install langchain langchain-openai python-dotenv faiss-cpu tiktoken
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
)
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()
from langchain_core.runnables import RunnablePassthrough
rag_chain = {
"context": retriever, "question": RunnablePassthrough()}
| chat_prompt
| llm
}
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')
)
구성 요소 | 역할 | 통신 프로토콜 |
---|---|---|
Streamlit Frontend | 사용자 인터페이스 제공 | HTTP/JSON |
FastAPI Backend | 비즈니스 로직 처리 | REST API |
Redis Vector DB | 벡터 데이터 저장 및 검색 | Redis Protocol |
OpenAI API | 언어 모델 서비스 제공 | HTTPS/API Calls |
OpenAI API와의 원활한 통합, FAISS를 활용한 지식 기반 검색 생성, Streamlit으로 구현하는 직관적인 UI까지, 모든 요소가 하나의 파이프라인으로 연결됩니다.
특히 RAG 기술을 접목하면 단순한 질의응답을 넘어 문서를 활용한 전문성 있는 답변이 가능해집니다.