Vì sao pipeline RAG của bạn vẫn cần một thuật toán từ năm 1994

Công nghệ28 tháng 10, 2026·17 phút đọc

Embedding hiểu rằng "broken" đồng nghĩa với "defective", nhưng lại có thể không nhận ra ZX-4821 khác với ZX-4812. Bài viết phân tích hành trình của công cụ tìm kiếm từ khớp chính xác đến vector dày đặc, và lý do BM25 vẫn sống sót trong các hệ thống RAG hiện đại.

Vì sao pipeline RAG của bạn vẫn cần một thuật toán từ năm 1994

Hãy tưởng tượng một trợ lý hỗ trợ khách hàng nhận được câu hỏi: "Mã lỗi ZX-4821 có nghĩa là gì?" Câu trả lời nằm sẵn trong cơ sở tri thức. Một tài liệu chứa đúng mã đó, kèm theo lời giải thích ngắn gọn về lỗi phần cứng đã sinh ra nó.

Ấy vậy mà bộ truy xuất lại không trả về tài liệu ấy. Thay vào đó, nó lấy ra ba đoạn văn về các lỗi thiết bị phổ biến, quy trình khắc phục sự cố và chẩn đoán phần cứng. Xét về ngữ nghĩa, kết quả hoàn toàn hợp lý. Chúng nói về đúng sản phẩm, đúng loại vấn đề và đúng chủ đề chung. Nhưng không đoạn nào chứa ZX-4821.

Mô hình embedding hiểu được mọi thứ, trừ đúng chuỗi ký tự quan trọng nhất.

Giờ xét câu hỏi thứ hai: "Tôi có được hoàn tiền nếu sản phẩm giao đến bị hỏng không?" Chính sách liên quan không hề dùng cụm "hoàn tiền" hay "hỏng". Nó viết rằng "khách hàng đủ điều kiện được hoàn tiền khi sản phẩm được giao trong tình trạng khiếm khuyết". Tìm kiếm từ vựng có thể bỏ sót hoàn toàn. Nhưng truy xuất dày đặc (dense retrieval) lại nhận ra hai câu diễn đạt gần như cùng một ý.

Cả hai hệ thống đều không hỏng hóc. Chúng đang bảo tồn những loại thông tin khác nhau.

Hai cách nhìn khác nhau về cùng một câu hỏi

Truy xuất từ vựng (lexical retrieval) coi những từ chính xác trong truy vấn là bằng chứng. Truy xuất dày đặc (dense retrieval) cố gắng nhìn xuyên qua các từ đó để khôi phục ý nghĩa. Cách thứ nhất mạnh khi một cái tên hiếm, con số, từ viết tắt hay mã sản phẩm mang tính quyết định. Cách thứ hai mạnh khi truy vấn và câu trả lời mô tả cùng một khái niệm bằng ngôn ngữ khác nhau.

Lịch sử truy xuất thông tin thường được kể như một chuỗi thay thế: tìm kiếm Boolean nhường chỗ cho truy xuất xếp hạng, TF-IDF được cải thiện bởi BM25, vector thưa (sparse) rồi đến biểu diễn tiềm ẩn, và cuối cùng là embedding nơ-ron. Đọc theo cách này, câu chuyện trông như một đường thẳng: mỗi thế hệ hiểu ngôn ngữ tốt hơn thế hệ trước.

Nhưng truy xuất không tiến hóa bằng cách thay thế phương pháp tồi bằng phương pháp tốt hơn toàn diện. Ở mỗi bước, ta dường như mua một năng lực mới bằng cách làm suy yếu một năng lực khác.

Giai đoạn 1: Khi tìm kiếm đòi hỏi đúng từng từ

Truy xuất Boolean chính xác, nhanh và hoàn toàn theo nghĩa đen. Một truy vấn như damaged AND product NOT warranty trả về tài liệu chứa các từ bắt buộc và loại bỏ tài liệu chứa từ bị cấm. Phía sau là chỉ mục nghịch đảo (inverted index): thay vì quét mọi tài liệu, hệ thống lưu mỗi từ cùng danh sách tài liệu chứa nó.

Cách đảo ngược từ "tài liệu → từ" sang "từ → tài liệu" chính là điều làm nên chữ "nghịch đảo".

Thiết kế này hiệu quả và cực kỳ chính xác khi từng từ đều quan trọng. Một mã sản phẩm như FSM-133i hoặc xuất hiện trong tài liệu, hoặc không. Nhưng hệ thống không có khái niệm về sự gần gũi ngữ nghĩa: một tài liệu chứa "defective item" không thể được coi là liên quan một phần đến truy vấn về "broken product", trừ khi ai đó chủ động liên kết hai cách diễn đạt ấy.

