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 +:
    • langchain hoặc llama-index
    • faiss (local) hoặc chroma
    • 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 }