Chat bot về rag
date
Apr 3, 2026
slug
chat-bot-ve-rag
status
Published
tags
AI
summary
Dưới đây là hướng dẫn thực chiến (engineering-focused) để bạn build một chatbot RAG (Retrieval-Augmented Generation) dùng 2 file PDF (bài báo khoa học về Bitcoin & Blockchain).
type
Post
1. Kiến trúc tổng thể RAG
Pipeline chuẩn:
PDF → Text → Chunk → Embedding → Vector DB ↓ User Query → Embedding → Similarity Search → Context ↓ LLM → Answer
Thành phần:
- Loader: đọc PDF
- Chunking: chia nhỏ text
- Embedding model: encode text → vector
- Vector DB: lưu vector (FAISS / Chroma / Pinecone)
- Retriever: tìm context liên quan
- LLM: trả lời dựa trên context
2. Stack đề xuất (phù hợp dev nhanh)
Option phổ biến:
- Python +:
langchainhoặcllama-indexfaiss(local) hoặcchroma- OpenAI / local model (Ollama)
👉 Nếu bạn đang dev nhanh:
dùng LangChain + FAISS + OpenAI embeddings
4. Load & xử lý PDF
fromlangchain.document_loadersimportPyPDFLoader loader=PyPDFLoader("bitcoin_research.pdf") docs1=loader.load() loader2=PyPDFLoader("blockchain_research.pdf") docs2=loader2.load() docs=docs1+docs2
5. Chunking (CỰC KỲ QUAN TRỌNG)
Sai chunk = RAG ngu 🤡
fromlangchain.text_splitterimportRecursiveCharacterTextSplitter splitter=RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200 ) chunks=splitter.split_documents(docs)
Best practice:
- chunk_size: 800–1200
- overlap: 10–20%
- giữ nguyên context học thuật (đừng cắt giữa công thức / đoạn logic)
6. Embedding + Vector DB
fromlangchain.embeddingsimportOpenAIEmbeddings fromlangchain.vectorstoresimportFAISS embeddings=OpenAIEmbeddings() db=FAISS.from_documents(chunks,embeddings) db.save_local("vector_store")
7. Query + Retrieval
db=FAISS.load_local("vector_store",embeddings) query="Bitcoin consensus mechanism là gì?" docs=db.similarity_search(query,k=4)
8. Build Chatbot (RAG core)
fromlangchain.chat_modelsimportChatOpenAI fromlangchain.chainsimportRetrievalQA llm=ChatOpenAI(model_name="gpt-4o-mini") qa=RetrievalQA.from_chain_type( llm=llm, retriever=db.as_retriever() ) response=qa.run("Explain Bitcoin security model") print(response)
9. Prompt engineering (QUAN TRỌNG với research paper)
Mặc định RAG trả lời hơi "hallucinate", bạn nên ép format:
fromlangchain.promptsimportPromptTemplate template=""" You are a research assistant. Use ONLY the provided context to answer. If not found, say: "Not in provided documents" Context: {context} Question: {question} Answer: """ prompt=PromptTemplate( template=template, input_variables=["context","question"] )
10. Nâng cấp để xịn hơn (production-level)
🔹 1. Metadata filtering
Gắn metadata:
doc.metadata= { "source":"bitcoin_paper", "page":5 }