Поиск в кеше

Узел, который ищет сохранённый ответ на такой же запрос и, если находит, даёт флоу ответить без вызова модели.

3 мин чтения

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

Узел
Поиск в кеше
Тип
cache_lookup
Категория
Кеш
Порты
  • Попадание hit подключение обязательно
  • Промах miss подключение обязательно
Завершает путь
Нет

Что делает узел

Узел составляет из запроса ключ и ищет его.

  • Попадание выходит через Попадание с сохранённым ответом в качестве выхода узла. Ничего не удерживается и ничего не тратится: модель ради него не вызывается, и кредиты клиента не списываются.

  • Промах выходит через Промах и оставляет свой ключ для узла Запись в кеш ниже, который сохраняет под ним ответ модели.

Когда ответ выполнения — тот, что вернуло попадание, выполнение несёт cache.hit, равное true, и cached_at — момент, когда ответ был сохранён. Вкладка Метрики узла показывает, сколько сэкономили его попадания, как Сэкономлено, по оценке — по оценке, за которую был оплачен сохранённый ответ.

Когда использовать

Ставьте его перед AI-модель во флоу, запросы которого повторяются слово в слово: тот же вопрос, тот же документ для пересказа.

  • Ключ — точное совпадение. Промпт, который отличается одним пробелом, — другой промпт.

  • Контекста вызова в ключе нет. Два клиента, которые отправили одинаковый вход, делят один ответ, и со второго ничего не списывается.

Настройки

НастройкаДля чего она
scopeКто делит ответ — operation, запросы операции на опубликованной версии, которая его сохранила, или project, все запросы проекта. Узел без scope берёт operation.
key_fieldsПути внутри входа, из которых складывается ключ, записанные без input в начале — messages, а не input.messages. Пустой список делает ключом весь вход.

В конструкторе настройки — Общий доступ в пределах и Поля ключа.

Общий доступ в пределахКто делит ответ
Эта операцияЗапросы операции на опубликованной версии, которая его сохранила. Новая версия начинает с пустым кешем; откат находит то, что сохранила та версия, пока оно хранится
Весь проектКаждый запрос проекта с тем же ключом, какими бы ни были его операция и версия

Поля ключа — пути входа, из которых складывается ключ, записанные без input. в начале: messages, а не input.messages. Без них ключом служит весь вход. Поле ключа, которого в запросе нет, считается null: ключ такого запроса складывается только из остальных его полей ключа.

Порты

У узла два порта, Попадание и Промах, и оба обязательны. Флоу, в котором любой из них никуда не ведёт, не публикуется.

Выход

При попадании выход — ответ, который модель дала, когда его сохраняли, — выход узла AI-модель с usage того вызова. При промахе узел ничего не оставляет. Вернуть ответ с источником Последний вывод модели отвечает сохранённым ответом, когда попадание — последний ответ на пути.

Ошибки

Ошибок узел не выбрасывает: когда кеш не может ответить, узел выходит через Промах, а событие warning в трассировке говорит почему. Вот предупреждения, которые пишет узел:

JSON
[
  { "type": "warning", "node_key": "lookup", "payload": { "code": "cache_unavailable" } },
  { "type": "warning", "node_key": "lookup", "payload": { "code": "cache_key_unresolved" } },
  { "type": "warning", "node_key": "lookup", "payload": { "code": "cache_key_partial" } }
]
КодЧто случилось
cache_unavailableХранилище кеша недоступно. Ключ всё равно остаётся для Запись в кеш
cache_key_unresolvedНи одного поля ключа нет во входе, поэтому ключ ничего не говорит о запросе. Кеш не спрашивается, и под таким ключом ничего не сохраняется
cache_key_partialНекоторых полей ключа нет во входе. Ключ используется без них

Настройки проверяются при проверке флоу и при его публикации. Сначала отклоняется область, отличная от двух выше:

В API запись issues называет такую проверку в params.detail; её code — invalid_node_config.

ПроверкаСообщение в конструкторе
cache_unsupported_scope«{node}» использует несуществующую область кеша.

Затем проверяются поля ключа:

В API запись issues называет такую проверку в params.detail; её code — invalid_node_config.

ПроверкаСообщение в конструкторе
cache_key_fields_not_listПоля ключа «{node}» должны быть списком путей во входных данных.
cache_key_fields_empty_entryОдно из полей ключа «{node}» пустое.
cache_key_fields_rooted_path«{node}» строит ключ кеша по «{path}», но поля ключа читаются только внутри входных данных: путь там не начинается с «{root}».
cache_key_fields_padded_path«{node}» строит ключ кеша по «{path}», а у пути пробелы по краям: поля ключа читаются ровно так, как написаны.

Пример

  • Запрос — По умолчанию → Поиск в кеше
  • Поиск в кеше — Попадание → Вернуть ответ
  • Поиск в кеше — Промах → AI-модель
  • AI-модель — Успех → Запись в кеш
  • Запись в кеш — По умолчанию → Вернуть ответ

Промах вызывает модель, и Запись в кеш сохраняет её ответ. Попадание идёт прямо в Вернуть ответ, который отвечает сохранённым ответом.

Собрано из openapi b070e1f, sdk contract 5cc7055, php ae4a53b, node 84bc62d