Skip to content

Sử dụng Retrieval‑Augmented Generation (RAG) cùng EmbeddingGemma với Ollama trong Python

Spread the love

Retrieval‑Augmented Generation (RAG) là một kỹ thuật mạnh mẽ giúp mở rộng khả năng của các mô hình ngôn ngữ lớn (LLMs) bằng cách kết nối chúng với các nguồn kiến thức bên ngoài.
Theo Google Developer website thì EmbeddingGemma là một mô hình embedding nhẹ và mở, được thiết kế để thực hiện truy vấn nhanh và chất lượng cao trên các thiết bị hàng ngày như điện thoại di động. Với chỉ 308 triệu tham số, nó đủ hiệu quả để chạy các kỹ thuật AI tiên tiến, chẳng hạn như Retrieval Augmented Generation (RAG), trực tiếp trên máy tính cục bộ của bạn mà không cần kết nối Internet.

Dưới đây là phân tích chi tiết cách hai thành phần này hoạt động cùng nhau.


Khái niệm cốt lõi

RAG ngăn chặn mô hình ngôn ngữ “đóng gói” dữ liệu (hallucinate) bằng cách ép buộc nó dựa vào thông tin cụ thể mà bạn cung cấp. Nó được chia thành hai giai đoạn chính:

Giai đoạnMô tả
RetrieveTìm kiếm thông tin liên quan từ cơ sở dữ liệu kiến thức.
Augment & GenerateCung cấp thông tin đó làm ngữ cảnh cho LLM cùng câu hỏi của người dùng, sau đó yêu cầu mô hình tạo ra câu trả lời chỉ dựa trên ngữ cảnh đã cung cấp.

EmbeddingGemma là công cụ quan trọng trong giai đoạn Retrieve.


Cách RAG hoạt động cùng EmbeddingGemma

Thực hiện từ đầu tới cuối

Giai đoạnNội dung
Bước 1: Tạo chỉ mục cho kiến thức (bước offline)1. Chuẩn bị cơ sở dữ liệu để có thể tìm kiếm. 
2. Load & Chunk Data: Tải và chia nhỏ tài liệu (PDF, văn bản nội bộ, bài viết trên web,…) thành các đoạn nhỏ hơn. 
3. Create Embeddings: Sử dụng EmbeddingGemma để chuyển từng đoạn thành một vector số (embedding). Các đoạn có ý nghĩa tương đồng sẽ có vector gần nhau trong không gian số học. 
4. Store in a Vector Database: Lưu các embedding (kèm văn bản gốc) vào một vector database được tối ưu để tìm kiếm vector tương đồng nhanh chóng.
Bước 2: Trả lời câu hỏi (bước live)1. Embed the Query: Chuyển câu hỏi của người dùng thành vector bằng EmbeddingGemma (đúng mô hình đã dùng cho tài liệu). 
2. Search for Similarity: Dùng vector câu hỏi để tìm các embedding trong vector database có độ tương đồng cao nhất (phần “retrieve”). 
3. Augment the Prompt: Lấy văn bản gốc từ các chunk có liên quan nhất, kết hợp với câu hỏi thành một prompt mở rộng cho LLM (ví dụ: Gemma được fine‑tune theo hướng dẫn). Prompt sẽ nói: “Chỉ dựa trên ngữ cảnh sau, hãy trả lời câu hỏi.” 
4. Generate the Final Answer: LLM nhận prompt được mở rộng và tạo ra câu trả lời dựa trên ngữ cảnh, không chỉ dựa vào kiến thức tổng quát. Vì ngữ cảnh được chọn lọc chính xác nhờ tìm kiếm embedding, câu trả lời cuối cùng sẽ chính xác và cụ thể.

Tại sao chọn EmbeddingGemma cho RAG?

Lợi íchMô tả
Độ chính xác caoTạo embedding chất lượng cao, nắm bắt đúng ý nghĩa của văn bản, giúp thu thập tài liệu liên quan nhất.
Hiệu suất tốtMô hình nhẹ và nhanh, làm cho quá trình tạo và tìm kiếm embedding diễn ra nhanh chóng và tiết kiệm chi phí.
Giảm hallucinationHệ thống toàn bộ làm cho đầu ra cuối cùng của LLM có thể kiểm chứng và dựa vào dữ liệu thực tế từ cơ sở kiến thức của bạn.
Truy cập dữ liệu riêng tưCho phép xây dựng hệ thống hỏi‑đáp dựa trên tài liệu riêng của bạn (hoặc tài liệu cập nhật ngay) mà không cần huấn luyện lại một LLM lớn.

Ví dụ Python cho RAG với EmbeddingGemma

Dưới đây là đoạn mã Python thực hiện một pipeline RAG đơn giản, sử dụng EmbeddingGemma cho embeddings và mô hình Gemma được fine‑tune theo hướng dẫn cho việc sinh văn bản.

Chú ý: Mã chạy hoàn toàn trên máy cục bộ nhờ Ollama, nên bảo mật và thử nghiệm dễ dàng.

