Галоўная / Артыкулы

Семантычныя кэшы з RedIs для пошуку вектараў

Зменшыце витраты на API для адгуктування за дапамою сэмантычнага кэшаў у Redis: двухрэвнавы кэш, які павтарае выкарыстоўванне рэзультатаў вектарнага пошуку, калі запыты маюць аднаковы значэнне, у Node.js.

Выдавец: REACTAPP.TOP4 хв чытання1033 слоў

Крыніцы: Semantic Caching with Redis: Slashing API Costs in Vector Search

Стварэнне продукту на асасце АІ частаючы не так супраканяе каманды якосьцю модэлю, як складаннем рахунку. Чат-бот, який выглядае дырэвым пры калькі соткаў корыстнікаў, можа раптам запрацаваць дужа дорага, калі кожны пошук, рэкамендацыя чы вопыт спрычынаюць новы вызов модэлю эмбеддінгу.

Большасць такіх вызоў ёсць зайвымі. Семантычны кэшаванне перадае ранейшыя рэзультаты, калі новы запит значыць практычна тое ж самае. У Redis такі падход можа зменшыць час адпаведзення і витраты на інфраструктуру, не перапісываючы бізнес-логіку прыемленае.

Закрытыя витраты на вектарны пошук

Тыповы пат генеравання з дапамою пошуку (RAG) выглядае так:

User Query
     ↓
Embedding API
     ↓
Vector Database
     ↓
Retrieved Documents
     ↓
LLM

Кожны новы запит зазвычай значыць:

  • вызов модэлю эмбеддінгу
  • оплата за затрымку сеті
  • выкананне вектарнага пошуку
  • перадача знаходзячыхся рэзультатаў

Вызовы модэлю эмбеддінгу коштаюць грошы. Перадача даных туда-назад коштае часу.

Разглянем два пошуку, які здзеймаюцца за две хвілінкі:

  • “жоўтый геймінг-лэптоп”
  • “дышчы геймінг-лэптопы”

Фразаванне разнае; намеры – майже тыя ж. Аднак багатыя сістэмы пераскладваюць оба запиты з нуля. Серед тыяўчох корыстнікаў платформа разважна плаціць за практычна тыя ж роботы.

Што такое семантычны кэшаванне?

Класычныя кэшы зберагаюць ключы як точныя строкі. Якщо кэшаваць “чырвоныя падзолкі”, то будзе знаходзіцца толькі ідэнтычная фраза. Фраза “падзолкі, якія чырвоные” не будзе знаходзіцца.

Семантычны кэшаванне паўставляе значэнне. Кожны запит ператвараецца на эмбеддынг. Калі два вектары ўсталяюцца дастаткова близка, зберажаны адказ можна перыварыць.

Напрыклад:

Query A
"best beginner Python book"
↓
Embedding A

Пазней:

Query B
"good Python books for beginners"

Якщо косайнавы аналагія перасягне выбраны порог – скажамо, 0.95 – система вяртае кэшаваны адказ. Не трэба новага вызову эмбеддынгу, не трэба новага пошуку вектараў, няма дапаможнай ставкі.

Стварэнне двухрэবеровага кэша

У прымэнных рашытках часта выкорыстоўваецца два кэша.

Рэবер 1: кэш умяшчання

Самы быстры рэবер. Аднаковая строка запита вяртае зберажаны умяшчанне замест таго, каб зноў вызваць модель.

Query
   ↓
Redis
   ↓
Embedding

Эта проста мера пазбегае ад аднаго з найпашыльнейшых платных вызоў у додатках на AI.

Рэবер 2: кэш семантычных рэзультатаў

На другім рэবеры зберагаюцца фінальныя адпаведзі на пошук. Пораўнанне водвараецца па суседствах умяшчання, а не па чыстам тэксте.

Embedding
      ↓
Redis Vector Search
      ↓
Cached Search Results

Блізкі сусед означае, што база дадзеных вектароў прахідна, і корыстнік атрымлеў за мінуту адпаведзь з кэша.

Чаму Redis?

Redis — это быстрая памятка ў оператыўной памяці. За дапамогай Redis Stack і RediSearch ён таксама можа выконваць пошук на адпоўненасць вектараў.

