Использование Code Execution для математических вычислений
Введение: Почему языковым моделям нужен калькулятор?
Коллеги, добро пожаловать на урок, который может кардинально изменить то, как вы проектируете решения на базе LLM. Мы поговорим о Code Execution (выполнении кода) в контексте Gemini.
Давайте начнем с известного парадокса. Вы можете попросить LLM написать сонет в стиле Шекспира о квантовой физике, и она справится блестяще. Но попросите её умножить 34,982 на 12,111, и высока вероятность, что она «поплывет». Она может выдать число, которое выглядит правдоподобно, но будет математически неверным.
Почему так происходит?
Языковые модели — это вероятностные машины. Они предсказывают следующий токен. Для модели число «100» — это не математическая величина, а токен, который часто встречается после «10 умножить на 10». В вычислениях нет места «вероятности» — там нужен детерминизм. Предсказывать результат сложной арифметики, основываясь на текстах из интернета — это всё равно что пытаться угадать погоду, читая стихи о дожде.
Решение: Code Execution
Gemini решает эту проблему элегантно. Вместо того чтобы пытаться предсказать ответ, модель пишет программу на Python, которая вычисляет этот ответ. Затем эта программа запускается в защищенной песочнице (sandbox), результат возвращается модели, и она формирует окончательный ответ пользователю.
В этом уроке мы разберем, как превратить Gemini из гуманитария в инженера, используя этот инструмент.
Настройка окружения и базовый синтаксис
Для начала работы нам не нужно устанавливать сторонние интерпретаторы Python на свой сервер. Вся магия происходит на стороне Google. Наша задача — правильно сконфигурировать клиент и явно разрешить модели использовать инструмент code_execution.
В версии API для Gemini 3 (и последних версиях 1.5 Pro/Flash) это делается через передачу аргумента tools при создании модели. Обратите внимание: это отличается от Function Calling, где вы описываете свои функции. Здесь мы активируем встроенный движок Python.
import google.generativeai as genai
import os
# Предполагается, что API ключ уже настроен в переменных окружения
# os.environ["GOOGLE_API_KEY"] = "ваш_ключ"
genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
# Инициализация модели с включенным инструментом Code Execution
# Обратите внимание на параметр tools
model = genai.GenerativeModel(
model_name='gemini-1.5-pro-latest', # Используем актуальную версию
tools='code_execution'
)
# Пример простого запроса
response = model.generate_content(
"Посчитай сумму первых 50 чисел Фибоначчи."
)
# Вывод ответа
print(response.text)
Анатомия процесса: Что происходит «под капотом»?
Когда вы запускаете код выше, происходит интересный многоступенчатый процесс. Это не просто «вопрос-ответ». Это диалог модели самой с собой и с интерпретатором.
- Анализ запроса: Gemini понимает, что задача требует вычислений (сумма чисел Фибоначчи). Она «решает», что её внутренних знаний недостаточно или это слишком рискованно для простого предсказания текста.
- Генерация кода: Модель генерирует блок кода на Python. Она импортирует нужные библиотеки (если требуется) и пишет алгоритм.
- Изолированное выполнение: Этот код отправляется во временную, защищенную среду выполнения (sandbox) на серверах Google. У этой среды нет доступа в интернет, но в ней предустановлены популярные библиотеки вроде
numpy,pandas,scipy,matplotlib. - Возврат результата: Результат выполнения (или ошибка, если код упал) возвращается модели.
- Синтез ответа: Модель берет этот технический вывод и формулирует понятный ответ для пользователя на естественном языке.
Для нас, как разработчиков, критически важно то, что мы можем получить доступ к этим промежуточным шагам. В объекте response часто содержится история вызовов (parts), где виден и сгенерированный код, и результат его выполнения. Это бесценно для отладки и аудита.
# Давайте посмотрим, как именно модель решила задачу
# Мы можем итерироваться по частям ответа, чтобы найти исполняемый код
response = model.generate_content(
"Какова вероятность выпадения суммы 7 при броске двух костей? Рассчитай через симуляцию 100,000 бросков."
)
print("--- Итоговый ответ ---")
print(response.text)
print("\n--- Что происходило внутри (Code Execution) ---")
# В структуре ответа Gemini части с кодом имеют определенный тип
for part in response.candidates[0].content.parts:
if part.executable_code:
print(f"[Генерация кода]:\n{part.executable_code.code}\n")
if part.code_execution_result:
print(f"[Результат выполнения]:\n{part.code_execution_result.output}\n")
Практическое применение: Финансовая математика
Давайте отойдем от абстрактных задач и рассмотрим Enterprise-кейс. Представьте, что вы создаете финансового ассистента. Пользователь хочет рассчитать график платежей по ипотеке с возможностью досрочного погашения.
Пытаться заставить LLM сделать это просто текстом — гарантированный провал. Ошибки накопления округления сделают расчет бесполезным. Code Execution здесь идеален, так как он гарантирует математическую точность Python.
В примере ниже мы попросим модель рассчитать сложный процент, но с условием ежемесячного пополнения. Это задача, которую сложно решить «в уме», но легко скриптом.
# Сложный запрос с финансовой логикой
prompt = """
Я планирую инвестировать 100,000 рублей под 12% годовых с ежемесячной капитализацией.
Кроме того, я буду докладывать на счет по 5,000 рублей в конце каждого месяца.
Сколько денег будет на счету через 5 лет?
Построй таблицу (выведи текстом) для каждого года.
"""
response = model.generate_content(prompt)
print(response.text)
Ограничения и лучшие практики
Несмотря на мощь этого инструмента, у него есть четкие границы, которые вы должны учитывать при проектировании архитектуры:
- Нет доступа в Интернет: Код выполняется в «вакууме». Вы не можете внутри
code_executionпопросить скрипт скачать актуальный курс валют или спарсить сайт. Если вам нужны внешние данные, вы должны сначала получить их другим инструментом (Function Calling) и передать в контекст модели, а затем попросить Code Execution их обработать. - Ограничение по времени (Timeouts): Скрипты не могут работать вечно. Если модель напишет бесконечный цикл или слишком тяжелые вычисления, процесс будет убит по таймауту.
- Библиотеки: Доступен стандартный Data Science стек (Numpy, Pandas, Scipy). Нестандартные библиотеки (например, специфичные криптографические модули) могут быть недоступны.
- Стейтлесс (в рамках запроса): По умолчанию состояние не сохраняется между разными запросами
generate_content, если вы не используете режим чата (ChatSession). В режиме чата контекст выполнения (переменные) может сохраняться в рамках одной сессии, что позволяет выполнять вычисления итеративно.
Совет профи: Всегда явно указывайте модели в промпте, если задача требует точности. Фраза «Используй код для проверки своих вычислений» или «Рассчитай это программно» значительно повышает качество ответов, даже если инструмент включен по умолчанию.
Напишите программу, использующую Gemini с Code Execution, для решения задачи оптимизации. Задача: У нас есть список проектов с их стоимостью и ожидаемой прибылью. Бюджет ограничен 50,000$. Нужно выбрать комбинацию проектов, дающую максимальную прибыль. Данные: Проект А (20к, прибыль 30к), Проект Б (15к, прибыль 20к), Проект В (30к, прибыль 45к), Проект Г (10к, прибыль 10к). Попросите модель решить эту задачу (задача о рюкзаке).
В каком случае использование Code Execution в Gemini будет НЕВОЗМОЖНЫМ или бесполезным?