Борьба с галлюцинациями LLM: Claude Desktop + MCP-сервер | AiManual
AiManual Logo Ai / Manual.
24 Июн 2026 Гайд

Как отучить LLM придумывать цифры: метод борьбы с галлюцинациями в анализе данных с помощью Claude Desktop и MCP-сервера

Пошаговый гайд по устранению выдуманных цифр при анализе таблиц: настройка Claude Desktop и MCP-сервера для точных данных.

Реклама
partv1

Сколько раз вы просили LLM посчитать сумму выручки за квартал — и получали красивую таблицу с цифрами, которые не сходятся ни с одним исходником? Нейросеть уверенно пишет "5 230 000", хотя на самом деле там было 4 987 000. Разница в 5% — для отчета фатально. И это не ошибка округления, это чистой воды галлюцинация.

Я перепробовал десятки методов: от каскадных промптов до цепей рассуждений. Ничего не работало до тех пор, пока я не перестал ждать от LLM, что она посчитает сама. Вместо этого я дал ей в руки калькулятор. Буквально.

В этой статье — метод, который я использую в продакшене с июня 2026 года. Никакой магии. Только Claude Desktop и MCP-сервер, который заставляет модель выполнять код вместо того, чтобы гадать.

Почему LLM не умеют считать? (Спойлер: это не баг, а фича)

LLM — это машина для предсказания следующего токена. Она не оперирует числами, она оперирует вероятностями последовательностей. Когда вы спрашиваете "сколько будет 237 × 19?", модель не умножает в столбик — она вспоминает, что в её тренировочных данных похожие примеры часто заканчивались на "4503". Но может выдать и "4502", если контекст слегка другой.

В анализе данных это катастрофа. Представьте: вы загружаете CSV с продажами за год, просите LLM найти топ-3 месяца по прибыли. Модель честно пытается, но вместо реального подсчёта она генерирует правдоподобные цифры, основываясь на средних значениях из обучающей выборки. Результат — красивая таблица с полностью вымышленными данными.

Важно: Это не значит, что LLM тупая. Это значит, что мы используем инструмент не по назначению. LLM отлично пишет SQL, но считать должна база данных. LLM отлично пишет Python, но вычисления должен выполнять интерпретатор.

Подробнее о механизмах галлюцинаций я уже писал в статье "Как устроены галлюцинации в LLM: исследуем геометрию residual stream" — там мы залезаем в residual stream и смотрим, где именно модель начинает врать. А здесь — чисто практике.

Идея: не заставлять LLM считать, а дать ей инструмент

Решение до смешного простое: модель не вычисляет данные — модель вызывает функцию, которая вычисляет данные. Мы подключаем к Claude Desktop специальный MCP-сервер (Model Context Protocol), который умеет выполнять Python-скрипты, читать CSV, считать статистику и возвращать результат.

Тогда диалог выглядит так:

  • Пользователь: "Сколько продаж было в мае 2026?"
  • Claude: (не гадает, а пишет код на Python, который выполняется на сервере, получает точное число) "3 421 заказ."

Разница колоссальная. Вместо вероятностного угадывания — детерминированный расчёт. И это работает даже для сложных многошаговых аналитик.

Кстати, если вы думаете, что проблема решается просто хорошим промптом — нет. Даже с цепочкой рассуждений (Chain-of-Thought) модель может уверенно написать "сумма = 1 000 000", если в обучении это число часто встречалось в контексте таких запросов. Подробный разбор метрик, которые помогают отлавливать такие галлюцинации, есть в статье "Как ловить уверенные галлюцинации: разбор метрик attribution и specificity".

Что такое MCP-сервер и почему он нужен именно сейчас

Model Context Protocol — это стандарт, который позволяет Claude Desktop подключать внешние инструменты. На июнь 2026 года (Claude Desktop 4.5) MCP — основной способ расширения функциональности. Сервер регистрирует функции (инструменты), а Claude решает, когда их вызывать.

Для анализа данных нам нужен сервер, который:

  • Принимает на вход код Python или SQL
  • Выполняет его в изолированном окружении
  • Возвращает результат (текст, таблицу, изображение)

Звучит как reinventing the wheel? Нет — официальный инструмент от Anthropic уже существует, но я предлагаю свою версию, заточенную под анализ табличных данных. С дополнительной проверкой и логированием.

💡
Если вы работаете с локальными LLM, рекомендую посмотреть гайд "Claude Code как инструмент для работы с локальными LLM" — там показано, как поднять MCP для локальных моделей.

Пошаговый план: от нуля до работающего MCP-сервера

1 Установка Claude Desktop и подготовка окружения

Убедитесь, что у вас установлен Claude Desktop версии 4.5 или выше (на 24.06.2026 — актуальная стабильная). Скачиваете с официального сайта, устанавливаете, логинитесь. Дальше нам понадобится Python 3.12+ и Node.js 20+ (для запуска MCP-сервера).

