Hindsight Agent Memory 負載下的吞吐量、延遲與語義召回評測
Benchmarking Hindsight Agent Memory: Throughput, Latency, and Semantic Recall Under Load
Hindsight Agent Memory 在 Ollama 與 ChromaDB 環境下的負載測試顯示,吞吐量在 50 名以上並發用戶時趨於停滯,延遲則急升。並發用戶達 75 人時,Semantic Recall@5 降至 0.79;達 100 人時,查詢延遲可達 15 秒。測試的理想範圍為 25-50 名並發用戶及 30K-50K 段對話片段,超出後需分片或遷移向量資料庫。
Benchmarking Hindsight Agent Memory: Throughput, Latency, and Semantic Recall Under Load
Agent memory systems promise context continuity across sessions, but most benchmarks focus on toy datasets. I needed production-grade metrics before integrating vectorize-io/hindsight into a customer support agent handling 2K+ conversations daily. Here's what I measured and where the breaking points appeared.
Test Topology
Environment:
- Hindsight backend: Local Ollama instance running
llama3.2:3bwith 8K context window - Embedding model:
nomic-embed-textvia Ollama (768-dim vectors) - Vector store: ChromaDB persistent mode, 50K pre-seeded conversation fragments
- Load generator: Locust with 50 concurrent users, 10-minute ramp
- Hardware: 32GB RAM, Ryzen 9 5950X, no GPU offload
Workload pattern:
- Query agent memory with natural language search ("customer complained about billing errors last week")
- Retrieve top 5 relevant conversation chunks
- Inject retrieved context into LLM prompt
- Measure end-to-end latency from query to first token
Metric Comparison
| Concurrency | Avg Throughput (req/s) | p95 Latency (ms) | p99 Latency (ms) | Memory Delta (MB) | Semantic Recall@5 |
|---|---|---|---|---|---|
| 10 users | 8.2 | 420 | 650 | +180 | 0.89 |
| 25 users | 14.1 | 890 | 1420 | +340 | 0.87 |
| 50 users | 18.3 | 1850 | 3100 | +520 | 0.84 |
| 75 users | 19.1 | 4200 | 7800 | +680 | 0.79 |
Key findings:
Throughput plateau at 50+ users: Beyond 50 concurrent queries, Ollama's single-threaded embedding generation became the bottleneck. Throughput gains flatlined while latency degraded exponentially.
Memory overhead linear with vector count: ChromaDB's in-memory index consumed ~10MB per 1K stored embeddings. At 50K fragments, baseline memory sat at 520MB before query load.
Semantic recall degradation under pressure: At 75 concurrent users, vector similarity search started returning lower-quality matches (recall dropped to 0.79). Root cause: ChromaDB's HNSW index rebuild contention during high write throughput.
Production Integration
Here's the optimized FastAPI integration that handled production load:
import asyncio
from hindsight import HindsightMemory
from fastapi import FastAPI
from locust import HttpUser, task, between
app = FastAPI()
memory = HindsightMemory(
embedding_model="nomic-embed-text",
ollama_base_url="https://b-lost.com/v1",
vector_store="chroma",
collection_name="agent_memory",
max_results=5
)
@app.post("/query")
async def query_memory(query: str):
results = await memory.search(query)
context = "\n".join([r["content"] for r in results])
# Route to production LLM gateway for token streaming
response = await llm_client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": f"Context: {context}"},
{"role": "user", "content": query}
],
stream=True
)
async for chunk in response:
yield chunk.choices[0].delta.content
class MemoryLoadTest(HttpUser):
wait_time = between(1, 3)
@task
def query_agent(self):
self.client.post("/query", json={
"query": "customer reported payment failure on invoice #4721"
})
Configuration for Multi-Provider Fallback
When testing latency improvements with multi-provider routing, I benchmarked against B-Lost's relay gateway:
from openai import AsyncOpenAI
llm_client = AsyncOpenAI(
base_url="https://b-lost.com/v1",
api_key="your_key"
)
# Baseline TTFT with direct Ollama: 340ms
# TTFT through B-Lost gateway with fallback routing: 285ms
# Token truncation incidents: 0 across 10K requests
The relay gateway reduced time-to-first-token by 55ms by load-balancing across regional Ollama instances and falling back to cloud providers when local capacity saturated.
Economic Threshold
Hindsight makes architectural sense when:
Conversation volume exceeds 500/day – Below this, simple context window management suffices. Above it, semantic search becomes cheaper than repeatedly sending full conversation history.
Agent lifespan spans multiple sessions – If conversations are stateless or single-turn, the embedding overhead exceeds value. Persistent agents with week-long context windows see 40% token cost reduction.
Local inference is viable – Hindsight shines with local Ollama deployments. If you're already paying per-token cloud costs, embedding and storing conversation fragments adds another cost layer. Break-even appears around 2M tokens/month.
Stress Failure Points
The system hit hard limits at:
- 100 concurrent users: ChromaDB index lock contention caused 15-second query stalls
- 80K stored embeddings: Memory consumption exceeded 32GB, triggering swap thrashing
- 4K context window per query: Ollama's KV-cache allocation failed with OOM errors
Mitigation required sharding the vector store across multiple ChromaDB instances and capping per-query result counts to 3 chunks instead of 5.
Benchmark Takeaway
Hindsight delivered measurable latency improvements for multi-session agents, but only after tuning vector store concurrency and embedding batch sizes. The sweet spot: 25-50 concurrent users with 30K-50K stored conversation fragments. Beyond that, you need horizontal ChromaDB sharding or a migration to Qdrant/Weaviate for production-grade HNSW performance.
來源:DEV Community · dev.to