Logo Zephyrnet

Làm cách nào để xây dựng ứng dụng tư vấn lượng calo bằng GenAI?

Ngày:

Giới thiệu

Trí tuệ nhân tạo có nhiều trường hợp sử dụng và một số trường hợp tốt nhất là trong ngành Y tế. Nó thực sự có thể giúp mọi người duy trì một cuộc sống khỏe mạnh hơn. Với sự bùng nổ ngày càng tăng trong trí tuệ nhân tạo, ngày nay một số ứng dụng nhất định được tạo ra với độ phức tạp ít hơn. Một ứng dụng rất hữu ích có thể được xây dựng là Ứng dụng Calorie Advisor. Trong bài viết này, chúng ta sẽ chỉ xem xét vấn đề này, lấy cảm hứng từ việc chăm sóc sức khỏe của chúng ta. Chúng tôi sẽ xây dựng một Ứng dụng tư vấn lượng calo đơn giản để chúng tôi có thể nhập hình ảnh của thực phẩm và ứng dụng sẽ giúp chúng tôi tính toán lượng calo của từng món có trong thực phẩm. Dự án này là một phần của NutriGen, tập trung vào sức khỏe thông qua AI.

Dinh dưỡng

Mục tiêu học tập

  • Ứng dụng mà chúng tôi sẽ tạo trong bài viết này sẽ dựa trên các kỹ thuật xử lý hình ảnh và kỹ thuật nhanh chóng cơ bản.
  • Chúng tôi sẽ sử dụng API Google Gemini Pro Vision cho trường hợp sử dụng của mình.
  • Sau đó, chúng ta sẽ tạo cấu trúc mã, nơi chúng ta sẽ thực hiện Xử lý hình ảnh và Kỹ thuật nhắc nhở. Cuối cùng, chúng ta sẽ làm việc trên Giao diện người dùng bằng Streamlit.
  • Sau đó, chúng tôi sẽ triển khai ứng dụng của mình lên Ôm mặt Nền tảng miễn phí.
  • Chúng ta cũng sẽ thấy một số vấn đề mà chúng ta sẽ gặp phải trong kết quả đầu ra khi Gemini không mô tả được một mặt hàng thực phẩm và đưa ra số lượng calo sai cho thực phẩm đó. Chúng tôi cũng sẽ thảo luận về các giải pháp khác nhau cho vấn đề này.

Yêu cầu trước

Hãy bắt đầu với việc triển khai dự án của chúng tôi, nhưng trước đó, hãy đảm bảo rằng bạn có hiểu biết cơ bản về AI và LLM tổng hợp. Sẽ không sao nếu bạn biết rất ít vì trong bài viết này, chúng tôi sẽ triển khai mọi thứ từ đầu.

Đối với Kỹ thuật nhắc nhở Python cần thiết, cần có hiểu biết cơ bản về Generative AI và làm quen với Google Gemini. Ngoài ra, kiến ​​thức cơ bản về Hợp lý hóa, Github Ôm mặt các thư viện là cần thiết. Việc làm quen với các thư viện như PIL cho mục đích tiền xử lý ảnh cũng có lợi.

Bài báo này đã được xuất bản như một phần của Blogathon Khoa học Dữ liệu.

Mục lục

Đường ống dự án

Trong bài viết này, chúng tôi sẽ nghiên cứu xây dựng một trợ lý AI để hỗ trợ các chuyên gia dinh dưỡng và cá nhân đưa ra quyết định sáng suốt về lựa chọn thực phẩm của họ và duy trì lối sống lành mạnh.

Quy trình sẽ như thế này: hình ảnh đầu vào -> xử lý hình ảnh -> kỹ thuật nhắc nhở -> gọi hàm cuối cùng để lấy đầu ra của hình ảnh đầu vào của món ăn. Đây là một cái nhìn tổng quan ngắn gọn về cách chúng tôi sẽ tiếp cận báo cáo vấn đề này.

Tổng quan về Gemini Pro Vision