Гэтае поўнанне дазволяе Redis:

  • зберагаць умяшчанні
  • пораўняваць вектары
  • вяртаць найбліжэйшыя суседы
  • Заканчэнне тымчасовага жыцця элементаў з TTL
  • Аддача даных за калікс секунд
  • Кэш перестае быць простым контейнерам з ключамі і значэннямі і стае слоем для сэмантычных пошукав.

    Выбір правильнага порога сэмабельнасці

    Выбор порога вялікая меры вплывае на якасць. Пры 0.99 падходзяць толькі майже ідэнтычныя даны — высокая тачнасць, меньша колькасць аддач. Пры 0.85 росте колькасць аддач, але можа выйсці збіг нерелевантных запыткаў (кросаве проты баскетбольных капцоў).

    Толерантнасць залежыць ад сферы прыменення. У е-камерцыі часта можна прыймаць болей шырокія порогі; у медычных пошукавах зазвычай нельга. Дзеяныя системы нават задаюць разныя порогі для кожнай колекцыі.

    Падтрымка свежасці кэша

    Кэшаваныя адказы корыстны толькі пакуль яны застаюць актуальнымі. “Актуальныя цены на iPhone” можу стаць застарэлымі за ноччу без плану апдэйта. Два распашчытныя падходы падходзяць для большасці случаў.

    Заканчэнне тымчасовага жыцця на адной з пазначэнняў часу

    Значэнне TTL памагае Redis аўтаматычна выдаліваць элементы — гэта корыстна для каталагаў, якія часта змінююцца.

    Анулюванне на адной з адбываючыхся падзеяў

    Калі прыкладнэ програма ведае, што адбылася зміна — апошнія паказанні запасаў, змены цэнаў, новыя дакументы, ўдаленніе элементаў — яна негайна выдалівае афектаваныя ключы, замест таго каб чакаць заканчэння періоду TTL.

    Як Redis шукае эмбеддынгі

    Сучасны Redis храніць эмбеддынгі як вектары з числамі з паводлівай канстантай і індексуе іх за дапамою такіх структураў, як:

    • FLAT
    • HNSW

    Новы запит не пераглядае ўсі вектары; індэксы швабрасна знаходзяць суседніе вектары, таму семантычныя пошукі часта завершаюцца за калькі мілісекунд.

    Аб’еднанне всього

    Шлях запыту з початку да канца выглядае так:

    User Query
          ↓
    Embedding Cache
          ↓
    Hit?
          ↓
    Yes → Use Cached Embedding
    No
     ↓
    Embedding API
     ↓
    Redis Semantic Cache
     ↓
    Hit?
     ↓
    Yes → Return Cached Results
    No
     ↓
    Vector Database
     ↓
    Store Results in Redis
     ↓
    Return Results
    

    Дырактарны шлях з обробкай эмбеддынга і пошуком запускаецца толькі у разы невялікага успеху пошуку. Усе інше застаецца швыракім.

    Якія палегчэнні можна спакушацца?

    Цыфры разніцяюцца залежна ад продукту, але багатыя звіты пра вырабоцтва выглядаюць так:

    • Звычайны семантычны пошук часта дае адзину пятую да адзіной трэці частка успехоў
    • Автадаптаванне та павторныя запиты можу складвацца да прыблізна паловы часткі трафіку
    • Успехі кэша зазвычай даюць адпаведныя рэсультаты за колька секунд
    • Неспэшы, калі запиты виконваюцца з включэнням дадзеных і пошукам ад пачатку да канца, можу займаць колька сотэй мілісекунд

    Кожны успех значыць адзін меншы запит да API для включэння дадзеных. Пры тыячах запитоў гэта дапамагае заўсёды эканоміць ресурсы та зменшваць затрымкі.

    Пашыльныя проблемы

    Отруўванне кэша

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

    Рост памяці

    Эмбедынгі ў вялікай меры: кожны з іх складаецца з сотняў або тыяў значэнняў типу float. Колекцыі быстра растуць. Перад запускам неабходна задаць мяркі памяці і правілы адчысцэння дадзеных.

    Пачатак работы

    Новы запуск пачынаецца з порожнім кэшам, таму ранні запиты плацуюць полную цэну. Популярныя запиты з часам прыгрэваюць кэш; дзеякія команды падготавліваюць заздалегідь часта выкарыстоўваныя запиты, каб скорачыць час адчынення сервісу.

    Калі семантычны кэшаванне не ўсегда падходзіць

    Гэты падход ўсёліпе, калі багато корыстувачаў ставяць схожыя запиты. Ён становіцься менш эфектывным, калі адпаведзі ў высокай меры персоналізаваныя або надта свежыя:

    • “Рестаранты поблізу”
    • персоналізаваныя рэкамендаціі
    • панелі керування, прызначанныя для конкрэтных корыстувачаў
    • актуальны запас тавароў
    • швыта змінююцыяся цены

    У такіх случаях вярнуць адпаведзь з кэша суседнага корыстувача можа быць проста некоректным.

    Заключныя меркі

    Калі зрастае трафік, створаныя AI, косцты інфраструктуры часта конкуруюць за прытлумленне увагі з якасцю модэляў. Семантычны кэшаванне — граматычны спосаб: выявляе спакульнае намерэнне, прыменшае павтаральную роботу з усаджэнням данных і пошукам. Redis робіць гэта практычным, спаўнюючы швальнасць памяці з відразу ж працюючым вектарным пошукам — швэйцарскія адпаведзі, менша колькасць платных вызоваў для усаджэння данных і адночасна прыемнае масштабаванне. Інодзе найлепшая оптымізацыя — не кращы модэль, а прыменшэнне роботы, якая ніколі не была неабходная.