[Hackathon] Giới thiệu ứng dụng Easy Medicine – Team Healthy Healthier

[Hackathon] Giới thiệu ứng dụng Easy Medicine – Team Healthy Healthier

Ngày nay, có rất nhiều ứng dụng được tạo ra để giúp mọi công việc trở nên đơn giản và hiệu quả hơn. Một trong những tính năng mang tính cạnh tranh nhất giữa các ứng dụng chính là tính tự động. Điều này nghĩa là con người sẽ tối thiểu hóa các thao tác nhất có thể và để phần còn lại cho ứng dụng. Từ khi Trí tuệ nhân tạo – AI trở nên phổ biến, tự động hoá trong các thao tác trở nên khả thi hơn, đồng thời, nó còn mở ra rất nhiều tính năng mới cho các ứng dụng. EasyMedicine cũng là một ứng dụng được xây dựng dựa trên công nghệ AI và nó giúp tự động hoá quản lý việc uống thuốc.

Nội dung chính

  1. EasyMedicine giải quyết những vấn đề gì?
  2. AI sẽ giúp giải quyết vấn đề như thế nào?
  3. Giới thiệu Google Cloud Vision
  4. Giới thiệu AWS Comprehend Medical
  5. Thiết kế hệ thống
  6. Demo ứng dụng
  7. Tính năng mong muốn phát triển
  8. Mặt hạn chế
  9. Lời kết
  10. Trích dẫn

#1. EasyMedicine giải quyết những vấn đề gì?

Là một người khoẻ mạnh, bạn có thể sẽ chưa hình dung được tại sao lại cần một ứng dụng quản lý việc uống thuốc. Tuy nhiên, nếu đặt bản thân vào tình huống là một người đang trải qua nhiều căn bệnh khác nhau, dù bạn có thể kiểm soát tốt và luôn uống thuốc đúng giờ thì chẳng phải việc quản lý thời gian uống thuốc này cũng không thể gọi là một chuyện đơn giản được hay sao? Trong khi đó, việc này hoàn toàn có thể kiểm soát bằng một ứng dụng, và bạn có thể tập trung vào những công việc khác của bản thân. Lấy một ví dụ cụ thể để làm rõ hơn về vấn đề này, đó chính là mẹ của chúng ta – người phải chăm sóc cho nhiều thành viên trong gia đình một khi họ bị bệnh. Ngoài ra, cũng phải thừa nhận rằng có đôi lúc chúng ta quên uống thuốc. Có khi chúng ta cũng sẽ lơ là việc uống thuốc một khi bệnh đã thuyên giảm. Hậu quả của những chuyện này chính là sức khoẻ của chúng ta sẽ bị ảnh hưởng không tốt về lâu dài.

Nói cách khác, chúng ta cần một công cụ giúp giải quyết những vấn đề sau:

  • • Hôm nay cần uống thuốc vào lúc mấy giờ, uống những thuốc gì và liều lượng là bao nhiêu?
  • • Có phương pháp gì để tránh quên uống thuốc hay không? Có ứng dụng gì giúp nhắc nhở việc uống thuốc không?
  • • Hôm nay đã uống những thuốc nào, chưa uống hoặc đã quên uống thuốc nào?
  • • Còn phải uống thuốc trong bao lâu và còn phải uống bao nhiêu viên nữa?
  • • Nếu sau này muốn tra cứu và tái sử dụng thông tin thuốc thì có ứng dụ gì hỗ trợ lưu trữ thông tin của thuốc hay không?

Ý tưởng chính cho ứng dụng EasyMedicine chính là để trả lời cho những câu hỏi ở trên.

#2. AI sẽ giúp giải quyết vấn đề như thế nào?

Dựa vào những vấn đề đã phân tích, chúng ta hoàn toàn có thể hình dung ra một ứng dụng giúp quản lý việc uống thuốc, bao gồm cả việc theo dõi và nhắc nhở việc uống thuốc đúng giờ.

