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

Как понять, что модель не знает ответа, а не выдумывает?

Как понять, что модель не знает ответа, а не выдумывает?

17 дней назад

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

Ответы

0

Как понять, что модель не знает ответа, а не выдумывает

Языковая модель не говорит «я не знаю» сама по себе — она генерирует правдоподобный текст, даже если не имеет нужной информации. Чтобы это обнаружить, нужно явно спрашивать об уверенности или проверять ответ независимым способом.

Способ 1: просить оценить уверенность в запросе

from openai import OpenAI
import json

client = OpenAI()

def ask_with_confidence(question: str) -> dict:
    prompt = f"""{question}

Ответь на вопрос. После ответа добавь отдельную строку в формате JSON:
{{"confidence": "высокая"|"средняя"|"низкая", "reason": "одно предложение почему"}}"""

    resp = client.chat.completions.create(
        model="gpt-4.1",
        temperature=0.0,
        max_tokens=512,
        messages=[{"role": "user", "content": prompt}]
    )

    текст = resp.choices[0].message.content
    строки = текст.strip().split("\n")
    json_строка = next((s for s in reversed(строки) if s.startswith("{")), None)

    if json_строка:
        мета = json.loads(json_строка)
        ответ = "\n".join(s for s in строки if s != json_строка).strip()
    else:
        мета = {"confidence": "неизвестно", "reason": ""}
        ответ = текст

    return {"answer": ответ, "confidence": мета}

результат = ask_with_confidence("В каком году вышла библиотека LangChain?")
print(результат["answer"])
print(результат["confidence"])

Способ 2: несколько прогонов и сравнение

Если модель уверена — ответы при разных прогонах совпадают. Если выдумывает — детали расходятся.

def check_consistency(question: str, runs: int = 3) -> dict:
    ответы = []
    for _ in range(runs):
        resp = client.chat.completions.create(
            model="gpt-4.1",
            temperature=0.7,
            max_tokens=100,
            messages=[{"role": "user", "content": question}]
        )
        ответы.append(resp.choices[0].message.content.strip())

    уникальных = len(set(ответы))
    return {
        "answers": ответы,
        "consistent": уникальных == 1,
        "unique_count": уникальных
    }

результат = check_consistency("Кто написал компилятор GCC?")
print(результат["consistent"])   # True или False
print(результат["answers"])

Способ 3: явная инструкция отвечать «не знаю»

SYSTEM = """Отвечай только если уверен в фактах.
Если вопрос касается конкретных дат, версий, имён или событий и ты не уверен —
отвечай строго: "Не знаю, проверьте в документации."
Не додумывай и не предполагай."""

Правила

  • Ни один из способов не даёт стопроцентной гарантии.
  • Используйте несколько прогонов для фактических вопросов, где цена ошибки высока.
  • Для критически важных фактов всегда сверяйтесь с внешним источником.

17 дней назад

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

+7 800 100 22 47

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

+7 495 085 21 62

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

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