Как LLM решают вопросы в духе “Что? Где? Когда?” — эксперимент и выводы

от автора

Привет, Хабр!

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


ссылка на оригинал статьи https://habr.com/ru/articles/925776/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *