Главная / Статьи / Система RAG может «работать» и всё равно сначала извлекать неверные доказательства.

Система RAG может «работать» и всё равно сначала извлекать неверные доказательства.

Пошаговое руководство по использованию системы A RAG, которая может «работать», но при этом сначала находить неверные доказательства: контракты, чеки и слоты для вставки кода для команд, использующих эту модель.

1229 слов

В следующих примечаниях описывается практический подход к решению данной проблемы. Основное внимание уделяется контрактам, проверкам и местам для вставки кода, а не мотивирующим формулировкам.

Система RAG может «работать», но всё равно сначала возвращать неверные данные

При работе с этапом системы RAG сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой чек-лист поможет избежать ошибок при последующих изменениях кода. Храните конфигурацию отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Оцените уровень воспроизведения информации на фиксированном наборе вопросов перед настройкой подсказок. Частая смена подсказок редко помогает улучшить качество поиска.

Краткий обзор

На этапе краткого анализа сначала запишите условия контракта: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Документируйте одновременно успешный и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. Напишите краткое руководство: как обновлять ключи, как опустошать очередь, как откатывать последнюю загрузку.

def recall_at_k(gold_id: str, ranked_ids: list[str], k: int = 5) -> int:
    """1 if the gold chunk appears anywhere in the top k, else 0."""
    return int(gold_id in ranked_ids[:k])

def reciprocal_rank(gold_id: str, ranked_ids: list[str]) -> float:
    """1/rank of the gold chunk's first appearance, 0 if absent."""
    for rank, doc_id in enumerate(ranked_ids, start=1):
        if doc_id == gold_id:
            return 1.0 / rank
    return 0.0
def reciprocal_rank_fusion(
    rankings: dict[str, list[str]], k: int = 60
) -> list[str]:
    """Fuse multiple ranked lists using rank position only."""
    scores: dict[str, float] = {}
    for ranking in rankings.values():
        for rank, doc_id in enumerate(ranking, start=1):
            scores[doc_id] = scores.get(doc_id, 0.0) + 1.0 / (k + rank)
    return sorted(scores, key=scores.get, reverse=True)

Можете ли вы устранить проблему путем настройки?

При работе над задачей «Не могли бы вы настроить этап обработки?» сначала запишите условия контракта: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Лучше использовать небольшие, тестируемые модули вместо обширных скриптов. Если какой-то шаг не сработает, причина неудачи должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Напишите краткое руководство: как обновлять ключи, как опустошать очередь, как откатить последнюю операцию загрузки.

На этапе завершающих размышлений сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия элементам, определите критерии успеха и не допускайте молчаливого частичного выполнения задачи. Напишите краткое руководство: как обновлять ключи, как опустошать очередь, как откатить последнюю операцию ввода.

Код и чтение

На этапе работы над кодом и чтения документации сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Рядом с функциональными результатами записывайте время выполнения и стоимость токенов или запросов. Отображение затрат с самого начала предотвращает неожиданные счета при переходе с демо-среды в общедоступные среды. Напишите краткое руководство: как обновлять ключи, как опустошать очередь, как откатывать последнюю загрузку данных. На этапе работы над кодом и чтения документации сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Документируйте как успешный, так и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки.

Чек-лист операционной деятельности

На этапе операционного чек-листа необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.

Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, где операторы могут их проверять, не читая весь кодовый граф.

При наличии бюджета добавляйте тест на базовую работоспособность, который проверяет критически важный путь в системе CI с использованием фикстчеров, а не реальных платных API.

Записывайте время выполнения и стоимость токенов или запросов вместе с функциональными результатами. Отображение стоимости заранее предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам.

Фиксируйте версии зависимостей и сохраняйте хэш изображения, с помощью которого выполнялась демонстрация. Воспроизводимость важнее коллективных знаний.

Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия результатам работы, определите критерии успешности и не соглашайтесь на молчаливое частичное выполнение задачи.

Перед переходом на следующую стадию заморозьте версии, сохраните эталонный отчет для критического пути выполнения и уточните шаги возврата к предыдущему состоянию. В совместных средах необходимы ограничения на частоту запросов, проверки принадлежности ресурсов и четко определенный ответственный за обновление секретов. Лучше выбирать надежность, чем креативные одноразовые демонстрации.

Примечание для e21201356c55: не храните ключи поставщика в репозитории, установите лимит токенов на одну сессию и сохраняйте отчеты рядом с фиксами для оценки, чтобы последующие замены моделей оставались сопоставимыми.

Этап 0 инструкций по укреплению безопасности наилучшим образом работает, если рассматривать его как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь кодовый граф.

Подробность укрепления 0/710: измеряйте время выполнения, класс ошибки и расход токенов для этой записи, затем принимайте решение о сохранении изменений на основе фиксированного набора критериев, а не на основе единичных примеров.

На этапе 1 процедуры укрепления безопасности необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние системы. Желательно использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага причина должна быть связана с конкретной областью ответственности, а не с запутанной структурой обработки данных.

Подробность укрепления безопасности 1/710: измеряйте время выполнения, тип ошибок и расход токенов для данной процедуры, затем принимайте решение о сохранении изменений на основе установленного набора критериев, а не на основе единичных наблюдений.

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

Подробности усиления безопасности 2/710: измерьте время выполнения, класс ошибки и расход токенов для данной записки, затем решите, следует ли сохранять изменение на основе определенного набора критериев, а не на основе устных замечаний.

Второй этап записки по усилению безопасности работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Документируйте одновременно успешный сценарий работы и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.

Подробности усиления безопасности 3/710: измерьте время обработки стены, класс ошибки и расход токенов для этой записи, затем решите, следует ли сохранять изменения на основе фиксированного набора вопросов, а не на основе единичных примеров.