Hướng Dẫn Chạy Mô Hình Embedding và Reranker Qwen3 Nội Bộ với Ollama

Mark Ponomarev

Mark Ponomarev

25 tháng 6 2025

Hướng Dẫn Chạy Mô Hình Embedding và Reranker Qwen3 Nội Bộ với Ollama

Thế giới các mô hình ngôn ngữ lớn (LLM) đang mở rộng với tốc độ chóng mặt, nhưng trong một thời gian dài, việc tiếp cận các khả năng tiên tiến đòi hỏi phải dựa vào các API dựa trên đám mây. Sự phụ thuộc này thường đi kèm với những lo ngại về quyền riêng tư, chi phí và khả năng tùy chỉnh. Tuy nhiên, tình thế đang thay đổi, nhờ vào các mô hình mã nguồn mở mạnh mẽ và các công cụ như Ollama giúp việc chạy chúng trên máy cục bộ của bạn trở nên dễ dàng hơn bao giờ hết.

Trong số những phát triển gần đây thú vị nhất là việc phát hành dòng mô hình Qwen3 của Alibaba Cloud. Các mô hình này, đặc biệt là các phiên bản nhúng (embedding) và sắp xếp lại (reranker) chuyên biệt, đang thiết lập các tiêu chuẩn mới về hiệu suất. Khi kết hợp với Ollama, chúng cung cấp một bộ công cụ mạnh mẽ cho các nhà phát triển và nhà nghiên cứu muốn xây dựng các ứng dụng AI tinh vi, chẳng hạn như công cụ tìm kiếm nâng cao và hệ thống Tạo sinh Tăng cường Truy xuất (RAG), tất cả đều từ phần cứng của riêng họ.

Bài viết này là hướng dẫn toàn diện, từng bước của bạn để khai thác sức mạnh này. Chúng tôi sẽ làm rõ các mô hình nhúng (embedding) và sắp xếp lại (reranker) là gì, hướng dẫn thiết lập Ollama và cung cấp mã Python thực tế để chạy các mô hình nhúng và sắp xếp lại Qwen3 cho một quy trình làm việc RAG hoàn chỉnh, từ đầu đến cuối.

💡
Bạn muốn một công cụ kiểm thử API tuyệt vời có thể tạo Tài liệu API đẹp mắt?

Bạn muốn một nền tảng tích hợp, tất cả trong một để Nhóm phát triển của bạn làm việc cùng nhau với năng suất tối đa?

Apidog đáp ứng mọi yêu cầu của bạn và thay thế Postman với mức giá phải chăng hơn nhiều!
nút

Bộ Đôi Quyền Năng: Tìm hiểu Mô hình Nhúng (Embedding) và Sắp xếp lại (Reranker)

Trước khi đi sâu vào "cách thực hiện", hãy cùng tìm hiểu "là gì". Trong bối cảnh của một hệ thống RAG, các mô hình nhúng (embedding) và sắp xếp lại (reranker) đóng những vai trò riêng biệt nhưng bổ trợ cho nhau.

1. Người Thủ Thư: Mô hình Nhúng (Embedding)

Hãy tưởng tượng một thư viện khổng lồ với hàng triệu cuốn sách nhưng không có hệ thống danh mục. Việc tìm kiếm thông tin sẽ là một cơn ác mộng. Một mô hình nhúng giống như một người thủ thư siêu thông minh đọc từng tài liệu và gán cho nó một vị trí cụ thể trong một "không gian khái niệm" rộng lớn, đa chiều.

Về mặt kỹ thuật, nhúng văn bản là một quá trình chuyển đổi một đoạn văn bản (một từ, câu hoặc toàn bộ tài liệu) thành một vector dày đặc các con số. Vector này nắm bắt ý nghĩa ngữ nghĩa của văn bản. Các tài liệu có ý nghĩa tương tự sẽ có các vector "gần" nhau trong không gian này.

Khi bạn có một truy vấn, mô hình nhúng sẽ chuyển đổi câu hỏi của bạn thành một vector và sau đó tìm kiếm trong thư viện các vector tài liệu gần nhất với nó. Tìm kiếm ban đầu này cực kỳ hiệu quả và truy xuất một tập hợp rộng các tài liệu có khả năng liên quan.

2. Chuyên gia Tư vấn: Mô hình Sắp xếp lại (Reranker)

