Giới thiệu
Retrieval Augmented Generation (RAG) là một phương pháp hiện đại, giúp các mô hình ngôn ngữ lớn (LLM) có thể truy cập thông tin từ cơ sở dữ liệu bên ngoài mà không cần phải tinh chỉnh mô hình. Quy trình RAG cơ bản bao gồm bốn bước: nhận truy vấn từ người dùng, chuyển đổi văn bản thành embedding qua mô hình embedding, tìm kiếm tài liệu liên quan qua bước truy xuất, và cuối cùng là tạo ra câu trả lời từ các tài liệu đã được truy xuất.
Trong quy trình này, bước truy xuất là rất quan trọng. Nếu bộ truy xuất không tìm thấy tài liệu phù hợp, thì câu trả lời của LLM sẽ không chính xác. Tuy nhiên, một số vấn đề có thể xuất hiện tại bước truy xuất, chẳng hạn như truy vấn của người dùng quá ngắn, sai ngữ pháp hoặc chính tả, trong khi tài liệu lại quá dài và được viết đầy đủ.
HyDE: Kỹ thuật cải thiện truy xuất trong RAG
HyDE (Hypothetical Document Embeddings) là kỹ thuật được đề xuất nhằm khắc phục vấn đề này, bằng cách chuyển đổi truy vấn của người dùng thành một văn bản giả định. Kỹ thuật này đã được nghiên cứu và giới thiệu lần đầu trong bài báo "Precise Zero-Shot Dense Retrieval without Relevance Labels" vào năm 2022.
HyDE sẽ sử dụng một mô hình LLM đã được huấn luyện để chuyển đổi truy vấn thành văn bản giả. Văn bản giả này có thể chứa thông tin không chính xác, nhưng điều này không quan trọng vì nó sẽ được mã hóa thành các vector embedding và sử dụng cho tìm kiếm theo sự tương đồng ngữ nghĩa.
Quá trình này diễn ra như sau: Mô hình embedding sẽ lọc bỏ các chi tiết không cần thiết trong văn bản giả và tạo ra một vector embedding gần nhất với các tài liệu thực tế. Cuối cùng, bộ truy xuất sẽ sử dụng tài liệu giả định này để tìm kiếm tài liệu thực tế phù hợp trong không gian embedding.
Contriever: Mô hình truy xuất hiệu quả
Contriever là một bộ truy xuất (mô hình embedding) được đào tạo bằng phương pháp học đối kháng, cho phép tìm kiếm tương đồng mà không cần dữ liệu có gán nhãn. Phương pháp này rất hữu ích trong những trường hợp thiếu dữ liệu lớn. Contriever sẽ cố gắng phân biệt các cặp văn bản có nghĩa tương tự (positive pair) và không tương tự (negative pair) trong quá trình huấn luyện.
Khi nào nên sử dụng HyDE?
Việc quyết định khi nào sử dụng HyDE phụ thuộc vào mô hình embedding mà bạn đang sử dụng. Ví dụ, nếu mô hình embedding của bạn đã được tinh chỉnh cho tìm kiếm ngữ nghĩa, bạn có thể không cần áp dụng HyDE. Ngược lại, nếu mô hình của bạn được đào tạo bằng phương pháp học không giám sát, HyDE sẽ là một lựa chọn tốt để cải thiện truy xuất.
Cách triển khai HyDE
Chúng ta có thể triển khai HyDE bằng Python bằng cách sử dụng các thư viện như transformers và sentence-transformers. Trong ví dụ dưới đây, tôi sẽ hướng dẫn bạn cách tạo một mô hình LLM và một mô hình embedding để tính toán cho các vector embedding từ một văn bản giả định.
python
# Cài đặt thư viện cần thiết
!pip install transformers sentence-transformers torch
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
class LLM:
def __init__(self, model_name="Qwen/Qwen2.5-0.5B-Instruct"):
self.device = "cuda" if torch.cuda.is_available() else "cpu"
self.model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
).to(self.device)
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
def generate(self, prompt, temperature=0.7, max_new_tokens=256):
messages = [{"role": "user", "content": prompt}]
text = self.tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
model_inputs = self.tokenizer([text], return_tensors="pt").to(self.device)
generated_ids = self.model.generate(
**model_inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=temperature,
)
generated_ids = [
output_ids[len(input_ids) :]
for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
return self.tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
Di chuyển tiếp theo, bạn cần tạo một mô hình mã hóa để tính toán các embedding và so sánh sự tương đồng giữa các văn bản khác nhau.
Kết luận
HyDE là một kỹ thuật đơn giản nhưng hiệu quả trong việc cải thiện hiệu suất truy xuất trong pipeline RAG. Bằng cách tạo ra văn bản giả từ các truy vấn, HyDE giúp thực hiện tìm kiếm tương đồng trong không gian embedding giữa tài liệu thực và tài liệu giả định. Điều này đặc biệt hữu ích khi sử dụng các mô hình embedding chưa được tinh chỉnh cho tìm kiếm ngữ nghĩa. Bạn hãy thử nghiệm với HyDE để tìm ra khả năng cải thiện hiệu suất tìm kiếm của mình trong các ứng dụng thực tế.
Tài liệu tham khảo
- P. Lewis et al., Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (2021), arXiv:2005.11401
- L. Gao et al., Precise Zero-Shot Dense Retrieval without Relevance Labels (2022), arXiv:2212.10496
- G. Izacard et al., Unsupervised Dense Information Retrieval with Contrastive Learning (2022), Transactions on Machine Learning Research (2022)
- X. Wang et al., Searching for Best Practices in Retrieval-Augmented Generation (2024), arXiv:2407.01219
source: viblo