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

Tìm kiếm kết hợp (Hybrid Search) bắt đầu từ hai danh sách ứng viên chất lượng

Medium Towards AI· James Luan· 9/11/2026general

Xét một truy vấn hỗ trợ kỹ thuật bao gồm cả mã lỗi và phần mô tả thông thường về sự cố phát sinh. Phương thức so khớp chính xác (exact matching) hỗ trợ việc tìm kiếm mã lỗi. Trong khi đó, truy xuất ngữ nghĩa (semantic retrieval) mang lại hiệu quả khi phần mô tả sử dụng từ ngữ khác với tài liệu hướng dẫn. Không có tín hiệu nào là hoàn toàn đầy đủ, bởi mỗi phương thức chỉ phát huy hiệu quả tối ưu trên một dạng yêu cầu nhất định. Vấn đề mang tính thực tiễn là xác định bằng chứng mà mỗi luồng truy xuất đóng góp. Cần tránh bắt đầu cuộc thảo luận này bằng một công thức kết hợp (fusion formula). Việc gộp hai bảng xếp hạng không thể khôi phục một tài liệu mà cả hai luồng truy xuất đều chưa tìm thấy. Phương thức này cũng có thể khiến một tập hợp kết quả ứng viên kém chất lượng trở nên có vẻ tinh vi hơn mà không

