Hybrid search with RRF improves AI memory system over pure vector search

An open-source memory system for AI assistants has been developed, using PostgreSQL with pgvector in a local-first, self-hosted setup. The system stores information for AI assistants to remember across sessions and makes it searchable.
Why pure vector search wasn't enough
The developer started with pure vector search: embedding queries, using cosine similarity, and returning top-k results. While this worked for vague questions, it consistently failed on exact matches. For example, searching for "RRF merging" would return chunks about "combining ranked lists" from months ago instead of the document that literally says "RRF merging."
Hybrid search solution
The solution involved adding a second search arm: full-text search using PostgreSQL's tsvector with a GIN index. This keyword matching catches what vector search misses. However, this created two ranked lists that needed merging.
Reciprocal Rank Fusion (RRF)
Reciprocal Rank Fusion proved to be the answer for merging the two ranked lists. The formula is simple: score = 1 / (k + rank), where k=60 (the standard value). Results that appear in both lists get both scores added. This approach requires no weight tuning and no score normalization between cosine similarity and ts_rank—it only uses rank positions.
Query enrichment technique
Before searching, the system runs queries through the embedding model's WordPiece tokenizer to extract key terms (multi-subword tokens that are likely technical or domain terms). This generates up to 3 query variations, embeds all of them, and searches in parallel. This catches results that one phrasing might miss.
Technical stack
- PostgreSQL 16 + pgvector (HNSW index for vectors, GIN index for full-text)
- all-MiniLM-L6-v2 for embeddings (384 dimensions, runs on CPU)
- Python with async psycopg 3
- 3 ingestion adapters: markdown, plaintext, and Claude conversation JSON
The entire system runs locally with no API calls for embeddings and no cloud dependencies. The code was recently shipped, and the developer has written a detailed blog post about the full approach.
📖 Read the full source: r/LocalLLaMA
👀 See Also

0Latency: A Persistent Memory Layer for AI Agents via MCP
0Latency is an MCP server that adds persistent memory to Claude and other AI agents, storing memories across sessions to prevent context loss. It works natively with Claude Desktop, Claude Code, claude.ai, GPT, Gemini, Cursor, and any MCP-compatible agent.

Chrome Extension Bridges Google Messages to Claude Code via MCP
A developer built a Chrome extension that connects Google Messages Web to Claude Code using MCP with stdio and WebSocket transport. The extension lists chats, reads messages, and drafts replies but currently can't send messages due to Angular's zone.js isolation.

Meeting Summarization on a 6GB GPU: qwen3.5:0.8B Works at 57s, Granite 4 350M Hallucinates
VoiceFlow v1.6.0 adds local meeting recording and summarization. Benchmarking sub-1B models on a 6GB RTX 3060: qwen3.5:0.8B produces structured summaries in 57s at 2.2GB VRAM, while Granite 4 350M hallucinates badly.

quorum: AI Code Governance Tool Enforces Independent Model Review
quorum is a governance layer for AI-assisted development that enforces a consensus protocol requiring code to be independently reviewed by a different model before committing. It includes three structural gates that block progress: audit, retro, and quality gates.