Chuyển đến nội dung chính

Query Transformation trong RAG: Rewrite, HyDE và Decomposition

Sau chunking, embedding, hybrid retrieval và reranking, một nguyên nhân quan trọng khiến RAG vẫn truy xuất kém nằm ngay ở query. Câu hỏi của người dùng được viết để giao tiếp tự nhiên, trong khi tài liệu trong index thường dùng thuật ngữ, cấu trúc và mức độ chi tiết khác.

Query transformation là nhóm kỹ thuật biến đổi truy vấn trước hoặc trong quá trình retrieval nhằm tăng khả năng tìm được tài liệu relevant. Các kỹ thuật phổ biến gồm query rewriting, query expansion, query decomposition, multi-query retrieval và HyDE.

Vì sao query gốc chưa chắc là query tốt để retrieval?

Người dùng thường đặt câu hỏi theo cách thuận tiện cho họ chứ không theo vocabulary của document collection. Ví dụ, người dùng có thể hỏi:

“Vì sao tài khoản của tôi cứ bị đá ra ngoài sau một lúc không dùng?”

Trong tài liệu kỹ thuật, cùng vấn đề có thể được mô tả bằng các thuật ngữ như session timeout, idle timeout hoặc session expiration. Dense retrieval có thể xử lý một phần chênh lệch ngữ nghĩa này, nhưng không đảm bảo query embedding luôn nằm gần đúng chunk cần tìm.

Một query cũng có thể quá dài, chứa thông tin hội thoại không cần thiết, dùng đại từ không rõ tham chiếu hoặc gộp nhiều ý thành một câu. Những yếu tố này làm representation của query ít tập trung hơn.

User query → query transformation → retriever → candidates → reranker → context

Query transformation không thay thế retriever. Nó điều chỉnh đầu vào của retriever để query phản ánh rõ hơn information need, tức nhu cầu thông tin thực sự của người dùng.

Query rewriting: viết lại truy vấn để rõ và độc lập hơn

Query rewriting biến query ban đầu thành một phiên bản phù hợp hơn cho retrieval nhưng vẫn giữ nguyên ý định chính. Kỹ thuật này đặc biệt hữu ích trong conversational RAG, nơi câu hỏi hiện tại phụ thuộc vào các lượt hội thoại trước.

Ví dụ hội thoại:

User: HNSW dùng để làm gì trong vector database?

User: Nó khác exact search ở điểm nào?

Query thứ hai đứng riêng lẻ chứa đại từ “nó”, vì vậy retriever không biết chắc đối tượng đang được hỏi là gì. Một query rewriter có thể chuyển thành:

“HNSW khác exact nearest-neighbor search trong vector database ở điểm nào?”

Đây thường được gọi là standalone query rewriting: biến câu hỏi phụ thuộc vào conversation history thành câu hỏi có thể hiểu độc lập.

Một query rewriter tốt nên bảo toàn user intent. Nếu mô hình tự thêm giả định hoặc thay đổi đối tượng được hỏi, retrieval có thể chuyển sang đúng nghĩa về mặt ngôn ngữ nhưng sai về mặt thông tin.

Lưu ý: query rewriting không phải summarization. Mục tiêu không phải rút gọn hội thoại, mà tạo một retrieval query thể hiện chính xác information need của lượt hỏi hiện tại.

Query expansion và multi-query retrieval

Query expansion bổ sung các term hoặc cách diễn đạt có liên quan nhằm tăng cơ hội matching với document. Đây là kỹ thuật lâu đời trong Information Retrieval và vẫn hữu ích trong RAG.

Ví dụ query:

“Cách giảm thời gian tìm vector?”

Một phiên bản expanded có thể bổ sung các khái niệm liên quan như:

  • vector search latency;
  • Approximate Nearest Neighbor;
  • ANN index;
  • HNSW search parameters.

