📑 Mục lục bài viết
Mặc dù các mô hình ngôn ngữ lớn (LLMs) sở hữu lượng tri thức khổng lồ, chúng vẫn mắc phải hai giới hạn lớn: hiện tượng “ảo giác” (Hallucination) và thiếu thông tin dữ liệu nội bộ/thời gian thực. Kỹ thuật RAG (Retrieval-Augmented Generation) chính là giải pháp hàng đầu để khắc phục triệt để vấn đề này.
1. Nguyên lý Hoạt động của RAG Pipeline
Hệ thống RAG hoạt động theo quy trình 3 giai đoạn cốt lõi:
- Indexing (Chỉ mục hóa): Tài liệu văn bản (PDF, Docs, Markdown) được bóc tách thành các đoạn nhỏ (Chunks) có độ dài khoảng 500-1000 tokens, sau đó chuyển đổi thành các Vector số học nhiều chiều thông qua Embedding Model (như
text-embedding-3-small). - Retrieval (Truy vấn tương đồng): Khi người dùng đặt câu hỏi, câu hỏi cũng được mã hóa thành Vector. Cơ sở dữ liệu Vector (ChromaDB, Pinecone, Qdrant) sẽ tìm kiếm các đoạn văn bản có độ tương đồng cosine (Cosine Similarity) cao nhất với câu hỏi.
- Generation (Sinh phản hồi): Các đoạn thông tin tìm được kết hợp cùng câu hỏi gốc được đưa vào Prompt gửi đến LLM để mô hình tổng hợp câu trả lời chính xác 100% dựa trên tài liệu cung cấp.
2. Mã nguồn Triển khai RAG với Python & LangChain
Đoạn mã hoàn chỉnh dưới đây minh họa việc nạp tài liệu và thực hiện hỏi đáp thông minh:
import os
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
# 1. Nạp và phân đoạn tài liệu
loader = TextLoader("knowledge_base.txt", encoding="utf-8")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=600, chunk_overlap=100)
splits = text_splitter.split_documents(docs)
# 2. Tạo Vector Store với Chroma
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# 3. Thiết lập LLM và Prompt template
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.1)
system_prompt = (
"Bạn là trợ lý AI chuyên nghiệp. Hãy sử dụng các đoạn ngữ cảnh sau đây để trả lời câu hỏi: "
"nn{context}nn"
"Nếu thông tin không có trong tài liệu, hãy thành thật trả lời là bạn không biết."
)
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
("human", "{input}"),
])
# 4. Thực thi chuỗi truy vấn RAG
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)
response = rag_chain.invoke({"input": "Quy trình bảo hành sản phẩm diễn ra như thế nào?"})
print("Phản hồi:", response["answer"])
3. Các Chiến lược Tối ưu RAG Nâng cao
- Hybrid Search: Kết hợp giữa tìm kiếm từ khóa truyền thống (BM25) và tìm kiếm ngữ nghĩa (Dense Vector) để tối ưu độ chính xác cho các thuật ngữ chuyên ngành.
- Reranking: Sử dụng mô hình Cohere Rerank hoặc Cross-Encoder để sắp xếp lại thứ tự ưu tiên của các kết quả trước khi đưa vào ngữ cảnh LLM.
Leave a Reply