51일차 자연어처리5 챗봇구현하기

차지예·2025년 7월 24일

생성AI

목록 보기
45/56
post-thumbnail

우리말 필수 의학용어 기반 RAG 챗봇 구현기


RAG 챗봇 구조 요약

  1. PDF 로딩 및 분할
  2. 텍스트 분할(Text Splitting)
  3. 임베딩 생성
  4. FAISS 벡터 DB 구성
  5. LLM 연결(OpenAI)
  6. Gradio 인터페이스 연결

1. PDF 문서 로딩

from langchain.document_loaders import PyPDFLoader

pdf_path = "우리말_의학용어의_필수의학용어집을_중심으로.pdf"
loader = PyPDFLoader(pdf_path)
pages = loader.load_and_split()

2. 텍스트 분할 (PDF가 용어표일 경우 적합한 분할 전략)

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=200,
    chunk_overlap=10,
    separators=["\n\n", "\n", " "]
)
texts = text_splitter.split_documents(pages)

📌 이유:

  • 해당 PDF는 "용어 - 대체어 - 설명" 형태로 구성되어 있음
  • 너무 큰 chunk는 각 용어가 섞여버리는 문제가 발생할 수 있음
  • separators를 활용해 항목 단위 분할 유도

✅ 전처리 전략 요약

항목권장 방식
텍스트 분할기RecursiveCharacterTextSplitter
chunk_size200
chunk_overlap10
separators["\\n\\n", "\\n", " "]
이유PDF 구조가 항목 중심이므로 항목 단위 분할 필요

3. 임베딩 및 벡터 DB 구성

from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS

embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vector_db = FAISS.from_documents(texts, embeddings)
retriever = vector_db.as_retriever()

4. LLM 연결 (OpenAI API 사용)

import os
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA

os.environ["OPENAI_API_KEY"] = "sk-..."  # 자신의 키로 교체

llm = ChatOpenAI(temperature=0.1, model_name="gpt-3.5-turbo")

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=retriever,
    chain_type="stuff"
)

5. Gradio 챗봇 인터페이스

import gradio as gr

with gr.Blocks() as demo:
    gr.Markdown("## 🧠 우리말 필수 의학용어 챗봇")

    chatbot = gr.Chatbot(label="RAG 기반 챗봇")
    msg = gr.Textbox(label="질문을 입력하세요")
    state = gr.State([])

    def respond(message, chat_history):
        response = qa_chain.run(message)
        chat_history.append((message, response))
        return "", chat_history

    msg.submit(respond, [msg, state], [msg, chatbot])
    gr.Button("대화 초기화").click(lambda: [], None, chatbot)

demo.launch()

api 토큰을 다써서 아직 Gradio 챗봇 인터페이스를 확인하지 못했다... 추후에 확인할 예정


0개의 댓글