Việc truy xuất ban đầu từ mô hình nhúng nhanh chóng, nhưng không phải lúc nào cũng hoàn hảo. Nó có thể kéo vào các tài liệu có liên quan về mặt chủ đề nhưng không trả lời chính xác truy vấn của người dùng. Đây là lúc reranker phát huy tác dụng.

Nếu mô hình nhúng là một người thủ thư tổng quát, thì reranker là một chuyên gia về chủ đề. Nó lấy các kết quả hàng đầu từ tìm kiếm ban đầu và thực hiện phân tích chi tiết hơn, tốn nhiều tính toán hơn. Thay vì so sánh một vector truy vấn với các vector tài liệu một cách độc lập, một mô hình reranker (thường là bộ mã hóa chéo) xem xét truy vấn và từng tài liệu như một cặp.

So sánh trực tiếp này cho phép reranker tính toán điểm liên quan chính xác hơn nhiều. Sau đó, nó sắp xếp lại các tài liệu dựa trên điểm này, đẩy các kết quả liên quan nhất lên đầu. Quy trình hai giai đoạn này—truy xuất ban đầu nhanh chóng sau đó là sắp xếp lại chính xác—là bí mật để đạt được hiệu suất RAG tiên tiến.

Gặp gỡ các Mô hình Qwen3: Một Tiêu chuẩn Mới trong AI Mã nguồn Mở

Dòng Qwen3 từ Alibaba Cloud không chỉ là một bộ mô hình khác; nó đại diện cho một bước nhảy vọt đáng kể trong NLP mã nguồn mở. Dưới đây là những gì làm cho các mô hình nhúng và sắp xếp lại nổi bật:

Thiết lập Môi trường AI Cục bộ của Bạn

Bây giờ, hãy bắt tay vào thực hiện. Bước đầu tiên là thiết lập Ollama và tải xuống các mô hình Qwen3.

Bước 1: Cài đặt Ollama

Ollama cung cấp một lệnh cài đặt đơn giản, một dòng cho macOS và Linux. Mở terminal của bạn và chạy:

curl -fsSL https://ollama.com/install.sh | sh

Đối với Windows, tải xuống trình cài đặt chính thức từ trang web của Ollama.

Sau khi cài đặt, bạn có thể xác minh nó hoạt động bằng cách chạy:

ollama --version

Bước 2: Tải xuống các Mô hình Qwen3

Khi Ollama đang chạy, bạn có thể tải các mô hình từ thư viện Ollama. Các mô hình Qwen3 được lưu trữ dưới không gian tên `dengcao`. Chúng ta sẽ tải xuống một phiên bản được đề xuất của các mô hình nhúng và sắp xếp lại. Thẻ `:Q5_K_M` biểu thị một mức lượng tử hóa cụ thể mang lại sự cân bằng tuyệt vời giữa hiệu suất và việc sử dụng tài nguyên.

Trong terminal của bạn, chạy các lệnh sau:

# Tải xuống mô hình nhúng tham số 8B
ollama pull dengcao/Qwen3-Embedding-8B:Q5_K_M

# Tải xuống mô hình sắp xếp lại tham số 4B
ollama pull dengcao/Qwen3-Reranker-4B:Q5_K_M

Việc tải xuống này có thể mất một chút thời gian, tùy thuộc vào kết nối internet của bạn. Sau khi hoàn tất, bạn có thể xem các mô hình có sẵn cục bộ của mình bằng cách chạy `ollama list`.

Phần 1: Tạo Nhúng (Embeddings) với Qwen3

Với mô hình nhúng đã được tải xuống, hãy tạo một số vector. Chúng ta sẽ sử dụng thư viện Python `ollama` chính thức. Nếu bạn chưa cài đặt, hãy chạy `pip install ollama`.

Đây là một đoạn mã Python đơn giản để tạo một nhúng cho một đoạn văn bản:

import ollama

# Định nghĩa tên mô hình như đã tải xuống
EMBEDDING_MODEL = 'dengcao/Qwen3-Embedding-8B:Q5_K_M'

def get_embedding(text: str):
    """Tạo một nhúng cho một văn bản đã cho."""
    try:
        response = ollama.embeddings(
            model=EMBEDDING_MODEL,
            prompt=text
        )
        return response['embedding']
    except Exception as e:
        print(f"Đã xảy ra lỗi: {e}")
        return None

# --- Ví dụ Sử dụng ---
sentence = "Ollama makes it easy to run LLMs locally."
embedding = get_embedding(sentence)

