Files
ajarbot/demo_hybrid_comparison.py
Jordan Ramos 8afff96bb5 Add API usage tracking and dynamic task reloading
Features:
- Usage tracking system (usage_tracker.py)
  - Tracks input/output tokens per API call
  - Calculates costs with support for cache pricing
  - Stores data in usage_data.json (gitignored)
  - Integrated into llm_interface.py

- Dynamic task scheduler reloading
  - Auto-detects YAML changes every 60s
  - No restart needed for new tasks
  - reload_tasks() method for manual refresh

- Example cost tracking scheduled task
  - Daily API usage report
  - Budget tracking ($5/month target)
  - Disabled by default in scheduled_tasks.yaml

Improvements:
- Fixed tool_use/tool_result pair splitting bug (CRITICAL)
- Added thread safety to agent.chat()
- Fixed N+1 query problem in hybrid search
- Optimized database batch queries
- Added conversation history pruning (50 messages max)

Updated .gitignore:
- Exclude user profiles (memory_workspace/users/*.md)
- Exclude usage data (usage_data.json)
- Exclude vector index (vectors.usearch)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-13 23:38:44 -07:00

54 lines
1.7 KiB
Python

"""Compare old keyword search vs new hybrid search."""
from memory_system import MemorySystem
print("Initializing memory system...")
memory = MemorySystem()
print("\n" + "="*70)
print("KEYWORD vs HYBRID SEARCH COMPARISON")
print("="*70)
# Test queries that benefit from semantic understanding
test_queries = [
("How do I reduce costs?", "Testing semantic understanding of 'reduce costs' -> 'cost optimization'"),
("when was I born", "Testing semantic match for birthday/birth date"),
("what database do we use", "Testing keyword match for 'SQLite'"),
("vector similarity", "Testing technical term matching"),
]
for query, description in test_queries:
print(f"\n{description}")
print(f"Query: '{query}'")
print("-" * 70)
# Keyword-only search
print("\n KEYWORD SEARCH (old):")
keyword_results = memory.search(query, max_results=2)
if keyword_results:
for i, r in enumerate(keyword_results, 1):
print(f" {i}. {r['path']}:{r['start_line']} (score: {r['score']:.3f})")
print(f" {r['snippet'][:80]}...")
else:
print(" No results found!")
# Hybrid search
print("\n HYBRID SEARCH (new):")
hybrid_results = memory.search_hybrid(query, max_results=2)
if hybrid_results:
for i, r in enumerate(hybrid_results, 1):
print(f" {i}. {r['path']}:{r['start_line']} (score: {r['score']:.3f})")
print(f" {r['snippet'][:80]}...")
else:
print(" No results found!")
print()
print("\n" + "="*70)
print(f"[OK] Hybrid search loaded with {len(memory.vector_index)} vector embeddings")
print(f"[OK] Vector index: {memory.vector_index_path}")
print(f"[OK] Database: {memory.db_path}")
print("="*70)
memory.close()