Nhằm giúp cho mọi thao tác được thực hiện dễ dàng, nhanh chóng nhất có thể thì chúng ta cần tự động hoá một số bước. Đó là lập danh sách thuốc cần uống và đặt lịch báo giờ uống thuốc.

Cụ thể, người dùng sẽ chụp hình toa thuốc của mình. Sau đó, đơn thuốc sẽ được quét và một danh sách các loại thuốc cần uống sẽ được tạo (với thông tin về liều lượng cụ thể). Đồng thời, thời gian biểu cho việc uống thuốc sẽ được tự động tạo ra.

Từ đó, mọi bước sẽ được hoàn tất chỉ sau một thao tác chụp hình. Và công nghệ AI sẽ là cách để chúng ta có thể thực hiện nó. Cụ thể như sau:

  • Computer Vision: Thị giác máy tính – là công nghệ AI cho phép phân biệt được các vật thể nằm trong một khung hình. Trong trường hợp này, chúng ta cần trích xuất được nội dung bằng chữ (raw text) của toa thuốc nằm trong hình ảnh mà người dùng đã chụp. Google Clould Vision API là công cụ sẽ được sử dụng cho việc này.
  • Natural Language Processing: Là một lĩnh vực của trí tuệ nhân tạo, công nghệ này tập trung vào việc giúp máy tính tư duy và hiểu nội dung văn bản như cách con người viết và nói. Đây là một nhiệm vụ khó khăn vì nó liên quan đến rất nhiều dữ liệu trừu tượng (phi cấu trúc). Vì nội dung chính cần AI xử lý là các toa thuốc nên AI được chọn cần phải được đào tạo bằng dữ liệu y tế. Do đó, AWS Comprehend Medical là một dịch vụ phù hợp trong trường hợp này.

#3. Giới thiệu Google Cloud Vision API

Là một API cung cấp bởi Google. Ưu điểm của nó đến từ tốc độ xử lý và độ chính xác cao, dễ sử dụng và đã được đạo tạo bằng một lượng data hình ảnh khổng lồ. Đối với tính năng trích xuất văn bản (detect text) từ hình ảnh, nó có thể xử lý được cả văn bản đánh máy và cả viết tay, ngoài ra có thể hoạt động tốt với nhiều loại ngôn ngữ khác nhau.

Các vùng mà Google đặt máy chủ cho dịch vụ này:

  • us: USA country only
  • eu: The European Union

Chi phí duy trì dịch vụ (Pricing – Cloud Vision API):

  • • Google sẽ tính phí theo tháng dựa vào số hình ảnh đã xử lý. Mỗi hình ảnh sẽ được tính là 1 unit.
  • • Có nhiều mức thu phí khác nhau dựa vào số lượng unit. Nhưng đối với ứng dụng EasyMedicine, ta sẽ xét đến mức dưới 5.000.000 units. Ở mức này thì sẽ tốn 1.5 USD cho mỗi 1000 units.
  • • Ví dụ: mỗi tháng ứng dụng xử lý 10000 hình ảnh thì sẽ tiêu tốn 15USD.

Với mức thu phí 1.5 USD/1000 units thì có thể thấy là nó khá tốn kém. Hy vọng tương lai sẽ tìm được dịch vụ với giá tốt hơn, có thể là dịch vụ nằm trong region khác và giá sẽ rẻ hơn.

#4. Giới thiệu AWS Comprehend Medical

Là một dịch vụ về AI thuộc NLP (Natural Language Processing) của AWS (Amazon Web Service), API này nhận đầu vào là một đoạn văn bản và trả về các thông tin liên quan về y tế đã trích xuất được. Vì đã được được đào tạo qua một lượng data lớn về y tế nên độ chính xác của kết quả là khá cao – và đây là thứ mà ta cần trong ứng dụng này vì nó ảnh hưởng trực tiếp đến sức khoẻ của người dùng. Ngoài ra, vì đây là dịch vụ của AWS nên dịch vụ này được đặt ở rất nhiều vùng, dẫn đến tốc độ phản hồi cũng rất tối ưu.

