Przegląd
GoModel ma dwie warstwy cache’u odpowiedzi dla requestów streamingowych i niestreamingowych na:/v1/chat/completions/v1/responses/v1/messages/v1/embeddings/v1/systemone(oraz/permutei/separateKeva)
text/event-stream.
Cache dokładnego dopasowania zwraca identyczne co do bajtu odpowiedzi z:
/v1/embeddings korzysta tylko z cache’u dokładnego. Embedding musi
reprezentować dokładnie ten tekst, dla którego go zażądano, więc odtworzenie
wektora jedynie podobnego wejścia byłoby błędną odpowiedzią, a nie równoważną.
Requesty embeddingów nigdy nie są też streamowane, więc cache’owana jest tylko
odpowiedź JSON. To samo dotyczy decyzji System One:
podobny stan to nie ta sama decyzja.Włącz cache dokładny
Skieruj cache odpowiedzi na Redisa:REDIS_URLREDIS_KEY_RESPONSESREDIS_TTL_RESPONSES
Włącz cache semantyczny
Dodaj bloksemantic z providerem embeddera i bazą wektorową:
qdrantpgvectorpineconeweaviate
Cache-Control: no-cache lub Cache-Control: no-store, aby pominąć cache dla
pojedynczego requestu. Plugin może też wykluczyć
jedną odpowiedź z obu warstw, ustawiając NoStore w swojej decyzji – korzysta
z tego guardrail, który przywraca do odpowiedzi dane specyficzne dla requestu, aby
przywrócony tekst nigdy nie został odtworzony innemu wywołującemu. Request
background: true na
/v1/responses także pomija obie
warstwy: jego body queued zawiera id należące do odpowiedzi jednego wywołującego.
Pełny projekt cache’u semantycznego i opcje przechowywania opisuje
ADR-0006.
Na czym opiera się klucz cache’u dokładnego
Cache dokładny hashuje:- ścieżkę requestu
- rozwiązany kontekst workflow użyty do wykonania, konkretnie tryb wykonania, typ providera i rozwiązany model
- łańcuch guardrails, do którego rozwiązuje się request, w fazach promptu, odpowiedzi i strumienia
- końcowe body requestu
Planowanie prompt cache u providera
Gdy routing ustali konkretnego providera i model, GoModel dodaje plan cache’owania, jeśli stały prefiks spełnia minimalny rozmiar wymagany przez tego providera, a klient nie przekazał już własnej dyrektywy cache:- OpenAI otrzymuje stały
prompt_cache_key; modele obsługujące jawne cache’owanie otrzymują też breakpoint i jawny tryb cache. - Anthropic otrzymuje automatyczne cache’owanie ephemeral na najwyższym poziomie.
- Amazon Bedrock Converse otrzymuje cache point po stałym prefiksie.
- Natywne Gemini AI Studio tworzy i ponownie wykorzystuje pięciominutowy obiekt cached content; równoczesne tworzenie jest łączone według prefiksu i stałych danych uwierzytelniających.
true), a nieprawidłowa wartość
generuje ostrzeżenie przy starcie.
Zachowanie user_path
W cache’u dokładnym user_path sam w sobie nie jest dodawany do klucza cache’u.
To zamierzone. Jeśli dwa requesty mają tę samą ścieżkę, rozwiązany workflow
i końcowe body requestu, mogą współdzielić ten sam wpis cache’u dokładnego,
nawet jeśli pochodzą z różnych wartości user_path.
Jeśli potrzebujesz zachowania cache’u specyficznego dla tenanta lub ścieżki, użyj
workflow z zakresem albo w inny sposób spraw, by końcowy request różnił się dla tego
zakresu. Sam
user_path nie jest kluczem partycjonowania cache’u dokładnego.- wyłącz cache w workflow z zakresem
- używaj różnych workflow z zakresem dla różnych wartości
user_path - dołącz kontekst specyficzny dla zakresu, aby końcowe body requestu się różniło
Odpowiedzi obsłużone przez failover nie są cache’owane
Gdy na request odpowiada cel failoveru, a nie ten, który routing wybrał jako pierwszy, odpowiedź nie jest zapisywana. Klucz cache’u dokładnego jest hashowany z rozwiązania sprzed failoveru, więc zapisanie odpowiedzi zapasowego celu powodowałoby jej zwracanie pod kluczem celu głównego, gdy ten wróci do działania. Praktyczna konsekwencja: model wirtualny, którego pierwszy cel jest chronicznie niedostępny, przestaje gromadzić wpisy w cache’u tak długo, jak ten cel nie działa – każdy request z cache missem przechodzi failover i jest obsługiwany na świeżo, a nic, co wytworzy, nie jest zapisywane. Wpisy zapisane przed awarią są zwracane aż do wygaśnięcia ich TTL: wyszukiwanie w cache’u odbywa się przed wysłaniem, więc cache hit jest zwracany bez angażowania żadnego z celów. Jeśli cel ma być niedostępny przez dłuższy czas, zmień kolejność łańcucha (lub wskaż w modelu wirtualnym sprawny cel), aby odpowiedzi na niego znów mogły trafiać do cache’u. Retry w obrębie jednego celu nie są tym objęte: z obu warstw cache’u wykluczana jest tylko odpowiedź wytworzona po tym, jak przeszukiwanie przeszło do innego celu.Analityka cache’u
Gdy cache odpowiedzi i śledzenie użycia są włączone, Admin API udostępnia przegląd obejmujący tylko odpowiedzi z cache’u pod:user_path wywołującego
i cache_type równym exact lub semantic. Endpointy użycia
(/admin/usage/* i /v1/usage) domyślnie je pomijają, aby sumy i koszty
odzwierciedlały wydatki u providerów; przekaż cache_mode=all, aby je uwzględnić,
lub cache_mode=cached, aby zobaczyć tylko cache hity. Wyjątkiem jest
/admin/usage/sessions: sumy requestów i tokenów sesji zawsze obejmują cache hity,
a jego pola kosztów pozostają ograniczone do providerów.