GeminiPro là đa phương thức LLM được xây dựng bởi Google. Nó đã được đào tạo để trở thành đa phương thức ngay từ đầu. Nó có thể thực hiện tốt nhiều tác vụ khác nhau, bao gồm chú thích hình ảnh, phân loại, tóm tắt, trả lời câu hỏi, v.v. Một trong những sự thật thú vị về nó là nó sử dụng Kiến trúc bộ giải mã biến áp nổi tiếng của chúng tôi. Nó được đào tạo trên nhiều loại dữ liệu, giúp giảm độ phức tạp của việc giải quyết các đầu vào đa phương thức và cung cấp đầu ra có chất lượng.

Bước 1: Tạo môi trường ảo

Tạo một môi trường ảo là một phương pháp hay để tách biệt dự án của chúng ta và các phần phụ thuộc của nó sao cho chúng không trùng với các dự án khác và chúng ta luôn có thể có các phiên bản thư viện khác nhau mà chúng ta cần trong các môi trường ảo khác nhau. Vì vậy, bây giờ chúng ta sẽ tạo một môi trường ảo cho dự án. Để thực hiện việc này, hãy làm theo các bước được đề cập dưới đây:

  • Tạo một thư mục trống trên màn hình nền cho dự án.
  • Mở thư mục này trong Mã VS.
  • Mở thiết bị đầu cuối.

Viết lệnh sau:

pip install virtualenv
python -m venv genai_project

Bạn có thể sử dụng lệnh sau nếu gặp lỗi chính sách thực thi:

Set-ExecutionPolicy RemoteSigned -Scope Process

Bây giờ chúng ta cần kích hoạt môi trường ảo của mình, để sử dụng lệnh sau:

.genai_projectScriptsactivate

Chúng tôi đã tạo thành công môi trường ảo của mình.

Bước tạo môi trường ảo trong Google Colab

Chúng tôi cũng có thể tạo Môi trường ảo của mình trong Google Colab; đây là quy trình từng bước để làm điều đó:

  • Tạo sổ tay Colab mới
  • Sử dụng các lệnh dưới đây từng bước
!which python
!python --version
#to check if python is installed or not
%env PYTHONPATH=
# setting python path environment variable in empty value ensuring that python
# won't search for modules and packages in additional directory. It helps
# in avoiding conflicts or unintended module loading.
!pip install virtualenv 
# create virtual environment 
!virtualenv genai_project
!wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

#This will help download the miniconda installer script which is used to create
# and manage virtual environments in python
!chmod +x Miniconda3-latest-Linux-x86_64.sh
# this command is making our mini conda installer script executable within
# the colab environment. 
!./Miniconda3-latest-Linux-x86_64.sh -b -f -p /usr/local
# this is used to run miniconda installer script and 
# specify the path where miniconda should be installed
!conda install -q -y --prefix /usr/local python=3.8 ujson
#this will help install ujson and python 3.8 installation in our venv.
import sys
sys.path.append('/usr/local/lib/python3.8/site-packages/')
#it will allow python to locate and import modules from a venv directory
import os
os.environ['CONDA_PREFIX'] = '/usr/local/envs/myenv'

# used to activate miniconda enviornment 
!python --version
#checks the version of python within the activated miniconda environment

Do đó, chúng tôi cũng đã tạo môi trường ảo của mình trong Google Colab. Bây giờ, hãy kiểm tra xem chúng ta có thể tạo một tệp .py cơ bản như thế nào ở đó.

!source myenv/bin/activate
#activating the virtual environment
!echo "print('Hello, world!')" >> my_script.py
# writing code using echo and saving this code in my_script.py file
!python my_script.py
#running my_script.py file

Điều này sẽ in Hello World cho chúng tôi ở đầu ra. À chính nó đấy. Đó là tất cả về cách làm việc với Môi trường ảo trong Google Colab. Bây giờ chúng ta hãy tiếp tục với dự án.

Bước 2: Nhập các thư viện cần thiết

import streamlit as st
import google.generativeaias genai 
import os 
from dotenv import load_dotenv
load_dotenv()
from PIL import Image

Nếu gặp sự cố khi nhập bất kỳ thư viện nào ở trên, bạn luôn có thể sử dụng lệnh “pip install Library_name” để cài đặt nó.

Chúng tôi đang sử dụng thư viện Streamlit để tạo giao diện người dùng cơ bản. Người dùng sẽ có thể tải lên một hình ảnh và nhận được kết quả đầu ra dựa trên hình ảnh đó.