Vấn đề không phải Boolean xếp hạng sai tài liệu. Nó không xếp hạng gì cả: tài liệu hoặc thỏa mãn điều kiện logic, hoặc nằm ngoài tập kết quả.

Giai đoạn 2: Khi độ liên quan trở thành một con số

Truy xuất Boolean biết tài liệu nào thỏa mãn truy vấn, nhưng không biết tài liệu nào xứng đáng xuất hiện đầu tiên. Mô hình không gian vector thay đổi điều đó bằng cách biểu diễn mỗi tài liệu và cả truy vấn thành một vector với các chiều tương ứng với từ.

Ở đây TF-IDF sửa một điểm yếu: đếm từ thô coi mọi từ có giá trị thông tin như nhau. TF-IDF tăng trọng số cho những từ xuất hiện nhiều trong một tài liệu nhưng hiếm trên toàn bộ tập dữ liệu. Từ "product" xuất hiện khắp nơi đóng góp rất ít. Một từ như FSM-133i chỉ xuất hiện trong hai tài liệu có thể chi phối toàn bộ thứ hạng.

Đây là bước tiến lớn: truy xuất có được các mức độ liên quan trong khi vẫn giữ độ chính xác của từ khớp chính xác. Nhưng hình học của nó vẫn được xây từ vốn từ chung. "Broken product" và "defective item" nằm ở các chiều khác nhau, dù nghĩa gần như trùng nhau.

Giai đoạn 3: Thuật toán năm 1994 từ chối chết

BM25 học được rằng lần lặp thứ mười của một từ không nên được tính như lần đầu tiên.

TF-IDF đưa ra ý tưởng thiết yếu: một từ hiếm nên đóng góp nhiều hơn một từ xuất hiện gần như ở mọi tài liệu. Nhưng tần suất từ tạo ra vấn đề khác. Nếu một tài liệu lặp lại "damaged" hai mươi lần, nó không nhất thiết xứng đáng nhận gấp hai mươi lần độ liên quan. Tài liệu dài cũng có lợi thế không công bằng: chứa nhiều từ hơn nên có nhiều cơ hội khớp truy vấn hơn.

BM25 giữ logic từ hiếm của TF-IDF nhưng thêm hai hiệu chỉnh: việc lặp lại một từ phải dần ngừng có ích, và tài liệu dài không được thắng chỉ vì có nhiều cơ hội chứa từ trong truy vấn.

Công thức trông nặng nề hơn ý tưởng, nhưng nói gọn lại:

Điểm BM25 ≈ độ hiếm của từ × tần suất bão hòa × hiệu chỉnh độ dài

Hai tham số k₁ và b điều khiển quá trình này: k₁ quyết định tốc độ mà các lần lặp lại ngừng cộng thêm giá trị, còn b quyết định mạnh hay nhẹ việc sửa sai cho độ dài tài liệu.

Áp dụng vào mã lỗi ZX-4821: IDF của nó sẽ cao vì chỉ xuất hiện trong rất ít tài liệu, khiến nó mang nhiều thông tin hơn một từ phổ biến như "device". Nếu một tài liệu lặp lại ZX-4821 mười lần, tần suất tăng nhưng phân số dần bão hòa như lợi nhuận giảm dần: lần xuất hiện thứ mười đóng góp ít hơn hẳn lần đầu. Nếu tài liệu đó còn dài bất thường, tỷ lệ độ dài sẽ giảm lợi thế mà nó có được chỉ nhờ chứa nhiều chữ.

Nhờ vậy, BM25 là một bộ truy xuất từ vựng cực kỳ kỷ luật. Nó bảo tồn độ chính xác của mã định danh, tên riêng, con số và thuật ngữ hiếm, đồng thời ngăn sự lặp lại và độ dài tài liệu chi phối thứ hạng. Một tài liệu ngắn giải thích trực tiếp ZX-4821 có thể xếp trên một cuốn hướng dẫn dày năm mươi trang chỉ tình cờ nhắc đến mã đó vài lần.

Nhưng BM25 vẫn chỉ thưởng cho những từ nó quan sát được. Nếu truy vấn ghi "broken power supply" và tài liệu liên quan ghi "defective energy unit", sự tương đồng khái niệm không xuất hiện ở đâu trong phương trình. Không có thiết lập nào của k₁ hay b tạo ra được mối quan hệ giữa những từ chưa từng khớp nhau.

Giai đoạn 4: Khi tìm kiếm nhìn xuống dưới bề mặt từ ngữ

