Pull to refresh

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

Level of difficultyEasy
Reading time6 min
Views4.5K

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


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

Tags:
Hubs:
+8
Comments8

Articles