Chúng tôi sử dụng Google Generative để lấy LLM và phân tích hình ảnh để biết lượng calo phù hợp cho từng món trong thực phẩm của chúng tôi.

Hình ảnh đang được sử dụng để thực hiện một số quá trình tiền xử lý hình ảnh cơ bản.

Bước 3: Thiết lập khóa API

Tạo một tệp .env mới trong cùng thư mục và lưu trữ khóa API của bạn. Bạn có thể lấy Google API Song Tử chìa khóa từ Google MakerSuite.

Bước 4: Chức năng tạo phản hồi

Ở đây chúng ta sẽ tạo một hàm tạo phản hồi. Hãy chia nhỏ nó ra từng bước một:

Đầu tiên, chúng tôi sử dụng gen. Định cấu hình để định cấu hình API mà chúng tôi đã tạo từ Trang web Google MakerSuite. Sau đó, chúng tôi tạo hàm get_gemini_response, hàm này nhận 2 tham số đầu vào: dấu nhắc đầu vào và hình ảnh. Đây là hàm chính sẽ trả về kết quả đầu ra trong văn bản.

genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))

def get_gemini_response(input_prompt, image):

    model = genai.GenerativeModel('gemini-pro-vision')

    response = model.generate_content([input_prompt, image[0]])

    return response

Ở đây, chúng tôi đang sử dụng mô hình 'Gemini-pro-vision' vì nó là mô hình đa phương thức. Sau khi gọi mô hình của chúng tôi từ phần phụ thuộc genie.GenerativeModel, chúng tôi chỉ chuyển lời nhắc và dữ liệu hình ảnh đến mô hình. Cuối cùng, dựa trên hướng dẫn được cung cấp trong lời nhắc và dữ liệu hình ảnh mà chúng tôi đã cung cấp, mô hình sẽ trả về kết quả đầu ra dưới dạng văn bản thể hiện lượng calo của các mặt hàng thực phẩm khác nhau có trong hình ảnh.

Bước 5: Tiền xử lý ảnh

Hàm này kiểm tra xem tham số upload_file có phải là None hay không, nghĩa là người dùng đã tải tệp lên. Nếu một tệp đã được tải lên, mã sẽ tiến hành đọc nội dung tệp thành byte bằng phương thức getvalue() của đối tượng upload_file. Điều này sẽ trả về byte thô của tệp đã tải lên.

Dữ liệu byte thu được từ tệp đã tải lên được lưu trữ ở định dạng từ điển dưới cặp khóa-giá trị “mime_type” và “data”. Khóa “mime_type” lưu trữ loại MIME của tệp đã tải lên, loại này cho biết loại nội dung (ví dụ: hình ảnh/jpeg, hình ảnh/png). Khóa “dữ liệu” lưu trữ byte thô của tệp đã tải lên.

Sau đó, dữ liệu hình ảnh được lưu trữ trong danh sách có tên image_parts, chứa từ điển có dữ liệu và loại MIME của tệp được tải lên.

def input_image_setup(uploaded_file):
    if uploaded_file isnotNone:
        #Read the file into bytes
        bytes_data = uploaded_file.getvalue()
        image_parts = [
            {
                "mime_type":uploaded_file.type, 
                "data":bytes_data
            }
        ]
        return image_parts
    else:
        raise FileNotFoundError("No file uploaded")

Bước 6: Tạo giao diện người dùng

Vì vậy, cuối cùng, đã đến lúc tạo giao diện người dùng cho dự án của chúng ta. Như đã đề cập trước đó, chúng tôi sẽ sử dụng thư viện Streamlit để viết mã cho giao diện người dùng.

## initialising the streamlit app
st.set_page_config(page_title="Calories Advisor App")
st.header("Calories Advisor App")
uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
image = ""
if uploaded_file isnotNone:
    image = Image.open(uploaded_file)
    st.image(image, caption="Uploaded Image", use_column_width=True)
submit = st.button("Tell me about the total calories")

Ban đầu, chúng tôi thiết lập cấu hình trang bằng set_page_config và đặt tiêu đề cho ứng dụng. Sau đó, chúng tôi tạo tiêu đề và thêm hộp tải tệp lên để người dùng có thể tải hình ảnh lên. St. Image hiển thị hình ảnh mà người dùng đã tải lên giao diện người dùng. Cuối cùng, có một nút gửi, sau đó chúng ta sẽ nhận được kết quả đầu ra từ mô hình ngôn ngữ lớn của chúng ta, Gemini Pro Vision.

