Знакомо чувство, когда хотите понять работу ИИ-ассистента, но все туториалы предлагают подключить десяток библиотек и получить готовую коробку? LangChain, LlamaIndex, AutoGen — мощные инструменты, но они скрывают самое интересное: как на самом деле происходит диалог между кодом и языковой моделью.
А ведь принцип на удивление простой: отправил список сообщений — получил ответ. Всё. Серьёзно. Давайте построим чат-бота с нуля за минуту и разберёмся, что происходит за кулисами каждого AI-ассистента.
Что мы получим в итоге?
Консольный чат-бот, который:
Прежде чем писать код, нужно получить две вещи:
Ключ API от OpenRouter. Зайдите на https://openrouter.ai, создайте аккаунт и сгенерируйте API-ключ. Для начала подойдёт бесплатная модель — никакой кредитной карты не нужно.
Файл `.env` для хранения ключа. Создайте в корне проекта файл `.env` и добавьте туда:
OPENROUTER_API_KEY=ваш_ключ
Импорт и настройка
import os, requests, json
import dotenv
dotenv.load_dotenv()
url = "https://openrouter.ai/api/v1/chat/completions"
api_key = os.getenv("OPENROUTER_API_KEY")
model_name = "openrouter/free"
Здесь мы загружаем переменные окружения из .env файла. dotenv — единственная внешняя зависимость нашего проекта, и она нужна только для удобства: чтобы не хранить секреты прямо в коде.
Адрес url указывает на стандартный OpenAI-совместимый API. Почти все современные LLM-провайдеры используют одинаковый формат запросов — это значит что наш бот легко адаптировать для OpenAI, Anthropic или любых других моделей.
Управление контекстом диалога
class Context:
def __init__(self):
self.prompt = []
def add(self, role, message):
self.prompt.append({"role": role, "content": message})
Это самая важная часть кода. Языковые модели не «помнят» предыдущие сообщения — они получают на вход весь список сообщений целиком при каждом запросе. Поэтому мы храним всю историю диалога в списке self.prompt.
Каждое сообщение состоит из двух частей: роль (`system`, `user`, `assistant`) и текст. Системное сообщение задаёт поведение бота, сообщения пользователя — вопросы, ответы ассистента — его реакции.
Отправка запроса к модели
def send_to_llm(context):
data = {
"model": model_name,
"messages": context.prompt
}
headers = {
"Authorization": "Bearer " + api_key
}
response = requests.post(url,
headers=headers, data=json.dumps(data)
)
response.raise_for_status()
result = response.json()
return result["choices"][0]["message"]["content"]
requests.post отправляет POST-запрос с JSON-данными на адрес API. В ответе модель возвращает JSON, из которого нам нужен только текст — result["choices"][0]["message"]["content"].
Обратите внимание на response.raise_for_status() — это проверка на ошибки. Если API вернёт ошибку (неверный ключ, лимит запросов), код остановится с понятным сообщением, а не будет молча глючить.
Основной цикл общения
context = Context()
context.add("system", "Ты помощник для программистов")
print("Введите запрос")
while True:
print("> ", end="")
query = input().strip()
if query == "":
continue
if query.lower() in ["q", "quit"]:
break
context.add("user", query)
answer = send_to_llm(context)
print(answer)
context.add("assistant", answer)
Простой бесконечный цикл: считали ввод → добавил в контекст → отправили модели → вывели ответ → добавили ответ в контекст. Обратите внимание что мы добавляем и вопрос, и ответ — так модель «видит» всю переписку при следующем запросе.
Небольшой нюанс: модель не имеет собственной памяти. Каждый раз ей заново отправляется вся история диалога. На длинных беседах это может стать дорогим — но для начала это идеальный подход.
Многие думают что для создания AI-бота нужна сложная инфраструктура. Но на деле формат диалога стандартен — одинаков для GPT, Claude, Llama и десятков других моделей. Освоив этот паттерн, вы поймете принцип работы любого AI-ассистента: это просто функция, которая принимает список сообщений и возвращает новое.
Вот что уже можете делать с этим кодом:
Простой AI чат-бот на Python — это не учебный проект на вечер, а фундамент для понимания того как работают современные ИИ-ассистенты. Буквально несколько строк кода, одна внешняя библиотека и бесплатный API-ключ — и получаете работающего бота с контекстом диалога.
Главный вывод: за каждой «магией» AI скрывается обычный HTTP-запрос. Модель не «думает» и не «понимает» — она предсказывает следующее слово на основе списка сообщений, которые ей отправляете. Понимание этого принципа — ключ к созданию любых AI-инструментов, от простых ботов до сложных агентных систем.
Попробуйте запустить этот код, поэкспериментируйте с системными сообщениями и моделями. А потом спросите себя: а что если добавить боту доступ к базе данных? Вопросы важнее готовых ответов.