Skip to main content
Glama
CHAT_CONTEXT_OPTIMIZATION.md10.2 kB
# Chat Context Optimization ## Tổng quan Chat Context Optimization là hệ thống quản lý context thông minh cho các cuộc hội thoại dài, giúp: - **Giảm token usage** mà vẫn giữ được context quan trọng - **Tăng relevance** bằng cách retrieve các đoạn hội thoại liên quan - **Tự động summarize** các phần cũ của conversation ## Kiến trúc ``` ┌─────────────────────────────────────────────────────────────────┐ │ Chat Context Optimization │ ├─────────────────────────────────────────────────────────────────┤ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ TokenEstimator │ │ EmbeddingService │ │ SpanRetriever │ │ │ │ │ │ │ │ │ │ │ │ - Ước tính │ │ - Tạo embedding │ │ - Similarity │ │ │ │ token count │ │ - Hỗ trợ nhiều │ │ search │ │ │ │ - Character- │ │ providers │ │ - Span │ │ │ │ based │ │ - Retry logic │ │ expansion │ │ │ └────────┬────────┘ └────────┬─────────┘ └────────┬────────┘ │ │ │ │ │ │ │ └──────────┬─────────┴──────────────────────┘ │ │ ▼ │ │ ┌─────────────────────┐ │ │ │ ChatContextBuilder │ │ │ │ │ │ │ │ - Strategy pattern │ │ │ │ - Budget management │ │ │ │ - Summarization │ │ │ └─────────┬───────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────┐ │ │ │ Integration │ │ │ │ │ │ │ │ - API adapter │ │ │ │ - DB persistence │ │ │ │ - Embedding queue │ │ │ └─────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` ## Strategies ### 1. `full` - Không tối ưu - Include tất cả messages trong conversation - Dùng khi conversation ngắn hoặc cần full context - Không có token savings ### 2. `last-n` - N messages gần nhất - Chỉ include N messages cuối cùng - Simple và nhanh - Mất context từ đầu conversation ### 3. `summary+recent` - Summary + Recent (Mặc định) - Combine: - Summary của các messages cũ (auto-generated) - N messages gần nhất - Cân bằng giữa context và token usage - Tự động trigger summarization khi cần ### 4. `span-retrieval` - Semantic Search - Dùng embedding để tìm các đoạn hội thoại liên quan - Algorithm: 1. Generate embedding cho user message hiện tại 2. Similarity search trong messages cũ (pgvector) 3. Expand các hit thành spans (±radius) 4. Combine spans + recent messages - Tốt nhất cho long conversations với nhiều topics ## Configuration ```typescript interface ChatContextConfig { // Strategy selection strategy: 'full' | 'last-n' | 'summary+recent' | 'span-retrieval'; // Token budget maxPromptTokens: number; // Default: 4096 // Recent messages recentMinMessages: number; // Default: 4 (always include) recentMaxMessages: number; // Default: 20 // Span retrieval settings spanTopK: number; // Default: 5 (top hits) spanRadius: number; // Default: 2 (expand ±2 messages) spanBudgetRatio: number; // Default: 0.4 (40% budget for spans) spanMinSimilarity: number; // Default: 0.7 // Summarization summarizationThreshold: number; // Default: 2000 tokens // System prompt systemPrompt?: string; } ``` ### Per-Model Token Limits ```typescript // Auto-adjusted based on model 'gpt-4' -> maxPromptTokens: 8192 'claude-3' -> maxPromptTokens: 100000 'gpt-3.5' -> maxPromptTokens: 4096 ``` ## Database Schema ### Migration: `007_chat_context_optimization.sql` ```sql -- Thêm vào bảng messages ALTER TABLE messages ADD COLUMN turn_index INT NOT NULL DEFAULT 0; ALTER TABLE messages ADD COLUMN token_estimate INT; ALTER TABLE messages ADD COLUMN is_summarized BOOLEAN DEFAULT false; ALTER TABLE messages ADD COLUMN embedding vector(1536); -- Thêm vào bảng conversations ALTER TABLE conversations ADD COLUMN summary TEXT; ALTER TABLE conversations ADD COLUMN summary_token_estimate INT; ALTER TABLE conversations ADD COLUMN summary_updated_at TIMESTAMP; -- Indexes CREATE INDEX idx_messages_embedding_vector ON messages USING ivfflat (embedding vector_cosine_ops); ``` ## Usage ### Basic Usage ```typescript import { buildContextForRequest } from './services/chat'; const result = await buildContextForRequest({ conversationId: 'conv-123', messages: [ { role: 'user', content: 'Hello' }, { role: 'assistant', content: 'Hi there!' }, { role: 'user', content: 'What did we discuss earlier?' } ], model: 'gpt-4', contextStrategy: 'span-retrieval', }); // result.messages - Optimized messages for LLM // result.tokenStats.saved - Tokens saved // result.strategy - Strategy used ``` ### Direct ChatContextBuilder ```typescript import { chatContextBuilder } from './services/chat'; const result = await chatContextBuilder.buildContext({ conversationId: 'conv-123', currentUserMessage: 'What did we discuss about the database design?', modelId: 'gpt-4', configOverrides: { strategy: 'span-retrieval', spanTopK: 10, }, }); ``` ### Generate Embeddings ```typescript import { queueMessageEmbedding, backfillConversationEmbeddings } from './services/chat'; // Queue single message embedding (async, non-blocking) await queueMessageEmbedding('conv-123', 'New message content'); // Backfill embeddings for conversation const { processed } = await backfillConversationEmbeddings('conv-123', 20); ``` ## Environment Variables ```bash # Embedding provider configuration EMBEDDING_PROVIDER=openai # openai | openrouter | local EMBEDDING_MODEL_ID=text-embedding-3-small EMBEDDING_DIMENSION=1536 EMBEDDING_API_KEY=sk-... # OpenRouter (alternative) OPENROUTER_API_KEY=sk-or-... ``` ## Services ### TokenEstimator Ước tính số tokens mà không cần API call: - Character-based estimation (~4 chars/token cho English) - CJK support (~2 chars/token) - Code detection (~3.5 chars/token) ```typescript import { tokenEstimator } from './services/chat'; const tokens = tokenEstimator.estimateTokens('Hello world', 'gpt-4'); // ~2 tokens ``` ### EmbeddingService Generate embeddings với retry logic: ```typescript import { embeddingService } from './services/chat'; const embedding = await embeddingService.getEmbedding('Some text'); // number[] with dimension 1536 const embeddings = await embeddingService.getBatchEmbeddings(['text1', 'text2']); // number[][] ``` ### SpanRetriever Semantic search + span expansion: ```typescript import { SpanRetriever } from './services/chat'; const spans = await spanRetriever.retrieveRelevantSpans( 'conv-123', 'What about the database?', { topK: 5, spanRadius: 2 }, 2000 // token budget ); ``` ## Integration với Chat API ### Tích hợp vào `/v1/chat/completions` ```typescript // Trong handleChatCompletions const contextResult = await buildContextForRequest({ conversationId: req.body.conversation_id, messages: req.body.messages, model: req.body.model, contextStrategy: req.body.context_strategy, }); // Sử dụng optimized prompt const result = await routeRequest({ prompt: contextResult.prompt, // hoặc messages: contextResult.messages maxTokens: max_tokens, }, routingOptions); ``` ## Performance ### Token Savings Estimate | Conversation Length | Strategy | Avg Savings | |---------------------|----------|-------------| | <20 messages | full | 0% | | 20-50 messages | last-n | 40-60% | | 50-100 messages | summary+recent | 60-80% | | >100 messages | span-retrieval | 70-90% | ### Latency Impact | Strategy | Additional Latency | |----------|-------------------| | full | ~0ms | | last-n | ~5ms | | summary+recent | ~20ms (first time: +500ms for summarization) | | span-retrieval | ~50-100ms (embedding generation) | ## Testing ```bash # Run tests npm test -- --grep "ChatContextBuilder" # Specific test files npm test -- src/services/chat/__tests__/ ``` ## Roadmap - [ ] Cấu hình per-project/per-tool - [ ] LLM-based summarization (thay vì extractive) - [ ] Streaming support cho summarization - [ ] Caching embeddings - [ ] Multi-language token estimation

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/babasida246/ai-mcp-gateway'

If you have feedback or need assistance with the MCP directory API, please join our Discord server