
Hệ thống RAG (Retrieval-Augmented Generation) cấp doanh nghiệp: Từ PDF đến câu trả lời được đánh dấu.
Trí tuệ Tài liệu Doanh nghiệp [Tập 1 Số 1] Phiên bản RAG nhỏ nhất thực sự hoạt động, trên một tệp PDF thực, với các câu trả lời có căn cứ và các dòng nguồn được đánh dấu. Bài viết Baseline Enterprise RAG, From PDF to Highlighted Answer xuất hiện lần đầu trên Towards Data Science.
Ứng dụng LLM
RAG doanh nghiệp cơ bản, từ PDF đến câu trả lời được đánh dấu
Thông tin tài liệu doanh nghiệp [Tập 1 #1] Phiên bản RAG nhỏ nhất thực sự hoạt động, trên một tệp PDF thực, với các câu trả lời có căn cứ và các dòng nguồn được đánh dấu.
angela shi
Ngày 29/5/2026
41 phút đọc
Chia sẻ
Ảnh của Curvd, qua Unsplash
Cách nhanh nhất để hiểu RAG là xây dựng phiên bản nhỏ nhất thực sự hoạt động, chạy nó trên một tài liệu thực và xem xét kỹ những gì vừa xảy ra.
Đó là nội dung của bài viết này. Khoảng một trăm dòng mã Python (không có cơ sở dữ liệu vector, không có framework, không có tác nhân) chạy trên bài báo Attention Is All You Need (Vaswani et al. 2017; giấy phép phân phối không độc quyền của arXiv, được công bố trên trang tóm tắt của arXiv), trả về một câu trả lời có nguồn gốc với các dòng nguồn chính xác được đánh dấu trên trang.
Sau đó, chúng ta sẽ xem xét lại từng khối và đặt câu hỏi mà nó tự nhiên gợi ra. Mỗi câu hỏi là nội dung mà một bài viết sau này sẽ phát triển.
Đường ống tối thiểu là lượng mã nhỏ nhất tuân thủ bốn khối và tạo ra một câu trả lời có thể kiểm chứng. Mỗi bài viết sau này bổ sung khả năng mà nhóm cần sau một lỗi cụ thể trên các tài liệu thực, không phải vì kiến trúc cần thêm các lớp.
1. Những gì chúng ta đang xây dựng
Đường ống có bốn khối (Phần II đi sâu vào từng khối một cách chi tiết) cộng với một bước kết xuất cuối cùng, tùy chọn. Mỗi khối cho biết nó nhận vào gì và trả về gì; những gì chúng ta chuyển từ khối này sang khối tiếp theo là những gì chúng ta lưu.
Phân tích tài liệu nhận một đường dẫn PDF và trả về line_df (một hàng cho mỗi dòng văn bản, với page_num, line_num, text và hộp giới hạn) cộng với page_df. Phiên bản tối thiểu giữ cả hai trong bộ nhớ; các hệ thống lớn hơn lưu trữ chúng (Bài viết 23 đề cập đến thời điểm chuyển sang cơ sở dữ liệu).
Phân tích câu hỏi biến câu hỏi của người dùng thành một ParsedQuestion mang câu hỏi đã được chuẩn hóa cộng với một danh sách ngắn các từ khóa đã kiểm tra. Nó giữ hẹp một cách có chủ đích: không có logic truy xuất ở đây, không có nhúng câu hỏi.
Truy xuất tiêu thụ ParsedQuestion và phát ra các số trang top-k (và, khi cần, các số dòng phù hợp trong các trang đó). Giữ việc chuyển giao chỉ cho các số trang giúp nó nhỏ gọn; bước tiếp theo xây dựng lại các dòng đã lọc từ line_df ngay tại chỗ. Nhúng câu hỏi nằm trong khối này vì nó phụ thuộc vào chỉ mục corpus.
Tạo ra kết hợp câu hỏi, line_df và các số trang đã truy xuất, và tạo ra một AnswerWithEvidence: một JSON được gõ mang câu trả lời, phạm vi bằng chứng (start_page, start_line, end_page, end_line), độ tin cậy, lý do, các trích dẫn chính xác từ nguồn và bất kỳ cảnh báo nào. JSON đầy đủ đáng để lưu để đánh giá, kiểm toán và phát lại.
Chú thích PDF là tùy chọn. Với PDF nguồn và phạm vi bằng chứng, nó ghi một PDF được chú thích với các hình chữ nhật được vẽ xung quanh các dòng được trích dẫn. Một công cụ CLI, một công việc hàng loạt hoặc một người tiêu dùng API có thể bỏ qua nó; câu trả lời với các trích dẫn đã hoàn chỉnh sau khi tạo.
Bốn khối đầu tiên là bốn khối (Bài viết 5 phát triển phân tích tài liệu, Bài viết 6 phân tích câu hỏi, Bài viết 7 truy xuất, Bài viết 8 tạo). Chú thích PDF là bước kết xuất, không phải là một khối riêng.
Đường ống RAG cơ bản, từ đầu đến cuối – Hình ảnh của tác giả
Một tệp PDF và một câu hỏi được đưa vào. Mỗi khối chuyển đổi đầu vào thành một cấu trúc có tổ chức hơn: phân tích tài liệu chuyển đổi PDF thành các hàng, phân tích câu hỏi chuyển đổi câu hỏi thành các từ khóa sẵn sàng tìm kiếm, truy xuất cắt giảm các hàng thành một vài số trang, tạo ra một câu trả lời được định dạng và chú thích PDF vẽ lại các dòng được trích dẫn lên nguồn. Kết quả không phải là một bong bóng chatbot. Đó là một câu trả lời JSON có nguồn gốc cùng với một tệp PDF được chú thích mà người dùng có thể mở và kiểm tra.
Các phụ thuộc là tối thiểu:
pymupdf phân tích các tệp PDF thành văn bản cùng với thông tin vị trí; các hộp giới hạn mà nó trả về được sử dụng để đánh dấu câu trả lời trên trang nguồn.
openai là máy khách LLM; thông qua base_url, cùng một thư viện phục vụ Azure, OpenRouter, Ollama hoặc bất kỳ điểm cuối tương thích nào.
pandas lưu trữ tài liệu dưới dạng DataFrame, định dạng mà mọi bước phân tích và truy xuất sử dụng.
pydantic định nghĩa lược đồ câu trả lời buộc JSON có cấu trúc với các trích dẫn.
Không có cơ sở dữ liệu vector, không có khung điều phối, không có thư viện RAG chuyên biệt. Các bài viết sau này sẽ xem xét khi nào các công cụ hỗ trợ của các thư viện đó trở nên hữu ích và khi nào chúng cản trở việc hiểu rõ vấn đề.
“Đối với một bài báo 15 trang, LLM có thể đọc toàn bộ. Tại sao phải bận tâm đến việc truy xuất?” Đây là một điểm hợp lý đối với tài liệu này. Chúng tôi sử dụng bài báo để dạy phương pháp, không phải để tiết kiệm token trên 15 trang này. Sự phản đối thường chỉ ra điểm chuẩn Needle in a Haystack (Kamradt, 2023), nơi các mô hình tiên tiến đạt điểm gần như hoàn hảo khi truy xuất một câu nguyên văn duy nhất từ ngữ cảnh 1 triệu token.
Điểm chuẩn đó là nghiên cứu, không phải thực tiễn. Một "kim" là một sự thật đơn lẻ, nguyên văn, trong khi các câu hỏi của doanh nghiệp tổng hợp (“mọi hợp đồng có mức khấu trừ vượt quá 5.000 euro”), so sánh (“điều khoản 12 trong ba chính sách này”) hoặc tóm tắt trên nhiều đoạn văn. Không có câu hỏi nào trong số đó là một câu đơn lẻ để tìm.
Hai lý do thực tế hơn giữ cho việc truy xuất được duy trì. Các tài liệu của doanh nghiệp thường dài:
một hợp đồng bảo hiểm 300 trang,
một hồ sơ quy định 500 trang,
một đặc tả kỹ thuật nhiều tập.
Gửi toàn bộ tài liệu cho LLM tốn tiền thật cho mỗi câu hỏi, mỗi lần chạy lại, mỗi người dùng và làm loãng sự chú ý của nó trên các trang không liên quan.
Và cùng một câu hỏi chạy trên hàng trăm hoặc hàng nghìn tài liệu cùng một lúc:
“tìm mọi hợp đồng loại trừ thiệt hại do động đất”,
“tóm tắt các thay đổi quy định của năm nay trên tất cả các hồ sơ”.
Ở quy mô đó, “đưa tất cả vào” không còn là một chiến lược. Truy xuất là yếu tố giúp quy trình tồn tại cả hai thay đổi: từ một bài báo ngắn sang một hợp đồng dài, và từ một tài liệu sang toàn bộ kho tài liệu.
2. Bốn khối và một điểm nổi bật của PDF
Mỗi bước khai báo đầu vào và đầu ra của nó, và các bước là độc lập. Đầu ra của bước N là đầu vào của bước N+1, được lưu dưới dạng DataFrame có tên để bất kỳ bước nào cũng có thể được chạy lại một mình so với đầu ra đã lưu của p.




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