Query expansion đặc biệt hữu ích với lexical retrieval vì nó tăng lexical overlap. Với dense retrieval, một chiến lược liên quan là multi-query retrieval: tạo nhiều cách diễn đạt khác nhau của cùng information need rồi retrieval riêng từng query.

Ví dụ từ một câu hỏi:

“Làm thế nào để RAG tìm tài liệu chính xác hơn?”

Có thể sinh các query bổ sung như:

  • “Cách cải thiện retrieval accuracy trong RAG”
  • “Tối ưu dense retrieval và reranking cho RAG”
  • “Các kỹ thuật tăng recall của retriever trong RAG”

Mỗi query tạo một candidate list riêng. Các danh sách sau đó có thể được union, deduplicate và fusion trước khi reranking.

Multi-query retrieval giúp tăng retrieval recall, nhưng cũng có thể làm candidate set lớn hơn và chứa nhiều false positive. Vì vậy nó thường hiệu quả hơn khi đi cùng reranker.

Query decomposition cho câu hỏi nhiều bước

Không phải query nào cũng nên được gửi nguyên vẹn vào một lần retrieval. Những câu hỏi cần nhiều fact hoặc nhiều bước suy luận có thể được tách thành các subquery. Kỹ thuật này gọi là query decomposition.

Giả sử người dùng hỏi:

“Dense retrieval khác BM25 như thế nào và trong trường hợp nào nên kết hợp cả hai?”

Có thể tách thành:

  1. Dense retrieval hoạt động như thế nào?
  2. BM25 hoạt động như thế nào?
  3. Điểm mạnh và điểm yếu của dense retrieval so với BM25 là gì?
  4. Khi nào hybrid retrieval phù hợp?

Mỗi subquery có thể truy xuất một tập evidence riêng. Sau đó hệ thống tổng hợp evidence để tạo context cho câu trả lời cuối.

Decomposition đặc biệt hữu ích với multi-hop question answering, nơi câu trả lời cần thông tin từ nhiều tài liệu hoặc nhiều thực thể khác nhau.

Tuy nhiên, decomposition tạo thêm nhiều retrieval call và có thể gây error propagation. Nếu LLM chia câu hỏi sai ngay từ đầu, các bước retrieval phía sau có thể tìm đúng tài liệu cho những subquery không thực sự cần thiết.

HyDE: retrieval bằng hypothetical document

HyDE, viết tắt của Hypothetical Document Embeddings, sử dụng một cách tiếp cận khác query rewriting thông thường. Thay vì trực tiếp embedding câu hỏi, hệ thống trước tiên sinh ra một đoạn văn giả định giống tài liệu có thể trả lời query.

Query
↓
LLM tạo hypothetical document
↓
Embedding hypothetical document
↓
Vector retrieval
↓
Real documents

Ví dụ query:

“Vì sao overlap quá lớn có thể làm RAG retrieval kém hiệu quả?”

LLM có thể sinh một hypothetical passage mang dạng tài liệu:

“Large chunk overlap creates duplicated content across neighboring chunks, increasing index size and causing multiple highly similar chunks to occupy retrieval results...”

Embedding của đoạn giả định này có thể gần với embedding của tài liệu thực hơn embedding của một câu hỏi ngắn. Về trực giác, HyDE giảm khoảng cách giữa hai dạng văn bản: question-like query và document-like passage.

Điểm quan trọng là hypothetical document không được xem là evidence để trả lời người dùng. Nó chỉ đóng vai trò trung gian để retrieval.

Không nên nhầm: nội dung do LLM tạo trong HyDE có thể chứa thông tin không chính xác. Hệ thống phải retrieval tài liệu thật và sử dụng tài liệu thật làm evidence thay vì coi hypothetical document là nguồn tri thức.

Triển khai multi-query retrieval đơn giản bằng Python

Ví dụ dưới đây giả lập nhiều retrieval result và hợp nhất chúng trước bước reranking. Trong hệ thống thực tế, mỗi query có thể được gửi đến BM25, vector database hoặc cả hai.

