Sau khi đã hiểu các khái niệm nền tảng và công cụ của Retrieval-Augmented Generation (RAG), đã đến lúc bạn xây dựng pipeline RAG đầu tiên.
Bài này hướng dẫn bạn bước từng
bước, từ thiết lập dữ liệu cho đến tạo pipeline hoạt động đầy đủ, có thể truy
xuất thông tin và sinh phản hồi có ngữ cảnh bằng mô hình ngôn ngữ.
Mục tiêu chính của chương này là giúp bạn:
- Hiểu quy trình làm việc của một RAG pipeline
hoàn chỉnh.
- Xây dựng và chạy thử một pipeline cơ bản bằng
Python.
- Học cách đưa dữ liệu riêng của bạn vào mô
hình AI.
- Kiểm tra cách retriever và generator phối hợp để tạo
ra phản hồi chính xác.
4.1 Cấu trúc tổng thể của một
pipeline RAG
Một pipeline RAG bao gồm bốn
thành phần chính làm việc cùng nhau:
- Tập dữ liệu nguồn (Knowledge Base / Document
Store):
Nơi bạn lưu trữ
các tài liệu, văn bản hoặc dữ liệu cần truy vấn.
Ví dụ: file PDF, hướng dẫn sử dụng, bài báo khoa học, chính sách nội bộ.
- Bộ nhúng (Embedding Model):
Mỗi đoạn văn
trong dữ liệu sẽ được mã hóa thành vector (embedding) để biểu diễn ý nghĩa ngữ
nghĩa.
- Cơ sở dữ liệu vector (Vector Store):
Lưu trữ và tìm
kiếm các embeddings dựa trên độ tương đồng ngữ nghĩa.
Ví dụ: FAISS, Pinecone, ChromaDB.
- Mô hình ngôn ngữ (Language Model):
Tạo ra phản hồi
cuối cùng, bằng cách kết hợp truy vấn người dùng và thông tin được truy xuất.
Luồng hoạt động tổng quát
Quy trình của một pipeline RAG điển
hình:
- Người dùng nhập một truy vấn (query).
- Truy vấn được chuyển thành embedding vector.
- Vector database tìm các đoạn văn tương tự nhất
trong cơ sở tri thức.
- Những đoạn đó được ghép vào truy vấn tạo
thành prompt hoàn chỉnh.
- Prompt được đưa vào mô hình ngôn ngữ (LLM) để tạo
ra phản hồi.
👉 Nhờ vậy, phản hồi của
mô hình không còn chỉ dựa vào tri thức được huấn luyện, mà còn được hỗ trợ bởi
dữ liệu thực tế, cập nhật, và có thể kiểm chứng.
Ví dụ sơ đồ logic RAG:
4.2 Chuẩn bị môi trường
Để bắt đầu, bạn cần cài đặt các
thư viện cần thiết cho pipeline RAG cơ bản.
Chúng ta sẽ dùng LangChain để quản lý pipeline, FAISS làm cơ sở dữ
liệu vector, và OpenAI GPT làm mô hình ngôn ngữ.
Cài đặt thư viện cần thiết:
pip install langchain openai faiss-cpu tiktoken
Nếu bạn dùng GPU, có thể thay faiss-cpu
bằng faiss-gpu.
Thiết lập khóa API của OpenAI:
import os
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
📌 Lưu ý: Đừng bao
giờ ghi trực tiếp khóa API vào mã nguồn thực tế — hãy lưu trong biến môi trường
hoặc file .env để bảo mật.
4.3 Tạo tập dữ liệu
Trong phần này, bạn sẽ tạo một tập
dữ liệu mẫu nhỏ gồm vài đoạn văn bản, dùng để huấn luyện retriever và test
pipeline.
Ví dụ đơn giản:
texts = [
"Retrieval-Augmented
Generation (RAG) là một kỹ thuật kết hợp truy xuất thông tin và mô hình ngôn ngữ.",
"LangChain
là một framework phổ biến để xây dựng các ứng dụng AI dựa trên mô hình ngôn ngữ.",
"FAISS là
thư viện của Meta được tối ưu hóa cho việc tìm kiếm vector nhanh.",
"OpenAI
GPT có thể được sử dụng để tạo sinh phản hồi từ dữ liệu được truy xuất."
]
Chúng ta sẽ xử lý những đoạn văn
này thành các embeddings để có thể tìm kiếm ngữ nghĩa sau này.
4.4 Tạo Embeddings
Đầu tiên, chúng ta cần chuyển
đổi văn bản thành embeddings — biểu diễn số học giúp mô hình hiểu ngữ
nghĩa.
from langchain.embeddings import OpenAIEmbeddings
# Khởi tạo mô hình embedding
embedding_model = OpenAIEmbeddings()
# Tạo embeddings cho các đoạn văn
embeddings = [embedding_model.embed_query(text) for text in
texts]
print(f"Số lượng embeddings: {len(embeddings)}")
print(f"Chiều dài vector đầu tiên: {len(embeddings[0])}")
Mỗi đoạn văn sẽ được chuyển thành
một vector có 1536 chiều (khi dùng mô hình text-embedding-ada-002 của
OpenAI).
4.5 Lưu và tìm kiếm với FAISS
Giờ ta sẽ lưu embeddings này vào
FAISS để thực hiện truy vấn ngữ nghĩa.
from langchain.vectorstores import FAISS
# Tạo vector store FAISS từ các đoạn văn bản
vector_store = FAISS.from_texts(texts,
embedding=embedding_model)
# Biến vector store thành retriever
retriever = vector_store.as_retriever(search_kwargs={"k":
2})
Ở đây:
- k=2 nghĩa là mỗi lần tìm kiếm, hệ thống sẽ trả về 2
tài liệu tương tự nhất.
- as_retriever() giúp LangChain có thể tương tác dễ
dàng với FAISS.
4.6 Kết nối với mô hình ngôn
ngữ (LLM)
Giờ ta sẽ kết hợp retriever với
mô hình ngôn ngữ GPT để tạo pipeline RAG hoàn chỉnh.
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# Khởi tạo mô hình ngôn ngữ GPT
llm = ChatOpenAI(model="gpt-3.5-turbo")
# Tạo pipeline RAG
rag_pipeline = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # Dạng kết hợp tài liệu đơn giản
retriever=retriever
)
4.7 Thử truy vấn đầu tiên
Giờ bạn đã có pipeline RAG hoàn
chỉnh. Hãy thử gửi một truy vấn.
query = "RAG hoạt động như thế nào?"
result = rag_pipeline.run(query)
print(result)
Kết quả có thể là:
“RAG hoạt động bằng cách kết hợp khả năng truy xuất thông
tin từ các cơ sở dữ liệu bên ngoài với khả năng tạo ngôn ngữ tự nhiên của mô
hình ngôn ngữ, giúp phản hồi chính xác và cập nhật hơn.”
Bạn vừa tạo ra một pipeline
RAG cơ bản, có thể hiểu và trả lời dựa trên dữ liệu do chính bạn cung cấp.
4.8 Kiểm tra quy trình nội bộ
Để hiểu rõ hơn cách pipeline vận
hành, ta có thể xem từng bước mà LangChain thực hiện.
Ví dụ: in ra các tài liệu mà
retriever tìm thấy:
retrieved_docs = retriever.get_relevant_documents("LangChain
là gì?")
for i, doc in enumerate(retrieved_docs):
print(f"---
Tài liệu {i+1} ---")
print(doc.page_content)
Đầu ra:
--- Tài liệu 1 ---
LangChain là một framework phổ biến để xây dựng các ứng dụng
AI dựa trên mô hình ngôn ngữ.
--- Tài liệu 2 ---
Retrieval-Augmented Generation (RAG) là một kỹ thuật kết
hợp truy xuất thông tin và mô hình ngôn ngữ.
👉 Điều này cho thấy
pipeline đã chọn đúng đoạn văn phù hợp nhất.
4.9 Hiểu cách LangChain kết hợp
dữ liệu và truy vấn
LangChain tự động ghép nối
truy vấn người dùng và tài liệu truy xuất được thành một prompt đầy đủ để gửi
đến mô hình ngôn ngữ.
Ví dụ prompt nội bộ có dạng:
Hãy sử dụng các thông tin sau để trả lời câu hỏi.
Thông tin truy xuất:
1. Retrieval-Augmented Generation (RAG) là một kỹ thuật kết hợp truy xuất thông tin và mô hình ngôn ngữ.
2. LangChain là một framework phổ biến để xây dựng các ứng dụng AI dựa trên mô hình ngôn ngữ.
Câu hỏi:
RAG hoạt động như thế nào?
Mô hình sau đó sinh phản hồi dựa
trên toàn bộ ngữ cảnh này — nhờ vậy, phản hồi được hỗ trợ bởi dữ liệu cụ thể
và đúng đắn.
4.10 Điều chỉnh tham số tìm kiếm
FAISS (và các retriever khác) cho
phép tinh chỉnh tham số để thay đổi hành vi truy xuất.
Ví dụ, bạn có thể thay đổi k (số
tài liệu được lấy):
retriever.search_kwargs = {"k": 3}
Hoặc thêm bộ lọc metadata
(nếu tài liệu có trường như “nguồn”, “tác giả”):
retriever.search_kwargs
= {
"k": 3,
"filter": {"source": "medical_articles"}
}
4.11 Lưu pipeline để sử dụng lại
Bạn có thể lưu vector database
FAISS để không cần tạo lại embeddings mỗi lần chạy.
vector_store.save_local("faiss_index")
# Tải lại
new_vector_store = FAISS.load_local("faiss_index",
embedding_model)
new_retriever = new_vector_store.as_retriever()
Pipeline RAG cơ bản này có thể được
mở rộng theo nhiều hướng:
- Thêm nhiều nguồn dữ liệu hơn: PDF, website,
cơ sở dữ liệu nội bộ.
- Tối ưu retriever: dùng mô hình embedding
tiên tiến (như text-embedding-3-large).
- Kết hợp chain phức tạp: như map-reduce
hoặc refine chain trong LangChain.
- Tùy chỉnh prompt: giúp mô hình phản hồi đúng
văn phong hoặc định dạng bạn mong muốn.
Ví dụ sử dụng prompt tùy chỉnh:
from langchain.prompts import PromptTemplate
template = """
Sử dụng thông tin sau để trả lời
câu hỏi:
{context}
Câu hỏi: {question}
Hãy trả lời ngắn gọn, chính xác
và bằng tiếng Việt.
"""
custom_prompt = PromptTemplate(
template=template, input_variables=["context", "question"]
)
rag_pipeline = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
chain_type_kwargs={"prompt": custom_prompt}
)
4.13 Kiểm tra độ chính xác và
phản hồi
Để đánh giá pipeline RAG, bạn có
thể dùng các tiêu chí:
- Relevance (Tính liên quan): Tài liệu truy xuất
có phù hợp với truy vấn không?
- Faithfulness (Độ trung thực): Phản hồi có
đúng với dữ liệu được truy xuất không?
- Fluency (Độ tự nhiên): Phản hồi có rõ ràng,
mạch lạc không?
Bạn có thể xây test script đơn
giản để đo lường độ chính xác:
queries = [
"FAISS
dùng để làm gì?",
"LangChain
có chức năng gì?",
"OpenAI
GPT đóng vai trò gì trong RAG?"
]
for q in queries:
print(f"❓ {q}")
print(rag_pipeline.run(q))
print("-----")
4.14 Kết luận:
Trong bài này, bạn đã:
- Hiểu cấu trúc của một pipeline RAG hoàn chỉnh.
- Học cách tạo embeddings và lưu trữ trong FAISS.
- Kết nối retriever và mô hình ngôn ngữ GPT
để tạo phản hồi ngữ nghĩa.
- Biết cách lưu trữ, mở rộng và tinh chỉnh
pipeline.
🚀 Bạn vừa xây dựng
pipeline RAG đầu tiên của mình – nền tảng cho mọi ứng dụng AI dựa trên dữ liệu.
Tác giả: Hoàng Thơ - Tổng hợp và biên soạn
BÀI 1 - BÀI 2 - BÀI 3 - BÀI 4 - BÀI 5 - BÀI 6 - BÀI 7 - BÀI 8 - BÀI 9 - BÀI 10


Post a Comment