Xét một truy vấn hỗ trợ chứa cả mã lỗi lẫn nội dung mô tả thông thường về sự cố. Phương pháp khớp chính xác (exact matching) giúp tìm kiếm mã lỗi. Truy vấn ngữ nghĩa (semantic retrieval) phát huy hiệu quả khi phần mô tả sử dụng từ ngữ khác biệt so với tài liệu kỹ thuật. Không một tín hiệu đơn lẻ nào là đủ chỉ vì tín hiệu đó hoạt động tốt trên một dạng yêu cầu khác. Vấn đề cốt lõi cần xem xét là mỗi phương thức truy vấn đóng góp loại bằng chứng nào. Không nên bắt đầu cuộc thảo luận này bằng một công thức kết hợp (fusion formula). Việc kết hợp hai bảng xếp hạng không thể khôi phục một tài liệu mà cả hai hướng truy vấn đều không tìm thấy. Điều này cũng có thể khiến một tập hợp ứng viên nghèo nàn trở nên phức tạp hơn về mặt hình thức mà không cải thiện được độ bao phủ. Trước khi tinh chỉnh kết quả tìm kiếm kết hợp (hybrid), cần xem xét riêng biệt danh sách kết quả dạng dày đặc (dense) và dạng từ vựng (lexical) nhằm làm rõ những hạn chế của từng phương pháp. Bài hướng dẫn tìm kiếm kết hợp trên Milvus của Stefan Webb cung cấp nền tảng triển khai gồm: một trường vector dày đặc (dense field), một trường BM25 do máy chủ tự tạo, và kỹ thuật hợp nhất thứ hạng tương hỗ (reciprocal-rank fusion). Phần hướng dẫn dưới đây sử dụng một tập dữ liệu hỗ trợ gốc quy mô nhỏ nhằm làm sáng tỏ các mối quan hệ nêu trên. Quy trình này được xây dựng trên mẫu API của Milvus 2.5 và cần được thực thi trên máy chủ tương thích ở chế độ Độc lập (Standalone) hoặc Phân tán (Distributed), đồng thời sử dụng phiên bản thư viện máy khách (client) phù hợp với máy chủ đó. Phân định rõ trách nhiệm cho từng dạng biểu diễn dữ liệu Ứng dụng sẽ tạo các nhúng vector dày đặc (dense embeddings). Milvus tạo biểu diễn BM25 từ trường văn bản thông qua một hàm lược đồ (schema function). Việc phân định rõ ràng các trách nhiệm này giúp phòng tránh một sai lầm phân loại phổ biến: coi kết quả dạng thưa (sparse output) như một mảng nhúng khác do ứng dụng cung cấp. Đầu vào của nhánh từ vựng là văn bản thô, và bộ phân tích của máy chủ sẽ tham gia vào việc xác định phương thức giúp văn bản đó có thể tìm kiếm được. Cần cài đặt thư viện máy khách PyMilvus tương thích cùng các mô hình phụ thuộc, khởi động máy chủ thử nghiệm tại điểm cuối (endpoint) dưới đây và chạy lần lượt năm đoạn mã theo thứ tự trong một phiên Python. Mô hình nhúng có thể tải tệp tin trong lần sử dụng đầu tiên. Điểm cuối mặc định phục vụ cho thử nghiệm cục bộ; cần cung cấp các cấu hình xác thực và kết nối phù hợp với hệ thống triển khai thực tế. Đây là các tài liệu phục vụ mục đích minh họa, không phải dữ liệu đánh giá cho môi trường vận hành (production). from pymilvus import (MilvusClient, DataType, Function, FunctionType, AnnSearchRequest, RRFRanker, model) client = MilvusClient(uri="http://localhost:19530") collection = "james_hybrid_support_demo" encoder = model.DefaultEmbeddingFunction() documents = [ "ERR_AUTH_401 means the API credential is missing or expired.", "Rotate an expired API token in account settings before retrying.", "ERR_RATE_429 indicates too many requests; use bounded retry backoff.", "A network timeout does not prove that the server rejected a write.", ] vectors = encoder.encode_documents(documents) dimension = len(vectors[0]) if client.has_collection(collection): raise RuntimeError("Use a fresh demo collection name; existing data is preserved.")Việc xác định số chiều của trường dữ liệu trực tiếp từ đầu ra thực tế của mô hình giúp tránh việc sao chép nhầm thông số của một bộ mã hóa (encoder) khác. Trong một hệ thống triển khai thực tế, thông tin nhận dạng và phiên bản của mô hình vẫn cần được lưu lại. Sự tương thích về số chiều là điều kiện cần thiết, nhưng không đồng nghĩa với việc các vectơ tài liệu và vectơ truy vấn cùng nằm trong một không gian ngữ nghĩa. Cả hai phía bắt buộc phải sử dụng đúng quy trình mã hóa đã định trước. Kết nối văn bản với BM25 trong cấu trúc dữ liệu (schema) Cấu trúc dữ liệu lưu giữ văn bản gốc song song với biểu diễn dày đặc (dense representation). Trường văn bản cho phép tiến hành phân tích, trong khi hàm BM25 thực hiện kết nối trường này với trường đầu ra thưa thớt (sparse output). Đây là mối liên hệ cần được thể hiện rõ ràng trong quá trình đánh giá mã nguồn: dữ liệu đầu vào nào được nạp cho trường phái sinh nào, và hệ thống nào duy trì mối quan hệ phái sinh đó khi nguồn dữ liệu thay đổi. schema = client.create_schema(auto_id=False, enable_dynamic_field=False) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("text", DataType.VARCHAR, max_length=4096, enable_analyzer=True) schema.add_field("dense", DataType.FLOAT_VECTOR, dim=dimension) schema.add_field("sparse", DataType.SPARSE_FLOAT_VECTOR) schema.add_function(Function(name="support_bm25", input_field_names=["text"], output_field_names=["sparse"], function_type=FunctionType.BM25))Bộ phân tích cú pháp (analyzer) cần được kiểm thử kỹ lưỡng thay vì lựa chọn mặc định theo cảm tính. Các mã định danh lỗi, dấu câu, tên sản phẩm và nội dung đa ngôn ngữ có thể làm bộc lộ sự sai lệch giữa văn bản hiển thị cho người dùng và các đơn vị từ (tokens) mà chỉ mục từ vựng sử dụng. Một tập hợp dữ liệu (collection) tiếp nhận dữ liệu thành công vẫn có nguy cơ hoạt động không như kỳ vọng đối với chính các định danh chuẩn xác vốn là mục đích của việc tích hợp tìm kiếm toàn văn. Cần duy trì các trường hợp kiểm thử quy mô nhỏ tập trung vào bộ phân tích cú pháp, song song với việc đánh giá độ liên quan tổng thể. Điển hình như việc kiểm tra xem một truy vấn chứa mã định danh lỗi cụ thể có truy xuất đúng tài liệu giải thích về lỗi đó hay không. Đây là yêu cầu kỹ thuật hoàn toàn khác biệt so với việc truy xuất câu trả lời hữu ích từ một câu diễn đạt lại bằng ngôn ngữ tự nhiên. Việc tách biệt các trường hợp thử nghiệm giúp dễ dàng xác định lỗi phát sinh từ khâu phân tách từ vị (tokenization), khâu mã hóa dày đặc (dense encoding) hay khâu xếp hạng kết quả (ranking). Xây dựng và nạp dữ liệu cho cả hai hướng truy xuất Mỗi trường vectơ đòi hỏi chỉ mục và chỉ số đo lường phù hợp. Hướng tiếp cận vectơ dày đặc dưới đây sử dụng độ tương đồng cosine; hướng tiếp cận từ vựng sử dụng BM25 cùng chỉ mục đảo thưa thớt (sparse inverted index). Đây là hai hệ thống tính điểm riêng biệt. Điểm số đầu ra của chúng không thể được quy đổi tương đương theo kiểu một đơn vị đo độ tương đồng cosine có cùng giá trị với một đơn vị đo mức độ liên quan BM25. indexes = client.prepare_index_params() indexes.add_index(field_name="dense", index_type="AUTOINDEX", metric_type="COSINE") indexes.add_index(field_name="sparse", index_type="SPARSE_INVERTED_INDEX", metric_type="BM25") client.create_collection(collection, schema=schema, index_params=indexes, consistency_level="Strong") client.insert(collection, data=[ {"id": i, "text": text, "dense": vector.tolist()} for i, (text, vector) in enumerate(zip(documents, vectors)) ]) client.flush(collection) client.lo ad_collection(collection) Trong quá trình chèn dữ liệu, hệ thống chỉ cung cấp văn bản nguồn và vectơ dày đặc (dense vector). Hàm lược đồ (schema function) sẽ tạo ra biểu diễn thưa (sparse representation). Các mã định danh (ID) cố định trong phần minh họa này giúp việc so sánh các kết quả trả về trở nên thuận tiện hơn. Trong một hệ thống quy mô lớn hơn, việc sử dụng các mã định danh ổn định sẽ cho phép các báo cáo đánh giá liên kết một kết quả trở lại tài liệu nguồn và curre

Nguồn tin: Medium Towards AI — Tác giả: James Luan. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.