Biến Lớp Tri Thức Thành Đồ Thị Bạn Có Thể Thực Sự Truy Vấn
Bài viết này thách thức cách tiếp cận truyền thống trong việc xây dựng lớp tri thức cho hệ thống RAG. Tác giả trình bày một thiết kế sửa đổi, loại bỏ bộ định tuyến truy vấn dựa trên từ khóa và thay thế bằng một đường ống truy xuất hợp nhất, luôn chạy mọi lúc. Trọng tâm là biến đồ thị tri thức thành một thành phần có thể duyệt qua thực sự với các cạnh bitemporal, phát hiện mâu thuẫn tự động và tiến trình phân giải thực thể hai ngưỡng, cho phép hệ thống trả lời các câu hỏi đa bước và theo thời gian mà kiến trúc trước đây không thể.

Biến Lớp Tri Thức Thành Đồ Thị Bạn Có Thể Thực Sự Truy Vấn
Trong phần đầu của loạt bài về thiết kế lớp tri thức bền vững, tôi đã xây dựng một hệ thống lưu trữ kiến thức và bằng chứng cho đường ống RAG. Tuy nhiên, một con số 149 so với 19 (tỷ lệ phân mảnh 7 lần) đã phơi bày một điểm yếu cốt lõi: các mối quan hệ được lưu trữ nhưng không bao giờ được duyệt qua trong lúc truy vấn. Bài viết này giới thiệu một thiết kế sửa đổi toàn diện để giải quyết vấn đề đó.
Sự Thật Về Điểm Yếu Của Kiến Trúc Cũ
Phần 1 đã xây dựng hệ thống với ba lớp: lớp bằng chứng (chunk, vector, toàn văn), lớp tri thức (khái niệm, quan hệ, quyết định) và một bộ điều phối quyết định nên hỏi lớp nào dựa trên từ khóa trong câu hỏi. Vấn đề không chỉ là các quy tắc heuristic thô sơ, mà là vấn đề mang tính cấu trúc: chất lượng truy xuất trở thành thuộc tính của cách diễn đạt câu hỏi, không phải của hệ thống.
Hai người dùng hỏi cùng một sự thật với cách diễn đạt khác nhau có thể đi qua các đường dẫn khác nhau và nhận được câu trả lời có độ tin cậy khác nhau.
Nguyên Tắc Mới: Chạy Mọi Thứ, Luôn Luôn
Thay vì định tuyến, thiết kế mới bắt đầu từ một tiền đề khác: chạy mọi thứ, luôn luôn, và để kết quả cạnh tranh dựa trên bằng chứng. Một đường ống cố định, không có chế độ, giúp hệ thống trở nên xác định, có thể kiểm thử và dễ dàng lập luận.
Bộ Truy Xuất So Với Bộ Lọc
Để tránh kiến trúc ba-engine phức tạp, tác giả đề xuất một bài kiểm tra quan trọng: một phương thức tạo ra bằng chứng được xếp hạng (relu) hay chỉ thu hẹp và điều chỉnh lại xếp hạng của người khác (filter)?
- Semantic và keyword search: Bộ truy xuất (retriever) - tạo ra bằng chứng được xếp hạng.
- Thời gian: Bộ lọc (filter) - hạn chế và tăng cường thứ hạng, không bao giờ tự xếp hạng.
- Đồ thị: Nằm giữa - không tự xếp hạng nhưng mở rộng (expand), biến một kết quả liên quan thành một khu vực kết nối với tín hiệu quan hệ.
Kết quả: Hai engine, không phải ba. Một cam kết tồn tại lâu hơn mọi lựa chọn engine: một giao diện thống nhất, cho phép thêm, thay thế hoặc loại bỏ backends mà không ảnh hưởng đến phần trên.
Đường Ống Hợp Nhất Từ Đầu Đến Cuối
Với bộ định tuyến bị loại bỏ và các engine được chọn, truy xuất trở thành một đường ống cố định mà mọi truy vấn đều chạy từ trên xuống dưới:
Sơ đồ đường ống hợp nhất
- Bước 1 mang theo neo (anchors), không chỉ văn bản. Mỗi chunk trong chỉ mục tìm kiếm lưu trữ ID của các thực thể mà nó nhắc đến. Một kết quả tìm kiếm kết hợp đã biết nó đi vào đồ thị ở đâu.
- Bước 2 là bắt buộc. Duyệt đồ thị là một giai đoạn cố định, không phải một tùy chọn. Khi đồ thị không có gì hữu ích, nó đóng góp ít và kết quả tìm kiếm tự mang câu trả lời.
- Bước 4 là một bộ xếp hạng lại duy nhất trên toàn bộ union. Điều này cho phép một đối tượng vừa kết nối vừa liên quan có thể vượt qua một đối tượng tương tự hơn nhưng bị cô lập.
- Bước 7 là nơi cổng mâu thuẫn (contradiction gate) tồn tại. Nếu bó kết quả chạm vào một khái niệm đang tranh cãi, hệ thống vẫn trình bày cả hai quan điểm, nêu tên chủ sở hữu và từ chối trả lời như thể vấn đề đã được giải quyết.
Mô hình không bao giờ nhận được một đống các đoạn rời rạc. Thay vào đó, nó nhận một đồ thị con nhỏ, được xếp hạng, kết nối và ghi nguồn được hiển thị như ngữ cảnh.
Thời Gian Di Chuyển Vào Bên Trong Các Cạnh
Phần 1 xử lý thời gian ở mức tài liệu. Thiết kế mới di chuyển thời gian đến nơi kiến thức thực sự sống: mỗi cạnh quan hệ mang một cửa sổ hiệu lực (valid_from, valid_to, mở nếu là hiện tại), cùng với dấu thời gian hệ thống học được sự thật (event time và ingest time).
Các cạnh bitemporal
Khi một sự thật thay đổi, cạnh cũ không bị viết đè mà được hết hạn (expire) — valid_to được đóng lại, và một cạnh mới mở ra. Điều này tạo ra ba dạng câu hỏi gần như miễn phí:
- As-of: Quy tắc kiểm tra nào áp dụng vào ngày 20/2/2026? Chỉ duyệt các cạnh còn hiệu lực tại thời điểm đó.
- Timeline: Yêu cầu kiểm tra mái nhà đã tiến hóa như thế nào? Chuỗi có thứ tự các cạnh của một thực thể theo cửa sổ hiệu lực.
- Diff: Điều gì đã thay đổi trong hướng dẫn bảo lãnh trong quý này? Các cạnh có cửa sổ hiệu lực mở hoặc đóng trong một khoảng thời gian.
Mâu Thuẫn: Từ Việc Tuyển Chọn Đến Phát Hiện Tự Động
Điểm mạnh nhất của Phần 1 là cổng mâu thuẫn, nhưng sự phát hiện mâu thuẫn đó là do tôi tự làm. Với các cạnh bitemporal, việc phát hiện trở nên tự động. Tại thời điểm nạp dữ liệu, sau khi trích xuất một sự thật mới và phân giải thực thể, hệ thống kiểm tra nó với các cạnh hiện hành trên cùng một chủ đề:
- Một sự thay thế rõ ràng (phiên bản mới hơn của cùng một quy tắc từ cùng một cơ quan) tự động hết hạn cạnh cũ.
- Một xung đột thực sự (hai nguồn hiện tại, thẩm quyền khác nhau, tuyên bố không tương thích) được đưa lên bề mặt, ghi lại như một đối tượng mâu thuẫn chưa được giải quyết với chủ sở hữu chịu trách nhiệm, và không bao giờ được máy móc giải quyết.
Phân Giải Thực Thể: Nền Tảng Mà Đồ Thị Đứng Vững
Vấn đề 149 so với 19 là lý do bài viết này tồn tại. Mọi lời hứa về duyệt đồ thị, cạnh bitemporal, và phát hiện mâu thuẫn đều phụ thuộc vào giả định rằng "cùng một chủ đề" là một nút duy nhất.
Quy trình phân giải thực thể
Quy trình phân giải trở thành một pipeline hạng nhất với hai ngưỡng:
- Khớp có độ tin cậy cao: tự động liên kết.
- Không khớp rõ ràng: tạo thực thể mới.
- Vùng xám: gửi mô hình ngôn ngữ để phân xử, với đề xuất, ngữ cảnh cục bộ và hồ sơ ứng viên trong prompt.
Trong quá trình triển khai trực tiếp, pipeline này giảm 149 khái niệm xuống còn 120, giảm 20% nhưng vẫn cao hơn nhiều so với 19 khái niệm chuẩn. Đây không phải là vấn đề đã được giải quyết, nhưng cơ chế đang di chuyển con số đúng hướng.
Một bài học quan trọng: các embedding ứng viên phải được lưu vào bộ nhớ cache để tránh việc nhúng lại mọi tên chuẩn cho mọi đề xuất.
Chi Phí Thêm Vào Gần Như Bằng Không
| Thành phần | Chế độ | Hành vi chi phí dự kiến |
|---|---|---|
| Cosmos DB for Gremlin | Serverless | RUs mỗi lần duyệt; gần như bằng không khi rảnh |
| Azure Functions (projection) | Consumption | Miễn phí cho corpus demo |
| Entities index | Trong dịch vụ tìm kiếm hiện có | Không có dịch vụ mới |
| Union rerank | Foundry tokens | Chi phí biến đổi thực sự duy nhất |
| Trích xuất + phân xử vùng xám | Foundry tokens | Một lần mỗi tài liệu; hai ngưỡng giữ vùng xám hẹp |
Điểm mấu chốt: chi phí cố định gần như bằng không, và hai thứ có thể thực sự tốn tiền (rerank tokens và phân xử vùng xám) đều được kiểm soát bằng các nút điều chỉnh mà thiết kế cố tình để lộ.
Kết Luận
Việc biến lớp tri thức thành một đồ thị có thể duyệt được đòi hỏi một sự thay đổi triết lý: truy xuất chất lượng phải là thuộc tính của hệ thống, không phải của cách diễn đạt câu hỏi. Bằng cách loại bỏ bộ định tuyến, hợp nhất mọi phương thức truy xuất, đưa thời gian vào các cạnh, và tự động hóa việc phát hiện mâu thuẫn, hệ thống không chỉ trả lời tốt hơn mà còn trở nên có thể kiểm chứng và có thể mở rộng một cách bền vững.