Bước 7: Viết lời nhắc hệ thống

Bây giờ là lúc để sáng tạo. Tại đây, chúng ta sẽ tạo lời nhắc đầu vào, yêu cầu mô hình hoạt động như một chuyên gia dinh dưỡng. Không cần thiết phải sử dụng lời nhắc bên dưới; bạn cũng có thể cung cấp lời nhắc tùy chỉnh của mình. Hiện tại, chúng tôi đang yêu cầu mô hình của mình hành động theo một cách nhất định. Dựa trên hình ảnh đầu vào của thực phẩm được cung cấp, chúng tôi đang yêu cầu mô hình của mình đọc dữ liệu hình ảnh đó và tạo ra kết quả đầu ra, điều này sẽ cung cấp cho chúng tôi lượng calo của các mặt hàng thực phẩm có trong hình ảnh và đưa ra đánh giá xem thực phẩm đó có tốt cho sức khỏe hay không hoặc không lành mạnh. Nếu thực phẩm có hại, chúng tôi yêu cầu nó cung cấp các lựa chọn thay thế bổ dưỡng hơn cho các mặt hàng thực phẩm trong hình ảnh của chúng tôi. Bạn có thể tùy chỉnh nó nhiều hơn theo nhu cầu của mình và có được một cách tuyệt vời để theo dõi sức khỏe của mình.

Đôi khi nó có thể không đọc được dữ liệu hình ảnh một cách chính xác, chúng tôi cũng sẽ thảo luận về các giải pháp liên quan đến vấn đề này ở cuối bài viết này.

input_prompt = """

You are an expert nutritionist where you need to see the food items from the 
image and calculate the total calories, also give the details of all 
the food items with their respective calorie count in the below fomat.

        1. Item 1 - no of calories

        2. Item 2 - no of calories

        ----

        ----

Finally you can also mention whether the food is healthy or not and also mention 
the percentage split ratio of carbohydrates, fats, fibers, sugar, protein and 
other important things required in our diet. If you find that food is not healthy 
then you must provide some alternative healthy food items that user can have 
in diet.

"""
if submit:

    image_data = input_image_setup(uploaded_file)

    response = get_gemini_response(input_prompt, image_data)

    st.header("The Response is: ")

    st.write(response)

Cuối cùng, chúng tôi đang kiểm tra xem nếu người dùng nhấp vào nút Gửi, chúng tôi sẽ nhận được dữ liệu hình ảnh từ

hàm input_image_setup mà chúng tôi đã tạo trước đó. Sau đó, chúng tôi chuyển lời nhắc đầu vào và dữ liệu hình ảnh này tới hàm get_gemini_response mà chúng tôi đã tạo trước đó. Chúng tôi gọi tất cả các hàm mà chúng tôi đã tạo trước đó để nhận được kết quả đầu ra cuối cùng được lưu trữ trong phản hồi.

Bước 8: Triển khai App ôm mặt

Bây giờ là lúc triển khai. Hãy bắt đầu nào.

Sẽ giải thích cách đơn giản nhất để triển khai ứng dụng này mà chúng tôi đã tạo. Có hai tùy chọn mà chúng ta có thể xem xét nếu muốn triển khai ứng dụng của mình: một là Streamlit Share và hai là Ôm mặt. Ở đây, chúng ta sẽ sử dụng Ôm Mặt để triển khai; bạn có thể thử khám phá triển khai trên Streamlit Share iFaceu nếu muốn. Đây là liên kết tham khảo cho điều đó – Triển khai trên Streamlit Share

Trước tiên, hãy nhanh chóng tạo tệp require.txt mà chúng ta cần để triển khai.

Mở terminal và chạy lệnh bên dưới để tạo tệp request.txt.

pip freeze > requirements.txt1plainText

Điều này sẽ tạo một tệp văn bản mới có tên là require. Tất cả các phụ thuộc của dự án sẽ có sẵn ở đó. Nếu điều này gây ra lỗi thì không sao. Bạn luôn có thể tạo một tệp văn bản mới trong thư mục làm việc của mình rồi sao chép và dán tệp request.txt từ liên kết GitHub mà tôi sẽ cung cấp tiếp theo.

