
Привет, Хабр!
Недавно я выпустил на OZON авторскую коллекцию интеллектуальных вопросов, отобранных из базы ЧГК, квизов и тематических пабликов. Я постарался собрать не просто интересные и «красивые» задачи, а такие, которые можно решить логически — без знания редких фактов.
Со временем мне пришла в голову мысль: а как с такими задачами справятся современные большие языковые модели (LLM)? Особенно те, которые ориентированы не просто на выдачу ответов, а на рассуждение.
Решил устроить мини-эксперимент и проверить!
Условия эксперимента:
60 текстовых вопросов на русском языке.
(Если вопрос представлял собой дуплет/триплет — я добавлял пояснение в промт.)Вопросы подавались в чат-режиме, без дополнительного контекста.
Функция поиска в интернете была отключена, чтобы исключить подглядывание в базу.
Результаты
Модель | Правильных ответов | Доля правильных ответов, % | Место |
OpenAI o3 | 43 | 72 | 1 |
Gemini 2.5 pro | 42 | 70 | 2 |
Claude 3.7 Thinking | 25 | 42 | 3 |
DeepSeek R1 | 22 | 37 | 4 |
YandexGPT 4 pro (+рассуждение) | 21 | 35 | 5 |
Gemini 2.5 Flash | 17 | 28 | 6 |
GIGA CHAT 2 MAX | 16 | 27 | 7 |
P.S. Значения в таблице получены в рамках одного прогона — каждый вопрос задавался модели лишь один раз. Однако стоит учитывать, что у LLM есть параметр temperature, который управляет уровнем случайности в генерации ответа: чем выше значение, тем больше вариативность и «креативность» выдачи. Это напрямую влияет на выбор слов и логику рассуждения.
В идеале, чтобы получить более объективную картину, следовало бы запускать модель несколько раз на каждый вопрос, собирать распределение ответов и уже по нему вычислять, например, среднюю долю правильных решений.
Общие впечатления
🔹 GigaChat 2 MAX: "вспоминающая", но не "рассуждающая"
GigaChat 2 MAX — единственная в списке модель, которую нельзя отнести к классу thinking-LLM. По сути, её ответы чаще всего основаны на прямом «вспоминании» фактов из обучающей выборки, а не на логическом выводе. Это особенно заметно в тех случаях, когда вопрос содержит реальные фамилии или узнаваемые формулировки.
Пример:
"Фридрих Фрёбель называл детей "божьими растениями". Он считается создателем первого... Чего?"
Правильный ответ: Детского сада
Вопрос звучит изящно, но если вы знаете, чем известен Фрёбель, — ответ даётся «в лоб». LLM, очевидно, просто узнала фамилию и сопоставила с известным фактом.
🔹 Thinking-LLM: гипотезы, логика и немного магии
Все остальные протестированные модели можно условно отнести к "thinking-LLM" — они не просто выдают ответ, а проводят рассуждения. Часто можно наблюдать, как модель:
генерирует несколько гипотез;
перебирает их;
отвергает неверные;
находит финальную версию.
Именно эта цепочка делает их особенно интересными: они не только «вспоминают», но и строят вывод. Хотя стоит отметить, что порой встречаются случаи, когда модель угадывает правильный ответ, но объяснение к нему — полностью некорректно. Поэтому важно анализировать не только ответ, но и ход рассуждений.
Thinking-модели хорошо проявляют себя в задачах с нестандартной логикой, «чувством юмора» или зависимыми элементами (дуплеты, триплеты и т.п.).
Пример (юмор):
"Закончите шутку тремя словами: "А наш спонсор — отель «Развитие». Счастлив только тот, кто ...""
Правильный ответ: ... остановился в «Развитии»
На пару вопросов я получил настолько хорошие версии, что это может быть поводом переосмыслить или доработать формулировку вопроса.
Пример:
"ПЕРВЫЕ играют важную роль в экономике юга Чили. В книге чилийской писательницы Исабель Альенде говорится, что множество ПЕРВЫХ на склонах Анд похожи на ВТОРЫЕ, спустившиеся с высот до самой земли. Какие слова, начинающиеся на одну и ту же букву, заменены словами «ПЕРВАЯ» и «ВТОРОЕ»?"
Правильный ответ: овцы, облака (комментарий: пасущиеся на склонах овцы напоминали облака)
Одна из красивых версий от OpenAI o3: виноградники, водопады
При этом на по-настоящему нестандартные вопросы, особенно те, что требуют выйти за рамки обычной логики — модели, в целом, справляются хуже.
Пример (все модели ошиблись):
"Согласно шутке, «Муму» и «Дедушка Мазай и зайцы» — произведения из двух противоположных литературных жанров. Назовите оба этих жанра."
Правильный ответ: утопия и антиутопия
Вопрос требует не только знания произведений, но и нестандартного взгляда на жанры — что оказалось выше порога креативности большинства моделей.
🔹 Повторные прогоны и распределение гипотез
Меня впечатлили результаты OpenAI o3 и Gemini 2.5 Pro — они существенно выделялись по точности и качеству объяснений. Чтобы получить более стабильную картину, я написал Python-скрипт, который по API вызывает Gemini 2.5 Pro:
каждый вопрос прогоняется по 5 раз без сохранения контекста (чтобы ответы были независимыми);
в промте я прошу сгенерировать 5 различных версий ответа, расположенных по убыванию уверенности.
Результаты:
Среднее количество правильных ответов по первым гипотезам: от 35 до 43 из 60.
Если же учитывать все гипотезы (25 на вопрос) и считать вопрос решённым, если среди них есть хотя бы один правильный — общее число правильных ответов выросло до 48 из 60 (80%)!
Подключение и взаимодействие по API с Gemini 2.5 pro
import os
import time
import logging
from typing import List, Tuple, Set
import pandas as pd
from google import genai #python >= 3.8
from google.genai import types
# ------------------------------------------------------------------
# 1. Константы
# ------------------------------------------------------------------
GEMINI_API_KEY = '' #ваш API-key
CSV_IN = "questions.txt" #две колонки: n- номер вопроса, question - текст вопроса
CSV_OUT = "answers_gemini.csv"
N_REPEATS = 5
RATE_LIMIT = 1 # сек между вызовами
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(message)s",
datefmt="%H:%M:%S",
)
# ------------------------------------------------------------------
# 2. Инициализация клиента
# ------------------------------------------------------------------
client = genai.Client(api_key=GEMINI_API_KEY)
# ------------------------------------------------------------------
# 3. Запрос к Gemini
# ------------------------------------------------------------------
def ask_llm(q_num: int, q_text: str) -> Tuple[str, int, float]:
system_instruction = (
"Вы — педантичный логик. "
"Придумайте пять разных вариантов ответов на вопрос "
"в порядке убывания степени уверенности в строго заданном формате:"
)
user_prompt = (
f"Вопрос №{q_num}.\n{q_text}\n"
"Формат ответа:\n"
"Гипотеза № <номер гипотезы>.\n"
"ОТВЕТ: <Ваш вывод>\n"
"ОБОСНОВАНИЕ: <2–3 предложения>"
)
t0 = time.perf_counter()
try:
response = client.models.generate_content(
model="gemini-2.5-pro",
config=types.GenerateContentConfig(
temperature=0.7,
#max_output_tokens=2048,
system_instruction=system_instruction
),
contents=[{"role": "user", "parts": [{"text": user_prompt}]}]
)
elapsed = round(time.perf_counter() - t0, 3)
# Извлечение текста
answer_txt = response.candidates[0].content.parts[0].text.strip()
return answer_txt, 0, elapsed
except Exception as e:
raise RuntimeError(f"Gemini error: {e}")
# ------------------------------------------------------------------
# 4. Основной цикл
# ------------------------------------------------------------------
def main() -> None:
df_in = pd.read_csv(CSV_IN, sep="\t", encoding="cp1251").dropna()
done: Set[Tuple[int, int]] = set()
if os.path.isfile(CSV_OUT):
df_done = pd.read_csv(CSV_OUT, encoding="utf-8-sig")
done = set(zip(df_done["N"], df_done["repeat"]))
logging.info("🔄 Найдено %d уже сохранённых ответов → %s", len(done), CSV_OUT)
else:
logging.info("➕ CSV_OUT ещё не создан, начнём с нуля")
first_write = not os.path.isfile(CSV_OUT)
total_q = len(df_in)
for q_idx, row in enumerate(df_in.itertuples(index=False), start=1):
q_num, q_text = int(row.n), str(row.question)
for rep in range(1, N_REPEATS + 1):
if (q_num, rep) in done:
continue
logging.info("▶️ %d/%d | Вопрос №%s | попытка %s", q_idx, total_q, q_num, rep)
try:
ans, tokens, secs = ask_llm(q_num, q_text)
except Exception as exc:
logging.error("❌ Вопрос №%s, попытка %s: %s", q_num, rep, exc)
ans, tokens, secs = f"ERROR: {exc}", 0, 0.0
row_out = {
"N": q_num,
"repeat": rep,
"question": q_text,
"answer": ans,
"out_tokens": tokens,
"elapsed_sec": secs,
}
pd.DataFrame([row_out]).to_csv(
CSV_OUT,
mode="a",
header=first_write,
index=False,
encoding="utf-8-sig",
)
first_write = False
time.sleep(RATE_LIMIT)
logging.info("✅ Готово. Все результаты зафиксированы в %s", CSV_OUT)
if __name__ == "__main__":
main()
🔹 Напоследок — идея: модели в связке
Мне кажется интересным следующее направление: запуск моделей в связке — одна генерирует гипотезы, другая их анализирует. Например, модель А предлагает 3 варианта, а модель B выбирает лучший или предлагает свою интерпретацию. Это своего рода имитация командной игры или брейншторма — где один игрок выдвигает идею, а другой уточняет или спорит.
Выводы
Результаты LLM на логических и «квизовых» вопросах — действительно впечатляют. Современные модели умеют не только вспоминать, но и строить рассуждения, формировать альтернативные гипотезы и порой даже предлагать более остроумные или точные формулировки, чем оригинал.
На мой взгляд, LLM уже можно использовать как ассистента при составлении интеллектуальных и логических задач. Вот несколько советов, как извлечь из этого максимум пользы:
Используйте "thinking-LLM" — такие как OpenAI o3 и Gemini 2.5 Pro (актуальные на момент написания статьи). У них лучшие цепочки рассуждений и гибкость мышления.
Читайте объяснения, а не только ответы. Даже если ответ правильный — путь к нему может многое сказать о качестве логики.
Запрашивайте несколько версий ответа. Это поможет найти неожиданные, но достойные альтернативные формулировки, которые могли бы улучшить или разнообразить ваш вопрос.
Задавайте один и тот же вопрос несколько раз. Поведение модели зависит от параметра temperature, который влияет на вариативность ответа. Повтор — это способ оценить устойчивость гипотез.