Туториал 1: Первый агент за 30 минут

Создаём ReAct-агента, который ищет информацию в интернете и отвечает на вопросы.
Без фреймворков — только Python + Ollama.

← Туториалы · Команда агентов → · 🇬🇧 English


Что вы сделаете

Агента, который:

  1. Получает вопрос пользователя
  2. Решает, нужно ли искать информацию
  3. Если нужно — ищет (имитация поиска)
  4. Формулирует ответ на основе найденного

Не установили Ollama? Сначала basics/ или getting-started.md — установка за 10 минут.
Не знакомы с AI-терминами? basics/glossary.ru.md — словарь на 35 терминов.

Шаг 1: Проверяем окружение

# Проверьте, что Ollama работает
curl http://localhost:11434/api/version

# Убедитесь, что модель скачана
ollama pull qwen3.5:4b

Шаг 2: Пишем ядро агента

Создайте файл my_first_agent.py:

import requests
import json

OLLAMA_API = "http://localhost:11434/api/chat"
MODEL = "qwen3.5:4b"


def search_web(query: str) -> str:
    """
    Имитация поиска в интернете.
    В реальном проекте здесь был бы вызов Google Search API,
    DuckDuckGo или векторного поиска.
    """
    database = {
        "погода москва": "В Москве сейчас +18°C, облачно",
        "погода лондон": "В Лондоне +15°C, дождь",
        "столица франции": "Столица Франции — Париж",
        "python создатель": "Python создал Гвидо ван Россум в 1991 году",
        "что такое ai агент": (
            "AI-агент — это программа, которая использует языковую модель "
            "для принятия решений и вызова инструментов"
        ),
    }
    
    # Ищем по ключевым словам
    for key, value in database.items():
        if key in query.lower():
            return value
    
    return f"Информация по запросу '{query}' не найдена в локальной БД"


# Описываем инструмент для модели
TOOLS = [
    {
        "type": "function",
        "function": {
            "name": "search_web",
            "description": (
                "Поиск информации в интернете. "
                "Используй когда нужно узнать факты, погоду, даты."
            ),
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "description": "Поисковый запрос"
                    }
                },
                "required": ["query"]
            }
        }
    }
]


def agent_loop(user_input: str, max_steps: int = 5) -> str:
    """
    ReAct-цикл агента:
    1. Спросить модель
    2. Если модель вызывает инструмент — выполнить
    3. Вернуть результат модели
    4. Повторять, пока модель не ответит
    """
    
    messages = [
        {
            "role": "system",
            "content": (
                "Ты — полезный ассистент. Если тебе нужно узнать "
                "какую-то информацию — используй search_web. "
                "Не угадывай факты, лучше поищи."
            )
        },
        {"role": "user", "content": user_input}
    ]
    
    for step in range(max_steps):
        print(f"\n  [Шаг {step + 1}] Отправляю запрос модели...")
        
        response = requests.post(OLLAMA_API, json={
            "model": MODEL,
            "messages": messages,
            "tools": TOOLS,
            "stream": False
        })
        
        msg = response.json()["message"]
        messages.append(msg)
        
        # Модель хочет вызвать инструмент?
        if msg.get("tool_calls"):
            for tc in msg["tool_calls"]:
                name = tc["function"]["name"]
                args = json.loads(tc["function"]["arguments"])
                
                print(f"  [Шаг {step + 1}] Вызываю {name}({args})")
                
                # Выполняем инструмент
                result = search_web(**args)
                print(f"  [Шаг {step + 1}] Результат: {result}")
                
                messages.append({
                    "role": "tool",
                    "name": name,
                    "content": json.dumps({"result": result})
                })
        else:
            # Модель решила ответить
            answer = msg["content"]
            print(f"  [Шаг {step + 1}] Ответ модели получен")
            return answer
    
    return "Агент не смог выполнить задачу за отведённое число шагов"


# === Точка входа ===
if __name__ == "__main__":
    print("🧠 Мой первый AI-агент")
    print("=" * 40)
    
    while True:
        user_input = input("\n❓ Спроси что-нибудь (или 'exit'): ")
        if user_input.lower() == "exit":
            break
        
        result = agent_loop(user_input)
        print(f"\n📋 Ответ: {result}")

Шаг 3: Запускаем

python my_first_agent.py

Попробуйте спросить:


Шаг 4: Что вы увидите

🧠 Мой первый AI-агент

❓ Спроси что-нибудь (или 'exit'): Какая погода в Москве?

  [Шаг 1] Отправляю запрос модели...
  [Шаг 1] Вызываю search_web({'query': 'погода москва'})
  [Шаг 1] Результат: В Москве сейчас +18°C, облачно
  [Шаг 2] Отправляю запрос модели...
  [Шаг 2] Ответ модели получен

📋 Ответ: В Москве сейчас +18°C, облачно. 
           Это комфортная температура для прогулок.

Как это работает

Вы: «Какая погода в Москве?»

1. Модель получает вопрос + описание инструмента search_web
2. Модель решает: «Нужно поискать» → вызывает search_web(query="погода москва")
3. Система выполняет search_web, возвращает результат
4. Модель получает результат → формулирует ответ
5. Модель решает: «Данных достаточно» → отвечает пользователю

Что дальше

Теперь у вас есть работающий агент! Дальше:

  1. Замените search_web на реальный API — DuckDuckGo, Google, или векторный поиск
  2. Добавьте больше инструментов — калькулятор, чтение файлов, перевод
  3. Соберите команду агентов → 02-agent-team.md

Полный код

Весь код этого туториала — один файл my_first_agent.py (100 строк). Это минимальная реализация агента, которая даёт понимание, как всё работает «под капотом».



В разделе: 01-first-agent · 02-agent-team · 03-coding-agent
Связанные разделы: AI-агенты · Нулевой уровень · Локальные модели
Навигация: ← Туториалы · ↑ На главную · 🇬🇧 English