5.1 Cài đặt & Yêu cầu

  1. Cài đặt Ollama: Tham khảo hướng dẫn tại trang web Ollama để cài đặt trên hệ thống của bạn.
    https://ollama.com/download
    Bạn có thể tìm hiểu thêm về Ollma tại đây.
  2. Cài đặt thư viện Python
    pip install ollama faiss-cpu numpy
    • ollama: Client Python chính thức để tương tác với Ollama.
    • faiss-cpu: Thư viện hiệu quả của Facebook AI cho tìm kiếm tương đồng (vector store).
    • numpy: Thư viện số học cốt lõi, cần cho FAISS.
  3. Tải mô hình: Mở terminal và chạy hai lệnh sau để tải EmbeddingGemma và mô hình Gemma:2B.
    ollama run embeddinggemma
    ollama pull gemma:2b

Mã Python hoàn chỉnh

Các bạn có thể chép code trên Colab notebook của mình để chạy local. Lưu ý rằng code này KHÔNG CHẠY TRỰC TIẾP TRÊN COLAB được vì Ollama phải chạy local

import ollama
import faiss
import numpy as np

# 1. "Cơ sở dữ liệu" trong bộ nhớ (để ví dụ đơn giản)
documents = [
    "The capital of France is Paris.",
    "The Eiffel Tower is a famous landmark in Paris.",
    "Mars is known as the Red Planet.",
    "The solar system has eight planets.",
    "The main component of Earth's atmosphere is nitrogen.",
    "Water is composed of hydrogen and oxygen atoms.",
]

# 2. Tạo embedding cho các tài liệu bằng EmbeddingGemma
print("Embedding documents...")
embeddings = []
for doc in documents:
    response = ollama.embeddings(model="embeddinggemma", prompt=doc)
    embeddings.append(response["embedding"])

# Chuyển embeddings thành mảng NumPy
embeddings_np = np.array(embeddings).astype('float32')

# 3. Tạo và nạp dữ liệu vào FAISS vector store
print("Creating FAISS index...")
dimension = embeddings_np.shape[1]          # chiều của embedding
index = faiss.IndexFlatL2(dimension)        # chỉ mục L2 đơn giản
index.add(embeddings_np)
print(f"FAISS index created with {index.ntotal} vectors.")

# 4. Hàm truy vấn RAG
def query_rag(query: str, k: int = 2):
    """
    Truy vấn hệ thống RAG.
    1. Embedding câu hỏi.
    2. Tìm kiếm vector store để lấy top‑k tài liệu liên quan.
    3. Tạo prompt với ngữ cảnh thu thập.
    4. Gọi mô hình sinh văn bản để trả lời.
    """
    # Bước 1: Embedding câu hỏi
    query_embedding_response = ollama.embeddings(model="embeddinggemma", prompt=query)
    query_embedding = np.array([query_embedding_response["embedding"]]).astype('float32')

    # Bước 2: Tìm kiếm
    print(f"\nSearching for the top {k} most relevant documents...")
    distances, indices = index.search(query_embedding, k)

    retrieved_chunks = [documents[i] for i in indices[0]]
    print("Retrieved context:", retrieved_chunks)

    # Bước 3: Tạo prompt
    prompt_template = f"""
    Based ONLY on the following context, answer the user's question.
    If the context does not contain the answer, state that you don't have enough information.
    Context:
    - {"\n- ".join(retrieved_chunks)}
    Question: {query}
    """

    # Bước 4: Gọi mô hình sinh
    print("Generating answer...")
    response = ollama.chat(
        model='gemma:2b',
        messages=[{'role': 'user', 'content': prompt_template}]
    )
    return response['message']['content']

# 5. Kiểm thử pipeline với các câu hỏi mẫu
user_query = "What is the capital of France and what is a famous landmark there?"
final_answer = query_rag(user_query)

print("\n--- Final Answer ---")
print(final_answer)

user_query_2 = "What is Mars known as?"
final_answer_2 = query_rag(user_query_2)

print("\n--- Final Answer (Mars) ---")
print(final_answer_2)

Kết quả mong đợi

  • Với câu hỏi What is the capital of France and what is a famous landmark there?, mô hình sẽ trả lời: “Paris is the capital of France and the Eiffel Tower is a famous landmark there.”
  • Với câu hỏi What is Mars known as?, mô hình sẽ trả lời: “Mars is known as the Red Planet.”

Nếu ngữ cảnh không chứa thông tin cần thiết, mô hình sẽ thông báo “I don’t have enough information.”


Kết luận

  • RAG kết hợp LLMs với nguồn dữ liệu bên ngoài giúp tránh hallucination và cung cấp câu trả lời chính xác hơn.
  • EmbeddingGemma là công cụ chuyên biệt để tạo embeddings chất lượng cao, làm cho quá trình Retrieve nhanh và hiệu quả.
  • Việc triển khai RAG với EmbeddingGemma có thể thực hiện dễ dàng trên máy cục bộ thông qua Ollama và FAISS, giúp bảo mật và thử nghiệm nhanh chóng.

Bạn có thể mở rộng ví dụ trên bằng cách sử dụng các vector database có khả năng lưu trữ lâu dài (Redis‑AI, Weaviate, Pinecone, …) hoặc mở rộng số lượng tài liệu, chiều embedding, hoặc thậm chí sử dụng nhiều mô hình embeddings khác nhau để nâng cao độ chính xác.


Đọc thêm

https://ai.google.dev/gemma/docs/embeddinggemma/fine-tuning-embeddinggemma-with-sentence-transformers

https://ai.google.dev/gemma/docs/embeddinggemma/inference-embeddinggemma-with-sentence-transformers

Leave a Reply

Your email address will not be published. Required fields are marked *

error: Content is protected !!