Gemini думает

Модели Gemini используют внутренний "процесс мышления", который значительно улучшает их способность рассуждать и планировать многоэтапные действия. Это делает их очень эффективными для сложных задач, таких как программирование, высшая математика и анализ данных.

В этом руководстве рассказывается, как использовать возможности Gemini по рассуждению с помощью Gemini API.

Создание контента с помощью размышлений

Запрос к модели для размышлений создается так же, как и любой другой запрос на создание контента. Основное отличие заключается в том, что в поле model нужно указать одну из моделей с поддержкой рассуждений, как показано в следующем примере генерации текста:

Python

from google import genai

client = genai.Client()
prompt = "Explain the concept of Occam's Razor and provide a simple, everyday example."
response = client.models.generate_content(
    model="gemini-3.8-flash",
    contents=prompt
)

print(response.text)

JavaScript

import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({});

async function main() {
  const prompt = "Explain the concept of Occam's Razor and provide a simple, everyday example.";

  const response = await ai.models.generateContent({
    model: "gemini-3.8-flash",
    contents: prompt,
  });

  console.log(response.text);
}

main();

Проложить маршрут

package main

import (
  "context"
  "fmt"
  "log"
  "os"
  "google.golang.org/genai"
)

func main() {
  ctx := context.Background()
  client, err := genai.NewClient(ctx, nil)
  if err != nil {
      log.Fatal(err)
  }

  prompt := "Explain the concept of Occam's Razor and provide a simple, everyday example."
  model := "gemini-3.8-flash"

  resp, _ := client.Models.GenerateContent(ctx, model, genai.Text(prompt), nil)

  fmt.Println(resp.Text())
}

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent" \
 -H "x-goog-api-key: $GEMINI_API_KEY" \
 -H 'Content-Type: application/json' \
 -X POST \
 -d '{
   "contents": [
     {
       "parts": [
         {
           "text": "Explain the concept of Occam'\''s Razor and provide a simple, everyday example."
         }
       ]
     }
   ]
 }'
 ```

Краткие пересказы рассуждений

Краткие изложения мыслей – это сжатые версии необработанных мыслей модели, которые позволяют понять внутренние рассуждения модели. Обратите внимание, что уровни и лимиты рассуждений применяются к необработанным рассуждениям модели, а не к их краткому пересказу.

Чтобы включить краткий пересказ мыслей, задайте для параметра includeThoughts значение true в конфигурации запроса. Затем вы можете получить доступ к сводке, перебирая parts параметра response и проверяя логическое значение thought.

Ниже приведен пример, демонстрирующий, как включить и получить сводку мыслей без потоковой передачи, которая возвращает одну окончательную сводку мыслей вместе с ответом.

Python

from google import genai
from google.genai import types

client = genai.Client()
prompt = "What is the sum of the first 50 prime numbers?"
response = client.models.generate_content(
  model="gemini-3.8-flash",
  contents=prompt,
  config=types.GenerateContentConfig(
    thinking_config=types.ThinkingConfig(
      include_thoughts=True
    )
  )
)

for part in response.candidates[0].content.parts:
  if not part.text:
    continue
  if part.thought:
    print("Thought summary:")
    print(part.text)
    print()
  else:
    print("Answer:")
    print(part.text)
    print()

JavaScript

import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({});

async function main() {
  const response = await ai.models.generateContent({
    model: "gemini-3.8-flash",
    contents: "What is the sum of the first 50 prime numbers?",
    config: {
      thinkingConfig: {
        includeThoughts: true,
      },
    },
  });

  for (const part of response.candidates[0].content.parts) {
    if (!part.text) {
      continue;
    }
    else if (part.thought) {
      console.log("Thoughts summary:");
      console.log(part.text);
    }
    else {
      console.log("Answer:");
      console.log(part.text);
    }
  }
}

main();

Проложить маршрут

package main

import (
  "context"
  "fmt"
  "google.golang.org/genai"
  "os"
)

func main() {
  ctx := context.Background()
  client, err := genai.NewClient(ctx, nil)
  if err != nil {
      log.Fatal(err)
  }

  contents := genai.Text("What is the sum of the first 50 prime numbers?")
  model := "gemini-3.8-flash"
  resp, _ := client.Models.GenerateContent(ctx, model, contents, &genai.GenerateContentConfig{
    ThinkingConfig: &genai.ThinkingConfig{
      IncludeThoughts: true,
    },
  })

  for _, part := range resp.Candidates[0].Content.Parts {
    if part.Text != "" {
      if part.Thought {
        fmt.Println("Thoughts Summary:")
        fmt.Println(part.Text)
      } else {
        fmt.Println("Answer:")
        fmt.Println(part.Text)
      }
    }
  }
}

А вот пример использования цепочки рассуждений с потоковой передачей, которая возвращает скользящие, инкрементные сводки во время генерации:

Python

from google import genai
from google.genai import types

client = genai.Client()

prompt = """
Alice, Bob, and Carol each live in a different house on the same street: red, green, and blue.
The person who lives in the red house owns a cat.
Bob does not live in the green house.
Carol owns a dog.
The green house is to the left of the red house.
Alice does not own a cat.
Who lives in each house, and what pet do they own?
"""

thoughts = ""
answer = ""

for chunk in client.models.generate_content_stream(
    model="gemini-3.8-flash",
    contents=prompt,
    config=types.GenerateContentConfig(
      thinking_config=types.ThinkingConfig(
        include_thoughts=True
      )
    )
):
  for part in chunk.candidates[0].content.parts:
    if not part.text:
      continue
    elif part.thought:
      if not thoughts:
        print("Thoughts summary:")
      print(part.text)
      thoughts += part.text
    else:
      if not answer:
        print("Answer:")
      print(part.text)
      answer += part.text

JavaScript

import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({});

const prompt = `Alice, Bob, and Carol each live in a different house on the same
street: red, green, and blue. The person who lives in the red house owns a cat.
Bob does not live in the green house. Carol owns a dog. The green house is to
the left of the red house. Alice does not own a cat. Who lives in each house,
and what pet do they own?`;

let thoughts = "";
let answer = "";

async function main() {
  const response = await ai.models.generateContentStream({
    model: "gemini-3.8-flash",
    contents: prompt,
    config: {
      thinkingConfig: {
        includeThoughts: true,
      },
    },
  });

  for await (const chunk of response) {
    for (const part of chunk.candidates[0].content.parts) {
      if (!part.text) {
        continue;
      } else if (part.thought) {
        if (!thoughts) {
          console.log("Thoughts summary:");
        }
        console.log(part.text);
        thoughts = thoughts + part.text;
      } else {
        if (!answer) {
          console.log("Answer:");
        }
        console.log(part.text);
        answer = answer + part.text;
      }
    }
  }
}

await main();

Проложить маршрут

package main

import (
  "context"
  "fmt"
  "log"
  "os"
  "google.golang.org/genai"
)

const prompt = `
Alice, Bob, and Carol each live in a different house on the same street: red, green, and blue.
The person who lives in the red house owns a cat.
Bob does not live in the green house.
Carol owns a dog.
The green house is to the left of the red house.
Alice does not own a cat.
Who lives in each house, and what pet do they own?
`

func main() {
  ctx := context.Background()
  client, err := genai.NewClient(ctx, nil)
  if err != nil {
      log.Fatal(err)
  }

  contents := genai.Text(prompt)
  model := "gemini-3.8-flash"

  resp := client.Models.GenerateContentStream(ctx, model, contents, &genai.GenerateContentConfig{
    ThinkingConfig: &genai.ThinkingConfig{
      IncludeThoughts: true,
    },
  })

  for chunk := range resp {
    for _, part := range chunk.Candidates[0].Content.Parts {
      if len(part.Text) == 0 {
        continue
      }

      if part.Thought {
        fmt.Printf("Thought: %s\n", part.Text)
      } else {
        fmt.Printf("Answer: %s\n", part.Text)
      }
    }
  }
}

Контроль мышления

Модели Gemini по умолчанию используют динамическое мышление, автоматически регулируя объем рассуждений в зависимости от сложности запроса пользователя. Однако, если у вас есть особые требования к задержке или вам нужно, чтобы модель выполняла более глубокие рассуждения, чем обычно, вы можете использовать параметры для управления процессом мышления.

Уровни мышления (Gemini 4 и Gemini 3)

Параметр thinkingLevel, обязательный для моделей Gemini 4 и рекомендуемый для Gemini 3, позволяет управлять поведением рассуждения. Gemini 4 (gemini-4-argon) поддерживает low, medium (по умолчанию) и high.

В таблице ниже приведены настройки thinkingLevel для каждого типа модели.

Уровень мышления Gemini 3.8 Flash Gemini 3.6 Flash Gemini 4 Argon Gemini 3.5 и 3.1 Flash-Lite Gemini 3.1 Flash-Lite Image Gemini 3 Flash Gemini Robotics ER 2 Описание
minimal Не поддерживается (ошибка) Что пользователь может Не поддерживается (ошибка) Поддерживается (по умолчанию) Поддерживается (по умолчанию) Что пользователь может Что пользователь может Соответствует настройке "не думать" для большинства запросов. Обратите внимание, что minimal не гарантирует, что рассуждения будут отключены. Модель может рассуждать минимально при выполнении сложных задач.
low Что пользователь может Что пользователь может Что пользователь может Что пользователь может Не поддерживается Что пользователь может Что пользователь может Минимизирует задержку и стоимость.
medium Поддерживается (по умолчанию) Поддерживается (по умолчанию) Поддерживается (по умолчанию) Что пользователь может Чего пользователь не может Что пользователь может Что пользователь может Сбалансированное мышление для большинства задач.
high Поддерживается (динамический) Поддерживается (динамический) Поддерживается (динамический) Поддерживается (динамический) Поддерживается (динамический) Поддерживается (по умолчанию, динамический) Поддерживается (по умолчанию, динамический) Максимальная глубина рассуждений. Модели может потребоваться значительно больше времени, чтобы сгенерировать первый токен (не относящийся к рассуждениям), но при этом ответ будет более обоснованным.

В примере ниже показано, как задать уровень рассуждения.

Python

from google import genai
from google.genai import types

client = genai.Client()

response = client.models.generate_content(
    model="gemini-3.8-flash",
    contents="Provide a list of 3 famous physicists and their key contributions",
    config=types.GenerateContentConfig(
        thinking_config=types.ThinkingConfig(thinking_level="low")
    ),
)

print(response.text)

JavaScript

import { GoogleGenAI, ThinkingLevel } from "@google/genai";

const ai = new GoogleGenAI({});

async function main() {
  const response = await ai.models.generateContent({
    model: "gemini-3.8-flash",
    contents: "Provide a list of 3 famous physicists and their key contributions",
    config: {
      thinkingConfig: {
        thinkingLevel: ThinkingLevel.LOW,
      },
    },
  });

  console.log(response.text);
}

main();

Проложить маршрут

package main

import (
  "context"
  "fmt"
  "google.golang.org/genai"
  "os"
)

func main() {
  ctx := context.Background()
  client, err := genai.NewClient(ctx, nil)
  if err != nil {
      log.Fatal(err)
  }

  thinkingLevelVal := "low"

  contents := genai.Text("Provide a list of 3 famous physicists and their key contributions")
  model := "gemini-3.8-flash"
  resp, _ := client.Models.GenerateContent(ctx, model, contents, &genai.GenerateContentConfig{
    ThinkingConfig: &genai.ThinkingConfig{
      ThinkingLevel: &thinkingLevelVal,
    },
  })

fmt.Println(resp.Text())
}

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
  "contents": [
    {
      "parts": [
        {
          "text": "Provide a list of 3 famous physicists and their key contributions"
        }
      ]
    }
  ],
  "generationConfig": {
    "thinkingConfig": {
          "thinkingLevel": "low"
    }
  }
}'

Отключить режим мышления для Gemini 4 Argon нельзя. Модели Gemini 3 Flash и Flash-Lite также не поддерживают полное отключение мышления. Если вы не укажете уровень мышления, Gemini будет использовать уровень мышления по умолчанию для модели (например, "medium" для Gemini 4 Argon, Gemini 3.8 Flash и Gemini 3.6 Flash).

Модели серии Gemini 2.5 не поддерживают thinkingLevel. Вместо этого используйте thinkingBudget.

Ограничения на количество токенов и max_output_tokens

Параметр генерации max_output_tokens задает максимальное количество токенов, которые может сгенерировать ответ, включая токены размышлений.

Если этот параметр задан, он действует как жесткое ограничение, применяемое инфраструктурой, без изменения того, как модель распределяет свой бюджет на рассуждения (thinking_level).

Если модель достигнет этого лимита во время рассуждения, она прекратит генерировать ответ с помощью finish_reason: MAX_TOKENS и вернет усеченный или пустой результат (при этом плата за сгенерированные токены мышления будет взиматься). Чтобы снизить стоимость или задержку, не усекая ответы, уменьшите значение thinking_level (low или medium), а не max_output_tokens.

Для моделей Gemini 4 (gemini-4-argon) действуют следующие ограничения на контекст и выходные данные:

  • Общее окно контекста на 1 миллион токенов. Входные, выходные и токены рассуждения используют одно окно контекста на 1 миллион токенов (1,048,576 токенов). Если количество входных токенов плюс max_output_tokens превышает 1 048 576, API автоматически ограничивает количество выходных токенов оставшимся пространством в окне контекста (1,048,576 минус количество входных токенов).
  • Ограничения на выходные данные для одного запроса (64 000 токенов для потоковой передачи и 32 000 токенов для непотоковой передачи) и длинное декодирование (до 1 млн токенов). Один запрос на потоковую передачу (streamGenerateContent) возвращает до 65,536 токенов, а один запрос на непотоковую передачу (generateContent) – до 32,768 токенов. Чтобы сгенерировать больше токенов, чем разрешено за один запрос (до 1,048,576 токенов за вычетом входных данных), задайте для параметра max_output_tokens значение выше ограничения. Последние версии Google GenAI SDK по умолчанию продолжают генерацию автоматически (automatic_continuation=True). Вы также можете запустить цикл клиента, используя continuation_token, возвращенный, когда генерация останавливается с finish_reason: "CONTINUATION". Примеры кода приведены в разделе Длинный код.

Бюджеты

Параметр thinkingBudget, представленный в серии Gemini 2.5, указывает модели, сколько токенов мышления нужно использовать для рассуждений.

Ниже приведены сведения о настройке thinkingBudget для каждого типа модели. Чтобы отключить функцию, задайте для параметра thinkingBudget значение 0. Если задать для параметра thinkingBudget значение -1, будет включено динамическое мышление, то есть модель будет корректировать бюджет в зависимости от сложности запроса.

Модель Настройка по умолчанию
(бюджет на размышления не задан)
Диапазон Отключить режим размышления Включить динамическое мышление
2.5 Pro Динамическое мышление 128 – 32768 —: нельзя отключить режим размышления thinkingBudget = -1 (по умолчанию)
2.5 Flash Динамическое мышление 0 – 24576 thinkingBudget = 0 thinkingBudget = -1 (по умолчанию)
2.5. Предварительный просмотр Flash Динамическое мышление 0 – 24576 thinkingBudget = 0 thinkingBudget = -1 (по умолчанию)
2.5 Flash Lite Модель не думает 512 – 24576 thinkingBudget = 0 thinkingBudget = -1
2.5 Flash Lite Preview Модель не думает 512 – 24576 thinkingBudget = 0 thinkingBudget = -1
Robotics-ER 1.6 Preview Динамическое мышление 0 – 24576 thinkingBudget = 0 thinkingBudget = -1 (по умолчанию)
2.5 Flash Live Native Audio Preview (09-2025) Динамическое мышление 0 – 24576 thinkingBudget = 0 thinkingBudget = -1 (по умолчанию)

Python

from google import genai
from google.genai import types

client = genai.Client()

response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="Provide a list of 3 famous physicists and their key contributions",
    config=types.GenerateContentConfig(
        thinking_config=types.ThinkingConfig(thinking_budget=1024)
        # Turn off thinking:
        # thinking_config=types.ThinkingConfig(thinking_budget=0)
        # Turn on dynamic thinking:
        # thinking_config=types.ThinkingConfig(thinking_budget=-1)
    ),
)

print(response.text)

JavaScript

import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({});

async function main() {
  const response = await ai.models.generateContent({
    model: "gemini-2.5-flash",
    contents: "Provide a list of 3 famous physicists and their key contributions",
    config: {
      thinkingConfig: {
        thinkingBudget: 1024,
        // Turn off thinking:
        // thinkingBudget: 0
        // Turn on dynamic thinking:
        // thinkingBudget: -1
      },
    },
  });

  console.log(response.text);
}

main();

Проложить маршрут

package main

import (
  "context"
  "fmt"
  "google.golang.org/genai"
  "os"
)

func main() {
  ctx := context.Background()
  client, err := genai.NewClient(ctx, nil)
  if err != nil {
      log.Fatal(err)
  }

  thinkingBudgetVal := int32(1024)

  contents := genai.Text("Provide a list of 3 famous physicists and their key contributions")
  model := "gemini-2.5-flash"
  resp, _ := client.Models.GenerateContent(ctx, model, contents, &genai.GenerateContentConfig{
    ThinkingConfig: &genai.ThinkingConfig{
      ThinkingBudget: &thinkingBudgetVal,
      // Turn off thinking:
      // ThinkingBudget: int32(0),
      // Turn on dynamic thinking:
      // ThinkingBudget: int32(-1),
    },
  })

fmt.Println(resp.Text())
}

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
  "contents": [
    {
      "parts": [
        {
          "text": "Provide a list of 3 famous physicists and their key contributions"
        }
      ]
    }
  ],
  "generationConfig": {
    "thinkingConfig": {
          "thinkingBudget": 1024
    }
  }
}'

В зависимости от запроса модель может превысить или не достичь лимита токенов.

Подписи мыслей

Gemini API не сохраняет состояние, поэтому модель обрабатывает каждый запрос к API независимо и не имеет доступа к контексту рассуждений из предыдущих шагов в пошаговых взаимодействиях.

Чтобы поддерживать контекст рассуждений в многошаговых взаимодействиях, Gemini возвращает сигнатуры рассуждений – зашифрованные представления внутреннего процесса рассуждений модели.

  • Модели Gemini 2.5 возвращают сигнатуры размышлений, если эта функция включена и запрос включает вызов функций, в частности объявления функций.
  • Модели Gemini 4 и Gemini 3 могут возвращать сигнатуры рассуждений для всех типов частей. Рекомендуем всегда передавать все подписи в том виде, в котором они были получены. Для подписей вызовов функций это обязательно. Чтобы узнать больше, прочитайте страницу Thought Signatures.

Другие ограничения на использование, которые следует учитывать при вызове функций:

  • Подписи возвращаются моделью в других частях ответа, например в вызовах функций или текстовых частях. Возвращайте весь ответ со всеми частями модели в последующих ходах.
  • Не объединяйте части с подписями.
  • Не объединяйте часть с подписью с частью без подписи.

Цены

Если мышление включено, цена ответа рассчитывается как сумма токенов вывода и токенов мышления. Общее количество сгенерированных токенов мышления можно получить из поля thoughtsTokenCount.

Python

# ...
print("Thoughts tokens:", response.usage_metadata.thoughts_token_count)
print("Output tokens:", response.usage_metadata.candidates_token_count)

JavaScript

// ...
console.log(`Thoughts tokens: ${response.usageMetadata.thoughtsTokenCount}`);
console.log(`Output tokens: ${response.usageMetadata.candidatesTokenCount}`);

Проложить маршрут

// ...
fmt.Println("Thoughts tokens:", response.UsageMetadata.ThoughtsTokenCount)
fmt.Println("Output tokens:", response.UsageMetadata.CandidatesTokenCount)

Думающие модели генерируют полные цепочки рассуждений, чтобы повысить качество итогового ответа, а затем выводят краткие пересказы, чтобы дать представление о ходе мыслей. Таким образом, цена зависит от количества токенов, которые модели нужно сгенерировать, чтобы создать краткий пересказ, несмотря на то, что API возвращает только сам пересказ.

Подробнее о подсчете токенов…

Рекомендации

В этом разделе приведены рекомендации по эффективному использованию думающих моделей. Как всегда, чтобы получить наилучшие результаты, следуйте нашим рекомендациям по составлению запросов.

Отладка и управление

  • Проверка рассуждений. Если вы не получаете ожидаемый ответ от моделей, отвечающих за рассуждения, вам может помочь тщательный анализ кратких изложений мыслей Gemini. Вы можете посмотреть, как модель разбила задачу на части и пришла к выводу, и использовать эту информацию, чтобы исправить результаты.

  • Укажите, как нужно рассуждать. Если вы хотите получить длинный ответ, укажите в запросе, как модель должна рассуждать. Это позволит вам использовать больше токенов для ответа.

Сложность задачи

  • Простые задачи (режим Thinking можно отключить). Для простых запросов, не требующих сложных рассуждений, например для поиска фактов или классификации, режим Thinking не нужен. Примеры:
    • "Где была основана компания DeepMind?"
    • "В этом письме предлагается встреча или просто предоставляется информация?"
  • Задачи средней сложности (по умолчанию/требующие размышлений). Многие распространенные запросы требуют пошаговой обработки или более глубокого понимания. Gemini может использовать способность рассуждать для таких задач, как:
    • Приведи аналогию между фотосинтезом и взрослением.
    • Сравните электромобили и гибридные автомобили.
  • Сложные задачи (максимальная способность к рассуждению). Для действительно сложных задач, таких как решение сложных математических задач или задач по программированию, мы рекомендуем установить высокий лимит на рассуждения. Для выполнения таких задач модели необходимо задействовать все свои возможности рассуждения и планирования, что часто включает в себя множество внутренних шагов, прежде чем будет предоставлен ответ. Примеры:
    • Реши задачу 1 из AIME 2025: найди сумму всех целых оснований b > 9, для которых 17b является делителем 97b.
    • Напиши код Python для веб-приложения, которое визуализирует данные фондового рынка в реальном времени, включая аутентификацию пользователей. Сделайте его максимально эффективным.

Поддерживаемые модели, инструменты и возможности

Функции рассуждения поддерживаются во всех моделях серий 4, 3 и 2.5. Все возможности моделей перечислены на странице Обзор моделей.

Думающие модели работают со всеми инструментами и функциями Gemini. Это позволяет моделям взаимодействовать с внешними системами, выполнять код или получать информацию в реальном времени, а затем использовать полученные результаты в своих рассуждениях и окончательном ответе.

Примеры использования инструментов с моделями мышления можно найти в [кулинарной книге по мышлению][Colab].

Что дальше?

[Colab]: https://colab.sandbox.google.com/github/google-gemini/cookbook/blob/main/quickstarts/Get_started_thinking.ipynb