Optimized Prompts: - Create utils/rag_prompt_builder.py with citation-optimized prompts - Specialized for DAO tokenomics and technical documentation - Proper citation format [1], [2] with doc_id, page, section - Memory context integration (facts, events, summaries) - Token count estimation RAG Service Metrics: - Add comprehensive logging in query_pipeline.py - Log: question, doc_ids, scores, retrieval method, timing - Track: retrieval_time, total_query_time, documents_found, citations_count - Add metrics in ingest_pipeline.py: pages_processed, blocks_processed, pipeline_time Router Improvements: - Use optimized prompt builder in _handle_rag_query() - Add graceful fallback: if RAG unavailable, use Memory only - Log prompt token count, RAG usage, Memory usage - Return detailed metadata (rag_used, memory_used, citations_count, metrics) Evaluation Tools: - Create tests/rag_eval.py for systematic quality testing - Test fixed questions with expected doc_ids - Save results to JSON and CSV - Compare RAG Service vs Router results - Track: citations, expected docs found, query times Documentation: - Create docs/RAG_METRICS_PLAN.md - Plan for Prometheus metrics collection - Grafana dashboard panels and alerts - Implementation guide for metrics
7.6 KiB
7.6 KiB
RAG Metrics & Dashboard Plan
План збору метрик та створення дашборду для RAG + Memory стеку.
1. Метрики для збору
1.1. RAG Service Metrics
Ingest Metrics:
rag_ingest_total- загальна кількість ingest операційrag_ingest_duration_seconds- час ingest (histogram)rag_ingest_documents_indexed- кількість індексованих документівrag_ingest_pages_processed- кількість оброблених сторінокrag_ingest_errors_total- кількість помилок ingest
Query Metrics:
rag_query_total- загальна кількість запитівrag_query_duration_seconds- час query (histogram)rag_query_documents_retrieved- кількість знайдених документівrag_query_citations_count- кількість citationsrag_query_embedding_time_seconds- час embeddingrag_query_retrieval_time_seconds- час retrievalrag_query_llm_time_seconds- час LLM генераціїrag_query_errors_total- кількість помилок queryrag_query_empty_results_total- запити без результатів
Quality Metrics:
rag_query_dao_filter_applied- застосування dao_id фільтраrag_query_doc_ids_found- унікальні doc_ids в результатах
1.2. Router Metrics (RAG Query Mode)
router_rag_query_total- загальна кількість rag_query запитівrouter_rag_query_duration_seconds- загальний час обробкиrouter_rag_query_memory_used- використання Memoryrouter_rag_query_rag_used- використання RAGrouter_rag_query_prompt_tokens_estimated- оцінка токенів промптуrouter_rag_query_fallback_total- fallback на Memory only
1.3. Memory Service Metrics
memory_context_fetch_total- кількість викликів get_contextmemory_context_fetch_duration_seconds- час отримання контекстуmemory_context_facts_count- кількість factsmemory_context_events_count- кількість eventsmemory_context_summaries_count- кількість summaries
2. Де збирати метрики
2.1. RAG Service
Файл: services/rag-service/app/metrics.py
from prometheus_client import Counter, Histogram, Gauge
# Ingest metrics
ingest_total = Counter('rag_ingest_total', 'Total ingest operations')
ingest_duration = Histogram('rag_ingest_duration_seconds', 'Ingest duration')
ingest_documents = Counter('rag_ingest_documents_indexed', 'Documents indexed')
ingest_errors = Counter('rag_ingest_errors_total', 'Ingest errors')
# Query metrics
query_total = Counter('rag_query_total', 'Total queries')
query_duration = Histogram('rag_query_duration_seconds', 'Query duration')
query_documents = Histogram('rag_query_documents_retrieved', 'Documents retrieved')
query_citations = Histogram('rag_query_citations_count', 'Citations count')
query_errors = Counter('rag_query_errors_total', 'Query errors')
query_empty = Counter('rag_query_empty_results_total', 'Empty results')
# Quality metrics
query_dao_filter = Counter('rag_query_dao_filter_applied', 'DAO filter applied', ['dao_id'])
Використання:
- В
ingest_pipeline.py: після успішного ingest - В
query_pipeline.py: після кожного query
2.2. Router
Файл: metrics.py (в корені Router)
from prometheus_client import Counter, Histogram
rag_query_total = Counter('router_rag_query_total', 'Total RAG queries')
rag_query_duration = Histogram('router_rag_query_duration_seconds', 'RAG query duration')
rag_query_memory_used = Counter('router_rag_query_memory_used', 'Memory used in RAG queries')
rag_query_rag_used = Counter('router_rag_query_rag_used', 'RAG used in queries')
rag_query_fallback = Counter('router_rag_query_fallback_total', 'Fallback to Memory only')
Використання:
- В
router_app.py: в_handle_rag_query()
3. Dashboard (Grafana)
3.1. Panels
RAG Service:
- Ingest Rate -
rate(rag_ingest_total[5m]) - Ingest Duration -
histogram_quantile(0.95, rag_ingest_duration_seconds) - Documents Indexed -
sum(rag_ingest_documents_indexed) - Query Rate -
rate(rag_query_total[5m]) - Query Duration -
histogram_quantile(0.95, rag_query_duration_seconds) - Documents Retrieved -
avg(rag_query_documents_retrieved) - Citations Count -
avg(rag_query_citations_count) - Empty Results Rate -
rate(rag_query_empty_results_total[5m]) / rate(rag_query_total[5m])
Router (RAG Query):
- RAG Query Rate -
rate(router_rag_query_total[5m]) - RAG Query Duration -
histogram_quantile(0.95, router_rag_query_duration_seconds) - Memory Usage Rate -
rate(router_rag_query_memory_used[5m]) / rate(router_rag_query_total[5m]) - RAG Usage Rate -
rate(router_rag_query_rag_used[5m]) / rate(router_rag_query_total[5m]) - Fallback Rate -
rate(router_rag_query_fallback_total[5m]) / rate(router_rag_query_total[5m])
Memory Service:
- Context Fetch Rate -
rate(memory_context_fetch_total[5m]) - Context Fetch Duration -
histogram_quantile(0.95, memory_context_fetch_duration_seconds) - Average Facts Count -
avg(memory_context_facts_count) - Average Events Count -
avg(memory_context_events_count)
3.2. Alerts
- High Error Rate:
rate(rag_query_errors_total[5m]) > 0.1 - Slow Queries:
histogram_quantile(0.95, rag_query_duration_seconds) > 10 - High Fallback Rate:
rate(router_rag_query_fallback_total[5m]) / rate(router_rag_query_total[5m]) > 0.2 - Empty Results:
rate(rag_query_empty_results_total[5m]) / rate(rag_query_total[5m]) > 0.3
4. Реалізація (мінімальна)
4.1. Додати Prometheus Client
RAG Service:
pip install prometheus-client
Router:
pip install prometheus-client
4.2. Expose Metrics Endpoint
RAG Service:
# app/main.py
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST
from fastapi.responses import Response
@app.get("/metrics")
async def metrics():
return Response(content=generate_latest(), media_type=CONTENT_TYPE_LATEST)
Router:
# http_api.py
@app.get("/metrics")
async def metrics():
return Response(content=generate_latest(), media_type=CONTENT_TYPE_LATEST)
4.3. Docker Compose для Prometheus + Grafana
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
5. Наступні кроки
- Додати
prometheus-clientв requirements - Створити
metrics.pyв RAG Service та Router - Додати
/metricsendpoints - Налаштувати Prometheus scraping
- Створити Grafana dashboard
- Налаштувати alerts
6. Корисні запити для аналізу
Hit Rate (кількість успішних запитів з результатами):
(rag_query_total - rag_query_empty_results_total) / rag_query_total
Average Documents per Query:
avg(rag_query_documents_retrieved)
DAO Distribution:
sum by (dao_id) (rag_query_dao_filter_applied)
Token Usage:
avg(router_rag_query_prompt_tokens_estimated)