Amazon Comprehend Medical – Natural Language Processing for Healthcare Customers | AWS News Blog

Các thông tin mà AI này có khả năng nhận biết là khá đa dạng, nhưng vì chỉ quản lý việc uống thuốc của người dùng nên ta chỉ cần tập trung xét đến các thông tin như dưới đây:

  • • Thông tin về thuốc: tên thuốc, liều lượng thuốc
  • • Thông tin về thời gian

Chi phí duy trì dịch vụ (Amazon Comprehend – Pricing):

  • • Mỗi 100 kí tự = 1 unit. Có nhiều mức thu phí khác nhau, nhưng mức mà EasyMedicine sử dụng sẽ nằm ở 10 triệu units.
  • • Ở mức 10 triệu units, phí cho mỗi unit là $0.0001USD. Ví dụ, mỗi tháng cần xử lý 10.000 toa thuốc, và trung bình mỗi toa thuốc sẽ có khoản 500 kí tự, thì mức phí sẽ là 10000*5*0,0001 = 5 USD

Đây là một mức phí khá tối ưu.

#5. Thiết kế hệ thống

Dưới đây là sơ đồ thiết kế hệ thống của EasyMedicine:

Để hiểu rõ hơn về sơ đồ trên, chúng ta hãy cùng tìm hiểu luồng xử lý của ứng dụng. Đầu tiên, sau khi người dùng input hình ảnh toa thuốc được chụp/ được đăng tải thì hình ảnh này sẽ được gửi về server. Server lúc này gọi tới Google Vision API bằng cách gửi mã base64 encode của hình ảnh đã input. Google sẽ xử lý và trả về toàn bộ nội dung văn bản trích xuất được từ bức ảnh. Lấy toa thuốc dưới đây là một ví dụ.

 

 

Tiếp theo, server sử dụng nội dung bằng chữ đã trích xuất được để gọi tới API của AWS Comprehend Medical nhằm yêu cầu trích xuất dữ liệu về y tế.  Dưới đây là một phần của kết quả trả về:

 

{
    “Entities”: [
        {
            “Id”: 1,
            “BeginOffset”: 0,
            “EndOffset”: 27,
            “Score”: 0.982366681098938,
            “Text”: “Erythromycin ethylsuccinate”,                     // Tên thuốc
            “Category”: “MEDICATION”,
            “Type”: “GENERIC_NAME”,
            “Traits”: [],
            “Attributes”: [
                {
                    “Type”: “STRENGTH”,
                    “Score”: 0.8039610385894775,
                    “RelationshipScore”: 0.9956788420677185,
                    “RelationshipType”: “STRENGTH”,
                    “Id”: 2,
                    “BeginOffset”: 28,
                    “EndOffset”: 37,
                    “Text”: “400mg/5ml”,                                        // Liều lượng thuốc
                    “Category”: “MEDICATION”,
                    “Traits”: []
                },
                {
                    “Type”: “FREQUENCY”,
                    “Score”: 0.2624519169330597,
                    “RelationshipScore”: 0.999884843826294,
                    “RelationshipType”: “FREQUENCY”,
                    “Id”: 3,
                    “BeginOffset”: 46,
                    “EndOffset”: 55,
                    “Text”: “tsp.q.i.d”,                                           // Độ thường xuyên
                    “Category”: “MEDICATION”,
                    “Traits”: []
                }
            ]
        }
    ]
}

 

