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

البدء
كيف أقوم بتثبيت مكتبة Ollama لـ Python للبحث على الويب؟ قم بتثبيت الإصدار 0.6.0 أو الأحدث باستخدام pip install 'ollama>=0.6.0'. يحتوي هذا الإصدار على الدوال web_search و web_fetch.
pip install 'ollama>=0.6.0'
لإدارة بيئات Python والوحدات، يُنصح باستخدام uv، وهو مدير وحدات Python سريع، أو إعداد بيئة افتراضية باستخدام venv للحفاظ على تبعياتك منفصلة.
أنشئ مفتاح وصول من حسابك Ollama وحدد مفتاح الوصول كمتغير بيئة:
export OLLAMA_API_KEY="your_api_key"
على PowerShell لـ Windows:
$env:OLLAMA_API_KEY = "your_api_key"
البحث عبر الإنترنت الأساسي
أبسط طريقة للبحث عبر الإنترنت باستخدام Ollama:
import ollama
# بحث ويب بسيط
response = ollama.web_search("ما هو Ollama؟")
print(response)
الناتج:
results = [
{
"title": "Ollama",
"url": "https://ollama.com/",
"content": "النماذج السحابية متاحة الآن في Ollama. .."
},
{
"title": "ما هو Ollama؟ الميزات، التسعير، والتطبيقات",
"url": "https://www.walturn.com/insights/what-is-ollama",
"content": "خدماتنا. .."
},
{
"title": "دليل Ollama الكامل: التثبيت، الاستخدام، و أمثلة الكود",
"url": "https://collabnix.com/complete-ollama-guide",
"content": "انضم إلى خادم Discord الخاص بنا. .."
}
]
التحكم في عدد النتائج
import ollama
# الحصول على نتائج أكثر
response = ollama.web_search("أحدث أخبار الذكاء الاصطناعي", max_results=10)
for result in response.results:
print(f"📌 {result.title}")
print(f" {result.url}")
print(f" {result.content[:100]}. ..")
print()
استرداد محتوى الصفحة الكاملة
ما الفرق بين web_search و web_fetch في مكتبة Ollama لـ Python؟ يقوم web_search بإجراء استفسارات على الإنترنت ويعيد نتائج البحث متعددة مع العناوين، الروابط، والخلاصات. يقوم web_fetch باسترداد محتوى كامل لعنوان URL معين، ويعيد عنوان الصفحة، المحتوى بالتنسيق Markdown، والروابط. المحتوى Markdown الذي يُعاد بواسطة web_fetch مثالي للاستخدام المُزيد - إذا كنت بحاجة لتحويل HTML إلى Markdown في سياقات أخرى، راجع دليلنا حول تحويل HTML إلى Markdown باستخدام Python.
from ollama import web_fetch
result = web_fetch('https://ollama.com')
print(result)
الناتج:
WebFetchResponse(
title='Ollama',
content='[النماذج السحابية](https://ollama.com/blog/cloud-models) متاحة الآن في Ollama\n\n**المحادثة والبناء باستخدام النماذج المفتوحة**\n\n[تنزيل](https://ollama.com/download) [استكشاف النماذج](https://ollama.com/models)\n\nمتوفرة لنظام macOS، Windows، وLinux',
links=['https://ollama.com/', 'https://ollama.com/models', 'https://github.com/ollama/ollama']
)
الجمع بين البحث والاسترداد
نمط شائع هو البحث أولاً، ثم استرداد المحتوى الكامل من النتائج ذات الصلة:
from ollama import web_search, web_fetch
# البحث عن المعلومات
search_results = web_search("مزايا جديدة في Ollama 2025")
# استرداد المحتوى الكامل من النتيجة الأولى
if search_results.results:
first_url = search_results.results[0].url
full_content = web_fetch(first_url)
print(f"العنوان: {full_content.title}")
print(f"المحتوى: {full_content.content[:500]}. ..")
print(f"الروابط المكتشفة: {len(full_content.links)}")
بناء وكيل البحث
ما النماذج التي تعمل بشكل أفضل مع وكلاء البحث في Ollama؟ تعمل النماذج ذات الميزات القوية لاستخدام الأدوات بشكل أفضل، بما في ذلك qwen3، gpt-oss، والنماذج السحابية مثل qwen3:480b-cloud و deepseek-v3.1-cloud. للحصول على استخدامات متقدمة تتطلب مخرجات منظمة من هذه النماذج، راجع دليلنا حول نماذج LLM ذات المخرجات المنظمة باستخدام Ollama و Qwen3.
أولاً، اسحب نموذجًا قويًا:
ollama pull qwen3:4b
وكيل البحث البسيط
إليك وكيل بحث بسيط يمكنه اتخاذ قرارات مستقلة حول متى يجب أن يبحث:
from ollama import chat, web_fetch, web_search
available_tools = {'web_search': web_search, 'web_fetch': web_fetch}
messages = [{'role': 'user', 'content': "ما هي محرك Ollama الجديد"}]
while True:
response = chat(
model='qwen3:4b',
messages=messages,
tools=[web_search, web_fetch],
think=True
)
if response.message.thinking:
print('🧠 التفكير:', response.message.thinking[:200], '. ..')
if response.message.content:
print('💬 الرد:', response.message.content)
messages.append(response.message)
if response.message.tool_calls:
print('🔧 مكالمات الأدوات:', response.message.tool_calls)
for tool_call in response.message.tool_calls:
function_to_call = available_tools.get(tool_call.function.name)
if function_to_call:
args = tool_call.function.arguments
result = function_to_call(**args)
print('📥 النتيجة:', str(result)[:200], '. ..')
# قص النتيجة لتناسب حدود السياق
messages.append({
'role': 'tool',
'content': str(result)[:2000 * 4],
'tool_name': tool_call.function.name
})
else:
messages.append({
'role': 'tool',
'content': f'الاداة {tool_call.function.name} غير موجودة',
'tool_name': tool_call.function.name
})
else:
break
كيف أتعامل مع نتائج البحث عبر الإنترنت الكبيرة في Python؟ قص النتائج لتناسب حدود السياق. الطريقة الموصى بها هي قص سلسلة النتيجة إلى حوالي 8000 حرف (2000 رمز × 4 أحرف) قبل إرسالها إلى النموذج.
وكيل بحث متقدم مع معالجة الأخطاء
إليك إصدار محسن مع معالجة أخطاء أفضل:
from ollama import chat, web_fetch, web_search
import json
class SearchAgent:
def __init__(self, model: str = 'qwen3:4b'):
self.model = model
self.tools = {'web_search': web_search, 'web_fetch': web_fetch}
self.messages = []
self.max_iterations = 10
def query(self, question: str) -> str:
self.messages = [{'role': 'user', 'content': question}]
for iteration in range(self.max_iterations):
try:
response = chat(
model=self.model,
messages=self.messages,
tools=[web_search, web_fetch],
think=True
)
except Exception as e:
return f"حدث خطأ أثناء المحادثة: {e}"
self.messages.append(response.message)
# إذا لم تكن هناك مكالمات أدوات، فهناك إجابة نهائية
if not response.message.tool_calls:
return response.message.content or "لم يتم توليد إجابة"
# تنفيذ مكالمات الأدوات
for tool_call in response.message.tool_calls:
result = self._execute_tool(tool_call)
self.messages.append({
'role': 'tool',
'content': result,
'tool_name': tool_call.function.name
})
return "تم الوصول إلى عدد الإجراءات القصوى دون الحصول على إجابة نهائية"
def _execute_tool(self, tool_call) -> str:
func_name = tool_call.function.name
args = tool_call.function.arguments
if func_name not in self.tools:
return f"أداة غير معروفة: {func_name}"
try:
result = self.tools[func_name](**args)
# قص النتيجة لتناسب حدود السياق
result_str = str(result)
if len(result_str) > 8000:
result_str = result_str[:8000] + "... [مقصوص]"
return result_str
except Exception as e:
return f"خطأ في الأداة: {e}"
# الاستخدام
agent = SearchAgent(model='qwen3:4b')
answer = agent.query("ما هي الميزات الجديدة في Ollama؟")
print(answer)
البحث عبر الإنترنت غير المتزامن
هل يمكنني استخدام وظائف البحث عبر الإنترنت في مكتبة Ollama لـ Python مع الكود غير المتزامن؟ نعم، تدعم مكتبة Ollama لـ Python العمليات غير المتزامنة. استخدم AsyncClient للبحث والاسترداد عبر الإنترنت غير المتزامن في التطبيقات غير المتزامنة. للحصول على مقارنة بين الأداء في لغات مختلفة في سياقات خالية من الخادم، راجع تحليلنا حول أداء AWS Lambda عبر JavaScript، Python، وGolang.
import asyncio
from ollama import AsyncClient
async def async_search():
client = AsyncClient()
# أداء بحث متعدد في وقت واحد
tasks = [
client.web_search("مزايا Ollama"),
client.web_search("أدوات LLM محلية"),
client.web_search("وكلاء البحث الذكاء الاصطناعي"),
]
results = await asyncio.gather(*tasks)
for i, result in enumerate(results):
print(f"البحث {i + 1}:")
for r in result.results[:2]:
print(f" - {r.title}")
print()
# تشغيل البحث غير المتزامن
asyncio.run(async_search())
وكيل البحث غير المتزامن
import asyncio
from ollama import AsyncClient
async def async_research_agent(question: str):
client = AsyncClient()
messages = [{'role': 'user', 'content': question}]
while True:
response = await client.chat(
model='qwen3:4b',
messages=messages,
tools=[client.web_search, client.web_fetch],
)
messages.append(response.message)
if not response.message.tool_calls:
return response.message.content
# تنفيذ مكالمات الأدوات في وقت واحد
tool_tasks = []
for tool_call in response.message.tool_calls:
if tool_call.function.name == 'web_search':
task = client.web_search(**tool_call.function.arguments)
elif tool_call.function.name == 'web_fetch':
task = client.web_fetch(**tool_call.function.arguments)
else:
continue
tool_tasks.append((tool_call.function.name, task))
# جمع النتائج
for tool_name, task in tool_tasks:
result = await task
messages.append({
'role': 'tool',
'content': str(result)[:8000],
'tool_name': tool_name
})
# تشغيل
answer = asyncio.run(async_research_agent("ما الجديد في Python 3.13؟"))
print(answer)
طول السياق والأداء
ما طول السياق الذي يجب أن أضبطه لوكيل البحث في Python؟ ضع طول السياق إلى حوالي 32000 رمز للحصول على أداء معقول. تعمل وكلاء البحث بشكل أفضل مع طول السياق الكامل لأن web_search و web_fetch يمكن أن تعيد آلاف الرموز.
from ollama import chat, web_search
# ضع سياق أعلى للمهام التي تركز على البحث
response = chat(
model='qwen3:4b',
messages=[{'role': 'user', 'content': 'ابحث عن أحدث تطورات الذكاء الاصطناعي'}],
tools=[web_search],
options={
'num_ctx': 32768, # 32K سياق
}
)
دمج خادم MCP
توفير Ollama لخادم MCP لـ Python يسمح بإجراء بحث عبر الإنترنت في أي خادم MCP. للحصول على دليل شامل حول بناء خوادم MCP في Python مع إمكانيات البحث والتنقيب، راجع دليلنا التفصيلي حول بناء خوادم MCP في Python.
دمج Cline
قم بتكوين خوادم MCP في إعدادات Cline:
إدارة خوادم MCP → تكوين خوادم MCP → إضافة:
{
"mcpServers": {
"web_search_and_fetch": {
"type": "stdio",
"command": "uv",
"args": ["run", "path/to/web-search-mcp.py"],
"env": { "OLLAMA_API_KEY": "your_api_key_here" }
}
}
}
دمج Codex
أضف إلى ~/.codex/config.toml:
[mcp_servers.web_search]
command = "uv"
args = ["run", "path/to/web-search-mcp.py"]
env = { "OLLAMA_API_KEY" = "your_api_key_here" }
إنشاء خادم MCP الخاص بك
#!/usr/bin/env python3
"""خادم MCP بسيط لبحث Ollama عبر الإنترنت."""
import os
from mcp.server import Server
from mcp.types import Tool, TextContent
from ollama import web_search, web_fetch
app = Server("ollama-web-search")
@app.tool()
async def search_web(query: str, max_results: int = 5) -> str:
"""ابحث عبر الإنترنت عن معلومات."""
results = web_search(query, max_results=max_results)
output = []
for r in results.results:
output.append(f"**{r.title}**\n{r.url}\n{r.content}\n")
return "\n---\n".join(output)
@app.tool()
async def fetch_page(url: str) -> str:
"""استرداد محتوى كامل لصفحة ويب."""
result = web_fetch(url)
return f"# {result.title}\n\n{result.content}"
if __name__ == "__main__":
app.run()
أمثلة عملية
تُظهر هذه الأمثلة تطبيقات واقعية لواجهة برمجة التطبيقات لبحث Ollama عبر الإنترنت. يمكنك توسيع هذه الأنماط لبناء أنظمة أكثر تعقيدًا - على سبيل المثال، دمج نتائج البحث مع إنشاء PDF في Python لخلق تقارير بحثية.
مُلخص الأخبار
from ollama import chat, web_search
def summarize_news(topic: str) -> str:
# البحث عن أخبار حديثة
results = web_search(f"{topic} أحدث أخبار", max_results=5)
# تنسيق نتائج البحث للموديل
news_content = "\n\n".join([
f"**{r.title}**\n{r.content}"
for r in results.results
])
# طلب الموديل لملخص
response = chat(
model='qwen3:4b',
messages=[{
'role': 'user',
'content': f"قم بملخص هذه العناصر الإخبارية حول {topic}:\n\n{news_content}"
}]
)
return response.message.content
summary = summarize_news("الذكاء الاصطناعي")
print(summary)
مساعد البحث
from ollama import chat, web_search, web_fetch
from dataclasses import dataclass
@dataclass
class ResearchResult:
question: str
sources: list
answer: str
def research(question: str) -> ResearchResult:
# البحث عن معلومات ذات صلة
search_results = web_search(question, max_results=3)
# استرداد محتوى كامل من المصادر العليا
sources = []
full_content = []
for result in search_results.results[:3]:
try:
page = web_fetch(result.url)
sources.append(result.url)
full_content.append(f"المصدر: {result.url}\n{page.content[:2000]}")
except:
continue
# إنشاء إجابة شاملة
context = "\n\n---\n\n".join(full_content)
response = chat(
model='qwen3:4b',
messages=[{
'role': 'user',
'content': f"""بناءً على المصادر التالية، أجب عن هذا السؤال: {question}
المصادر:
{context}
قدم إجابة شاملة مع إشارات إلى المصادر."""
}]
)
return ResearchResult(
question=question,
sources=sources,
answer=response.message.content
)
# الاستخدام
result = research("كيف تعمل جدولة النماذج الجديدة في Ollama؟")
print(f"السؤال: {result.question}")
print(f"المصادر: {result.sources}")
print(f"الإجابة: {result.answer}")
النماذج الموصى بها
| النموذج | المعلمات | الأفضل لـ |
|---|---|---|
qwen3:4b |
4B | البحث المحلي السريع |
qwen3 |
8B | الوكلاء العامة |
gpt-oss |
متنوعة | المهام البحثية |
qwen3:480b-cloud |
480B | التفكير المعقد (سحابة) |
gpt-oss:120b-cloud |
120B | البحث الطويل (سحابة) |
deepseek-v3.1-cloud |
- | التحليل المتقدم (سحابة) |
الممارسات الموصى بها
- قص النتائج: قص نتائج الويب دائمًا لتتناسب مع حدود السياق (~8000 حرف)
- معالجة الأخطاء: تغليف مكالمات الأدوات في try/except للتعامل مع الفشل الشبكي
- الحد من التكرار: احترم حدود API لـ Ollama لبحث الويب
- طول السياق: استخدم ~32000 رمز لوكيل البحث
- التشغيل المتزامن: استخدم AsyncClient للعمليات المتزامنة
- الاختبار: اكتب اختبارات وحدة لوكيل البحث الخاص بك للتأكد من الموثوقية
- أساسيات Python: احتفظ بقائمة مصطلحات Python في متناول اليد للمرجع السريع حول القواعد والأنماط الشائعة
روابط مفيدة
- مدونة بحث Ollama عبر الإنترنت
- مكتبة Ollama لـ Python
- التوثيق الرسمي لـ Ollama
- مستودع Ollama على GitHub
- قائمة مصطلحات Python
- تحويل HTML إلى Markdown باستخدام Python: دليل شامل
- بناء خوادم MCP في Python: البحث والتنقيب
- نماذج LLM ذات المخرجات المنظمة: Ollama، Qwen3 و Python أو Go
- اختبارات الوحدات في Python
- أداء AWS Lambda: JavaScript مقابل Python مقابل Golang
- قائمة مصطلحات venv
- uv - مدير الوحدات، المشاريع، والبيئات لـ Python
- إنشاء PDF في Python - المكتبات والأمثلة