№ 28
VMEC-19 — Trợ lý AI gợi ý tầm soát ung thư sớm (vú, đại trực tràng, gan, phổi, dạ dày), kết nối dữ liệu từ nhà thuốc tới bệnh viện và luôn có bác sĩ duyệt trước khi trả kết quả cho người dùng
№ 28
Demo Day Zine
Ung thư là nguyên nhân tử vong hàng đầu tại Việt Nam, và phần lớn ca bệnh được phát hiện ở giai đoạn muộn — khi các lựa chọn điều trị đã thu hẹp đáng kể. Nghịch lý là hầu hết các loại ung thư phổ biến đều có hướng dẫn tầm soát rõ ràng từ những tổ chức y tế uy tín (ACS, USPSTF, Bộ Y tế). Vấn đề không nằm ở việc thiếu kiến thức y khoa, mà ở khoảng cách giữa kiến thức đó và hành động của người dân.
Không biết dấu hiệu nào đáng lo. Triệu chứng ung thư giai đoạn sớm thường không đặc hiệu — mệt mỏi, sụt cân nhẹ, thay đổi tiêu hoá — rất dễ nhầm với vấn đề sức khoẻ thông thường. Người dân không có công cụ nào để tự đánh giá mức độ đáng lo của tình trạng mình đang gặp.
Biết cần tầm soát nhưng không biết bắt đầu từ đâu. Ngay cả khi đã ý thức được nhu cầu, bước tìm cơ sở phù hợp và đặt lịch khám khiến nhiều người dừng lại. Việc trì hoãn kéo dài vô thời hạn.
Ghé nhà thuốc thường xuyên nhưng không ai theo dõi tiếp. Nhà thuốc là điểm chạm y tế thường xuyên nhất của người Việt, nhưng thông tin về triệu chứng và thuốc đang dùng dừng lại tại quầy — không trở thành dữ liệu theo dõi sức khoẻ dài hạn nào.
Các trợ lý AI y tế phổ thông gặp ba rủi ro nghiêm trọng trong bối cảnh tầm soát ung thư:
VMEC-19 được thiết kế xoay quanh ba nguyên tắc trả lời trực tiếp ba rủi ro trên: mọi khuyến nghị phải có nguồn trích dẫn, bác sĩ duyệt trước khi kết quả tới người dùng, và AI không quyết định thay bất kỳ ai.
Next.js (Vercel) → FastAPI (Railway) → PostgreSQL 16 + pgvector (Neon)
↓
LangGraph (Flow A, 8 node)
↓
OpenAI API (chỉ diễn giải, không tính toán)
Vector store dùng chung instance PostgreSQL với dữ liệu nghiệp vụ (pgvector), không tách cơ sở dữ liệu vector riêng — giảm chi phí vận hành và loại bỏ một điểm đồng bộ dữ liệu có thể sai lệch.
Người dùng hoàn thành khảo sát ba bước, dữ liệu đi qua chuỗi tám node:
intake → red_flag_detector → risk_scoring_engine → rag_retriever
→ screening_recommender → output_guardrail → hitl_interrupt → emit_result
Điểm thiết kế quan trọng nhất là ranh giới giữa việc AI làm và việc AI không được làm:
| Bước | Cơ chế | Có dùng AI |
|---|---|---|
| Phát hiện dấu hiệu cảnh báo | Quét từ khoá cố định | Không |
| Chấm điểm nguy cơ | Công thức cộng điểm theo bảng ngưỡng | Không |
| Truy xuất guideline | Tìm kiếm lai vector + từ khoá | Không |
| Viết lời khuyến nghị | Mô hình ngôn ngữ, chỉ dựa trên đoạn đã truy xuất | Có |
| Kiểm tra đầu ra | Đối chiếu mẫu ngôn ngữ cấm + trích dẫn | Không |
Nhờ vậy, con số nguy cơ hoàn toàn tất định và giải thích được, còn AI chỉ đảm nhận phần diễn giải sang ngôn ngữ tự nhiên — nơi sai sót không dẫn tới sai lệch định lượng.
Điểm nguy cơ cho từng loại ung thư được tính bằng công thức thuần:
Người dùng nhìn thấy được chính xác vì sao mình nhận điểm đó, thay vì một con số từ hộp đen. Cùng một hàm chấm điểm được tái sử dụng cho tính năng mô phỏng và cho việc chấm lại khi có dữ liệu mới — không tồn tại bản sao công thức nào chạy song song rồi lệch nhau theo thời gian.
Điểm này là thang ưu tiên tầm soát 0–100, không phải xác suất mắc bệnh — một phân biệt được thực thi ở cả tầng dữ liệu lẫn tầng hiển thị.
Cơ sở tri thức gồm 27 tài liệu guideline thật đã crawl từ ACS, USPSTF và Bộ Y tế, phân bố theo năm loại ung thư trong phạm vi.
ts_rank), lọc theo loại ung thư trước khi xếp hạng, lấy 3–5 đoạn liên quan nhất.{Nguồn}_{LoạiUngThư}_Screening_v{năm}#p{trang}, ví dụ USPSTF_Breast_Screening_v2024#p10 — truy ngược được tới đúng trang tài liệu gốc.Hai lớp chặn nội dung không có căn cứ:
Lớp thứ hai được bổ sung sau khi kiểm thử thực tế phát hiện lớp thứ nhất có thể bị lọt: khi hỏi về ung thư cổ tử cung (ngoài phạm vi), mô hình tạo ra hướng dẫn tầm soát đầy đủ không có nguồn nào, dùng cách diễn đạt không khớp với mẫu đang dò.
Quyền phủ quyết tuyệt đối của phát hiện dấu hiệu cảnh báo. Việc quét dấu hiệu nguy hiểm chạy trên câu chữ thô người dùng nhập, trước mọi bước khác, và không có cấu hình nào tắt được. Khi phát hiện, hệ thống tạo hồ sơ khẩn cấp đưa lên đầu hàng đợi bác sĩ và thông báo người giám hộ ngay lập tức — kể cả với tài khoản người phụ thuộc vốn phải qua bước người giám hộ duyệt.
Bắt buộc bác sĩ xác nhận. Mọi mức độ khuyến nghị trừ "chưa cần tầm soát" đều dừng lại chờ bác sĩ duyệt. Trong thời gian chờ, người dùng thấy dữ liệu tự khai và điểm nguy cơ của chính mình, nhưng phần diễn giải của AI bị che. Trạng thái luồng lưu bằng Postgres checkpointer nên có thể dừng và chạy tiếp qua nhiều phiên, kể cả sau khi máy chủ khởi động lại.
Chốt chặn ngôn ngữ. Mọi đầu ra hướng tới người dùng đều đi qua bộ kiểm tra cụm từ cấm — không có ngôn ngữ chẩn đoán, không kê đơn, không khẳng định chắc chắn. Disclaimer xuất hiện bắt buộc trên mọi màn hình kết quả.
Bảo vệ dữ liệu cá nhân. Toàn bộ thông tin định danh được ẩn danh trước khi ghi log; tham chiếu người dùng trong bảng log là mã giả danh. Phạm vi truy cập được giới hạn theo cơ sở y tế: bác sĩ chỉ đọc được hồ sơ bệnh nhân thuộc cơ sở mình.
Dược sĩ ghi nhận đơn thuốc và triệu chứng ngay tại quầy. Dữ liệu này trở thành nền theo dõi sức khoẻ hàng ngày, đi qua đúng bộ kiểm tra an toàn như dữ liệu khảo sát — không có ngoại lệ cho nguồn dữ liệu mới. Khi hệ thống nhận thấy dấu hiệu cần tầm soát, AI đề xuất và giữ tạm một khung giờ khám, nhưng lịch chỉ được chốt khi chính người dùng bấm xác nhận. Việc bác sĩ duyệt mức độ nguy cơ không đồng nghĩa với chốt lịch thay người dùng.
| Vai trò | Thấy được | Không thấy |
|---|---|---|
| Bệnh nhân | Hồ sơ của chính mình, lịch hẹn, nhắc nhở | Dữ liệu người khác |
| Bác sĩ | Hồ sơ bệnh nhân trong phạm vi cơ sở mình | Bệnh nhân cơ sở khác |
| Dược sĩ | Đơn thuốc tại quầy của mình | Đánh giá nguy cơ, chẩn đoán |
| Lễ tân | Tên, số điện thoại, giờ hẹn, loại tầm soát | Điểm nguy cơ, mức độ, triệu chứng |
| Quản trị | Thống kê tổng hợp toàn hệ thống | — |
Vai trò lễ tân minh hoạ nguyên tắc thiết kế phạm vi dữ liệu: họ cần biết khám gì để xếp phòng và chọn bác sĩ thay thế đúng chuyên khoa, nhưng không cần biết ca đó đáng lo tới mức nào — đó là thông tin lâm sàng thuộc về bác sĩ.
Đây không phải bản mô phỏng hay nguyên mẫu giao diện. Hệ thống đang vận hành trên hạ tầng thật:
Toàn bộ luồng nghiệp vụ — từ khảo sát, chấm điểm, truy xuất guideline, bác sĩ duyệt, tới đặt lịch và nhắc tái khám — đều thao tác được trực tiếp trên bản triển khai.
| Chỉ số | Giá trị |
|---|---|
| Bài kiểm thử tự động | 633 |
| Kịch bản kiểm thử thủ công trên môi trường thật | 45 |
| Lỗi nghiêm trọng đã phát hiện và vá | 9 |
| Tài liệu guideline thật trong cơ sở tri thức | 27 |
Cách tiếp cận kiểm thử tập trung vào khoá bất biến, không chỉ khoá hành vi. Ví dụ: có một bài kiểm thử liệt kê mọi đường tạo hồ sơ trong hệ thống và bắt buộc từng đường phải chạy bước quét dấu hiệu cảnh báo — thêm một cửa vào mới mà quên nối lớp an toàn sẽ làm bài kiểm thử đó thất bại ngay.
Một số lỗi nghiêm trọng nhất chỉ lộ ra khi chạy trên môi trường thật, không lộ ra trong kiểm thử đơn vị. Ba ví dụ tiêu biểu đã được vá:
Kiến trúc được chọn để chạy được trong giới hạn của các gói miễn phí hoặc chi phí thấp:
Mọi hướng phát triển ở trên đều phải giữ nguyên ba ràng buộc gốc: không có khuyến nghị nào không kèm nguồn trích dẫn, không có kết quả nào tới người dùng mà chưa qua bác sĩ duyệt, và AI không quyết định thay người dùng hay thay bác sĩ. Mỗi tính năng mới là một cửa vào mới có thể vô tình bỏ qua các lớp an toàn — bài học đã trả giá bằng lỗi thật trong quá trình phát triển, và là lý do các tính năng mới đều được dựng trên chính đường xử lý sẵn có thay vì mở luồng riêng.