برمجة بوت تيليجرام يتحدث بذكاء باستخدام Python و Ollama: تكامل كامل

برمجة بوت تيليجرام يتحدث بذكاء باستخدام Python و Ollama: تكامل كامل

في هذا الشرح سنتعلم خطوة بخطوة كيفية بناء بوت تيليجرام ذكي باستخدام Python مع نماذج الذكاء الاصطناعي المحلية عبر Ollama، بحيث يستطيع البوت استقبال الرسائل من المستخدمين، إرسالها لنموذج ذكاء اصطناعي يعمل على جهازك، ثم إعادة الرد للمستخدم بطريقة سلسة.

الهدف هو بناء هيكل قابل للتوسّع يمكن وصله لاحقًا بـقواعد بيانات، أو أوامر مخصصة، أو حتى ربطه مع أنظمة خلفية أخرى (مثل Django REST أو Dash). إذا لم تكن قد تعرّفت على أداة Ollama من قبل، يمكنك مراجعة: دليل شامل عن أداة Ollama مميزاتها وكيفية عملها و أشهر نماذج الذكاء الاصطناعي المتوفرة على Ollama.

لماذا Telegram Bot Python Ollama فكرة قوية؟

الجمع بين بايثون وOllama وبوت تيليجرام يعطيك:

  • تحكم كامل في البيانات: النموذج يعمل محليًا على جهازك (On-Premise)، فلا تقوم بإرسال محادثات المستخدمين لخوادم طرف ثالث.
  • تكاليف أقل على المدى الطويل مقارنة باستخدام واجهات API مدفوعة.
  • مرونة في تخصيص النموذج: يمكنك تشغيل نماذج مختلفة، أو Fine-tuning، أو إعداد Prompt ثابت لكل محادثة.
  • إمكانية التكامل مع أنظمة أخرى: مثل أنظمة تسجيل المستخدمين أو Dashboards أو نظم تقارير.

في هذا المقال سنركز على الجانب العملي لبناء Telegram Bot Python Ollama، مع شرح الكود الكامل وأفضل الممارسات.

المتطلبات الأساسية قبل البدء

1. متطلبات تقنية

  • معرفة أساسية بلغة Python والتعامل مع الحزم.
  • حساب على Telegram لإنشاء بوت جديد عبر BotFather.
  • جهاز قادر على تشغيل نماذج Ollama (يفضّل وجود GPU لكن ليس شرطًا للنماذج الخفيفة).

2. تنصيب Python والحزم اللازمة

تأكد أن لديك Python 3.9 أو أعلى، ثم أنشئ بيئة افتراضية (اختياري لكن مُفضّل):

python -m venv venv
source venv/bin/activate  # على لينكس/ماك
# أو
venv\Scripts\activate     # على ويندوز

ثم ثبّت الحزم التي سنحتاجها:

pip install python-telegram-bot requests python-dotenv
  • python-telegram-bot: مكتبة رسمية شهيرة للتعامل مع Telegram Bot API.
  • requests: لإرسال الطلبات إلى واجهة Ollama HTTP.
  • python-dotenv: لإدارة مفاتيح البيئة (Token الخاص بالبوت) بأمان نسبي.

3. تنصيب وتشغيل Ollama

قم بتنصيب Ollama حسب نظام التشغيل لديك (Windows, macOS, Linux) من موقعه الرسمي. ثم اختر نموذجًا مناسبًا. يمكنك معرفة تفاصيل النماذج من: أشهر نماذج الذكاء الاصطناعي المتوفرة على Ollama.

مثال على سحب نموذج:

ollama pull llama3