def merge_candidates(result_sets):
    merged = {}

    for results in result_sets:
        for rank, doc_id in enumerate(results, start=1):
            score = 1 / rank
            merged[doc_id] = merged.get(doc_id, 0) + score

    return sorted(
        merged.items(),
        key=lambda item: item[1],
        reverse=True
    )


query_1 = ["doc_2", "doc_5", "doc_1"]
query_2 = ["doc_5", "doc_3", "doc_2"]
query_3 = ["doc_2", "doc_4", "doc_5"]

candidates = merge_candidates([query_1, query_2, query_3])

for doc_id, score in candidates:
    print(doc_id, round(score, 3))

Document xuất hiện ở vị trí tốt trong nhiều query sẽ nhận điểm cao hơn. Đây chỉ là ví dụ minh họa; trong production có thể sử dụng Reciprocal Rank Fusion, weighted fusion hoặc đưa toàn bộ candidate sang cross-encoder reranker.

Một chi tiết quan trọng là phải deduplicate candidate. Nếu ba query khác nhau đều retrieval cùng một chunk, chunk đó không nên được đưa ba lần vào context chỉ vì nó xuất hiện trong ba result set.

Query transformation có thể làm retrieval tệ hơn khi nào?

Thêm một LLM vào trước retriever không mặc nhiên làm hệ thống tốt hơn. Query transformation có thể tạo query drift, tức truy vấn mới dần lệch khỏi information need ban đầu.

Ví dụ, query gốc hỏi về “Python multiprocessing” nhưng query expansion tự thêm “asyncio” vì cả hai liên quan đến concurrency. Kết quả retrieval có thể chuyển sang asynchronous programming dù người dùng không hỏi về chủ đề này.

Một vấn đề khác là mất các lexical constraint quan trọng. Với query:

“Lỗi CUDA error 700 khi chạy model”

Nếu query rewriter biến thành “GPU runtime failure during model execution”, semantic meaning vẫn tương đối đúng nhưng token 700 đã bị mất. Điều này có thể làm lexical retrieval bỏ qua tài liệu chính xác.

Trong các domain chứa identifier, version, error code, product code hoặc tên API, nên giữ nguyên các lexical anchor quan trọng khi rewrite query.

Nên chọn rewriting, multi-query, decomposition hay HyDE?

Không có một chiến lược query transformation phù hợp cho mọi query. Loại transformation nên được chọn dựa trên failure mode của retrieval.

Vấn đề Kỹ thuật phù hợp Mục tiêu
Query phụ thuộc hội thoại Query rewriting Tạo standalone query
Vocabulary mismatch Query expansion hoặc multi-query Tăng recall
Câu hỏi chứa nhiều ý Query decomposition Tìm evidence cho từng phần
Query ngắn khó map sang document HyDE Tạo document-like representation

Trong production, không nhất thiết phải áp dụng transformation cho mọi request. Một router có thể phân loại query đơn giản, query hội thoại, query multi-hop hoặc query cần exact matching rồi chọn retrieval strategy tương ứng.

Đánh giá query transformation đúng cách

Cách đánh giá tốt nhất không phải xem query đã viết lại “nghe hay hơn” hay chưa. Mục tiêu cuối cùng vẫn là retrieval relevant documents chính xác hơn.

Có thể so sánh pipeline trước và sau transformation bằng các retrieval metric như Recall@k, MRR hoặc nDCG. Nếu transformation làm Recall@20 tăng nhưng top results trở nên nhiễu, reranking metrics và chất lượng final answer cũng cần được kiểm tra.

Nên phân tích riêng theo query category. Conversational rewriting có thể cải thiện mạnh câu hỏi chứa đại từ nhưng gần như không có lợi cho exact error-code queries. Một aggregate metric duy nhất có thể che giấu những khác biệt này.

Ngoài accuracy, production system còn phải theo dõi latency và chi phí. Multi-query retrieval tạo nhiều search request hơn, decomposition tạo nhiều retrieval stage, còn HyDE cần thêm một LLM generation trước retrieval.

