Близнецы думают

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

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

Генерация контента с помощью мышления

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

Питон

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-2.5-pro",
    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-2.5-pro",
    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-2.5-pro"

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

  fmt.Println(resp.Text())
}

ОТДЫХ

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro: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 в конфигурации запроса. После этого вы сможете получить доступ к краткому изложению, перебирая элементы параметра response parts и проверяя логическое значение thought .

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

Питон

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-2.5-pro",
  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-2.5-pro",
    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-2.5-pro"
  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)
      }
    }
  }
}

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

Питон

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-2.5-pro",
    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-2.5-pro",
    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-2.5-pro"

  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 3 Pro)

Параметр thinkingLevel , рекомендуемый для моделей Gemini 3 и более поздних версий, позволяет управлять поведением рассуждений. Вы можете установить уровень мышления "low" или "high" . Если уровень мышления не указан, Gemini будет использовать динамический уровень мышления модели по умолчанию — "high" — для Gemini 3 Pro Preview.

Питон

from google import genai
from google.genai import types

client = genai.Client()

response = client.models.generate_content(
    model="gemini-3-pro-preview",
    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 } from "@google/genai";

const ai = new GoogleGenAI({});

async function main() {
  const response = await ai.models.generateContent({
    model: "gemini-3-pro-preview",
    contents: "Provide a list of 3 famous physicists and their key contributions",
    config: {
      thinkingConfig: {
        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-pro-preview"
  resp, _ := client.Models.GenerateContent(ctx, model, contents, &genai.GenerateContentConfig{
    ThinkingConfig: &genai.ThinkingConfig{
      ThinkingLevel: &thinkingLevelVal,
    },
  })

fmt.Println(resp.Text())
}

ОТДЫХ

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-preview: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"
    }
  }
}'

Отключить функцию thinkingLevel для Gemini 3 Pro невозможно. Модели серии Gemini 2.5 не поддерживают thinkingLevel ; вместо этого используйте thinkingBudget .

Продумывание бюджетов

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

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

Модель Настройка по умолчанию
(Мысли бюджет не установлен)
Диапазон Отключить мышление Включите динамическое мышление
2.5 Про Динамическое мышление: модель решает, когда и сколько думать 128 32768 N/A: Невозможно отключить мышление. thinkingBudget = -1
2.5 Вспышка Динамическое мышление: модель решает, когда и сколько думать 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 Предварительный просмотр Модель не думает 512 24576 thinkingBudget = 0 thinkingBudget = -1
Предварительный просмотр Robotics-ER 1.5 Динамическое мышление: модель решает, когда и сколько думать 0 до 24576 thinkingBudget = 0 thinkingBudget = -1
2.5 Flash Live Native Audio Preview (09-2025) Динамическое мышление: модель решает, когда и сколько думать 0 до 24576 thinkingBudget = 0 thinkingBudget = -1

Питон

from google import genai
from google.genai import types

client = genai.Client()

response = client.models.generate_content(
    model="gemini-2.5-pro",
    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-pro",
    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-pro"
  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())
}

ОТДЫХ

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro: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
    }
  }
}'

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

Мысленные подписи

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

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

  • Модели Gemini 2.5 возвращают сигнатуры мыслей, когда мышление включено и запрос включает вызов функций , в частности объявления функций .
  • Модели Gemini 3 могут возвращать сигнатуры мыслей для всех типов деталей . Мы рекомендуем всегда возвращать все сигнатуры в том виде, в котором они были получены, но это требуется для сигнатур вызова функций. Подробнее см. на странице « Сигнатуры мыслей» .

Пакет Google GenAI SDK автоматически обрабатывает возврат подписей мыслей. Вам нужно управлять подписями мыслей вручную только при изменении истории разговоров или использовании REST API.

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

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

Цены

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

Питон

# ...
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}`);

Идти

// ...
usageMetadata, err := json.MarshalIndent(response.UsageMetadata, "", "  ")
if err != nil {
  log.Fatal(err)
}
fmt.Println("Thoughts tokens:", string(usageMetadata.thoughts_token_count))
fmt.Println("Output tokens:", string(usageMetadata.candidates_token_count))

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

Более подробную информацию о токенах можно найти в руководстве по подсчету токенов .

Лучшие практики

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

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

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

  • Предоставьте руководство по обоснованию : если вы рассчитываете на особенно длинный ответ, вы можете дать руководство в подсказке, чтобы ограничить объём размышлений, используемых моделью. Это позволит вам зарезервировать больше токенов для вашего ответа.

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

  • Простые задачи (мышление может быть ОТКЛЮЧЕНО): для простых запросов, не требующих сложных рассуждений, таких как поиск фактов или классификация, мышление не требуется. Примеры:
    • «Где была основана компания DeepMind?»
    • «Это электронное письмо с просьбой о встрече или просто с информацией?»
  • Задачи среднего уровня сложности (по умолчанию/небольшое размышление): Многие распространённые запросы требуют пошаговой обработки или более глубокого понимания. Близнецы могут гибко использовать свои мыслительные способности для решения таких задач, как:
    • Проведите аналогию между фотосинтезом и взрослением.
    • Сравните и сопоставьте электромобили и гибридные автомобили.
  • Сложные задачи (максимальная способность к мышлению): Для действительно сложных задач, таких как решение сложных математических задач или программирование, мы рекомендуем установить высокий бюджет для интеллектуальной деятельности. Такие задачи требуют от модели полного задействования её возможностей рассуждения и планирования, часто требуя множества внутренних этапов, прежде чем дать ответ. Примеры:
    • Решите задачу 1 в AIME 2025: Найдите сумму всех целых чисел с основаниями b > 9, для которых 17b является делителем 97b .
    • Напишите код Python для веб-приложения, визуализирующего данные фондового рынка в режиме реального времени, включая аутентификацию пользователей. Сделайте его максимально эффективным.

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

Функции Thinking поддерживаются во всех моделях серий 3 и 2.5. Полное описание возможностей моделей представлено на странице обзора .

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

Вы можете попробовать примеры использования инструментов с моделями мышления в « Кулинарной книге мышления» .

Что дальше?