Bây giờ, hãy đảm bảo rằng bạn có sẵn các tệp này (vì đó là những gì chúng tôi cần để triển khai):

  • ứng dụng
  • .env (đối với thông tin xác thực API)
  • Yêu cầu.txt

Nếu bạn chưa có thì hãy lấy tất cả các file này và tạo một tài khoản trên khuôn mặt ôm nhé. Sau đó, tạo một không gian mới và tải các tập tin lên đó. Đó là tất cả. Ứng dụng của bạn sẽ được triển khai tự động theo cách này. Bạn cũng sẽ có thể xem quá trình triển khai diễn ra như thế nào trong thời gian thực. Nếu xảy ra lỗi nào đó, bạn luôn có thể khắc phục bằng giao diện đơn giản và tất nhiên là cộng đồng ôm mặt, nơi có nhiều nội dung về giải quyết một số lỗi phổ biến trong quá trình triển khai.

Sau một thời gian, bạn sẽ có thể thấy ứng dụng hoạt động. Úi ôi! Cuối cùng chúng tôi đã tạo và triển khai ứng dụng dự đoán lượng calo của mình. Xin chúc mừng!!, Bạn có thể chia sẻ liên kết hoạt động của ứng dụng với bạn bè và gia đình mà bạn vừa xây dựng.

Đây là liên kết hoạt động đến ứng dụng chúng tôi vừa tạo – The Alorcalorieisor Ứng dụng

Hãy kiểm tra ứng dụng của chúng tôi bằng cách cung cấp hình ảnh đầu vào cho nó:

Trước:

Dinh dưỡng

Sau:

Dinh dưỡng

Đây là hoàn chỉnh liên kết kho lưu trữ github bao gồm mã nguồn và thông tin hữu ích khác liên quan đến dự án.

Bạn có thể sao chép kho lưu trữ và tùy chỉnh nó theo yêu cầu của mình. Cố gắng sáng tạo và rõ ràng hơn trong lời nhắc của bạn, vì điều này sẽ giúp mô hình của bạn có thêm sức mạnh để tạo ra kết quả đầu ra chính xác và phù hợp.

Phạm vi cải tiến

Các vấn đề có thể xảy ra ở kết quả đầu ra do mô hình tạo ra và giải pháp khắc phục:

Đôi khi, có thể xảy ra trường hợp bạn không nhận được kết quả đầu ra chính xác từ mô hình. Điều này có thể xảy ra do mô hình không thể dự đoán chính xác hình ảnh. Ví dụ: nếu bạn cung cấp hình ảnh đầu vào về thực phẩm và mặt hàng thực phẩm của bạn có chứa dưa chua thì mô hình của chúng tôi có thể coi đó là một thứ khác. Đây là mối quan tâm hàng đầu ở đây.

  • Một cách để giải quyết vấn đề này là thông qua các kỹ thuật kỹ thuật nhanh chóng hiệu quả, chẳng hạn như kỹ thuật nhanh chóng trong vài lần bắn, trong đó bạn có thể cung cấp cho mô hình các ví dụ và sau đó nó sẽ tạo ra kết quả đầu ra dựa trên những bài học từ những ví dụ đó và lời nhắc bạn đã cung cấp.
  • Một giải pháp khác có thể được xem xét ở đây là tạo dữ liệu tùy chỉnh của chúng tôi và tinh chỉnh nó. Chúng ta có thể tạo dữ liệu chứa hình ảnh của mặt hàng thực phẩm trong một cột và mô tả về mặt hàng thực phẩm có trong cột kia. Điều này sẽ giúp mô hình của chúng tôi tìm hiểu các mẫu cơ bản và dự đoán chính xác các mục trong hình ảnh được cung cấp. Vì vậy, việc có được kết quả đầu ra chính xác hơn về lượng calo cho hình ảnh món ăn là điều cần thiết.
  • Chúng tôi có thể tiến xa hơn bằng cách hỏi người dùng về mục tiêu dinh dưỡng của họ và yêu cầu mô hình tạo ra kết quả đầu ra dựa trên đó. (Bằng cách này, chúng tôi sẽ có thể điều chỉnh kết quả đầu ra do mô hình tạo ra và cung cấp nhiều kết quả đầu ra dành riêng cho người dùng hơn.)