Chỉ mục ngữ nghĩa tiềm ẩn (Latent Semantic Indexing - LSI) nén vốn từ để khôi phục các mối quan hệ mà khớp chính xác không thấy được.

LSI áp dụng phân rã giá trị kỳ dị rút gọn (truncated SVD) trên ma trận từ-tài liệu. Ma trận đầy đủ có thể có một chiều cho mỗi từ trong vốn từ; SVD rút gọn chỉ giữ lại k hướng mạnh nhất.

Thay đổi then chốt là các chiều mới không còn tương ứng với từng từ riêng lẻ. Một hướng tiềm ẩn có thể nắm bắt mẫu chung của broken, defective, failure và repair vì các từ này thường xuất hiện trong những tài liệu giống nhau. Nhờ đó, truy vấn chứa "broken power supply" có thể tiến gần hơn đến tài liệu về "defective energy unit", ngay cả khi không khớp chính xác từ quan trọng nhất.

Đây là một dạng truy xuất ngữ nghĩa sơ khai, dù mô hình không "hiểu" ngôn ngữ theo nghĩa hiện đại. Nó chỉ khám phá các mẫu thống kê đồng xuất hiện: các từ trở nên liên quan với nhau nhờ xuất hiện trong những môi trường văn bản tương tự.

Nhưng nén đi kèm cái giá. Các chiều tiềm ẩn khó diễn giải hơn vốn từ gốc, và SVD rút gọn cố tình loại bỏ những hướng được coi là ít quan trọng với toàn bộ ma trận. Một mã định danh hiếm nhưng quyết định như ZX-4821 có thể giải thích rất ít về cấu trúc toàn tập dữ liệu. Chính phép nén kết nối "broken" với "defective" lại có thể làm yếu tín hiệu chính xác khiến mã lỗi trở nên có giá trị.

Bằng cách vượt qua từ ngữ chính xác, tìm kiếm có được sự linh hoạt ngữ nghĩa — nhưng bắt đầu đánh đổi độ chính xác từ vựng.

Giai đoạn 5: Khi ý nghĩa được học máy

LSI cho thấy truy xuất có thể vượt qua trùng lặp từ ngữ chính xác. Nhưng cấu trúc ngữ nghĩa của nó đến từ phân rã tuyến tính trên một ma trận cụ thể. Đổi tập dữ liệu là không gian tiềm ẩn thay đổi theo.

Biểu diễn nơ-ron thay đổi nguồn gốc của tri thức đó. Các embedding từ sơ khai như Word2Vec học rằng những từ xuất hiện trong ngữ cảnh tương tự nên nhận vector tương tự. Thay vì gán cho "broken" và "defective" hai chiều riêng biệt không liên quan, mô hình đặt chúng gần nhau trong không gian học được. Đây là giả thuyết phân phối (distributional hypothesis) được biến thành hình học.

Các mô hình dựa trên Transformer sau đó giới thiệu biểu diễn theo ngữ cảnh, cho phép vector gán cho một token phụ thuộc vào câu xung quanh. Ý nghĩa không còn gắn chỉ với bản thân từ, mà với từ trong ngữ cảnh. Từ "bank" trong "bờ sông" và "ngân hàng đầu tư" nhận hai vector khác nhau.

Truy xuất dày đặc hiện đại mở rộng ý tưởng này từ từ sang toàn bộ truy vấn và tài liệu. Một encoder ánh xạ một đoạn văn bản thành vector kích thước cố định. Một truy vấn 30 từ và một đoạn văn 300 từ đều có thể trở thành vector 768 chiều. Các chiều không còn tương ứng với thuật ngữ hay chủ đề nhận diện được — chúng là tọa độ học được giúp mô hình đặt các văn bản liên quan gần nhau.

Kiến trúc Bi-Encoder

Hầu hết hệ thống truy xuất dày đặc dùng kiến trúc bi-encoder: truy vấn và từng tài liệu được mã hóa riêng rẽ. Sự tách biệt này quan trọng về mặt vận hành: embedding tài liệu được tính một lần, lưu trong chỉ mục và tái sử dụng cho mọi truy vấn. Lúc tìm kiếm, hệ thống chỉ cần mã hóa truy vấn mới rồi so sánh vector với các vector tài liệu đã lưu.

Độ tương đồng thường được đo bằng tích vô hướng hoặc cosine. Nhìn bề ngoài, cách này giống mô hình không gian vector trước đây, nhưng nguồn gốc hình học thì khác: TF-IDF tạo vector trực tiếp từ những từ quan sát được, LSI nén các chiều từ bằng SVD, còn bộ truy xuất dày đặc học không gian thông qua các ví dụ về cái gì nên và không nên được coi là liên quan.

