Pill-ID: Hệ Thống Visual RAG Xác Thực Thuốc Bằng CLIP và Milvus
Pill-ID là hệ thống sử dụng Trí tuệ nhân tạo đa phương thức để nhận diện viên thuốc qua hình ảnh và đối chiếu với đơn thuốc điện tử, giúp giảm thiểu sai sót trong quá trình dùng thuốc. Giải pháp kết hợp công nghệ Visual RAG, mô hình CLIP và cơ sở dữ liệu vector Milvus đóng vai trò then chốt.

Pill-ID: Hệ Thống Visual RAG Xác Thực Thuốc Bằng CLIP và Milvus
Lỗi sử dụng thuốc do nhầm lẫn viên thuốc vốn là vấn đề thầm lặng nhưng nguy hiểm. Với sự phát triển của các mô hình AI đa phương thức và Visual Retrieval-Augmented Generation (Visual RAG), giờ đây chúng ta có thể tạo ra hệ thống máy “nhìn” và xác thực thuốc theo thời gian thực nhằm ngăn ngừa sai sót.
Pill-ID là một hệ thống cross-check sử dụng Computer Vision kết hợp với cơ sở dữ liệu vector để nhận dạng viên thuốc chỉ qua một bức ảnh, đối chiếu với đơn thuốc điện tử. Giải pháp ứng dụng mô hình CLIP của OpenAI để tạo embeddings đa phương thức, Milvus để tìm kiếm vector nhanh và FastAPI để triển khai API hiệu quả.
Kiến trúc hệ thống: Cách Visual RAG hoạt động
Không giống như RAG truyền thống chỉ tập trung vào text, Visual RAG đi sâu khai thác đặc trưng hình ảnh để truy vấn cơ sở dữ liệu. Ví dụ, thay vì tìm kiếm từ khóa “Ibuprofen”, hệ thống sẽ tìm một vector biểu diễn hình dạng, màu sắc và kết cấu đặc trưng của viên thuốc Ibuprofen.
Quy trình hoạt động:
- Người dùng chụp ảnh viên thuốc
- Ảnh được xử lý: cắt bỏ nền, lấy phần thuốc (OpenCV)
- Mô hình CLIP tạo embeddings hình ảnh
- Milvus thực hiện tìm kiếm tương đồng vector nhanh chóng
- Lấy thông tin pill name, dosage từ cơ sở dữ liệu
- FastAPI trả về kết quả so khớp với tên thuốc trong đơn
- Nếu trùng khớp: Xác thực thành công; nếu không: Cảnh báo sai liều, sai thuốc
Chuẩn bị môi trường kỹ thuật
Để xây dựng hệ thống, bạn cần:
- Python 3.9+
- OpenCV (xử lý ảnh)
- CLIP từ thư viện Sentence-Transformers (mã hóa ảnh)
- Milvus (cơ sở dữ liệu vector hiệu suất cao)
- FastAPI (xây dựng API)
Bước 1: Khởi tạo cơ sở dữ liệu vector với Milvus
Milvus được chọn làm “bộ não” lưu trữ dấu vân tay hình ảnh của thuốc dưới dạng vector 512 chiều. Điểm mạnh của Milvus là khả năng quản lý hàng triệu vector với độ trễ dưới 1ms.
Mô tả schema cơ sở dữ liệu bao gồm:
- ID chính (pk)
- Vector đặc trưng viên thuốc (pill_vector)
- Tên thuốc (pill_name)
- Liều lượng (dosage_mg)
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
connections.connect("default", host="localhost", port="19530")
fields = [
FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="pill_vector", dtype=DataType.FLOAT_VECTOR, dim=512),
FieldSchema(name="pill_name", dtype=DataType.VARCHAR, max_length=200),
FieldSchema(name="dosage_mg", dtype=DataType.INT64)
]
schema = CollectionSchema(fields, "Pill identification collection")
pill_collection = Collection("pill_registry", schema)
Bước 2: Trích xuất đặc trưng hình ảnh bằng CLIP
CLIP (Contrastive Language-Image Pre-training) chuyển đổi hình ảnh viên thuốc thành vector số 512 chiều biểu diễn đặc trưng đa phương thức, giúp máy hiểu được hình ảnh và văn bản liên quan.
import torch
from PIL import Image
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('clip-ViT-B-32')
def get_image_embedding(image):
embedding = model.encode(image)
return embedding.tolist()
Bước 3: Xử lý ảnh bằng OpenCV
Ảnh chụp thường có nhiều yếu tố nhiễu không liên quan. OpenCV giúp cắt lọc vùng thuốc bằng cách nhận diện contour lớn nhất và lọc nền, tạo đầu vào sạch cho mô hình CLIP.
import cv2
import numpy as np
def preprocess_pill_image(image_bytes):
nparr = np.frombuffer(image_bytes, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if contours:
c = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(c)
cropped_pill = img[y:y+h, x:x+w]
return cropped_pill
return img
Bước 4: Triển khai API xác thực với FastAPI
API nhận ảnh thuốc và tên thuốc trong đơn, xử lý, tìm kiếm trong Milvus rồi trả về kết quả đối chiếu thuốc.
from fastapi import FastAPI, UploadFile, File
app = FastAPI()
@app.post("/verify-medication/")
async def verify_medication(prescribed_name: str, file: UploadFile = File(...)):
image_bytes = await file.read()
processed_img = preprocess_pill_image(image_bytes)
vector = get_image_embedding(processed_img)
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = pill_collection.search(
data=[vector],
anns_field="pill_vector",
param=search_params,
limit=1,
output_fields=["pill_name"]
)
detected_name = results[0][0].entity.get("pill_name")
if detected_name.lower() == prescribed_name.lower():
return {"status": "MATCH", "message": f"Verified: {detected_name} identified."}
else:
return {
"status": "WARNING",
"message": f"Possible Mismatch! Found {detected_name} but prescription says {prescribed_name}."
}
Mở rộng và triển khai thực tế
Việc xây dựng hệ thống demo tương đối đơn giản, tuy nhiên để đưa vào ứng dụng thực tế trong ngành y tế đòi hỏi:
- Xác thực nghiêm ngặt, đánh giá độ tin cậy
- Xây dựng pipeline dữ liệu an toàn, bảo mật y tế
- Hỗ trợ loại thuốc đa dạng, cả dạng vỉ, viên nang…
- Tích hợp nguồn dữ liệu đơn thuốc chuẩn FHIR
Các bạn có thể tìm hiểu thêm kỹ thuật triển khai mô hình đa phương thức và kiến trúc vector search quy mô lớn trên blog của WellAlly Tech – nơi chia sẻ sâu sắc về AI doanh nghiệp và cloud-native.
Kết luận
Giải pháp Pill-ID là minh chứng cho khả năng ứng dụng Visual RAG và AI đa phương thức trong việc giải quyết các vấn đề an toàn sử dụng thuốc, chuyển bài toán nhận dạng hình ảnh khó thành bài toán tìm kiếm vector đơn giản và hiệu quả. Đây là hướng đi triển vọng, hỗ trợ tránh sai sót thuốc, nâng cao chất lượng chăm sóc sức khỏe cộng đồng.
Triển vọng tương lai
- Mở rộng nhận dạng dạng vỉ thuốc, packaging
- Tích hợp API FHIR để tương tác dữ liệu y tế điện tử
- Triển khai mô hình ONNX để tối ưu tốc độ inference edge
Nếu bạn quan tâm chi tiết cách hoạt động của cơ sở dữ liệu vector hoặc mô hình CLIP, đừng ngần ngại để lại bình luận thảo luận nhé!



