LÀM CHỦ RAG ĐỂ XÂY DỰNG CÁC HỆ THỐNG AI THÔNG MINH HƠN, DỰA TRÊN DỮ LIỆU - BÀI 4: XÂY DỰNG PIPELINE RAG ĐẦU TIÊN CỦA BẠN

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 tinsinh 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:

  1. 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ộ.

  1. 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.

  1. 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.

  1. 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:

  1. Người dùng nhập một truy vấn (query).
  2. Truy vấn được chuyển thành embedding vector.
  3. Vector database tìm các đoạn văn tương tự nhất trong cơ sở tri thức.
  4. Những đoạn đó được ghép vào truy vấn tạo thành prompt hoàn chỉnh.
  5. 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()

 4.12 Mở rộng pipeline của bạn

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 đã:

🚀 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

Previous Post Next Post