/
Вопросы и ответы
/
Промт-инжиниринг
/

Почему LLM галлюцинирует и как это снизить

Почему LLM галлюцинирует и как это снизить

10 часов назад

Никита Вихров

Ответы

0

Почему LLM галлюцинирует и как это снизить

Галлюцинация — когда модель уверенно выдаёт неправильный ответ. Не «я не знаю», а конкретный несуществующий факт, выдуманная функция, несуществующая библиотека. Это не баг который починят — это фундаментальное свойство того, как работают языковые модели.


Почему это происходит

Модель генерирует текст, предсказывая следующий токен. Она оптимизирована на правдоподобность текста, а не на фактическую точность. Когда она не знает ответа — она не молчит, она генерирует то, что статистически похоже на правильный ответ.

from anthropic import Anthropic

client = Anthropic()

# Спрашиваем про несуществующую библиотеку
response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=256,
    messages=[{
        "role": "user",
        "content": "Как использовать метод .quicksort() в библиотеке pandas?"
    }]
)

print(response.content[0].text)
# Слабые модели могут выдать подробную инструкцию по несуществующему методу
# Сильные модели скажут что такого метода нет — но не всегда

Техника 1: явное разрешение говорить «не знаю»

По умолчанию модель старается ответить. Явно разреши ей признать незнание:

system = """Ты — технический ассистент.

Критически важно:
- Если не уверен в факте — скажи об этом явно: "Я не уверен, лучше проверить в документации"
- Если информации нет в контексте — отвечай: "В предоставленных данных этого нет"
- Не выдумывай названия функций, параметры, версии библиотек
- Лучше неполный правильный ответ, чем полный неправильный"""

Техника 2: верификация через цепочку рассуждений

Заставь модель проверить себя перед финальным ответом:

verification_prompt = """Ответь на вопрос, потом проверь свой ответ.

<question>{question}</question>

Формат:
<initial_answer>твой первоначальный ответ</initial_answer>
<verification>
- Какие факты в ответе ты знаешь точно?
- Какие факты могут быть неточными?
- Нужно ли что-то уточнить или убрать?
</verification>
<final_answer>исправленный ответ с пометками неуверенности где нужно</final_answer>"""

response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=1024,
    messages=[{
        "role": "user",
        "content": verification_prompt.format(question="Какие параметры принимает pd.read_csv()?")
    }]
)

Техника 3: RAG для фактических данных

Вместо того чтобы доверять памяти модели — передавай факты в контекст:

# Плохо: модель вспоминает из обучения (может ошибиться в версиях/параметрах)
response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=512,
    messages=[{"role": "user", "content": "Как использовать pd.read_csv() в pandas 2.0?"}]
)

# Хорошо: передаём актуальную документацию
with open("docs/pandas_read_csv.md") as f:
    docs = f.read()

response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=512,
    system=f"Отвечай только на основе этой документации:\n{docs}",
    messages=[{"role": "user", "content": "Как использовать pd.read_csv() в pandas 2.0?"}]
)

Техника 4: temperature = 0 для фактических вопросов

Высокая temperature увеличивает вероятность галлюцинаций — модель выбирает менее вероятные токены:

# Для фактических вопросов — детерминированный режим
response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=512,
    temperature=0,  # только самые вероятные токены
    messages=[{"role": "user", "content": "Какие методы есть у объекта Response в requests?"}]
)

Как выявлять галлюцинации в продакшне

Автоматически поймать все галлюцинации нельзя. Но можно снизить риск:

def answer_with_confidence(question: str, context: str) -> dict:
    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=512,
        temperature=0,
        system="""Отвечай только на основе предоставленного контекста.
Верни JSON: {"answer": "...", "confidence": "high|medium|low", "based_on_context": true|false}
confidence=low если информация неполная или ты не уверен.""",
        messages=[{
            "role": "user",
            "content": f"<context>{context}</context>\n\nВопрос: {question}"
        }]
    )

    import json, re
    text = re.sub(r'```(?:json)?|```', '', response.content[0].text).strip()
    result = json.loads(text)

    # Если модель не уверена — логируем для ревью
    if result["confidence"] == "low" or not result["based_on_context"]:
        log_for_review(question, result["answer"])

    return result

Галлюцинации не устранить полностью — но можно существенно снизить через правильную архитектуру: RAG вместо памяти модели, низкую temperature, явное разрешение говорить «не знаю».


На курсе «ИИ для разработчиков» на Хекслете разбирают как строить надёжные LLM-приложения с минимумом галлюцинаций — через RAG, правильные промпты и валидацию вывода.

10 часов назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845