Dạy không gian biết "gần" nghĩa là gì

Trong huấn luyện, mô hình nhận một truy vấn, một tài liệu liên quan d⁺ và một hoặc nhiều tài liệu không liên quan d⁻. Hàm mất mát đối chiếu (contrastive loss) đẩy điểm của tài liệu liên quan lên cao, đồng thời buộc nó cạnh tranh với các tài liệu tiêu cực. Nhiệt độ τ điều khiển mức độ sắc bén của mô hình trong việc phân biệt các ứng viên.

Quá trình huấn luyện lặp đi lặp lại việc điều chỉnh encoder cho đến khi các cặp truy vấn-tài liệu liên quan chiếm những vùng gần nhau trong không gian. Nhờ đó, truy vấn "The device stopped working because its power supply is broken" có thể truy xuất được đoạn văn: "A defective energy unit may prevent the device from starting". Hai văn bản chia sẻ rất ít từ chính xác, nhưng mô hình đã học rằng chúng mô tả tình huống tương tự.

Điều vector phải bỏ lại phía sau

Truy xuất dày đặc giải quyết phần lớn vấn đề vốn từ, nhưng tạo ra một dạng nén khác. Toàn bộ truy vấn hoặc tài liệu phải đi qua một vector kích thước cố định:

Nhiều token, quan hệ và chi tiết → một biểu diễn dày đặc duy nhất

Mô hình bảo tồn thông tin mà mục tiêu huấn luyện đã dạy nó coi là hữu ích cho độ tương đồng. Ý nghĩa rộng, ý định và cách diễn giải lại có thể sống sót cực tốt. Nhưng danh tính từ vựng chính xác không còn được bảo vệ một cách tường minh.

Với câu hỏi "Mã lỗi ZX-4821 có nghĩa là gì?", một bộ truy xuất dày đặc có thể đặt nó đúng gần các tài liệu về thiết bị ZX, lỗi chẩn đoán và sự cố nguồn. Nhưng không có gì trong độ tương đồng cosine đảm bảo rằng một đoạn văn chứa đúng chuỗi ZX-4821 sẽ xếp trên một hướng dẫn khắc phục sự cố tương tự về ngữ nghĩa mà không hề nhắc đến mã đó.

Vấn đề không phải mô hình không xử lý được mã. Các encoder hiện đại hoàn toàn có thể gán cho nó một biểu diễn. Vấn đề là mã phải cạnh tranh với mọi khía cạnh khác của văn bản để giành ảnh hưởng lên vector cuối cùng. Trừ khi quá trình huấn luyện đã khiến mã định danh chính xác trở nên quan trọng, chủ đề ngữ nghĩa xung quanh có thể lấn át.

BM25 xử lý tình huống này theo cách khác. Nếu ZX-4821 hiếm và xuất hiện ở cả truy vấn lẫn tài liệu, IDF cao của nó đóng góp trực tiếp vào điểm số. Khớp từ vựng không thể lặng lẽ tan biến vào phần còn lại của biểu diễn.

Truy xuất dày đặc có được sự linh hoạt ngữ nghĩa mạnh mẽ, nhưng bằng chứng từ vựng chính xác trở nên ngầm định thay vì được đảm bảo.

Giai đoạn 6: Vì sao tìm kiếm lai (hybrid search) tồn tại

Đến đây, lịch sử truy xuất không còn giống một chuỗi thay thế. BM25 và truy xuất dày đặc không phải giải pháp cũ và mới cho cùng một bài toán. Chúng trả lời hai câu hỏi khác nhau:

  • BM25 hỏi: Tài liệu nào chứa những từ mang nhiều thông tin giống như truy vấn?
  • Truy xuất dày đặc hỏi: Tài liệu nào diễn đạt ý nghĩa tương tự truy vấn?

Với "broken power supply" và "defective energy unit", truy xuất dày đặc có lợi thế tự nhiên. Với ZX-4821, BM25 có thể coi khớp chính xác là bằng chứng quyết định. Một truy vấn thực tế có thể cần cả hai: "Lỗi ZX-4821 có thể khiến thiết bị mất nguồn không?"

Kết hợp thứ hạng bằng Reciprocal Rank Fusion

