Python Machine learning
figonkingx  

RAG là gì? Kỹ thuật tăng cường độ chính xác cho AI

RAG (Retrieval Augmented Generation) là kỹ thuật quan trọng giúp cải thiện độ chính xác của Large Language Models. Thay vì chỉ dựa vào knowledge trong training data, RAG cho phép LLM truy cập và sử dụng thông tin từ nguồn dữ liệu bên ngoài.

Nội dung chính

Tại sao cần RAG?

LLMs như GPT-4, Claude có hai vấn đề chính:

  • Knowledge cutoff – Chỉ biết thông tin đến thời điểm training
  • Hallucination – Có thể “bịa” thông tin khi không chắc chắn

RAG giải quyết bằng cách:

  1. Tìm kiếm thông tin liên quan từ database
  2. Đưa thông tin đó vào context cho LLM
  3. LLM trả lời dựa trên context được cung cấp

Kiến trúc RAG cơ bản

┌─────────────┐     ┌──────────────┐     ┌─────────────┐
│   Question  │────▶│   Retriever  │────▶│  Vector DB  │
└─────────────┘     └──────────────┘     └─────────────┘
                           │
                           ▼ (relevant documents)
                    ┌──────────────┐
                    │     LLM      │
                    └──────────────┘
                           │
                           ▼
                    ┌──────────────┐
                    │    Answer    │
                    └──────────────┘

Cài đặt RAG với LangChain

1. Chuẩn bị môi trường

pip install langchain langchain-openai chromadb tiktoken

2. Load và chunk documents

from langchain.document_loaders import TextLoader, PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# Load documents
loader = PyPDFLoader("company_docs.pdf")
documents = loader.load()

# Split thành chunks
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    separators=["\n\n", "\n", " ", ""]
)
chunks = text_splitter.split_documents(documents)

3. Tạo vector store

from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# Tạo embeddings và lưu vào ChromaDB
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

4. Tạo RAG chain

from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA

llm = ChatOpenAI(model="gpt-4-turbo")

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",  # hoặc "map_reduce", "refine"
    retriever=vectorstore.as_retriever(
        search_kwargs={"k": 3}  # Top 3 relevant docs
    ),
    return_source_documents=True
)

# Query
result = qa_chain.invoke({"query": "What is our refund policy?"})
print(result["result"])
print("Sources:", result["source_documents"])

Vector Databases phổ biến

DatabaseƯu điểmUse case
ChromaDBĐơn giản, embeddedPrototyping
PineconeManaged, scalableProduction
WeaviateOpen source, powerfulEnterprise
QdrantFast, Rust-basedHigh performance
pgvectorPostgreSQL extensionExisting Postgres

Advanced RAG Techniques

Hybrid Search

Kết hợp semantic search với keyword search:

from langchain.retrievers import BM25Retriever, EnsembleRetriever

bm25 = BM25Retriever.from_documents(docs)
vector = vectorstore.as_retriever()

ensemble = EnsembleRetriever(
    retrievers=[bm25, vector],
    weights=[0.3, 0.7]
)

Contextual Compression

Nén context để giữ lại phần quan trọng:

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor

compressor = LLMChainExtractor.from_llm(llm)
retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=vectorstore.as_retriever()
)

Evaluation Metrics

  • Faithfulness – Câu trả lời có dựa trên context không?
  • Answer relevancy – Câu trả lời có liên quan đến câu hỏi?
  • Context precision – Context retrieved có chính xác?
  • Context recall – Đã lấy đủ context cần thiết chưa?

Fullstack Station Tips

RAG là kỹ thuật cốt lõi cho các ứng dụng AI trong doanh nghiệp:

  • Customer support – Q&A từ knowledge base
  • Legal/Medical – Tra cứu documents chính xác
  • Internal search – Tìm kiếm trong tài liệu công ty

Mẹo khi implement:

  • Chunk size ~500-1000 tokens thường tốt nhất
  • Overlap 10-20% để không mất context
  • Dùng metadata filtering để narrow down search
  • Test với nhiều embedding models (OpenAI, Cohere, local)

Tham khảo

Comments

Leave A Comment