حول المحتوى:
دليل عملي لبناء واجهة تفاعلية لنموذج تعلم آلي صغير باستخدام Streamlit: تحميل النموذج، عرض النتائج، إضافة خيارات للمستخدم، ونشر التطبيق محليًا أو على سيرفر.
في كثير من مشاريع الذكاء الاصطناعي، يكون لدينا نموذج تعلم آلي جاهز يعمل بشكل ممتاز في بيئة التطوير، لكن المشكلة تبدأ عندما نريد أن نجعله قابلاً للاستخدام من قبل الآخرين (فريق العمل، العميل، أو حتى المستخدم النهائي). هنا تظهر قوة Streamlit، إطار عمل بسيط في بايثون يسمح لك ببناء واجهة ويب تفاعلية لنماذجك خلال دقائق.
في هذا الدليل العملي من افهم صح سنبني معًا Streamlit واجهة ML بسيطة لعرض نموذج تعلم آلي، مع:
إذا لم تكن قد بنيت نموذجًا من قبل، يمكنك الرجوع إلى مقالنا عن بناء نموذج تعلم عميق صغير باستخدام PyTorch خطوة بخطوة، ثم استخدامه مع Streamlit لعرضه للمستخدم.
Streamlit هو مكتبة مفتوحة المصدر في بايثون تتيح لك بناء تطبيقات ويب تفاعلية بسهولة، دون الحاجة لخبرة في تطوير الواجهات (HTML, CSS, JavaScript). كل شيء يتم من داخل سكربت بايثون عادي.
مميزاته الرئيسية لنماذج التعلم الآلي:
st.text_input, st.slider, st.button.هذا يجعله خيارًا ممتازًا لكل من يريد Streamlit واجهة ML بسيطة وسريعة لنموذجه بدون تعقيدات أطر عمل الويب الكاملة مثل Django أو Flask (رغم إمكانية استخدامها عند الحاجة، ويمكنك قراءة المزيد عن النماذج في دليل Django 5 Models).
قبل البدء، ستحتاج إلى:
scikit-learn أو PyTorch أو TensorFlow حسب نموذجك)..pkl لـ scikit-learn أو .pt لـ PyTorch).من الأفضل إنشاء بيئة افتراضية (virtualenv أو venv) ثم تشغيل:
pip install streamlit scikit-learn pandas numpy
إذا كان نموذجك مبنيًا باستخدام PyTorch مثل الشرح في هذا المقال بناء نموذج تعلم عميق صغير باستخدام PyTorch خطوة بخطوة، أضف:
pip install torch torchvision
لشرح الفكرة بشكل واضح، سنفترض أن لدينا نموذجًا بسيطًا للتنبؤ بمعدل رضا عميل بناءً على بعض الخصائص، مثل:
يمكنك استبدال هذه المدخلات بمدخلات نموذجك الحقيقي. الهدف هو توضيح هيكل Streamlit واجهة ML أكثر من دقة النموذج نفسه.
سنستخدم هيكلًا بسيطًا للمجلد:
ml-streamlit-app/
├─ model.pkl # ملف النموذج المُدرَّب (كمثال)
└─ app.py # ملف تطبيق Streamlit
إذا كنت تستخدم PyTorch، قد يكون ملف النموذج model.pt، أو حتى كود النموذج مباشرة داخل app.py.
أول جزء مهم في Streamlit واجهة ML هو تحميل النموذج بكفاءة. نريد:
st.cache_resource أو st.cache_data (في الإصدارات الجديدة من Streamlit) لتسريع الأداء.مثال باستخدام scikit-learn مع ملف model.pkl:
import streamlit as st
import pickle
@st.cache_resource
def load_model():
with open("model.pkl", "rb") as f:
model = pickle.load(f)
return model
model = load_model()
إذا كنت تستخدم PyTorch، سيكون التحميل مختلفًا قليلًا، لكن الفكرة نفسها: دالة لتحميل النموذج، ثم استخدامه في الواجهة.
Streamlit يوفر مجموعة من العناصر التفاعلية الجاهزة:
st.text_input لإدخال النصوص.st.number_input للأرقام.st.slider للمنزلقات.st.selectbox للقوائم المنسدلة.st.checkbox لاختيار صح/خطأ.مثال على واجهة لإدخال بيانات العميل:
import streamlit as st
st.title("واجهة بسيطة لنموذج تعلم آلي باستخدام Streamlit")
st.subheader("تنبؤ بمعدل رضا العميل")
age = st.number_input("العمر", min_value=18, max_value=80, value=30)
salary = st.number_input("الراتب الشهري (بالعملة المحلية)", min_value=1000, max_value=100000, value=5000)
months = st.slider("مدة الاشتراك (بالأشهر)", min_value=1, max_value=60, value=12)
has_complaint = st.checkbox("هل سبق أن قدّم العميل شكوى؟")
هذه المدخلات هي ما سيتم تمريره لاحقًا إلى النموذج على شكل مصفوفة أو DataFrame.
بعد أخذ المدخلات من المستخدم، نحتاج إلى:
numpy array أو pandas DataFrame حسب ما يتوقعه النموذج.predict أو ما يقابلها في نموذجك.مثال بسيط باستخدام scikit-learn:
import numpy as np
complaint_value = 1 if has_complaint else 0
input_data = np.array([[age, salary, months, complaint_value]])
if st.button("تنفيذ التنبؤ"):
prediction = model.predict(input_data)
st.success(f"معدل رضا العميل المتوقع: {prediction[0]:.2f} من 5")
بهذا أصبح لدينا Streamlit واجهة ML تستقبل مدخلات من المستخدم، تمررها إلى النموذج، ثم تعرض النتيجة.
لتحسين تجربة المستخدم، يمكننا تنظيم الصفحة، إضافة نصوص توضيحية، واستخدام الأعمدة:
st.sidebar لنقل بعض المدخلات إلى القائمة الجانبية.st.columns لعرض المدخلات في أكثر من عمود.مثال أكثر تنظيمًا:
import streamlit as st
import numpy as np
import pickle
st.set_page_config(page_title="Streamlit واجهة ML", layout="centered")
@st.cache_resource
def load_model():
with open("model.pkl", "rb") as f:
model = pickle.load(f)
return model
model = load_model()
st.title("Streamlit واجهة ML لنموذج رضا العملاء")
st.write("أدخل بيانات العميل بالأسفل للحصول على التنبؤ بمعدل الرضا المتوقع.")
with st.sidebar:
st.header("إعدادات الإدخال")
age = st.number_input("العمر", min_value=18, max_value=80, value=30)
salary = st.number_input("الراتب الشهري", min_value=1000, max_value=100000, value=5000)
months = st.slider("مدة الاشتراك (أشهر)", min_value=1, max_value=60, value=12)
has_complaint = st.checkbox("سبق أن قدّم شكوى؟")
st.subheader("ملخص البيانات المدخلة")
col1, col2 = st.columns(2)
with col1:
st.metric("العمر", age)
st.metric("مدة الاشتراك (أشهر)", months)
with col2:
st.metric("الراتب الشهري", salary)
st.metric("هل اشتكى سابقًا؟", "نعم" if has_complaint else "لا")
complaint_value = 1 if has_complaint else 0
input_data = np.array([[age, salary, months, complaint_value]])
if st.button("تنفيذ التنبؤ الآن"):
prediction = model.predict(input_data)
st.success(f"معدل رضا العميل المتوقع: {prediction[0]:.2f} من 5")
بهذا نحصل على واجهة أنيقة، فيها:
بعد كتابة الكود في ملف app.py داخل مجلد المشروع، شغّل الأمر التالي من داخل نفس المجلد:
streamlit run app.py
سيفتح Streamlit المتصفح تلقائيًا على رابط مشابه لـ:
http://localhost:8501
كلما عدّلت في الكود، يمكنك حفظ الملف وسيقوم Streamlit بتحديث الواجهة تلقائيًا أو عند إعادة التحميل (حسب إعداداتك).
إذا كان النموذج مبنيًا باستخدام PyTorch (كما في شرح بناء نموذج PyTorch خطوة بخطوة)، يكون التدفق كالتالي:
import torch
@st.cache_resource
def load_model():
model = MyModelClass()
model.load_state_dict(torch.load("model.pt", map_location=torch.device("cpu")))
model.eval()
return model
torch.Tensor: input_tensor = torch.tensor(input_data, dtype=torch.float32)
with torch.no_grad():
output = model(input_tensor)
prediction = output.item()
المبدأ نفسه مع TensorFlow/Keras: تحميل النموذج، ثم تمرير المدخلات بنفس الأبعاد والمتغيرات التي استخدمتها أثناء التدريب.
بعد تشغيل النسخة الأولى من التطبيق، يمكنك التفكير في بعض التحسينات:
مثال مختصر لقبول ملف CSV:
uploaded_file = st.file_uploader("ارفع ملف CSV يحتوي على بيانات العملاء", type=["csv"])
if uploaded_file is not None:
import pandas as pd
data = pd.read_csv(uploaded_file)
st.write("معاينة البيانات:", data.head())
predictions = model.predict(data)
st.write("نتائج التنبؤ:", predictions)
Streamlit موجه أساسًا لتشغيل التطبيقات بطريقة بسيطة، ويمكن نشره بعدة طرق:
streamlit run app.py --server.port 8501 --server.address 0.0.0.0
ثم فتح تطبيقك عبر عنوان IP السيرفر.عند النشر، انتبه إلى:
st.help أو نصوصًا تحت الحقول لشرح المطلوب.app.py لسهولة الصيانة.باستخدام Streamlit، تستطيع تحويل أي نموذج تعلم آلي تملكه إلى تطبيق ويب تفاعلي بسيط يمكن لفريقك أو عملائك استخدامه بسهولة. كل ما تحتاجه هو:
app.py يحوي: @st.cache_resource.streamlit run app.py محليًا أو على سيرفر.بهذا تكون قد أنشأت Streamlit واجهة ML عملية، تتيح لك عرض إمكانيات نموذجك بسهولة، وتسرع عملية اختبار الأفكار ومشاركتها مع الآخرين، دون الدخول في تعقيدات تطوير واجهات ويب متكاملة.
دليل عملي لبناء واجهة تفاعلية لنموذج تعلم آلي صغير باستخدام Streamlit: تحميل النموذج، عرض النتائج، إضافة خيارات للمستخدم، ونشر التطبيق محليًا أو على سيرفر.
مساحة اعلانية