حول المحتوى:
شرح كيفية بناء بوت تيليجرام يرسل ويرد باستخدام نماذج Ollama المحلية، مع ربطه بقواعد بيانات وأوامر مخصصة.
في هذا الشرح سنتعلم خطوة بخطوة كيفية بناء بوت تيليجرام ذكي باستخدام Python مع نماذج الذكاء الاصطناعي المحلية عبر Ollama، بحيث يستطيع البوت استقبال الرسائل من المستخدمين، إرسالها لنموذج ذكاء اصطناعي يعمل على جهازك، ثم إعادة الرد للمستخدم بطريقة سلسة.
الهدف هو بناء هيكل قابل للتوسّع يمكن وصله لاحقًا بـقواعد بيانات، أو أوامر مخصصة، أو حتى ربطه مع أنظمة خلفية أخرى (مثل Django REST أو Dash). إذا لم تكن قد تعرّفت على أداة Ollama من قبل، يمكنك مراجعة: دليل شامل عن أداة Ollama مميزاتها وكيفية عملها و أشهر نماذج الذكاء الاصطناعي المتوفرة على Ollama.
الجمع بين بايثون وOllama وبوت تيليجرام يعطيك:
في هذا المقال سنركز على الجانب العملي لبناء Telegram Bot Python Ollama، مع شرح الكود الكامل وأفضل الممارسات.
تأكد أن لديك Python 3.9 أو أعلى، ثم أنشئ بيئة افتراضية (اختياري لكن مُفضّل):
python -m venv venv
source venv/bin/activate # على لينكس/ماك
# أو
venv\Scripts\activate # على ويندوز
ثم ثبّت الحزم التي سنحتاجها:
pip install python-telegram-bot requests python-dotenv قم بتنصيب Ollama حسب نظام التشغيل لديك (Windows, macOS, Linux) من موقعه الرسمي. ثم اختر نموذجًا مناسبًا. يمكنك معرفة تفاصيل النماذج من: أشهر نماذج الذكاء الاصطناعي المتوفرة على Ollama.
مثال على سحب نموذج:
ollama pull llama3 بعدها تأكد أن خادم Ollama يعمل (افتراضيًا على http://localhost:11434).
.env بجانب مشروعك:TELEGRAM_BOT_TOKEN=ضع_التوكن_هنا لنستخدم هيكل بسيط يمكن تطويره لاحقًا:
project/
├─ bot.py
├─ .env
└─ requirements.txt
كل منطق البوت سيكون داخل bot.py في البداية، ثم نراه كيف نفصله لو أردنا.
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 "عذراً، حدث خطأ في خادم الذكاء الاصطناعي."
بهذه الطريقة نستطيع لاحقًا تمرير محادثة كاملة (سياق متعدد الرسائل) وليس سؤالًا واحدًا فقط، مما يعطي البوت قدرة على التذكّر داخل الجلسة.
الآن ننتقل لملف 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، ...).
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))
لنُنشئ أمرًا يطلب من النموذج إجابة قصيرة جدًا عن النص الذي يرسله المستخدم بعد الأمر.
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 هو إمكانية تخصيص الردود بحسب المستخدم أو تخزين المحادثات لاحقًا لتحليلها (مع احترام الخصوصية بالطبع). هنا تحتاج إلى قاعدة بيانات، مثل:
يمكنك الاستفادة من مفاهيم بناء API وإدارة المستخدمين الموجودة في: كيفية بناء نظام تسجيل مستخدمين باستخدام Django REST و Next.js لتطوير نظام تسجيل دخول وتفويض متكامل حول البوت لو أردت التعامل مع هوية المستخدم خارج تيليجرام.
أولًا، تثبيت مكتبة 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 بحيث تحتفظ بسياق الحوار. لكن يجب أن تبني طبقة إدارة السياق في كود البوت نفسه.
يمكنك استخدام قاموس في بايثون لتخزين المحادثة مؤقتًا لكل مستخدم:
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)
هذه الطريقة بسيطة لكنها تعتمد على ذاكرة الخادم، أي أن التاريخ سيضيع عند إعادة تشغيل البوت. لحفظ السياق بشكل مستمر، يمكنك تخزينه في قاعدة البيانات وربطه بمعرف المستخدم.
system تؤثر بشدة على سلوك البوت. حدّد بوضوح اللغة، طول الإجابة، ونبرة الرد.python-telegram-bot تدعم Async، وهو مهم لتجنّب حظر الخيوط أثناء انتظار رد Ollama. لمزيد من الفهم راجع: البرمجة غير المتزامنة في بايثون: تحسين الأداء باستخدام async و await. بناء Telegram Bot Python Ollama يمنحك قدرة قوية على تشغيل مساعد ذكي محلي دون الاعتماد على خدمات سحابية خارجية. استخدمنا Python لربط Telegram Bot API مع خادم Ollama عبر HTTP، أضفنا أوامر مخصصة، شرحنا فكرة ربط البوت بقواعد بيانات، وإدارة سياق المحادثة لكل مستخدم.
يمكنك البدء بالهيكل البسيط المقدم في هذا الشرح، ثم توسّع خطوة بخطوة نحو نظام متكامل يخدم احتياجاتك أو احتياجات شركتك، مع الحفاظ على خصوصية البيانات والتحكم الكامل في سير العمل.
شرح كيفية بناء بوت تيليجرام يرسل ويرد باستخدام نماذج Ollama المحلية، مع ربطه بقواعد بيانات وأوامر مخصصة.
مساحة اعلانية