بعدها تأكد أن خادم Ollama يعمل (افتراضيًا على http://localhost:11434).

4. إنشاء بوت تيليجرام والحصول على Token

  1. افتح تيليجرام وابحث عن BotFather.
  2. أرسل الأمر /newbot واتبع التعليمات (اسم البوت، اليوزرنيم).
  3. بعد الإنشاء ستحصل على Bot Token، احتفظ به في ملف .env بجانب مشروعك:
TELEGRAM_BOT_TOKEN=ضع_التوكن_هنا

هيكلة مشروع Telegram Bot Python Ollama

لنستخدم هيكل بسيط يمكن تطويره لاحقًا:

project/
  ├─ bot.py
  ├─ .env
  └─ requirements.txt

كل منطق البوت سيكون داخل bot.py في البداية، ثم نراه كيف نفصله لو أردنا.

الاتصال بـ Ollama من بايثون

Ollama يوفر واجهة HTTP سهلة. نرسل لها نموذجًا، وPrompt، وبعض الإعدادات، وترجع لنا النص الناتج. مثال دالة بسيطة لاستدعاء النموذج:

import requests

OLLAMA_URL = "http://localhost:11434/api/chat"
MODEL_NAME = "llama3"  # أو أي نموذج قمت بسحبه

def ask_ollama(messages):
    """
    messages: قائمة من الرسائل بالشكل:
    [{"role": "user", "content": "نص السؤال"}]
    """
    payload = {
        "model": MODEL_NAME,
        "messages": messages,
        "stream": False  # نستقبل الرد دفعة واحدة
    }

    try:
        response = requests.post(OLLAMA_URL, json=payload, timeout=120)
        response.raise_for_status()
        data = response.json()
        # Ollama يعيد قائمة "message" تحتوي role و content
        return data.get("message", {}).get("content", "")
    except requests.exceptions.RequestException as e:
        print("خطأ في الاتصال بـ Ollama:", e)
        return "عذراً، حدث خطأ في خادم الذكاء الاصطناعي."

بهذه الطريقة نستطيع لاحقًا تمرير محادثة كاملة (سياق متعدد الرسائل) وليس سؤالًا واحدًا فقط، مما يعطي البوت قدرة على التذكّر داخل الجلسة.

بناء بوت تيليجرام أساسي يتصل بـ Ollama

الآن ننتقل لملف bot.py ونبني بوتًا بسيطًا:

import os
from dotenv import load_dotenv
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, ContextTypes, filters

import requests

# تحميل متغيرات البيئة
load_dotenv()
TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")

OLLAMA_URL = "http://localhost:11434/api/chat"
MODEL_NAME = "llama3"

# دالة الاتصال بـ Ollama
def ask_ollama(messages):
    payload = {
        "model": MODEL_NAME,
        "messages": messages,
        "stream": False
    }

    try:
        response = requests.post(OLLAMA_URL, json=payload, timeout=120)
        response.raise_for_status()
        data = response.json()
        return data.get("message", {}).get("content", "")
    except requests.exceptions.RequestException as e:
        print("خطأ في الاتصال بـ Ollama:", e)
        return "عذراً، حدث خطأ في خادم الذكاء الاصطناعي."


# أمر /start
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.effective_user
    text = (
        f"مرحباً {user.first_name or ''} 👋\n"
        "أنا بوت ذكاء اصطناعي يعمل محلياً باستخدام Ollama.\n"
        "أرسل لي أي سؤال أو نص لأجيبك عليه."
    )
    await update.message.reply_text(text)


# معالجة الرسائل النصية العادية
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_message = update.message.text

    # هنا يمكننا إضافة تهيئة أو سياق ثابت
    messages = [
        {"role": "system", "content": "أنت مساعد ذكي يجيب باللغة العربية بشكل واضح ومختصر."},
        {"role": "user", "content": user_message}
    ]

    await update.message.chat.send_action("typing")

    answer = ask_ollama(messages)

    await update.message.reply_text(answer)


async def main():
    app = ApplicationBuilder().token(TELEGRAM_BOT_TOKEN).build()

    # ربط الأوامر
    app.add_handler(CommandHandler("start", start))

    # ربط الرسائل النصية
    app.add_handler(MessageHandler(filters.TEXT & (~filters.COMMAND), handle_message))

    print("البوت يعمل الآن...")
    await app.run_polling()


if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

بهذه البساطة، أصبح لدينا Telegram Bot Python Ollama يرد على كل رسالة نصية يرسلها المستخدم اعتمادًا على نموذج ذكاء اصطناعي محلي.

إضافة أوامر مخصصة للبوت

البوت الحقيقي عادةً لا يكتفي بالرد على الرسائل فقط، بل يحتوي على أوامر تنظّم التفاعل مثل /help، /reset، أو أوامر خاصة بمجال معيّن (مثل /summarize، /translate، ...).

أمر /help

async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = (
        "الأوامر المتاحة:\n"
        "/start - بداية الاستخدام والتعريف بالبوت\n"
        "/help - عرض هذه الرسالة\n"
        "/short <نص> - طلب رد مختصر جداً\n"
        "أرسل أي رسالة نصية للحصول على إجابة عادية."
    )
    await update.message.reply_text(text)

ثم نربطه في الدالة الرئيسية:

app.add_handler(CommandHandler("help", help_command))

أمر مخصص: /short

لنُنشئ أمرًا يطلب من النموذج إجابة قصيرة جدًا عن النص الذي يرسله المستخدم بعد الأمر.

async def short_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    # نص الأمر بعد /short
    user_text = " ".join(context.args)
    if not user_text:
        await update.message.reply_text("اكتب النص بعد الأمر /short للحصول على ملخص قصير.")
        return

    messages = [
        {"role": "system", "content": "لخّص الجواب في سطرين فقط باللغة العربية."},
        {"role": "user", "content": user_text}
    ]

    await update.message.chat.send_action("typing")
    answer = ask_ollama(messages)
    await update.message.reply_text(answer)

ونضيفه في main():

app.add_handler(CommandHandler("short", short_command))

بهذه الفكرة يمكنك بناء أوامر متخصصة كثيرة، وكل أمر يضبط نبرة وطول وسلوك الرد عن طريق الرسالة system التي نمرّرها إلى Ollama.

ربط البوت بقواعد بيانات لتتبع المستخدمين والمحادثات

أحد أهم نقاط القوة في Telegram Bot Python Ollama هو إمكانية تخصيص الردود بحسب المستخدم أو تخزين المحادثات لاحقًا لتحليلها (مع احترام الخصوصية بالطبع). هنا تحتاج إلى قاعدة بيانات، مثل:

  • SQLite: بسيط ومضمّن مع بايثون، مناسب للمشاريع الصغيرة.
  • PostgreSQL / MySQL: لمشاريع أكبر أو عند وجود خادم مستقل.

يمكنك الاستفادة من مفاهيم بناء API وإدارة المستخدمين الموجودة في: كيفية بناء نظام تسجيل مستخدمين باستخدام Django REST و Next.js لتطوير نظام تسجيل دخول وتفويض متكامل حول البوت لو أردت التعامل مع هوية المستخدم خارج تيليجرام.

مثال مبسّط باستخدام SQLite

أولًا، تثبيت مكتبة ORM خفيفة مثل SQLAlchemy (اختياري):

pip install sqlalchemy

ثم نُعرّف نموذج مستخدم بسيط في ملف جديد db.py مثلاً:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker

engine = create_engine("sqlite:///bot.db", echo=False)
SessionLocal = sessionmaker(bind=engine)
Base = declarative_base()

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    telegram_id = Column(Integer, unique=True, index=True)
    username = Column(String, nullable=True)

Base.metadata.create_all(bind=engine)

ثم نستخدمه في bot.py لتخزين المستخدم عند أول استخدام:

from db import SessionLocal, User

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.effective_user

    # حفظ المستخدم إن لم يكن موجوداً
    db = SessionLocal()
    db_user = db.query(User).filter_by(telegram_id=user.id).first()
    if not db_user:
        db_user = User(telegram_id=user.id, username=user.username)
        db.add(db_user)
        db.commit()
    db.close()

    text = (
        f"مرحباً {user.first_name or ''}\n"
        "تم تسجيلك في نظام البوت. أرسل أي رسالة للبدء."
    )
    await update.message.reply_text(text)

بعدها يمكنك ربط كل رسالة بمستخدمها في جدول آخر مثل conversations، وتخزين:

  • الرسالة الأصلية من المستخدم
  • رد الذكاء الاصطناعي
  • تاريخ ووقت الإرسال
  • اختيار النموذج المستخدم

هذا يمنحك قاعدة بيانات للمحادثات يمكنك تحليها، مثلاً باستخدام أدوات مثل Dash لإنشاء Dashboard تفاعلية في Python لمتابعة أداء البوت.

إدارة السياق (ذاكرة المحادثة) لكل مستخدم

من مميزات نماذج المحادثة في Ollama أنها تدعم قائمة رسائل messages بحيث تحتفظ بسياق الحوار. لكن يجب أن تبني طبقة إدارة السياق في كود البوت نفسه.

استخدام ذاكرة بسيطة في الذاكرة (In-Memory)

يمكنك استخدام قاموس في بايثون لتخزين المحادثة مؤقتًا لكل مستخدم:

from collections import defaultdict

# مفتاحه telegram_id وقيمته قائمة رسائل
user_conversations = defaultdict(list)

MAX_MESSAGES = 10  # أقصى عدد رسائل نحفظها لكل مستخدم

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.effective_user
    user_message = update.message.text

    history = user_conversations[user.id]

    # إضافة رسالة المستخدم الحالية
    history.append({"role": "user", "content": user_message})

    # اقتصاص التاريخ إن زاد عن الحد
    if len(history) > MAX_MESSAGES:
        history = history[-MAX_MESSAGES:]
        user_conversations[user.id] = history

    # نضيف رسالة System كبداية للسياق كل مرة (أو مرة واحدة)
    messages = [
        {"role": "system", "content": "أنت مساعد ذكي يجيب باللغة العربية."}
    ] + history

    await update.message.chat.send_action("typing")
    answer = ask_ollama(messages)

    # حفظ رد البوت في التاريخ أيضاً
    history.append({"role": "assistant", "content": answer})

    await update.message.reply_text(answer)

هذه الطريقة بسيطة لكنها تعتمد على ذاكرة الخادم، أي أن التاريخ سيضيع عند إعادة تشغيل البوت. لحفظ السياق بشكل مستمر، يمكنك تخزينه في قاعدة البيانات وربطه بمعرف المستخدم.

أفضل الممارسات لتحسين أداء Telegram Bot Python Ollama

  • اختيار نموذج مناسب: النماذج الكبيرة تعطي جودة أعلى ولكن تحتاج موارد أعلى وزمن استجابة أطول. جرّب نماذج متوسطة الحجم للاستعمال اليومي.
  • ضبط Prompt النظام: رسالة system تؤثر بشدة على سلوك البوت. حدّد بوضوح اللغة، طول الإجابة، ونبرة الرد.
  • تحديد طول التاريخ: لا ترسل تاريخًا طويلاً جدًا للنموذج مع كل مرة، لأن هذا يزيد فترة المعالجة واستهلاك الذاكرة.
  • استخدام البرمجة غير المتزامنة: مكتبة python-telegram-bot تدعم Async، وهو مهم لتجنّب حظر الخيوط أثناء انتظار رد Ollama. لمزيد من الفهم راجع: البرمجة غير المتزامنة في بايثون: تحسين الأداء باستخدام async و await.
  • تسجيل الأخطاء Logs: سجّل كل خطأ يحدث في الاتصال بـ Ollama، أو في Telegram API، حتى تستطيع تتبع المشاكل بسهولة.

أفكار لتطوير البوت وتحويله إلى نظام متكامل

  • لوحة تحكم Admin Dashboard لمتابعة عدد المستخدمين، عدد الأسئلة، أوقات الذروة، باستخدام Plotly Dash أو أدوات مشابهة.
  • نظام صلاحيات يحدد من يمكنه الوصول لأوامر معيّنة (أوامر إدارية، أو مهام خطيرة مثل تنفيذ أوامر على الخادم).
  • تكامل مع REST API لبناء خدمات مخصّصة (مثل البحث في قاعدة بيانات شركة، معرفة حالة طلب، أو غيرها).
  • تخصيص النموذج عبر نماذج Ollama مختلفة لكل غرض (موديل للبرمجة، موديل للترجمة، موديل للشرح التعليمي).
  • دعم وسائط أخرى مثل تلخيص ملفات PDF، أو قراءة صور وشرحها، عبر توسيع قدرات النموذج أو ربط خدمات مساعدة.

خلاصة

بناء Telegram Bot Python Ollama يمنحك قدرة قوية على تشغيل مساعد ذكي محلي دون الاعتماد على خدمات سحابية خارجية. استخدمنا Python لربط Telegram Bot API مع خادم Ollama عبر HTTP، أضفنا أوامر مخصصة، شرحنا فكرة ربط البوت بقواعد بيانات، وإدارة سياق المحادثة لكل مستخدم.

يمكنك البدء بالهيكل البسيط المقدم في هذا الشرح، ثم توسّع خطوة بخطوة نحو نظام متكامل يخدم احتياجاتك أو احتياجات شركتك، مع الحفاظ على خصوصية البيانات والتحكم الكامل في سير العمل.

حول المحتوى:

شرح كيفية بناء بوت تيليجرام يرسل ويرد باستخدام نماذج Ollama المحلية، مع ربطه بقواعد بيانات وأوامر مخصصة.

هل كان هذا مفيدًا لك؟

أضف تعليقك