Использование Ollama Web Search API в Python
Создайте ИИ-агенты для поиска с помощью Python и 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, чтобы изолировать зависимости.
Создайте API-ключ на вашем аккаунте Ollama и установите его как переменную окружения:
export OLLAMA_API_KEY="your_api_key"
В Windows PowerShell:
$env:OLLAMA_API_KEY = "your_api_key"
Базовый веб-поиск
Самый простой способ выполнить поиск в вебе с помощью Ollama:
import ollama
# Простой веб-поиск
response = ollama.web_search("What is Ollama?")
print(response)
Вывод:
results = [
{
"title": "Ollama",
"url": "https://ollama.com/",
"content": "Cloud models are now available in Ollama..."
},
{
"title": "What is Ollama? Features, Pricing, and Use Cases",
"url": "https://www.walturn.com/insights/what-is-ollama",
"content": "Our services..."
},
{
"title": "Complete Ollama Guide: Installation, Usage & Code Examples",
"url": "https://collabnix.com/complete-ollama-guide",
"content": "Join our Discord Server..."
}
]
Управление количеством результатов
import ollama
# Получение большего количества результатов
response = ollama.web_search("latest AI news", 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 выполняет запросы в интернет и возвращает несколько результатов поиска с заголовками, URL и сниппетами. Функция 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='[Cloud models](https://ollama.com/blog/cloud-models) are now available in Ollama\n\n**Chat & build with open models**\n\n[Download](https://ollama.com/download) [Explore models](https://ollama.com/models)\n\nAvailable for macOS, Windows, and 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 new features 2025")
# Загрузка полного содержания из первого результата
if search_results.results:
first_url = search_results.results[0].url
full_content = web_fetch(first_url)
print(f"Title: {full_content.title}")
print(f"Content: {full_content.content[:500]}...")
print(f"Links found: {len(full_content.links)}")
Создание агента поиска
Какие модели Python лучше всего работают с агентами поиска Ollama? Лучше всего работают модели с сильными возможностями использования инструментов (tool-use), включая qwen3, gpt-oss, а также облачные модели, такие как qwen3:480b-cloud и deepseek-v3.1-cloud. Для более продвинутых сценариев, требующих структурированного вывода от этих моделей, ознакомьтесь с нашим руководством по LLM со структурированным выводом с использованием Ollama и Qwen3. Когда инструменты или режим JSON возвращают данные, которым вы доверяете, статья Валидация структурированного вывода LLM на Python, которой можно доверять охватывает парсинг, проверки с помощью Pydantic, повторные попытки и тестирование на стороне приложения.
Сначала загрузите подходящую модель:
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': "what is ollama's new engine"}]
while True:
response = chat(
model='qwen3:4b',
messages=messages,
tools=[web_search, web_fetch],
think=True
)
if response.message.thinking:
print('🧠 Thinking:', response.message.thinking[:200], '...')
if response.message.content:
print('💬 Response:', response.message.content)
messages.append(response.message)
if response.message.tool_calls:
print('🔧 Tool calls:', 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('📥 Result:', 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 {tool_call.function.name} not found',
'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"Error during chat: {e}"
self.messages.append(response.message)
# Если нет вызовов инструментов, у нас есть окончательный ответ
if not response.message.tool_calls:
return response.message.content or "No response generated"
# Выполнение вызовов инструментов
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 "Max iterations reached without final answer"
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"Unknown tool: {func_name}"
try:
result = self.tools[func_name](**args)
# Усечение для лимитов контекста
result_str = str(result)
if len(result_str) > 8000:
result_str = result_str[:8000] + "... [truncated]"
return result_str
except Exception as e:
return f"Tool error: {e}"
# Использование
agent = SearchAgent(model='qwen3:4b')
answer = agent.query("What are the latest features in Ollama?")
print(answer)
Асинхронный веб-поиск
Можно ли использовать веб-поиск Ollama Python с асинхронным кодом? Да, библиотека Ollama на Python поддерживает асинхронные операции. Используйте AsyncClient для неблокирующих операций веб-поиска и загрузки в асинхронных приложениях.
import asyncio
from ollama import AsyncClient
async def async_search():
client = AsyncClient()
# Выполнение нескольких поисков одновременно
tasks = [
client.web_search("Ollama features"),
client.web_search("local LLM tools"),
client.web_search("AI search agents"),
]
results = await asyncio.gather(*tasks)
for i, result in enumerate(results):
print(f"Search {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("What's new in 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': 'Research the latest AI developments'}],
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()
Практические примеры
Эти примеры демонстрируют реальные применения API веб-поиска Ollama. Вы можете расширить эти паттерны, чтобы создать более сложные системы; например, комбинируя результаты поиска с генерацией PDF на Python для создания исследовательских отчетов.
Суммаризатор новостей
from ollama import chat, web_search
def summarize_news(topic: str) -> str:
# Поиск последних новостей
results = web_search(f"{topic} latest news", 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"Summarize these news items about {topic}:\n\n{news_content}"
}]
)
return response.message.content
summary = summarize_news("artificial intelligence")
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"Source: {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"""Based on the following sources, answer this question: {question}
Sources:
{context}
Provide a comprehensive answer with citations to the sources."""
}]
)
return ResearchResult(
question=question,
sources=sources,
answer=response.message.content
)
# Использование
result = research("How does Ollama's new model scheduling work?")
print(f"Question: {result.question}")
print(f"Sources: {result.sources}")
print(f"Answer: {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: WebSearch & Scrape
- LLM со структурированным выводом: Ollama, Qwen3 & Python или Go