Khi đối chiếu kết quả JSON và hình ảnh input ban đầu, ta có thể thấy cách mà AI cấu trúc hoá các nội dung trong văn bản. Dựa vào những cấu trúc đã được định nghĩa trước, chúng ta dễ dàng lấy ra những thông tin cần thiết để xây dựng một lịch trình uống thuốc cho đơn thuốc này. Cụ thể, chúng ta sẽ tập trung xử lý các thuộc tính sau:

  • • Type là BRAND_NAME hoặcGENERIC_NAME“: đây là tên thuốc trích xuất được.
  • • Type là DOSAGE hoặc STRENGTH: đây là liều lượng thuốc
  • • Type là FREQUENCY: độ thường xuyên khi uống thuốc – đây là thông tin cần thiết để xây dựng lịch trình uống thuốc.

Từ những thông tin đã trích xuất được, chúng ta cần xử lý thông tin đó và kết quả là danh sách thuốc với lịch trình uống cụ thể:

Tên thuốc: Là thông tin dễ lấy được nhất vì nó không trừu tượng. Miễn là dữ liệu trong database về loại thuốc tồn tại trên hệ thống của AWS.

Liều lượng thuốc: Vì sẽ có nhiều hơn một attribute dạng “DOSAGE” được trả về, ta cần phân biệt được đâu là liều lượng thuốc thật sự, và đâu là liều lượng mỗi lần uống.
• Liều lượng thuốcはthường sẽ đi kèm với đơn vị về khối lượng/thể tích của loại thuốc đó. Chẳng hạn như 100mg hay 400ml . Sử dụng Regex (Regular Expression) sau, ta có thể dễ dàng trích xuất được liều lượng thuốc:/([0-9]+)( ?)(mg|ml)/
• Liều lượng mỗi lần uống
có thể ở dạng khối lượng (50mg) hoặc cũng có thể ở dạng từ ngữ (1 viên, một lọ, …). Xử lý cũng tương tự như trên.

Lịch uống thuốc:
• Thời gian uống thuốc ở dạng mã y dược (Medical and pharmacy abbreviations). Lấy nội dung ở toa thuốc trên làm ví dụ, “q.i.d” tương đương với “Four times a day”. Điều này có nghĩa là ứng dụng sẽ đặt lịch hẹn uống thuốc vào 4 thời điểm là sáng (7:00 AM), trưa (13:00 PM), chiều (18:00 PM), tối (21:00 PM).

• Thời gian uống thuốc ở dạng thời điểm trong ngày. Ứng dụng cần đặt lịch hẹn uống thuốc sao cho phù hợp với thời điểm được mô tả. Kiểu này sẽ có nhiều trường hợp khác nhau. Ví dụ Before breakfast (mỗi sáng lúc 7:00 AM) hoặc Twice a day (sáng – 7:00 AM, trưa 13:00 PM). Để chuyển được từ thời điểm sang lịch uống cụ thể, ta có thể dùng Regex để so khớp, chẳng hạn như:

Bước cuối cùng là hẹn giờ báo uống thuốc. Dựa vào danh sách đã tạo được, hệ thống sẽ gừi thông báo push notification đến điện thoại của người dùng. Nhờ đó họ có thể uống thuốc đúng giờ và đúng liều lượng.

#6. Demo ứng dụng:

Màn hình Home:

  • • Tính năng chính của màn hình này là kiểm soát việc uống thuốc đúng giờ.
  • • Hiển thị danh sách các loại thuốc mà người dùng phải uống. Uống vào thời điểm nào và liều lượng ra sao. Các loại thuốc được gom nhóm theo giờ uống thuốc, từ đó người dùng biết cần phải uống bao nhiêu loại thuốc vào các thời điểm nhất định.
  • • Khi trạng thái của thuốc chuyển sang màu xám với dấu ⚠️, nghĩa là người dùng đã quên uống thuốc đúng giờ. Để xác nhận bản thân đã uống thuốc đó đúng giờ, người dùng cần nhấn vào loại thuốc đó (hoặc nhấn “Check all”), lúc này trạng thái của thuốc sẽ chuyển sang màu xanh với dấu ✅.