if embedding:
    print(f"Nhúng cho: '{sentence}'")
    # In vài chiều đầu tiên để ngắn gọn
    print(f"5 chiều đầu tiên: {embedding[:5]}")
    print(f"Tổng số chiều: {len(embedding)}")

Đoạn mã này sẽ xuất ra năm giá trị đầu tiên của vector được tạo và tổng kích thước của nó (là 4096 đối với mô hình 8B). Vector này là biểu diễn số học của câu của chúng ta, sẵn sàng để được lưu trữ và so sánh.

Phần 2: Tinh chỉnh Kết quả với Qwen3 Reranker

Việc sử dụng reranker hơi khác một chút. Thay vì một điểm cuối `rerank` chuyên dụng, chúng ta sử dụng điểm cuối `chat` tiêu chuẩn. Chúng ta tạo một lời nhắc cụ thể yêu cầu mô hình hoạt động như một reranker, nhận một truy vấn và một tài liệu làm đầu vào và xuất ra điểm liên quan.

Hãy tạo một hàm Python để xử lý việc này. Chúng ta sẽ yêu cầu mô hình trả về một "Có" hoặc "Không" đơn giản để chỉ ra mức độ liên quan, điều mà chúng ta có thể dễ dàng chuyển đổi thành một điểm số.

import ollama

# Định nghĩa tên mô hình như đã tải xuống
RERANKER_MODEL = 'dengcao/Qwen3-Reranker-4B:Q5_K_M'

def rerank_document(query: str, document: str) -> float:
    """
    Sử dụng Qwen3 Reranker để chấm điểm mức độ liên quan của một tài liệu với một truy vấn.
    Trả về điểm 1.0 cho 'Có' và 0.0 cho 'Không'.
    """
    prompt = f"""
    Bạn là một chuyên gia đánh giá mức độ liên quan. Nhiệm vụ của bạn là đánh giá xem
    tài liệu sau đây có liên quan đến truy vấn của người dùng hay không.
    Vui lòng trả lời bằng một 'Có' hoặc 'Không' đơn giản.

    Truy vấn: {query}
    Tài liệu: {document}
    """
    try:
        response = ollama.chat(
            model=RERANKER_MODEL,
            messages=[{'role': 'user', 'content': prompt}],
            options={'temperature': 0.0} # Để đầu ra có tính xác định
        )
        answer = response['message']['content'].strip().lower()
        if 'yes' in answer:
            return 1.0
        return 0.0
    except Exception as e:
        print(f"Đã xảy ra lỗi trong quá trình sắp xếp lại: {e}")
        return 0.0

# --- Ví dụ Sử dụng ---
user_query = "How do I run models locally?"
doc1 = "Ollama is a tool for running large language models on your own computer."
doc2 = "The capital of France is Paris."

score1 = rerank_document(user_query, doc1)
score2 = rerank_document(user_query, doc2)

print(f"Mức độ liên quan của Tài liệu 1: {'Liên quan' if score1 > 0.5 else 'Không liên quan'} (Điểm: {score1})")
print(f"Mức độ liên quan của Tài liệu 2: {'Liên quan' if score2 > 0.5 else 'Không liên quan'} (Điểm: {score2})")

Hàm này minh họa cách tương tác với reranker. Nó xác định chính xác rằng `doc1` rất liên quan đến truy vấn trong khi `doc2` thì không.

Tổng hợp Lại: Một Triển khai RAG Đơn giản

Bây giờ là phần chính. Hãy xây dựng một quy trình RAG mini sử dụng cả hai mô hình của chúng ta để trả lời một truy vấn từ một cơ sở tri thức nhỏ. Để tìm kiếm sự tương đồng, chúng ta sẽ sử dụng `numpy`. Cài đặt nó bằng `pip install numpy`.

import ollama
import numpy as np

# --- Định nghĩa Mô hình ---
EMBEDDING_MODEL = 'dengcao/Qwen3-Embedding-8B:Q5_K_M'
RERANKER_MODEL = 'dengcao/Qwen3-Reranker-4B:Q5_K_M'

