
Привет, Хабр!
Недавно я выпустил на 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, который влияет на вариативность ответа. Повтор — это способ оценить устойчивость гипотез.
