Поиск в кеше
Узел, который ищет сохранённый ответ на такой же запрос и, если находит, даёт флоу ответить без вызова модели.
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 в трассировке говорит почему. Вот предупреждения, которые пишет узел:
[
{ "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-модель — Успех → Запись в кеш
- Запись в кеш — По умолчанию → Вернуть ответ
Промах вызывает модель, и Запись в кеш сохраняет её ответ. Попадание идёт прямо в Вернуть ответ, который отвечает сохранённым ответом.
См. также
Запись в кеш — узел, который сохраняет ответ.
Контекст выполнения и пути — что такое выход узла.
Отправить запрос —
cacheиcostв ответе, который получает вызывающий.AI-модель — вызов, ответ которого хранит кеш.
Собрано из openapi b070e1f, sdk contract 5cc7055, php ae4a53b, node 84bc62d