Không thể cộng trực tiếp điểm thô: điểm BM25 là 14,7 và độ tương đồng cosine là 0,82 nằm ở hai thang đo hoàn toàn khác nhau. Một giải pháp thực tế là Reciprocal Rank Fusion (RRF), bỏ qua điểm gốc và chỉ dùng vị trí của mỗi tài liệu trong từng danh sách xếp hạng. Hằng số c trong công thức ngăn vị trí đầu tiên chi phối quá mức.

Xét ba tài liệu ứng viên cho truy vấn trên:

  • Changelog nhắc đến ZX-4821 nhưng không giải thích: hạng 1 ở BM25 (nhờ chứa đúng mã), không có trong danh sách dày đặc.
  • Hướng dẫn chung về lỗi nguồn: không có trong danh sách BM25 (không chứa mã), hạng 1 ở truy xuất dày đặc.
  • Tài liệu giải thích ZX-4821 nghĩa là gì: hạng 2 ở BM25 (có mã), hạng 3 ở truy xuất dày đặc (ngữ nghĩa khớp).

Tài liệu thứ ba không đứng đầu ở danh sách nào. Nhưng với c = 60, điểm RRF của nó là 1/(60+2) + 1/(60+3) ≈ 0,032 — đủ để vượt lên trên cả hai "chuyên gia": changelog được BM25 ưa thích và hướng dẫn chung được truy xuất dày đặc ưa thích.

Đây chính là logic đằng sau tìm kiếm lai. Tài liệu chiến thắng không cần đứng đầu ở bất kỳ hệ thống nào. Nó có thể thắng vì hai bộ truy xuất không hoàn hảo độc lập đồng ý rằng nó xứng đáng nằm gần đỉnh. Sau nhiều thập kỷ tiến bộ, truy xuất hiện đại không cuối cùng lựa chọn giữa từ ngữ và ý nghĩa. Nó học được cách tìm kiếm bằng cả hai.

Kết luận: Truy xuất không thay thế quá khứ của nó

Mỗi thế hệ giải quyết một điểm yếu của thế hệ trước bằng cách chấp nhận một điểm yếu mới của chính mình. Boolean bảo tồn tính chính xác nhưng không xếp hạng được. TF-IDF đánh trọng số theo mức độ thông tin. BM25 cải thiện độ liên quan từ vựng nhưng vẫn không hiểu cách diễn giải lại. LSI nhìn xuống dưới từng từ nhưng nén mất một phần chi tiết từ vựng. Truy xuất dày đặc học được độ tương đồng ngữ nghĩa nhưng trở nên kém tin cậy khi từ ngữ chính xác quan trọng.

Đó là lý do BM25 sống sót. Nó vẫn được dùng không phải vì ngành truy xuất thông tin không tiến bộ sau năm 1994, mà vì truy xuất nơ-ron giải quyết một bài toán khác. Một mô hình dày đặc có thể nhận ra "thiết bị đột ngột tắt" giống với "mất nguồn ngoài ý muốn". BM25 có thể nhận ra ZX-4821 không phải ZX-4812. Một hệ thống tìm kiếm thực tế có thể cần cả hai sự thật cùng lúc.

Bài học thực tế cho người xây dựng RAG

Nếu bạn đang xây dựng hệ thống RAG, đừng coi truy xuất dày đặc là điểm khởi đầu mặc định và BM25 là đường cơ sở lịch sử. Hãy coi chúng là hai cảm biến khác nhau.

  • Chạy riêng từng bộ trước. Kiểm tra những truy vấn mà chúng bất đồng. Truy xuất dày đặc thường thắng ở cách diễn giải lại, mô tả bằng ngôn ngữ tự nhiên và tương đồng khái niệm.
  • BM25 thường thắng ở mã sản phẩm, tên riêng, con số, thông báo lỗi, thuật ngữ kỹ thuật và cách diễn đạt hiếm gặp.
  • Sau đó kết hợp danh sách xếp hạng bằng một phương pháp đơn giản như Reciprocal Rank Fusion. Bạn không cần thiết kế lại toàn bộ pipeline hay huấn luyện mô hình mới. Đường cơ sở lai hữu ích đầu tiên có thể chỉ cần hai bộ truy xuất và vài dòng logic xếp hạng.
  • Đánh giá riêng giai đoạn truy xuất tách khỏi câu trả lời cuối cùng của LLM. Nếu tài liệu cần thiết không bao giờ lọt vào ngữ cảnh được truy xuất, kỹ thuật prompt không thể cứu được nó.

Pipeline RAG của bạn có thể chứa mô hình ngôn ngữ mới nhất hiện có. Điều đó không có nghĩa mọi thành phần xung quanh nó đều phải mới. Đôi khi, mảnh ghép còn thiếu lại là một thuật toán từ năm 1994.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