# --- 1. Corpus và Tạo Nhúng Ngoại tuyến ---
documents = [
    "Dòng mô hình Qwen3 được phát triển bởi Alibaba Cloud.",
    "Ollama cung cấp giao diện dòng lệnh đơn giản để chạy LLM.",
    "Mô hình reranker tinh chỉnh kết quả tìm kiếm bằng cách tính toán điểm liên quan chính xác.",
    "Để cài đặt Ollama trên Linux, bạn có thể sử dụng lệnh curl.",
    "Các mô hình nhúng chuyển đổi văn bản thành vector số để tìm kiếm ngữ nghĩa.",
]

# Trong một ứng dụng thực tế, bạn sẽ lưu trữ các nhúng này trong một cơ sở dữ liệu vector
corpus_embeddings = []
print("Đang tạo nhúng cho kho tài liệu...")
for doc in documents:
    response = ollama.embeddings(model=EMBEDDING_MODEL, prompt=doc)
    corpus_embeddings.append(response['embedding'])
print("Đã tạo nhúng.")

def cosine_similarity(v1, v2):
    """Tính toán độ tương đồng cosine giữa hai vector."""
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

# --- 2. Truy xuất Trực tuyến và Sắp xếp lại ---
user_query = "Làm cách nào để cài đặt Ollama?"

# Nhúng truy vấn của người dùng
query_embedding = ollama.embeddings(model=EMBEDDING_MODEL, prompt=user_query)['embedding']

# Thực hiện truy xuất ban đầu (tìm kiếm ngữ nghĩa)
retrieval_scores = [cosine_similarity(query_embedding, emb) for emb in corpus_embeddings]
top_k_indices = np.argsort(retrieval_scores)[::-1][:3] # Lấy 3 kết quả hàng đầu

print("\n--- Kết quả Truy xuất Ban đầu (trước khi sắp xếp lại) ---")
for i in top_k_indices:
    print(f"Điểm: {retrieval_scores[i]:.4f} - Tài liệu: {documents[i]}")

# --- 3. Sắp xếp lại các kết quả hàng đầu ---
retrieved_docs = [documents[i] for i in top_k_indices]

print("\n--- Đang sắp xếp lại các kết quả hàng đầu ---")
reranked_scores = [rerank_document(user_query, doc) for doc in retrieved_docs]

# Kết hợp các tài liệu với điểm mới của chúng và sắp xếp
reranked_results = sorted(zip(retrieved_docs, reranked_scores), key=lambda x: x[1], reverse=True)

print("\n--- Kết quả Cuối cùng (sau khi sắp xếp lại) ---")
for doc, score in reranked_results:
    print(f"Điểm Liên quan: {score:.2f} - Tài liệu: {doc}")

Khi bạn chạy đoạn mã này, bạn sẽ thấy sức mạnh của quy trình hai giai đoạn. Việc truy xuất ban đầu tìm thấy chính xác các tài liệu liên quan đến "Ollama" và "cài đặt". Tuy nhiên, reranker sau đó xác định chính xác tài liệu về việc sử dụng `curl` là tài liệu liên quan nhất, đẩy nó lên đầu với điểm tuyệt đối.

Kết luận

Giờ đây, bạn đã thiết lập và sử dụng thành công một trong những bộ đôi AI mã nguồn mở mạnh mẽ nhất hiện có, ngay trên máy cục bộ của bạn. Bằng cách kết hợp phạm vi rộng của mô hình nhúng Qwen3 với độ chính xác sắc bén của reranker Qwen3, bạn có thể xây dựng các ứng dụng hiểu và xử lý ngôn ngữ với mức độ tinh tế mà trước đây chỉ thuộc về các hệ thống độc quyền, lớn.

Hành trình không dừng lại ở đây. Bạn có thể thử nghiệm với các kích thước mô hình khác nhau, thử các mức lượng tử hóa khác nhau và tích hợp quy trình này vào các ứng dụng phức tạp hơn. Khả năng chạy các công cụ này cục bộ mở ra một thế giới khả năng, trao quyền cho bạn sáng tạo, đổi mới và khám phá mà không ảnh hưởng đến quyền riêng tư hoặc hiệu suất. Chào mừng bạn đến với kỷ nguyên mới của AI mã nguồn mở, cục bộ.

💡
Bạn muốn một công cụ kiểm thử API tuyệt vời có thể tạo Tài liệu API đẹp mắt?

Bạn muốn một nền tảng tích hợp, tất cả trong một để Nhóm phát triển của bạn làm việc cùng nhau với năng suất tối đa?

Apidog đáp ứng mọi yêu cầu của bạn và thay thế Postman với mức giá phải chăng hơn nhiều!
nút

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API