Quy trình xử lý tri thức
Cách một tài liệu trở thành thứ agent tìm thấy và trích dẫn được — thêm vào, đọc, lập chỉ mục và tìm kiếm, kèm chi phí từng bước.
Một tài liệu trong kho tri thứcKho tri thứcKnowledge baseTập tài liệu mà agent tìm và trích dẫn được. Tệp được tải lên hoặc đồng bộ từ SharePoint, và mỗi kho có quy tắc chia sẻ riêng.Mở trong Thuật ngữ gồm hai phần: các byte của tệp trong kho đối tượng S3, và các dòng trong kho truy xuất — pgvector nằm ngay trong Postgres của portal. Kho này dùng chung với bộ nhớ: một đoạn tài liệu và một câu đã ghi nhớ là các dòng của cùng một bảng, được đọc qua kho tri thức mà cả hai thuộc về (tên nội bộ là “collection”). Việc trích xuất, chia đoạn và nhúng (embedding) chạy ngay trong tiến trình API.
Quy tắc chính
- Tài liệu được đọc một lần, khi được thêm vào hoặc thay đổi — không phải mỗi lần hỏi.
- Quy tắc chia sẻ áp vào mọi lượt tìm kiếm, kể cả của agent. Xem phạm vi hiển thị tài nguyên — áp cho kho tri thức và mọi thứ nằm trong đó.
- Việc đọc tính vào phòng ban của người tải lên; việc tìm kiếm tính vào phòng ban của người tìm.
- Tìm theo từ khoá luôn bật và miễn phí.
- Văn bản của tài liệu đã tìm được ngay khi còn ở trạng thái Pending.
Tải tệp lên, hoặc thêm một thư mục SharePoint đồng bộ theo lịch. Mỗi tệp được lưu một lần theo nội dung, nên cùng một tệp đính kèm lại sẽ khớp với bản đã có.
Yêu cầu tải lên
Lệnh tải lên trả về 202: dòng tài liệu đã tồn tại nhưng chưa tìm kiếm được gì. Yêu cầu sẽ:
-
Kiểm tra kho tri thức
Xác nhận kho tri thức tồn tại trong tổ chức của bạn và có nguồn thủ công.
-
Lưu byte
Tệp được đưa vào kho đối tượng.
-
Tạo hoặc thay thế tài liệu
Tạo tài liệu mới, hoặc thay thế tài liệu trước đó có cùng uri. Biểu mẫu có thể kèm mức đọcMức đọcReading levelMức độ portal đọc một PDF hoặc ảnh: Text (lớp văn bản và OCR, không dùng mô hình), Text + figures (mô tả hình ảnh), hoặc Full rewrite (mô hình viết lại từng trang). Càng sâu càng tốn.Mở trong Thuật ngữ và công tắc tìm kiếm ngữ nghĩa cho riêng tệp này; trường nào bỏ trống sẽ theo nguồn thủ công.
-
Xếp một tác vụ vào hàng đợi
Mỗi tài liệu một tác vụ nạp (ingest).
Đăng ký tài liệu theo tham chiếu là một route riêng, không ghi byte nào. Tệp mà portal không đọc được sẽ bị từ chối ngay khi tải lên, lúc hộp thoại vẫn đang mở — xem định dạng tệp.
Tệp đính kèm trong chat
Một tệp đính kèm là tài liệu hoặc hình ảnh, được quyết định một lần.
| Loại | Cách xử lý |
|---|---|
| Tài liệu | Được lập chỉ mục khi tải lên, và được mô tả trong tin nhắn bằng một manifest mà mô hình dùng để đọc. SVG bị từ chối vì là tài liệu có thể thực thi. |
| Hình ảnh | Được đưa nguyên cho mô hình; không trích chữ từ ảnh chụp và không gửi bảng tính dưới dạng ảnh. Định dạng và giới hạn kích thước là của nhà cung cấp, áp dụng khi tải lên. Hình ảnh được lưu mà không tạo tài liệu. |
Tài liệu đi đâu. Tài liệu được tải lên ngay khi đính kèm, trước khi gửi tin nhắn. Mỗi người có một kho tri thức đính kèm, tạo ra ở lần đính kèm đầu tiên, thuộc về họ, không có quy tắc nào và ẩn khỏi mọi danh sách. Kho này có một nguồn thủ công đọc ở mức Text, tìm kiếm ngữ nghĩa bật khi tổ chức đã gán mô hình embedding và tắt khi chưa có. Quá trình nạp giống mọi lần tải lên — lớp văn bản trước, OCR cho các trang cần, không gọi mô hình — và tính vào phòng ban của người tải lên.
Cùng byte, cùng tài liệu. uri của tài liệu là SHA-256 của tệp, không phải tên tệp. Hai tệp trùng tên vẫn tách biệt; cùng nội dung đính kèm lại, ở bất kỳ cuộc hội thoại nào, khớp với tài liệu đang có và không xếp hàng gì thêm. Tài liệu bị lỗi hoặc bị dừng sẽ được thay thế và xếp hàng lại.
Một lượt được đọc gì. Chỉ các tài liệu đính kèm trong chính cuộc hội thoại đó, được ghi trên từng tệp đính kèm của tin nhắn. Phần còn lại trong kho đính kèm của người đó nằm ngoài tầm với của cuộc hội thoại.
Manifest. Tin nhắn mang một mục cho mỗi tài liệu, trong cùng khung trích dẫn như tệp đính kèm: tên và loại tệp, id đính kèm, tiến độ đọc, các trang không đọc được, và 20 tiêu đề mục đầu tiên.
- Tài liệu đã xong và dài tối đa 6.000 ký tự được đặt nguyên vào tin nhắn, vì một lần gọi tool tốn hơn chừng ấy văn bản.
- Dài hơn thì đọc bằng
read_document(đọc được mọi tệp đính kèm của cuộc hội thoại này bất kể agent gắn gì, và đọc được theo khoảng trang) và tìm bằngsearch_attachments(chỉ tìm trong tệp đính kèm của cuộc hội thoại này). - Đọc một tài liệu đang lập chỉ mục sẽ chờ tối đa một phút, rồi trả về phần đã có và các trang còn thiếu.
Hình ảnh. Ảnh lớn hơn mức nhà cung cấp xem được sẽ được thu nhỏ trước khi gửi, và tin nhắn ghi rõ kích thước sau khi thu — nhà cung cấp giới hạn cạnh dài nhất và số token hình ảnh, rồi âm thầm thu nhỏ phần vượt. Ảnh điện thoại 12 megapixel gửi nguyên sẽ tốn byte ở mọi lượt sau mà không nét hơn. Việc thu nhỏ chạy ngay nơi đang giữ byte; ảnh đã nằm trong cả hai giới hạn được chuyển nguyên từng byte. Tin nhắn có ảnh cần mô hình nhìn được: lượt bị từ chối trước khi ghi lại bất cứ gì, kèm tên mô hình. Ô soạn tin cảnh báo trước khi gửi, nhưng lời từ chối mới là quyết định cuối, vì thiết lập ghi đè theo lượt không đi qua ô soạn tin.
Các lượt sau. Mọi tài liệu trước đó được phát lại dưới dạng manifest, dựng từ chỉ mục với trạng thái hiện tại, nên không tải hay đọc lại tệp nào. Văn bản đặt nguyên được phát lại trong một ngân sách chung, mới nhất trước; tài liệu vượt ngân sách được phát lại không kèm văn bản, để đọc lại bằng tool. Vài tin nhắn có ảnh gần nhất gửi lại ảnh (số lượng là cấu hình, vì mọi lượt cũ đều bị tính tiền ở mỗi yêu cầu). Tin nhắn cũ hơn nói bằng lời rằng ảnh không còn và nêu tên ảnh; ảnh mà chính sách lưu giữ hoặc bộ lưu trữ không trả lại được thì bị bỏ qua. Việc nhả ảnh trong một lần chạy xem ở vòng lặp agent.
Thiết lập lập chỉ mục
Mỗi tệp được lập chỉ mục với hai thiết lập: mức đọc và công tắc tìm kiếm ngữ nghĩa. Nguồn giữ giá trị mặc định cho các tệp của nó — Text với tìm kiếm ngữ nghĩa bật, trừ khi người tạo chọn khác. Một tệp có thể giữ giá trị riêng cho từng nửa; nửa nào để trống thì theo nguồn. Cả hai được xác định một lần, khi tác vụ được xếp hàng, và đi kèm tác vụ.
Word, Excel và các định dạng đánh máy khác luôn được đọc ở mức Text. Quay về mức nông hơn giữ lại những gì đã đọc và không tốn thêm.
| Mức đọc | Lấy gì từ tệp | Số lần gọi mô hình |
|---|---|---|
Text (TEXT) | Lớp văn bản, cộng OCR cho mọi trang lớp văn bản không phục vụ được | Không |
Text + figures (FIGURES) | Như trên, cộng mô tả hình ảnh trên mọi trang có vẽ hình | Một lần cho mỗi trang có hình |
Full rewrite (REWRITE) | Mô hình nền viết lại mọi trang thành Markdown, đối chiếu với lớp văn bản hoặc OCR, mô tả hình ngay tại chỗ | Một lần mỗi trang |
- Keyword only không tốn gì và chỉ mục từ khoá luôn bật. Tìm kiếm Semantic là bước embedding, một lần gọi cho mỗi lô đoạn. Tệp tắt ngữ nghĩa chỉ được chia đoạn và lập chỉ mục từ khoá — cũng là cách tệp được lập chỉ mục khi tổ chức chưa gán mô hình embedding.
- Text + figures và Full rewrite chỉ áp cho PDF hoặc ảnh. Định dạng soạn thảo không có trang, nên luôn đọc ở mức Text dù yêu cầu gì.
- Một trang “có vẽ hình” khi nó vẽ ảnh raster có cạnh ngắn ít nhất 150 pixel. Trang scan là một ảnh, nên với Text + figures mỗi trang scan tốn một lần gọi; mô hình không trả gì cho trang không có hình. Biểu đồ vẽ bằng vector không phải ảnh nên không được mô tả.
- Full rewrite dùng để đọc tệp bên cạnh bản chép, nơi tiêu đề và bảng Markdown giúp dễ phát hiện chữ đọc sai. Truy xuất đọc cùng những chữ đó như ở mức Text.
Đổi thiết lập chỉ xếp hàng tệp khi thay đổi làm việc đọc sâu hơn: mức đọc sâu hơn, hoặc bật tìm kiếm ngữ nghĩa. Chuyển sang nông hơn không xếp hàng gì và giữ các đoạn đã ghi. Đổi mặc định của nguồn sẽ xếp hàng mọi tệp đang theo nguồn và được làm sâu hơn; tệp giữ giá trị riêng cho nửa vừa đổi thì không bị động tới. Tệp đã mất byte lưu trữ được đếm và bỏ qua, lần đồng bộ sau sẽ tải lại.
Một lần nạp làm gì
| Bước | Thêm gì | Chi phí |
|---|---|---|
| Lớp văn bản | Chia đoạn, embedding khi bật ngữ nghĩa, và lập chỉ mục — toàn bộ việc với tài liệu soạn thảo | Khoảng một lần gọi embedding |
| Trang lớp văn bản không phục vụ được | OCR đọc; mỗi bản chép được đặt đúng chỗ mục của trang đó | Không |
| Hình ảnh, ở Text + figures | Mô hình nền mô tả và đặt vào trang của nó | Một lần gọi cho mỗi trang có hình |
| Mọi trang, ở Full rewrite | Mô hình nền viết lại; bản chép thay thế các đoạn của lớp văn bản | Một lần gọi mỗi trang |
Tài liệu ở PENDING khi còn bất kỳ bước nào đang chạy và READY khi tất cả xong, kể cả các trang được tính là không đọc được. Các đoạn văn bản đã tìm được ngay khi còn PENDING — trạng thái mô tả lần chạy, không phải chỉ mục.
Mỗi đoạn được embedding kèm tiêu đề tài liệu phía trước, không tốn gì và cho một đoạn đơn lẻ ngữ cảnh mà nó còn thiếu. Nội dung đoạn đã mang đường dẫn mục làm tiêu đề. Cách cắt văn bản thành đoạn xem ở chia đoạn và mục.
Trang và bước gộp
Một trang lỗi chỉ mất một trang.
- Trang OCR không đọc được gì bị tính là không đọc được.
- Ở Full rewrite, trang mà mô hình trả rỗng — hoặc không trả lời kịp thời gian cho phép — được đọc lại trên ảnh đã render, đến trần số lần thử. Sau đó giữ kết quả từ OCR hoặc lớp văn bản, hoặc tính là không đọc được nếu không có gì.
- Hình mà mô hình không trả lời kịp sẽ được hỏi lại, đến cùng trần đó.
Bước gộp chạy một lần, khi mọi trang tác vụ yêu cầu đã xong, và chỉ áp cho các trang lần chạy này đọc. Ở Text và Text + figures, nó thay phần OCR và mô hình đã đọc, giữ nguyên các đoạn của lớp văn bản, và giữ các mô tả hình mà lần chạy figures trước đã trả tiền. Ở Full rewrite mọi trang có bản chép riêng, nên bước gộp thay cả các đoạn của lớp văn bản; trước đó, lớp văn bản vẫn tìm được.
Bản chép và mô tả là các dòng được lưu, nên tác vụ chạy lại — thử lại, xử lý lại hay thiết lập sâu hơn — chỉ trả cho phần còn thiếu. Trang do OCR viết sẽ được đọc lại ở Full rewrite; trang do mô hình viết không bao giờ bị trả tiền hai lần, và vẫn ở trong chỉ mục khi tệp được xử lý lại ở Text.
Hàng đợi tác vụ
Mỗi tác vụ xử lý một tài liệu, trên hàng đợi dùng chung mô tả ở tác vụ nền. Mỗi instance backend đăng ký một handler với số làn lấy từ cấu hình; không làn nghĩa là không có handler (replica chỉ phục vụ request hoặc tiến trình CLI). Mỗi lần gọi mô hình có hạn chót do client gateway đặt từ cấu hình, và không bên gọi nào được bỏ qua.
Trong một tác vụ, các trang được render bằng số lần gọi subprocess đúng bằng số dải trang liên tiếp, rồi được đọc dưới một giới hạn thứ hai về số trang mỗi instance xử lý cùng lúc. Nhờ đó tài liệu trăm trang chảy qua các làn thay vì chiếm hết.
| Sự kiện | Kết quả |
|---|---|
| Mô hình trả về trang không đọc được | Thử lại trên ảnh đã có, rồi giữ kết quả OCR hoặc lớp văn bản, hoặc tính là không đọc được |
| Mô hình không trả lời kịp | Coi như trả rỗng: OCR hoặc lớp văn bản thế chỗ, hoặc trang tính là không đọc được |
| Lần gọi mô hình quá hạn chót | Một lần thử thất bại, báo bằng một câu |
| Lần thử lỗi, còn lượt thử | Về lại hàng đợi với thời gian chờ tăng gấp đôi |
| Hết lượt thử | Tác vụ vào hàng đợi thư chết (dead letter), tài liệu bị đánh lỗi, lý do được ghi ở nơi người dùng đọc được |
| Worker chết giữa chừng | Lần thử hết hạn và hàng đợi giao lại tác vụ; bản chép đã lưu nên không trang nào bị trả tiền hai lần |
Lần chạy bị treo. Cả lần chạy có thể chết — worker dừng, bản deploy thay thế nó, hoặc gateway từ chối đến khi hết lượt thử — để tài liệu nằm ở pending mà không ai xử lý. Cứ năm phút một lần quét tìm các dòng pending im lặng lâu hơn khoảng thời gian cấu hình (lần chạy ghi vào dòng mỗi khi một trang xong) và đưa lại vào hàng đợi, tính vào phòng ban đã ghi trên tài liệu lúc xếp hàng. Mỗi lần khởi động lại được đếm; vượt trần cấu hình thì tài liệu bị đánh lỗi kèm câu nhắc xử lý lại. Tài liệu không có phòng ban ghi nhận (không ai để tính tiền) hoặc đã mất bản lưu (không có gì để đọc) bị đánh lỗi theo cùng cách thay vì khởi động lại. Yêu cầu xử lý lại sẽ đặt lại bộ đếm.
Thu hồi và lỗi
Lần nạp lại thu hồi (retire) các đoạn của phiên bản trước rồi mới chèn đoạn mới, nên nếu lỗi xảy ra ở giữa thì không còn gì trả lời, thay vì một quy trình đã bị rút lại. Thu hồi là dấu mà bước truy xuất vốn đã lọc; số đoạn và ngày cập nhật khi giao dịch hoàn tất.
Chỉ lớp văn bản mới làm tài liệu lỗi; trang hết lượt thử chỉ bị tính là không đọc được. Tài liệu chỉ bị đánh lỗi khi tác vụ hết lượt thử, nên không nhấp nháy giữa pending và lỗi trong lúc thử lại. Lý do là một câu hoàn chỉnh, hiển thị nguyên văn.
| Lỗi | Lý do hiển thị |
|---|---|
| Định dạng không hỗ trợ | Nêu các định dạng dùng được |
| Bản scan không có lớp văn bản | Nói rõ như vậy |
Các điểm dừng khiến việc đọc bằng mô hình kết thúc sớm được liệt kê ở định dạng tệp.
Xử lý lại và dừng
| Nút | Tác dụng |
|---|---|
| Re-process (xử lý lại) | Chạy lại quy trình trên byte portal đang giữ, theo thiết lập hiện tại của tệp. Dòng trở về pending trước khi tác vụ được xếp hàng; dòng pending mà xếp hàng thất bại thì bấm lại là xong. |
| Indexing (lập chỉ mục) | Đặt mức đọc và tìm kiếm ngữ nghĩa riêng cho tệp, hoặc trả lại cho nguồn; xếp hàng tệp khi thay đổi làm sâu hơn. |
| Stop (dừng) | Chốt cả hai dòng cùng lúc — tác vụ bị huỷ, tài liệu ghi rõ — và để lần thử tự bỏ cuộc. Lần chạy kiểm tra lệnh huỷ trước khi đọc trang, trước khi embedding và trước khi ghi vào kho tri thức; mọi thứ tạo ra sau đó bị loại bỏ. |
Tài liệu bị dừng có trạng thái riêng, lý do ghi trước đó bị xoá, và những gì lần chạy hoàn tất gần nhất đã lập chỉ mục vẫn trả lời được. Các nút này trả về 202, nên nút đã bấm vẫn ở trạng thái đang xử lý cho đến khi danh sách tài liệu được đọc lại, và lần chạy đang diễn ra hiện nút Stop bên cạnh. Với nguồn SharePoint, Pause (tạm dừng) dừng một lượt đồng bộ — xem đồng bộ SharePoint.
Ai chi trả
Mọi lần gọi mô hình khi nạp — viết lại trang, mô tả hình, embedding đoạn — chạy trên khoá ảoKhoá ảoVirtual keyKhoá cổng cấp cho từng phòng ban, để mỗi lệnh gọi mô hình được giới hạn và tính phí đúng phòng ban. Người dùng không bao giờ phải dùng tới khoá này.Mở trong Thuật ngữ của phòng ban người tải lên, nên ngân sách và danh sách mô hình bị chặn của phòng ban đó giới hạn việc tải lên. Phòng ban là phòng ban của người tải lên tại thời điểm tải, được ghi trên tác vụ. Mỗi lần gọi để lại dòng kiểm tra giống một lượt chat, không nêu agent, mà ghi Document ingest ở chỗ tên agent.
Truy xuất tính tiền cùng cách: embedding câu truy vấn chạy trên khoá của phòng ban người tìm, nên ngân sách phòng ban giới hạn việc tìm. Khoá quản trị của bản triển khai dùng để cấu hình gateway và cấp khoá, không gọi mô hình nào.
| Lần gọi | Được báo cáo |
|---|---|
| Embedding | Token đầu vào và route |
| Viết lại trang, mô tả hình | Đầy đủ các loại token, kể cả phần cache phục vụ |
Chi phí được tính theo đơn giá gateway báo cho route đó và ghi hai nơi: trên tài liệu, theo ba loại lần gọi, và vào sổ chi phí nạp, mỗi dòng nêu phòng ban chi trả. Số liệu gateway không báo, hoặc route chưa ai định giá, để chi phí là không rõ — không bao giờ ghi số 0. Xem kiểm tra và chi phí.
Các dòng trong kho
Một đoạn giữ ba văn bản được tạo cùng lúc, nên không sửa chữ tại chỗ được: có thể thu hồi đoạn, còn nạp lại thì đổi nội dung.
| Văn bản | Nội dung |
|---|---|
| Được embedding | Tiêu đề tài liệu, rồi đến đoạn kèm tiêu đề mục |
| Được hiển thị | Riêng đoạn đó |
| Chỉ mục từ khoá và mã nguyên văn | Tiêu đề tài liệu và phần thân không kèm tiêu đề mục — tiêu đề lặp lại sẽ khiến mọi đoạn trong một mục xếp hạng như nhau |
Vì sao làm như vậy
Vì sao đọc tài liệu trước thay vì lúc hỏi?
Việc đọc — nhất là bản scan và đọc bằng mô hình — chậm và tốn tiền. Làm một lần giúp mọi câu hỏi sau nhanh và rẻ, và cho phép bạn kiểm tra kết quả đọc trước khi ai đó dựa vào.
Vì sao tài liệu tìm được khi vẫn ghi Pending?
Pending mô tả lần đọc, không phải chỉ mục. Đoạn văn bản tìm được ngay khi lưu, trong khi các bước sâu hơn vẫn chạy; khi xong, tài liệu chuyển sang Ready và bước gộp thay các đoạn đầu khi cần.
Vì sao thu hồi đoạn cũ trước khi chèn đoạn mới?
Nếu lần nạp lại lỗi giữa chừng, thà không có gì trả lời còn hơn một quy trình đã bị rút lại tiếp tục được trích dẫn.
Bên dưới
Chi tiết lưu trữ
Mọi lệnh chèn đoạn là SQL thuần, vì cột embedding là kiểu vector mà ORM không mô hình hoá; repository không có phương thức create. Chi phí nạp ghi vào usage.ingest_costs. Thời gian xử lý và mức đọc của mỗi lần nạp ghi vào retrieval.ingest_timings (mỗi tài liệu một dòng, cho lần chạy gần nhất) và dùng cho ước tính lần đồng bộ SharePoint đầu tiên.