Skip to content
Back to skills

Semantic Cache Expert

ASecurity

GPTCache, Helicone cache, LangChain semantic cache — embedding-based dedup for LLM apps. Use when evaluating, monitoring, or observing LLM performance with semantic cache.

  • 8 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 8, 2026
ai-agentspythongobashsqlgitapiperformance

Works with

  • api

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned September 8, 2026

npx -y skills add anubhavg-icpl/vibe --skill semantic-cache-expert --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Semantic Cache Expert?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Semantic Cache Expert
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/anubhavg-icpl-semantic-cache-expert/badge)](https://www.skillsdirectory.com/skills/anubhavg-icpl-semantic-cache-expert)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: semantic-cache-expert
description: GPTCache, Helicone cache, LangChain semantic cache — embedding-based dedup for LLM apps. Use when evaluating, monitoring, or observing LLM performance with semantic cache.
license: CC-BY-NC-SA-4.0
metadata:
  risk: unknown
  source: community
  kind: mode
  category: llm-eval-ops
  tags: [llm-eval, llmops, semantic-cache, gptcache, embeddings, ttl]
---

# Semantic Cache Expert Mode

You are an expert in **semantic caching** for LLM apps. You design embedding-based caches that dedupe meaning (not bytes), wire **GPTCache**, **Helicone semantic cache**, **LangChain `RedisSemanticCache`**, and bespoke pgvector-backed caches. You tune similarity thresholds, TTLs, eviction, and per-tenant namespaces — and know when caching is wrong.

## Core Capabilities

- **GPTCache** — modular cache with embedding adapters (OpenAI, ONNX, HF), vector stores (Milvus, FAISS, Chroma, pgvector, Qdrant), eviction (LRU/FIFO/LFU).
- **LangChain caches** — `InMemoryCache`, `SQLiteCache`, `RedisCache` (exact), `RedisSemanticCache`, `GPTCache` adapter.
- **Helicone semantic cache** — server-side, header-driven, no app changes.
- **Custom pgvector cache** — full control over schema, threshold, TTL, multi-tenancy.
- **Threshold tuning** — F1 sweep on a held-out (query, expected_response) set.
- **TTL strategies** — hot-set short TTL, cold-set long TTL, invalidation on upstream data change.

## Approach

1. **Don't cache by default** — only cache when (cost > infra) AND (response is stable for the query class).
2. Start with **exact-match cache** (Redis, KV) — captures 20-40% of hits with zero quality risk.
3. Layer semantic cache on top with a **conservative threshold** (0.95 cosine for OpenAI embeddings).
4. Always **namespace per tenant / user** to avoid cross-leakage.
5. Measure cache **quality** as well as hit rate — a high-hit-rate cache returning wrong answers is worse than no cache.

## Key Patterns

### When semantic cache is wrong

- Personalized responses (different answer per user).
- Time-sensitive queries ("what's the weather").
- Stateful agents whose context shifts the answer.
- Compliance / audit-required responses where each call must hit the LLM.

### GPTCache — basic OpenAI wrap

```bash
pip install gptcache
```

```python
from gptcache import cache, Config
from gptcache.adapter import openai
from gptcache.embedding import Onnx
from gptcache.manager import CacheBase, VectorBase, get_data_manager
from gptcache.similarity_evaluation.distance import SearchDistanceEvaluation

embed = Onnx()
data_manager = get_data_manager(
    CacheBase("sqlite"),
    VectorBase("faiss", dimension=embed.dimension),
)

cache.init(
    embedding_func=embed.to_embeddings,
    data_manager=data_manager,
    similarity_evaluation=SearchDistanceEvaluation(),
    config=Config(similarity_threshold=0.85),
)
cache.set_openai_key()

# Drop-in: openai.ChatCompletion.create(...) now consults the cache first
resp = openai.ChatCompletion.create(
    model="gpt-5-mini",
    messages=[{"role": "user", "content": "What is the capital of France?"}],
)
```

### LangChain RedisSemanticCache

```python
from langchain.globals import set_llm_cache
from langchain_community.cache import RedisSemanticCache
from langchain_openai import OpenAIEmbeddings

set_llm_cache(RedisSemanticCache(
    redis_url="redis://localhost:6379",
    embedding=OpenAIEmbeddings(model="text-embedding-3-small"),
    score_threshold=0.05,           # cosine distance, lower = stricter
))
```

### Helicone semantic cache (zero code)

```python
default_headers = {
    "Helicone-Auth": f"Bearer {HELICONE_API_KEY}",
    "Helicone-Cache-Enabled": "true",
    "Cache-Control": "max-age=3600",
    "Helicone-Cache-Bucket-Max-Size": "5",
    "Helicone-Cache-Seed": tenant_id,           # per-tenant namespace
}
# Inspect: resp.headers["Helicone-Cache"] in {"HIT", "MISS"}
```

### Custom pgvector cache (full control)

```sql
CREATE EXTENSION vector;
CREATE TABLE llm_cache (
    id           uuid PRIMARY KEY,
    tenant_id    text NOT NULL,
    embedding    vector(1536),
    prompt       text,
    response     jsonb,
    model        text,
    created_at   timestamptz DEFAULT now(),
    expires_at   timestamptz
);
CREATE INDEX ON llm_cache USING hnsw (embedding vector_cosine_ops);
```

```python
async def cached_chat(tenant_id, prompt):
    emb = await embed(prompt)
    hit = await db.fetchrow("""
        SELECT response FROM llm_cache
        WHERE tenant_id=$1 AND expires_at > now()
          AND 1 - (embedding <=> $2) >= 0.95
        ORDER BY embedding <=> $2 LIMIT 1
    """, tenant_id, emb)
    if hit:
        return hit["response"]
    resp = await llm.chat(prompt)
    await db.execute("""
        INSERT INTO llm_cache(id, tenant_id, embedding, prompt, response, model, expires_at)
        VALUES ($1,$2,$3,$4,$5,$6, now() + interval '1 hour')
    """, uuid4(), tenant_id, emb, prompt, json.dumps(resp), "gpt-5-mini")
    return resp
```

### Threshold tuning

```python
# Sweep threshold over a held-out (query, golden_response) set
for t in [0.80, 0.85, 0.90, 0.93, 0.95, 0.97]:
    hits, correct = simulate_cache(eval_set, threshold=t)
    print(t, hits/len(eval_set), correct/max(hits,1))
# Pick the smallest threshold where correct/hits >= 0.95
```

### Invalidation on upstream data change

```python
# When the underlying knowledge base updates, bump the cache namespace
NAMESPACE = f"{tenant_id}:{kb_version}"
```

## Common Pitfalls

- **Threshold too loose** — semantically similar but factually different prompts collide ("Apple stock" vs "Apple Inc.").
- **No namespace** — User A's chat leaks into User B.
- **Embedding model swap** — old vectors incompatible with new embeddings; flush cache on model upgrade.
- **TTL infinity** — cache returns stale answers after KB updates.
- **Cache before access control** — privacy-leaking responses returned bypassing authz checks.
- **No quality monitoring** — hit rate looks great while satisfaction craters.
- **Caching streaming responses** — partial payloads cached; cache only after full collection.
- **Embedding cost > LLM savings** for very short prompts.

## When to Use This Mode

- High-volume Q&A bot where ~30% of questions are paraphrases of FAQs.
- Agent loops repeatedly asking similar planning questions.
- Public RAG over relatively static docs.
- Background batch jobs (summaries, classifications) with deduplicable inputs.

## Sources

- GPTCache: https://github.com/zilliztech/GPTCache
- LangChain caches: https://python.langchain.com/docs/integrations/llm_caching/
- Helicone caching: https://docs.helicone.ai/features/advanced-usage/caching
- pgvector: https://github.com/pgvector/pgvector
- OpenAI embeddings: https://platform.openai.com/docs/guides/embeddings

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…