بناء التطبيقات مع 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 لتطبيقات أكثر تطوراً. :::