Kết luận

Chúng tôi đã đi sâu vào ứng dụng thực tế của Generative AI trong chăm sóc sức khỏe, tập trung vào việc tạo ra Ứng dụng Calorie Advisor. Dự án này cho thấy tiềm năng của AI trong việc hỗ trợ các cá nhân đưa ra quyết định sáng suốt về lựa chọn thực phẩm và duy trì lối sống lành mạnh. Từ việc thiết lập môi trường cho đến triển khai các kỹ thuật xử lý hình ảnh và kỹ thuật nhanh chóng, chúng tôi đã đề cập đến các bước thiết yếu. Việc triển khai ứng dụng trên Ôm mặt thể hiện khả năng tiếp cận đối tượng rộng hơn. Những thách thức như nhận dạng hình ảnh không chính xác đã được giải quyết bằng các giải pháp như kỹ thuật nhanh chóng hiệu quả. Khi chúng tôi kết luận, Ứng dụng Calorie Advisor là minh chứng cho sức mạnh biến đổi của AI sáng tạo trong việc thúc đẩy sức khỏe.

Chìa khóa chính

  • Chúng ta đã thảo luận rất nhiều cho đến nay, Bắt đầu với quy trình dự án và sau đó là phần giới thiệu cơ bản về mô hình ngôn ngữ lớn Gemini Pro Vision.
  • Sau đó, chúng tôi bắt đầu triển khai thực tế. Chúng tôi đã tạo môi trường ảo và khóa API từ Google MakerSuite.
  • Sau đó, chúng tôi thực hiện tất cả mã hóa của mình trong môi trường ảo đã tạo. Hơn nữa, chúng tôi đã thảo luận về cách triển khai ứng dụng trên nhiều nền tảng, chẳng hạn như Ôm mặt và Chia sẻ Streamlit.
  • Ngoài ra, chúng tôi đã xem xét các vấn đề có thể xảy ra và thảo luận về các giải pháp cho những vấn đề đó.
  •  Vì vậy, thật vui khi làm việc trong dự án này. Cảm ơn bạn đã ở lại đến cuối bài viết này; Tôi hy vọng bạn sẽ học được điều gì đó mới mẻ.

Những câu hỏi thường gặp

Q1. Mô hình Tầm nhìn Pro của Google Gemini là gì?

Google đã phát triển Gemini Pro Vision, một LLM nổi tiếng được biết đến với khả năng đa phương thức. Nó thực hiện các tác vụ như chú thích, tạo và tóm tắt hình ảnh. Người dùng có thể tạo khóa API trên Trang web MakerSuite để truy cập Gemini Pro Vision.

Q2. Làm cách nào có thể áp dụng Generative AI vào lĩnh vực Chăm sóc sức khỏe/Dinh dưỡng?

A. AI sáng tạo có rất nhiều tiềm năng để giải quyết các vấn đề trong thế giới thực. Một số cách nó có thể được áp dụng cho lĩnh vực sức khỏe/dinh dưỡng là nó có thể giúp bác sĩ kê đơn thuốc dựa trên các triệu chứng và hoạt động như một cố vấn dinh dưỡng, nơi người dùng có thể nhận được các khuyến nghị lành mạnh cho chế độ ăn uống của họ.

Q3. Kỹ thuật nhắc nhở giải quyết trường hợp sử dụng AI sáng tạo như thế nào?

A. Kỹ thuật nhanh chóng là một kỹ năng cần thiết để thành thạo ngày nay. Nơi tốt nhất để học kỹ thuật trompt từ cơ bản đến nâng cao là tại đây - https://www.promptingguide.ai/

Q4. Làm cách nào để tăng khả năng tạo ra kết quả đầu ra chính xác hơn của mô hình?

A. Để tăng khả năng tạo ra kết quả đầu ra chính xác hơn của mô hình, chúng ta có thể sử dụng các chiến thuật sau: Nhắc hiệu quả, Tinh chỉnh và Tạo tăng cường truy xuất (RAG).

Phương tiện hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định riêng của Tác giả.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img