API веб-поиска Ollama в Python

AI-поисковые агенты с помощью Python и Ollama

Содержимое страницы

Библиотека Python для Ollama теперь включает в себя нативные возможности поиска в интернете с Ollama. С несколькими строками кода вы можете дополнить свои локальные LLMs актуальной информацией из интернета, снижая вероятность галлюцинаций и повышая точность.

цифровое пространство

Начало работы

Как установить библиотеку Python для Ollama с поиском в интернете? Установите версию 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("Что такое 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 в Python для Ollama? 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='[Облачные модели](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)}")

Создание поискового агента

Какие модели Python лучше всего подходят для поисковых агентов Ollama? Лучше всего работают модели с сильными возможностями использования инструментов, включая qwen3, gpt-oss и облачные модели, такие как qwen3:480b-cloud и deepseek-v3.1-cloud. Для более сложных случаев использования, требующих структурированных выходных данных от этих моделей, ознакомьтесь с нашим руководством по LLMs с структурированным выводом с использованием 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 с асинхронным кодом? Да, библиотека Python для Ollama поддерживает асинхронные операции. Используйте AsyncClient для неблокирующих операций поиска и получения в асинхронных приложениях. Для сравнения производительности между Python и другими языками в серверных контекстах см. наш анализ производительности 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 предоставляет Python-сервер MCP, который позволяет выполнять веб-поиск в любом клиенте 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} последние новости", 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 - Продвинутый анализ (облако)

Лучшие практики

  1. Обрезка результатов: Всегда обрезайте результаты веб-поиска, чтобы они помещались в ограничения контекста (~8000 символов)
  2. Обработка ошибок: Оберните вызовы инструментов в try/except для обработки сбоев сети
  3. Ограничение скорости: Уважайте ограничения скорости API Ollama для веб-поиска
  4. Длина контекста: Используйте ~32000 токенов для поисковых агентов
  5. Асинхронность для масштабируемости: Используйте AsyncClient для одновременных операций
  6. Тестирование: Напишите модульные тесты для ваших поисковых агентов, чтобы обеспечить их надежность
  7. Основы Python: Держите под рукой шпаргалку по Python для быстрого доступа к синтаксису и общим шаблонам

Полезные ссылки