Интеграция с Code Execution Sandbox для сложных вычислений

50 минут Урок 13

Введение: Почему LLM плохи в математике (и как это исправить)

Добро пожаловать на урок, который меняет правила игры. Если вы работали с языковыми моделями достаточно долго, вы наверняка сталкивались с одной неприятной особенностью: они могут написать сонет в стиле Шекспира, но ошибаются при умножении трехзначных чисел.

Почему так происходит?

Традиционные LLM — это вероятностные машины. Они не «вычисляют», они предсказывают следующий токен. Для модели ответ на вопрос «сколько будет 234 * 567?» — это не результат работы арифметического логического устройства (ALU), а попытка вспомнить, какое число чаще всего следует за этой последовательностью символов в обучающей выборке. Это называется галлюцинацией вычислений.

Code Execution (Выполнение кода) решает эту проблему радикально. Вместо того чтобы заставлять модель симулировать вычисления, мы даем ей возможность написать программу на Python, выполнить её в защищенной песочнице (Sandbox) и использовать точный результат вывода программы для формирования ответа.

В этом уроке мы разберем, как интегрировать Code Execution в Gemini 3 API, чтобы решать задачи, требующие сложной логики, математики и обработки данных.

Архитектура Code Execution Sandbox

Важно понимать, что происходит «под капотом», когда вы активируете эту функцию. Это не просто генерация кода (как делает обычный чат-бот). Это цикл ReAct (Reasoning + Acting), встроенный в инфраструктуру модели.

  1. Интент: Модель понимает, что для ответа на вопрос (например, «Построй график функции...» или «Рассчитай аннуитетный платеж...») ей не хватает внутренних знаний.
  2. Генерация: Вместо текста ответа модель генерирует блок кода на Python.
  3. Выполнение: Этот код перехватывается на стороне Google и отправляется в изолированную виртуальную среду (Sandbox).
  4. Результат: Песочница возвращает результат (текст из print(), значения переменных или даже растровое изображение графика).
  5. Синтез: Модель получает результат выполнения кода как часть контекста и формулирует окончательный ответ пользователю на естественном языке.

Главное преимущество здесь — детерминизм. Python не галлюцинирует при сложении чисел.

python
import google.generativeai as genai
import os

# Настройка API ключа
genai.configure(api_key=os.environ["GOOGLE_API_KEY"])

# В Gemini 3 (и поздних 1.5) активация Code Execution делается через аргумент tools.
# Мы явно указываем модели, что у нее есть доступ к интерпретатору кода.

model = genai.GenerativeModel(
    model_name='gemini-3.0-pro',
    tools='code_execution'
)

# Пример запроса, который требует вычислений
prompt = """
У меня есть кредит на 5,000,000 рублей под 14.5% годовых на 15 лет.
Рассчитай ежемесячный аннуитетный платеж и общую сумму переплаты.
Выведи точные цифры.
"""

response = model.generate_content(prompt)

# Вывод результата
print(response.text)

Анализ поведения модели

В примере выше, если вы посмотрите в структуру объекта response, вы увидите нечто интересное. Ответ содержит не только финальный текст, но и специальную часть parts, в которой находится executable_code (код, который написала модель) и code_execution_result (то, что вернул Python).

Это критически важно для отладки. Иногда модель может написать синтаксически верный код, но логически ошибочный. Имея доступ к истории выполнения, вы можете проверить логику модели.

Доступные библиотеки

Песочница Gemini не пустая. В ней предустановлен стандартный набор библиотек для Data Science, что делает её мощным аналитическим инструментом:

  • NumPy: для матричных операций и сложной математики.
  • Pandas: для обработки табличных данных.
  • Matplotlib: для визуализации.
  • Scipy: для научных расчетов.
  • Scikit-learn: для базового ML.

Обратите внимание: доступа в интернет из песочницы нет. Вы не можете сделать pip install или requests.get(). Модель может работать только с теми данными, которые вы передали ей в контексте, или которые она сгенерировала сама.

python
# Продвинутый пример: Моделирование методом Монте-Карло
# Мы просим модель решить вероятностную задачу, которую невозможно решить "в уме".

complex_prompt = """
Напиши программу на Python, чтобы симулировать 100,000 бросков двух игральных костей.
Какова вероятность того, что сумма выпавших чисел будет равна 7?
Сравни полученный эмпирический результат с теоретической вероятностью (6/36).
"""

response = model.generate_content(complex_prompt)

# Мы можем извлечь сам код, чтобы убедиться, что симуляция честная
for part in response.candidates[0].content.parts:
    if part.executable_code:
        print("--- СГЕНЕРИРОВАННЫЙ КОД ---")
        print(part.executable_code.code)
    
    if part.code_execution_result:
        print("--- РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ ---")
        print(part.code_execution_result.output)

print("--- ИТОГОВЫЙ ОТВЕТ МОДЕЛИ ---")
print(response.text)

Function Calling vs Code Execution: Что выбрать?

В этом модуле мы изучали оба подхода. Возникает резонный вопрос: когда использовать вызов функций (Function Calling), а когда — выполнение кода (Code Execution)?

КритерийFunction CallingCode Execution
ЗадачаВзаимодействие с внешними API (CRM, Базы данных, Email)Сложные вычисления, логика, обработка текста, анализ данных
КонтрольВы пишете код функции, модель только передает параметрыМодель сама пишет код и выполняет его
БезопасностьВысокая (вы контролируете исполняемый код)Sandbox (код изолирован, но логика определяется моделью)
ОкружениеВаш серверСервера Google (Sandboxed environment)

Золотое правило: Если вам нужно получить данные из внешнего мира — используйте Function Calling. Если вам нужно обработать данные (посчитать, отсортировать, проанализировать) — используйте Code Execution.

Упражнение

Задача: Оптимизация текста.<br><br>Напишите скрипт, использующий Gemini с включенным Code Execution.<br><br>Задание для модели:<br>1. Создать список из 50 случайных слов (можно использовать библиотеку `random` и `string` для генерации псевдо-слов или выбрать из встроенного списка).<br>2. Отсортировать этот список в обратном алфавитном порядке.<br>3. Отфильтровать только те слова, которые начинаются с гласной буквы.<br>4. Вернуть итоговый список.<br><br>Цель: Убедиться, что модель не сортирует вручную (что часто приводит к ошибкам), а пишет для этого Python-скрипт.

Ограничения и Безопасность

Несмотря на мощь инструмента, вы должны помнить об ограничениях Sandbox среды в Gemini API:

  • Stateless (Без состояния): Каждая сессия выполнения кода живет только в рамках одного вызова (или одной чат-сессии). Файлы, созданные в одном запросе, не сохраняются навсегда.
  • Лимит времени: Скрипты имеют жесткий тайм-аут. Вы не сможете использовать Code Execution для обучения нейросети или майнинга криптовалют (даже не пытайтесь).
  • Нет ввода пользователя: Код не может запрашивать input(). Все данные должны быть переданы изначально.

Использование Code Execution требует изменения вашего подхода к промпт-инжинирингу. Вместо «Подумай шаг за шагом» (Chain of Thought), мы теперь говорим «Напиши код, чтобы проверить это». Это переводит модель из режима «философа» в режим «инженера».

Вопрос

Какое утверждение о Code Execution Sandbox в Gemini является ЛОЖНЫМ?