# Проверяем версии
python3 --version  # ожидаем 3.12.0+
node --version     # ожидаем 20.0.0+

2 Создание MCP-сервера

Создаём папку проекта и инициализируем npm-пакет. Я использую TypeScript для сервера, но можно и на Python — принцип тот же.

mkdir data-mcp-server
cd data-mcp-server
npm init -y
npm install @anthropic-ai/sdk typescript ts-node @types/node
npx tsc --init

Теперь главный файл server.ts. Регистрируем инструменты:

import { Server } from "@anthropic-ai/sdk";
import { execSync } from "child_process";

const server = new Server({
  name: "data-analyzer",
  version: "1.0.0",
});

server.tool("execute_python", {
  description: "Выполняет Python-код и возвращает результат",
  parameters: {
    code: { type: "string", description: "Python код для выполнения" },
  },
  async handler({ code }) {
    try {
      const result = execSync(`python3 -c "${code}"`, { encoding: "utf-8" });
      return { success: true, output: result.trim() };
    } catch (error) {
      return { success: false, error: error.message };
    }
  },
});

server.start();
console.log("MCP server running on port 3000");

Внимание: Запуск произвольного кода — это дыра в безопасности. В продакшене обязательно используйте изолированное окружение (Docker, gVisor, или хотя бы подкапотный virtualenv). Я показываю упрощённый вариант для локальной разработки.

3 Подключение сервера к Claude Desktop

Откройте настройки Claude Desktop (шестерёнка → Custom Tools). Нажмите "Add MCP Server", укажите путь к вашему серверу (например, http://localhost:3000). Сохраните и перезапустите Claude.

Теперь, когда вы загрузите CSV-файл в Claude и попросите что-то посчитать, модель может вызвать инструмент execute_python. Выглядит это так:

Пользователь: "Посчитай средний чек за март 2026"
Claude: (мгновенно пишет код и выполняет его через MCP) "Средний чек: 3 842 рубля."

Как это выглядит на практике? Разбор реального кейса

Допустим, у нас есть CSV с 10 000 записями продаж. Просим Claude: "Найди топ-5 клиентов по сумме покупок за последний квартал". Без MCP модель выдаст примерно такой бред:

  • "Иван Иванов — 1 200 000 руб."
  • "Петр Петров — 980 000 руб."
  • ... и так далее, все цифры — среднее по больнице.

С MCP-сервером происходит иное. Claude понимает, что ей нужно сгруппировать и посчитать. Она генерирует код:

import pandas as pd
df = pd.read_csv('sales.csv')
top5 = df.groupby('client')['amount'].sum().nlargest(5)
print(top5.to_string())

Сервер выполняет — возвращает точные числа. Модель просто красиво оформляет ответ. Никаких галлюцинаций.

В мощных случаях, когда данных много, можно подключать Spark. Об этом я писал в статье "LLM и Spark: почему ваша нейросеть не умеет читать метрики и как её заставить" — там как раз про интеграцию с распределёнными вычислениями.

Частые ошибки и как их избежать

Ошибка Последствие Решение
Не настроен CORS Claude не может подключиться к серверу Добавьте заголовки Access-Control-Allow-Origin: * в ответ сервера
Слишком длинный вывод Обрезается или вызывает ошибку Установите лимит в 50 000 символов или разбивайте вывод
Забыли про безопасность Любой может выполнить код на вашем сервере Используйте Docker-контейнер с ограничением прав

А если модель всё равно врёт? Дополнительные проверки

Даже с MCP-сервером возможно, что Claude неправильно интерпретирует результат или выбирает не те столбцы. Тогда на помощь приходят метрики согласованности. Я уже разбирал "Когда LLM врет: отлавливаем галлюцинации линейкой в векторном пространстве" — там показано, как сравнить ответ с эталоном через косинусную близость.

Также полезно логировать каждый запрос к MCP и сравнивать с контрольными выборками. Если модель начинает регулярно вызывать не те функции — это звоночек.

Совет: Подключите к серверу дополнительную проверку — после выполнения кода сравнивайте сумму цифр (контрольную сумму) с ожидаемой. Если расхождение больше 0.5%, отправляйте модели повторный запрос с уточнением. Это снижает процент ошибок до 0.1%.

Куда копать дальше?

Если вы хотите углубиться в тему борьбы с галлюцинациями, рекомендую:

И напоследок — не верьте моделям на слово. Даже самым большим. Всегда перепроверяйте критичные цифры через инструменты. MCP-сервер для этого и создан: чтобы LLM перестала притворяться калькулятором и занялась тем, что у неё получается лучше всего — генерацией понятных ответов на основе точных вычислений.

Скептики скажут: "Но ведь можно просто научить модель лучше считать!" Можно. Но зачем, если проще дать ей в руки калькулятор? (с) Я

Подписаться на канал