Bỏ qua tới nội dung chính
Quay lại tin tức

Triển khai tìm kiếm kết hợp ngữ nghĩa-từ vựng trong RAG

Machine Learning Mastery· Iván Palomares Carrascosa· 25/5/2026general

Việc triển khai các chiến lược tìm kiếm lai (hybrid search) là một bước quan trọng trong việc xây dựng các hệ thống RAG (Retrieval-Augmented Generation) hiện đại, đặc biệt khi chuyển đổi từ các giải pháp thử nghiệm sang các giải pháp sẵn sàng sản xuất.

Triển khai tìm kiếm lai ngữ nghĩa-từ vựng trong RAG Bởi Iván Palomares Carrascosa vào ngày 25/5/2026 trong Language Models 0 Chia sẻ Bài đăng Chia sẻ Trong bài viết này, bạn sẽ tìm hiểu cách triển khai chiến lược tìm kiếm lai cho các hệ thống RAG bằng cách kết hợp tìm kiếm từ vựng BM25 với tìm kiếm ngữ nghĩa, được hợp nhất bằng Reciprocal Rank Fusion. Các chủ đề chúng ta sẽ đề cập bao gồm: Tại sao tìm kiếm lai vượt trội hơn so với tìm kiếm từ vựng hoặc tìm kiếm ngữ nghĩa đơn thuần trong các hệ thống tạo sinh tăng cường truy xuất. Cách triển khai tìm kiếm từ vựng BM25 và tìm kiếm ngữ nghĩa vector dày đặc dưới dạng các công cụ truy xuất độc lập trong Python. Cách hợp nhất cả hai xếp hạng bằng Reciprocal Rank Fusion (RRF) để tạo ra kết quả truy xuất cuối cùng, cân bằng. Hãy đi thẳng vào vấn đề. Triển khai tìm kiếm lai ngữ nghĩa-từ vựng trong RAG Giới thiệu Việc triển khai các chiến lược tìm kiếm lai là một bước quan trọng trong việc xây dựng các hệ thống RAG (Retrieval-Augmented Generation) hiện đại, đặc biệt khi chuyển từ nguyên mẫu sang các giải pháp sẵn sàng sản xuất. Có rất ít tranh cãi về việc tìm kiếm ngữ nghĩa – được thúc đẩy bởi các vector dày đặc hoặc embeddings, là các biểu diễn số của văn bản – cực kỳ hữu ích trong việc hiểu ngữ nghĩa, từ đồng nghĩa và ngữ cảnh. Tuy nhiên, tìm kiếm từ vựng, dựa trên từ khóa với các phương pháp như BM25, bao phủ một điểm mù nhỏ mà tìm kiếm ngữ nghĩa bỏ qua. Do đó, việc kết hợp những gì tốt nhất của cả hai thế giới là công thức hoàn hảo để đưa cơ chế truy xuất của hệ thống RAG của bạn tiến thêm một bước. Hãy cùng khám phá cách triển khai một chiến lược tìm kiếm lai như vậy thông qua một ví dụ mã hóa đơn giản, hướng dẫn bạn qua từng bước của quy trình! Lưu ý: Nếu bạn chưa quen với các hệ thống RAG, bạn có thể thấy loạt bài viết "Hiểu về RAG" cực kỳ hữu ích để hiểu rõ nhất bài viết này. Đặc biệt, tôi khuyên bạn nên tìm hiểu về cơ sở dữ liệu vector trước thông qua bài viết này. Triển khai từng bước Bước đầu tiên là đảm bảo tất cả các thư viện Python bên ngoài cần thiết đã được cài đặt, đặc biệt là ba thư viện này: !pip install rank_bm25 sentence-transformers requests 1 !pip install rank_bm25 sentence-transformers requests rank_bm25: một triển khai thuật toán tìm kiếm từ vựng BM25 để truy xuất thông tin (BM là viết tắt của "Best Matching"). sentence-transformers: cung cấp các mô hình ngôn ngữ được đào tạo trước để tạo embeddings văn bản. Trong một môi trường thực tế, bạn có thể đã có cơ sở dữ liệu vector của riêng mình chứa nhiều embeddings tài liệu và không cần đến thư viện này, nhưng chúng ta sẽ sử dụng nó ở đây để mô phỏng việc xây dựng một cơ sở dữ liệu vector thử nghiệm và minh họa tìm kiếm lai trên đó. requests: được sử dụng để lấy gói dữ liệu thô từ một kho lưu trữ dữ liệu GitHub công khai được chuẩn bị cho ví dụ này. Với những thành phần này trong tay, chúng ta bắt đầu bằng cách tải tập dữ liệu và lưu trữ các văn bản thô vào một danh sách (chúng ta làm như vậy vì đây là một tập dữ liệu nhỏ). Quá trình tìm kiếm kết hợp được chia thành ba giai đoạn: hai giai đoạn diễn ra song song hoặc độc lập với nhau. Giai đoạn thứ ba là nơi diễn ra sự kết hợp của cả hai phương pháp, sử dụng một phương pháp hợp nhất gọi là Reciprocal Rank Fusion (RRF). Trước tiên, hãy cùng tìm hiểu về tìm kiếm từ vựng với BM25: ```python import requests import zipfile import io import os # Tải xuống và giải nén tập dữ liệu từ tệp nén url = "https://github.com/gakudo-ai/open-datasets/raw/refs/heads/main/asia_documents.zip" response = requests.get(url) with zipfile.ZipFile(io.BytesIO(response.content)) as z: z.extractall("asia_data") # Tải tài liệu và lấy tên tệp của chúng documents = [] doc_names = [] for file in os.listdir("asia_data"): if file.endswith(".txt"): with open(f"asia_data/{file}", "r", encoding="utf-8") as f: documents.append(f.read()) doc_names.append(file) print(f"Đã tải {len(documents)} tài liệu cho cơ sở tri thức.") ``` ```python from rank_bm25 import BM25Okapi # BM25 yêu cầu mỗi văn bản được mã hóa thành một (danh sách con) các từ tokenized_corpus = [doc.lower().split() for doc in documents] bm25 = BM25Okapi(tokenized_corpus) def search_bm25(query, top_k=3): tokenized_query = query.lower().split() # Lấy điểm số (mức độ liên quan từ vựng với truy vấn) cho tất cả các tài liệu scores = bm25.get_scores(tokenized_query) # Xếp hạng tài liệu theo điểm số ranked_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True) return ranked_indices[:top_k], scores ``` Quá trình tìm kiếm từ vựng đã được đóng gói trong một hàm có tên `search_bm25()`. Hàm này nhận hai đối số đầu vào: một chuỗi chứa truy vấn của người dùng đối với hệ thống RAG.

Nguồn tin: Machine Learning Mastery — Tác giả: Iván Palomares Carrascosa. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.