الدرس 9 من 22

بناء التطبيقات مع Ollama

التكامل مع Python

3 دقيقة للقراءة

مكتبة ollama الرسمية لـ Python توفر واجهة نظيفة وبايثونية لـ Ollama. لنبنِ تطبيقات حقيقية.

التثبيت

pip install ollama

الاستخدام الأساسي

التوليد البسيط

import ollama

# توليد نص أساسي
response = ollama.generate(
    model='llama3.2',
    prompt='Explain what an API is in one sentence.'
)

print(response['response'])
# "An API (Application Programming Interface) is a set of rules
#  that allows different software applications to communicate."

محادثات الدردشة

import ollama

# محادثة متعددة الأدوار
response = ollama.chat(
    model='llama3.2',
    messages=[
        {'role': 'system', 'content': 'You are a Python tutor.'},
        {'role': 'user', 'content': 'What is a list comprehension?'}
    ]
)

print(response['message']['content'])

الحفاظ على سياق المحادثة

import ollama

messages = [
    {'role': 'system', 'content': 'You are a helpful assistant.'}
]

def chat(user_message: str) -> str:
    """أرسل رسالة واحصل على رد، مع الحفاظ على السياق."""
    messages.append({'role': 'user', 'content': user_message})

    response = ollama.chat(
        model='llama3.2',
        messages=messages
    )

    assistant_message = response['message']['content']
    messages.append({'role': 'assistant', 'content': assistant_message})

    return assistant_message

# محادثة متعددة الأدوار
print(chat("What's the capital of France?"))
print(chat("What's the population there?"))  # السياق محفوظ
print(chat("And what language do they speak?"))  # لا يزال يعرف "فرنسا"

تدفق الردود

للمخرجات في الوقت الفعلي في التطبيقات:

import ollama

# تدفق الرموز أثناء توليدها
stream = ollama.chat(
    model='llama3.2',
    messages=[{'role': 'user', 'content': 'Write a haiku about coding'}],
    stream=True
)

for chunk in stream:
    print(chunk['message']['content'], end='', flush=True)

print()  # سطر جديد نهائي

التدفق مع مؤشر التقدم

import ollama
import sys

def stream_response(prompt: str, model: str = 'llama3.2') -> str:
    """تدفق الرد مع مخرجات في الوقت الفعلي."""
    full_response = []

    stream = ollama.chat(
        model=model,
        messages=[{'role': 'user', 'content': prompt}],
        stream=True
    )

    for chunk in stream:
        content = chunk['message']['content']
        full_response.append(content)
        sys.stdout.write(content)
        sys.stdout.flush()

    print()  # سطر جديد نهائي
    return ''.join(full_response)

response = stream_response("Explain recursion in 3 sentences")

توليد التضمينات

import ollama
import numpy as np

# تضمين واحد
response = ollama.embed(
    model='llama3.2',
    input='Python is a great programming language'
)

embedding = response['embeddings'][0]
print(f"بُعد التضمين: {len(embedding)}")

# تضمينات متعددة
texts = [
    "Python is great for AI",
    "JavaScript runs in browsers",
    "Python is excellent for machine learning"
]

response = ollama.embed(model='llama3.2', input=texts)
embeddings = response['embeddings']

# احسب التشابه
def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# Python-AI و Python-ML يجب أن يكونا أكثر تشابهاً
sim_01 = cosine_similarity(embeddings[0], embeddings[1])
sim_02 = cosine_similarity(embeddings[0], embeddings[2])
print(f"Python-AI vs JavaScript: {sim_01:.3f}")
print(f"Python-AI vs Python-ML: {sim_02:.3f}")

إدارة النماذج

import ollama

# اعرض جميع النماذج
models = ollama.list()
for model in models['models']:
    print(f"{model['name']}: {model['size'] / 1e9:.1f} GB")

# اسحب نموذج
ollama.pull('mistral')

# اعرض تفاصيل النموذج
info = ollama.show('llama3.2')
print(info['modelfile'])

# احذف نموذج
ollama.delete('old-model')

خيارات مخصصة

import ollama

response = ollama.chat(
    model='llama3.2',
    messages=[{'role': 'user', 'content': 'Write creative story ideas'}],
    options={
        'temperature': 1.2,      # أكثر إبداعاً
        'top_p': 0.95,
        'num_ctx': 4096,         # سياق أكبر
        'num_predict': 500,      # أقصى رموز للتوليد
        'stop': ['THE END']      # تسلسل إيقاف مخصص
    }
)

معالجة الأخطاء

import ollama
from ollama import ResponseError

def safe_generate(prompt: str, model: str = 'llama3.2') -> str:
    """توليد مع معالجة أخطاء صحيحة."""
    try:
        response = ollama.generate(model=model, prompt=prompt)
        return response['response']

    except ResponseError as e:
        if 'not found' in str(e):
            print(f"النموذج {model} غير موجود. جاري السحب...")
            ollama.pull(model)
            return safe_generate(prompt, model)
        raise

    except ConnectionError:
        print("خادم Ollama لا يعمل. ابدأه بـ: ollama serve")
        raise

# الاستخدام
result = safe_generate("Hello!", "llama3.2")

دعم Async

import asyncio
import ollama

async def async_chat(messages: list) -> str:
    """دردشة غير متزامنة مع Ollama."""
    client = ollama.AsyncClient()
    response = await client.chat(
        model='llama3.2',
        messages=messages
    )
    return response['message']['content']

async def main():
    # طلبات متزامنة
    tasks = [
        async_chat([{'role': 'user', 'content': 'What is 2+2?'}]),
        async_chat([{'role': 'user', 'content': 'What is 3+3?'}]),
        async_chat([{'role': 'user', 'content': 'What is 4+4?'}])
    ]
    results = await asyncio.gather(*tasks)
    for i, result in enumerate(results):
        print(f"النتيجة {i+1}: {result}")

asyncio.run(main())

بناء روبوت دردشة CLI بسيط

import ollama

def chatbot(model: str = 'llama3.2'):
    """روبوت دردشة تفاعلي مع سجل محادثات."""
    messages = [
        {'role': 'system', 'content': 'You are a helpful assistant.'}
    ]

    print(f"روبوت الدردشة جاهز (يستخدم {model}). اكتب 'quit' للخروج.\n")

    while True:
        user_input = input("أنت: ").strip()

        if user_input.lower() in ['quit', 'exit', 'q']:
            print("وداعاً!")
            break

        if not user_input:
            continue

        messages.append({'role': 'user', 'content': user_input})

        print("المساعد: ", end='', flush=True)

        stream = ollama.chat(
            model=model,
            messages=messages,
            stream=True
        )

        response_content = []
        for chunk in stream:
            content = chunk['message']['content']
            response_content.append(content)
            print(content, end='', flush=True)

        print()  # سطر جديد بعد الرد

        messages.append({
            'role': 'assistant',
            'content': ''.join(response_content)
        })

if __name__ == '__main__':
    chatbot()

مكتبة Python تجعل تكامل Ollama بسيطاً وبايثونياً. في الدرس التالي، سنستخدم LangChain لتطبيقات أكثر تطوراً. :::

اختبار

الوحدة 3: بناء التطبيقات مع Ollama

خذ الاختبار