Màn hình Medication:

  • • Tính năng chính của màn hình này là quản lý danh sách thuốc và thông tin về thuốc.
  • • Người dùng có thể thêm loại thuốc cần uống bằng cách nhập vào các hạng mục ở phần Manual.
  • • Ngoài ra, có thể chụp hình một toa thuốc và hệ thống sẽ tự động thêm danh sách thuốc cần uống với lịch trình dựa theo thông tin tìm được trên toa thuốc.
  • • Trường hợp thông tin từ hình chụp không chính xác, người dùng có thể tự chỉnh sửa hoặc xoá đi.

#7. Tính năng mong muốn phát triển

  • • Hỗ trợ nhiều ngôn ngữ hơn: Khi chụp ảnh đơn thuốc để ứng dụng tự động xử lý thông tin, tính năng này chỉ hoạt động hiệu quả khi đơn thuốc sử dụng ngôn ngữ tiếng Anh. Với các ngôn ngữ khác như tiếng Việt, tiếng Nhật thì ứng dụng chưa thể xử lý được.
  • • Lưu đơn thuốc để tái sử dụng: Để dễ quản lý hơn, chúng ta cần gom nhóm các loại thuốc theo một đơn thuốc cụ thể. Ngoài ra, trong tương lai chúng ta có khả năng tái phát bệnh một lần nữa, vì vậy nếu có sẵn một toa thuốc được lưu thì sẽ dễ dàng hơn trong việc tham khảo nên uống thuốc gì ở lần bị bệnh tiếp theo.
  • • Đặt thuốc trực tiếp trên ứng dụng: Bằng cách kết hợp với toa thuốc đã tạo, người dùng lúc này có thể không cần phải trực tiếp đến nhà thuốc để mua thuốc nữa, thay vào đó chỉ cần đặt thuốc ngay trên ứng dụng. Lợi ích của việc này không chỉ có sự tiện lợi, bởi nếu chúng ta có thể đảm bảo nguồn gốc, chất lượng thuốc cũng như giá thành thì người dùng sẽ luôn an tâm khi uống thuốc đã đặt qua ứng dụng của chúng ta.
  • • Trích xuất được tổng số lượng/tổng số ngày cần uống một loại thuốc nào đó: Hầu như các đơn thuốc đều có thông tin này, chẳng hạn như tổng số lượng thuốc cần uống là 10 viên. Hoặc tổng số ngày là 7 ngày.
  • • Tính năng cài đặt custom thời gian: Với mỗi người, thời gian uống thuốc là rất đa dạng. Vì vậy, chúng ta có thể để người dùng tự cài đặt thời gian phù hợp với thói quen của riêng mỗi người.

#8. Mặt hạn chế

Đa phần mặt hạn chế của ứng dụng nằm ở tính năng tự động tạo dữ liệu từ hình chụp của người dùng. Cụ thể, ứng dụng còn thiếu sót ở những điểm dưới đây:

  • Chỉ xử lý được các đơn thuốc sử dụng tiếng Anh. Vì vậy về mặt ngôn ngữ xử lý còn rất hạn chế.
  • Sẽ có trường hợp AWS Comprehend Medical không trích xuất được đầy đủ thông tin cần thiết để xử lý. Chẳng hạn như trường hợp toa thuốc sử dụng tên thuốc là của một hãng dược mà trong database của AWS chưa có dữ liệu. Lúc này ứng dụng không thể lấy được thông tin về tên thuốc.
  • Chưa thể hiểu được tất cả trường hợp của thông tin về lịch trình uống thuốc. Vì lịch trình về thời gian uống thuốc được ứng dụng suy luận ra từ thông tin trong toa thuốc. Sẽ có trường hợp nó chưa được lập trình để xử lý.

#9. Lời kết

EasyMedicine là một ý tượng có thể xem là khá thực tế và hữu ích. Tính năng của nó tận dụng công nghệ AI vì vậy các thao tác là rất dễ dàng. Hy vọng trong tương lai, ứng dụng này có thể thực sự được triển khai và đi vào hoạt động.

#10. Trích dẫn