Kết luận

Query transformation trong RAG giải quyết khoảng cách giữa cách người dùng đặt câu hỏi và cách tri thức được biểu diễn trong document collection. Query rewriting phù hợp với conversational context, multi-query và expansion giúp tăng recall, decomposition xử lý câu hỏi nhiều bước, còn HyDE tạo một document-like representation để phục vụ dense retrieval.

Sau khi retrieval đã tìm được candidate tốt, vấn đề tiếp theo là quyết định những chunk nào thực sự nên được đưa vào context của LLM, sắp xếp chúng ra sao và làm thế nào tránh context dư thừa hoặc mâu thuẫn. Đây là bước context construction và context optimization trong một pipeline RAG hoàn chỉnh.

© The CS Note · THE CS NOTE

Nội dung gốc thuộc tác giả. Vui lòng không đăng lại toàn văn khi chưa được phép, trừ trường hợp pháp luật hoặc giấy phép áp dụng cho phép. Nội dung của bên thứ ba tuân theo quyền và giấy phép tương ứng.

Nguồn gốc: Query Transformation trong RAG: Rewrite, HyDE và Decomposition

Về trang chủ Về đầu bài

Bài Đăng Phổ Biến

Bài toán tháp Hà nội

Trải nghiệm Tháp Hà Nội Kéo thả đĩa hoặc chạm vào các nút bên dưới để di chuyển. Bạn phải chuyển toàn bộ đĩa sang cột ngoài cùng bên phải (Cột 3) mà không đặt đĩa to lên đĩa nhỏ. Cột 1 Cột 2 Cột 3 Điều khiển & Chế độ Số lượng đĩa 4 Tốc độ máy giải ↪ Undo ↻ Chơi lại 🤖 Máy tự giải Thống kê ván chơi Nước đã đi 0 Thời gian 00:00 Tối thiểu cần 15 Kỷ lục của bạn - Lịch sử và Nguồn gốc Truyền thuyết Bài toán Tháp Hà Nội (hay Tháp Brahma) là một trò chơi xếp hình toán học kinh điển được giới thiệu lần đầu vào năm 1883 bởi nhà toán học người Pháp Édouard L...

Bài toán phân tích cảm xúc trong văn bản

Bài toán phân tích cảm xúc (sentiment analysis) là một bài toán NLP nhằm xác định thái độ hoặc cảm xúc được thể hiện trong văn bản. Ví dụ, từ một đánh giá như “Điện thoại đẹp, chạy nhanh nhưng pin hơi yếu”, hệ thống có thể nhận biết rằng người dùng có cả nhận xét tích cực và tiêu cực. Điểm thú vị của bài toán nằm ở khoảng cách giữa cách con người hiểu ngôn ngữ và cách máy tính xử lý dữ liệu. Một hệ thống phân tích cảm xúc cần biến văn bản tự nhiên thành dữ liệu có cấu trúc, học được các mẫu ngôn ngữ từ dữ liệu huấn luyện và đưa ra dự đoán hợp lý trên những câu chưa từng gặp. 1. Bài toán phân tích cảm xúc bắt đầu từ đâu? Hãy tưởng tượng một cửa hàng trực tuyến có hàng nghìn đánh giá mỗi ngày. Con người có thể đọc từng đánh giá để biết khách hàng hài lòng hay không, nhưng việc này nhanh chóng trở nên tốn thời gian khi dữ liệu tăng lên. NLP có thể biến bài toán đó thành một bài toán phân loại. Với mỗi văn bản, hệ thống nhận vào một chuỗi ký...

KAN cho phân đoạn khối u não với bộ BraTS 2020

