Blog/LLMOps és értékelés
Szemantikus gyorsítótár LLM-alkalmazásokhoz: mikor biztonságos újrahasznosítani a válaszokat, és mikor nem
Hogyan használják újra a szemantikus cache-ek az LLM-válaszokat hasonló kérdésekre, miben mások, mint a prompt caching, és hogyan kerüld el a téves találatokat.
Balázs Csorba··6 perc olvasás
- Semantic cache
- LLM cost
- Latency
- Embeddings
- Redis

A lényeg röviden
- A prompt caching a szolgáltatónál egy azonos előtagot használ újra, és sosem változtatja meg a választ; a szemantikus cache egy hasonló kérdésre tárolt választ ad vissza.
- Egy közzétett, ügyfélszolgálati jellegű teszten a szemantikus cache akár 68,8%-kal csökkentette az API-hívásokat, 97% feletti helyes találati aránnyal.
- A hasonlósági küszöb termékdöntés: olyan címkézett kérdéspárokból állítsd be, amelyeknek ugyanazt a választ kell kapniuk, illetve nem kaphatják.
- A cache-kulcsokat bérlő, felhasználó, nyelv és adatverzió szerint válaszd szét, különben egy ügyfél egy másik ügyfél válaszát kaphatja.
- Csak olyan válaszokat cache-elj, amelyek nem függnek friss adattól vagy személyes kontextustól, és minden bejegyzésnek legyen TTL-je és érvénytelenítési útja.
Az ügyfélszolgálati asszisztensek és a GYIK-botok újra és újra ugyanazokra a kérdésekre válaszolnak: hogyan állítom vissza a jelszavam, hol a számlám, mennyi a szállítási idő. Mindegyik kérdés egy modellhívásba kerül. A szemantikus cache az első alkalommal eltárolja a választ, és visszaadja, ha egy későbbi kérdés ugyanazt jelenti, még ha másképp is fogalmazták. Jól megcsinálva a hívások nagy része elmarad, és a válasz ezredmásodpercek alatt megérkezik. Hanyagul megcsinálva magabiztos válaszokat ad olyan kérdésekre, amelyeket senki sem tett fel.
A cikk szétválasztja a szemantikus cache-t a szolgáltatói prompt cachingtől, bemutatja az architektúrát, és idejének nagy részét azokra a részekre szánja, amelyeken a biztonság múlik: a küszöbre, a cache hatókörére, arra, mit ne cache-elj, és az érvénytelenítésre.
Miben különbözik a szemantikus cache a prompt cachingtől?
| Szempont | Prompt caching (szolgáltató) | Szemantikus cache (saját) |
|---|---|---|
| Egyezés | Pontosan azonos előtag | Hasonló jelentés egy küszöb felett |
| Mit használ újra | Feldolgozott bemeneti tokenek | A teljes tárolt válasz |
| Fut-e a modell | Igen, a válasz újonnan generálódik | Találatnál nem |
| Rossz válasz kockázata | A cache miatt nincs | Igen, téves találatnál |
A Claude prompt caching dokumentációja egyértelmű: a találathoz 100%-ban azonos promptszakaszok kellenek, és a cache nincs hatással a kimenet generálására. Ez eleve biztonságos, és ezt érdemes először bekapcsolni; erről a prompt caching és modellirányítás cikkben írtam. A szemantikus cache a modell előtt ül, és más jellegű döntés, mert azt változtatja meg, mit kap a felhasználó.
Hogyan működik a szemantikus cache?
Az olyan könyvtárak, mint a GPTCache, ezt embedding-generátorra, a válaszok tárolójára, a kérdések vektortárára és egy hasonlóság-értékelőre bontják, amely eldönti, hogy egy jelölt egyezik-e. Könyvtár nem feltétlenül kell hozzá: egy embedding-tábla vektorindexszel Postgresben, például pgvector, és húsz sor kód elég.
# Illustrative semantic cache on Postgres + pgvector
def cached_answer(question: str, scope: dict) -> str:
q = normalize(question)
vec = embed(q) # same model for writes and reads
row = db.fetchone("""
SELECT answer, 1 - (embedding <=> %(v)s) AS sim
FROM answer_cache
WHERE tenant = %(tenant)s AND lang = %(lang)s AND data_version = %(ver)s
AND expires_at > now()
ORDER BY embedding <=> %(v)s LIMIT 1""", {"v": vec, **scope})
if row and row.sim >= THRESHOLD:
metrics.hit(row.sim)
return row.answer
answer = call_model(question, scope)
if cacheable(question, answer):
db.execute("INSERT INTO answer_cache (...) VALUES (...)") # with expires_at = now() + ttl
return answer
Mennyit spórol a szemantikus cache?
A GPT Semantic Cache tanulmány Redisben tárolta a lekérdezések embeddingjeit, és ismétlődő, ügyfélszolgálati jellegű kérdéseken tesztelt. Akár 68,8%-kal kevesebb API-hívásról, kategóriától függően 61,6% és 68,8% közötti találati arányról és 97% feletti helyes találatról – azaz helyes választ adó találatról – számol be. Ezek a számok szándékosan ismétlődő forgalomból származnak. Egy termék-GYIK ilyen; egy nyílt végű asszisztens vagy egy kódolóeszköz nem, és a találatok töredékét fogja látni.
Mielőtt bármit építenél, mérd meg: naplózz egy hétnyi kérdést, embeddeld őket, és számold meg, hánynak van olyan közeli szomszédja, amelyet egy ember ugyanannak a kérdésnek fogadna el. Ez a szám a plafon.
Hogyan válaszd ki a hasonlósági küszöböt?
Az embedding-hasonlóság a témát méri, nem a szándékot. A Hogyan mondhatom le a rendelésemet? és a Hogyan mondhatom le az előfizetésemet? a vektortérben nagyon közel van, mégis más választ igényel. A Visszaküldhetem a kibontott terméket? és a Visszaküldhetem a bontatlan terméket? egyetlen szóelemben tér el, és ellentétes a válaszuk. Egy átlagos hasonlóságra hangolt küszöb boldogan kiszolgálja az egyiket a másik helyett.
- Gyűjts néhány száz valódi kérdéspárt, és mindegyiket címkézd: azonos vagy eltérő válasz. A trükkös negatív példákat szándékosan vedd fel.
- Számold ki minden pár hasonlóságát azzal az embedding-modellel, amelyet élesben használsz.
- Válaszd azt a legalacsonyabb küszöböt, amelynél a téves találatok nullán vagy a közelében maradnak, és fogadd el az ebből adódó találati arányt.
- Ismételd meg az ellenőrzést, valahányszor embedding-modellt váltasz, mert a hasonlósági skálák modellenként eltérnek.
A határsávban egy második ellenőrzés segít: a küszöb felett éppen csak átjutó találatoknál kérdezz meg egy kis, olcsó modellt, hogy a két kérdésre ugyanaz-e a válasz. Ez sokkal olcsóbb, mint a válasz generálása, és kiszűri a közeli tévedések többségét.
Hogyan akadályozd meg, hogy a szemantikus cache adatot szivárogtasson?
A cache a felhasználók közös memóriája. Ha a Mekkora a jelenlegi kedvezményem? kérdésre adott választ az ügyfélazonosító nélkül cache-eled, a következő kérdező ügyfél az első kedvezményét kapja. Minden keresést válassz szét mindazok szerint, amitől a válasz függ:
- Bérlő, személyes válaszoknál a felhasználó is. Vagy zárd ki teljesen a személyes válaszokat a cache-ből.
- Nyelv, hogy egy német kérdés ne kapjon tárolt angol választ.
- Szerepkör vagy jogosultsági szint, ha a belső munkatársak többet látnak, mint az ügyfelek.
- Adat- és promptverzió: egy új árlista, szabályzatszöveg vagy rendszerprompt új cache-névteret indítson.
A személyes adatot tartalmazó tárolt válaszok tárolt személyes adatok, a megfelelő megőrzési kötelezettségekkel; lásd a PII-kitakarás LLM-pipeline-okban cikket. A cache ráadásul írási útvonal is: ha a felhasználók tetszőleges modellkimenetet eltárolhatnak, amelyet aztán másoknak szolgálunk ki, egy prompt injectionnel manipulált válasz elterjedhet. Csak megbízható folyamatokból származó válaszokat tárolj, a guardrailek által megjelölt munkamenetekből soha.
Hogyan járjanak le és érvénytelenedjenek a tárolt válaszok?
Három mechanizmust használj együtt. Minden bejegyzésnek legyen TTL-je, inkább órákban vagy napokban, mint hónapokban mérve. A cache-kulcsban legyen verzió arra az adatra és promptra, amelyből a válasz született, így egy tartalomfrissítés új névtérre vált, ahelyett hogy egyenként törölnéd a sorokat. Végül kézi törlés dokumentumonként: ha valaki módosítja a visszaküldési szabályzatot, törölj minden bejegyzést, amelynek válasza ezt a dokumentumot idézte. Ehhez minden tárolt válasz mellé el kell menteni a forrásazonosítókat, ami a hivatkozások miatt amúgy is megéri, ahogy a grounding és hivatkozások cikkben.
Mit kell monitorozni?
| Metrika | Miért |
|---|---|
| Találati arány hatókörönként | Megmutatja, hol térül meg a cache |
| A találatok hasonlóság-eloszlása | A küszöb közeli sok találat kockázatot jelez |
| Negatív visszajelzés aránya tárolt és friss válaszokra | A téves találatok közvetlen jele |
| Találatok mintavételes emberi átnézése | Elkapja a felhasználók által nem jelzett téves találatokat |
A cache-találatokat ugyanúgy trace-eld, mint bármely más lépést, a hasonlósági értékkel és a tárolt bejegyzés azonosítójával, hogy egy rossz válasz visszakövethető legyen ahhoz a kérdéshez, amelyre eredetileg generálták; lásd az LLM-ágensek megfigyelhetősége cikket.
Források
Gyakori kérdések
Mi a különbség a prompt caching és a szemantikus cache között?
A prompt caching szolgáltatói funkció, amely a prompt feldolgozott előtagját használja újra, ha az pontosan azonos; a modell ettől még új választ generál. A szemantikus cache saját réteg, amely egy korábban generált választ ad vissza, ha az új kérdés elég hasonló egy tárolthoz, és így teljesen megspórolja a modellhívást.
Mennyit spórolhat egy szemantikus cache?
Attól függ, mennyire ismétlődő a forgalom. A GPT Semantic Cache tanulmány ismétlődő, ügyfélszolgálati jellegű kérdéseknél akár 68,8%-kal kevesebb API-hívásról, 61,6–68,8%-os találati arányról és 97% feletti helyes találatról számol be. A nyílt végű chat sokkal kevesebb találatot hoz.
Milyen hasonlósági küszöböt használjak?
Nincs univerzális szám; az embedding-modelltől és a szakterülettől függ. Gyűjts valódi kérdéspárokat, címkézd őket azonos vagy eltérő válaszként, és azt a küszöböt válaszd, amelynél ezen a készleten a téves találatok közel nullák maradnak.
Biztonságos a szemantikus cache személyes adatokkal?
Csak ha a bejegyzések ahhoz a felhasználóhoz vagy bérlőhöz vannak kötve, akié, és a személyes adatot tartalmazó válaszokat kizárod vagy felhasználónként cache-eled. Egy elválasztás nélküli közös cache kiszivárogtathatja az egyik felhasználó válaszát a másiknak.
Mikor ne használjak szemantikus cache-t?
Ha a válasz élő adattól függ, például készlettől, áraktól vagy rendelési állapottól, az eddigi beszélgetéstől vagy a felhasználó jogosultságaitól. Ilyenkor a drága részeket cache-eld, például a visszakeresési eredményeket vagy az eszközkimeneteket, ne a végső választ.