from langchain.document_loaders import PyPDFLoader
pdf_path = "우리말_의학용어의_필수의학용어집을_중심으로.pdf"
loader = PyPDFLoader(pdf_path)
pages = loader.load_and_split()
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)
📌 이유:
separators를 활용해 항목 단위 분할 유도| 항목 | 권장 방식 |
|---|---|
| 텍스트 분할기 | RecursiveCharacterTextSplitter |
| chunk_size | 200 |
| chunk_overlap | 10 |
| separators | ["\\n\\n", "\\n", " "] |
| 이유 | PDF 구조가 항목 중심이므로 항목 단위 분할 필요 |
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()
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"
)
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()