Kolmogorov-Arnold Network (KAN) mở ra một hướng khác với MLP truyền thống: thay vì chỉ học các trọng số vô hướng trên mỗi kết nối, KAN có thể học những hàm phi tuyến một biến trên các cạnh . Khi đưa ý tưởng này vào kiến trúc encoder-decoder như U-Net, ta có thể sử dụng convolution để giữ cấu trúc không gian của ảnh MRI và dùng KAN để thực hiện các phép biến đổi phi tuyến mạnh hơn trên representation trung gian. Một bài toán phù hợp để nghiên cứu hướng này là phân đoạn u thần kinh đệm trên BraTS 2020 . Dataset cung cấp MRI đa mô thức và yêu cầu xác định các vùng Whole Tumor (WT), Tumor Core (TC) và Enhancing Tumor (ET). Đây là bài toán 3D có sự mất cân bằng voxel lớn, hình dạng khối u rất đa dạng và ranh giới giữa các mô bệnh lý không đơn giản. Lưu ý học thuật quan trọng: U-KAN gốc được công bố cho nhiều benchmark phân đoạn ảnh y tế nhưng không báo cáo kết quả BraTS 2020. Một công trình sau đó đã mở rộng U-KAN sang 3D MRI brain tumor segmentation , nhưng đánh giá trên BraTS 2...

Tách từ trong tiếng Việt Word Segmentation

Tách từ tiếng Việt là bài toán xác định ranh giới giữa các từ trong một chuỗi văn bản. Khó khăn nằm ở chỗ khoảng trắng trong tiếng Việt thường phân cách các âm tiết , nhưng một từ hoàn chỉnh có thể gồm nhiều âm tiết như “sinh viên” , “đại học” , “công nghệ” hay “tự nhiên” . Tách từ đúng giúp các hệ thống NLP dựa trên từ biểu diễn văn bản hợp lý hơn, đặc biệt trong tìm kiếm, TF-IDF, phân loại văn bản, gán nhãn từ loại và một số mô hình ngôn ngữ tiếng Việt. Tuy nhiên, với các Transformer sử dụng tokenizer dưới mức từ như subword hoặc SentencePiece, tách từ thủ công không phải lúc nào cũng là bước bắt buộc . Việc có cần tách từ trước hay không phụ thuộc vào mô hình và pipeline cụ thể. Tóm tắt nội dung Khoảng trắng trong tiếng Việt không phải lúc nào cũng là ranh giới từ ; nhiều từ gồm hai hoặc nhiều âm tiết. Word segmentation và tokenization có liên quan nhưng không hoàn toàn đồng nghĩa. Ba hướng chính gồm dựa trên từ điển, mô hình thống kê và mô hình học sâu . Tron...

KAN là gì? Mạng Kolmogorov-Arnold khác MLP thế nào?

Kolmogorov-Arnold Network (KAN) là một kiến trúc mạng nơ-ron trong đó mỗi cạnh không chỉ chứa một trọng số vô hướng mà mang một hàm một biến có thể học được . Đây là khác biệt cốt lõi so với Multi-Layer Perceptron (MLP), nơi các cạnh chủ yếu thực hiện phép nhân với trọng số còn hàm kích hoạt thường được áp dụng tại các node. KAN được lấy cảm hứng từ định lý biểu diễn Kolmogorov-Arnold và đặc biệt đáng chú ý trong các bài toán xấp xỉ hàm, mô hình hóa khoa học và symbolic regression. Tuy nhiên, KAN không nên được hiểu là kiến trúc đã thay thế MLP trong mọi bài toán Deep Learning; khả năng biểu diễn, chi phí tính toán và mức độ phù hợp của hai kiến trúc khác nhau theo từng nhiệm vụ. Tóm tắt nội dung MLP học chủ yếu trọng số trên các cạnh , còn KAN đặt hàm một biến học được trên từng cạnh . Một KAN layer cộng kết quả của nhiều hàm cạnh để tạo activation của node tiếp theo. KAN gốc sử dụng B-spline để tham số hóa các hàm phi tuyến trên cạnh. KAN có lợi thế đáng chú ý về trực...