# @memberjunction/ai-reranker Two-stage retrieval reranking service for MemberJunction's AI agent framework. Provides centralized reranker management and LLM-based reranking capabilities for improving the relevance of vector search results, particularly agent memory notes. Supports configurable reranking models, observability integration, and agent-level configuration. ## Architecture ```mermaid graph TD subgraph "@memberjunction/ai-reranker" RS["RerankerService
Singleton Manager"] style RS fill:#2d8659,stroke:#1a5c3a,color:#fff LR["LLMReranker
LLM-Based Reranking"] style LR fill:#7c5295,stroke:#563a6b,color:#fff CT["Config Types
RerankerConfiguration"] style CT fill:#b8762f,stroke:#8a5722,color:#fff end subgraph "Two-Stage Retrieval" S1["Stage 1: Vector Search
Fast approximate retrieval"] style S1 fill:#2d6a9f,stroke:#1a4971,color:#fff S2["Stage 2: LLM Reranking
Precise relevance scoring"] style S2 fill:#7c5295,stroke:#563a6b,color:#fff S3["Final Results
Reranked by relevance"] style S3 fill:#2d8659,stroke:#1a5c3a,color:#fff end S1 -->|"Top-K candidates"| RS RS --> S2 S2 -->|"Scored & sorted"| S3 subgraph Dependencies AI["@memberjunction/ai
BaseReranker"] style AI fill:#2d6a9f,stroke:#1a4971,color:#fff AIP["@memberjunction/ai-prompts
AIPromptRunner"] style AIP fill:#2d6a9f,stroke:#1a4971,color:#fff AIE["@memberjunction/aiengine
NoteMatchResult"] style AIE fill:#2d6a9f,stroke:#1a4971,color:#fff end AI --> RS AIP --> LR AIE --> RS ``` ## Installation ```bash npm install @memberjunction/ai-reranker ``` ## Key Exports ### RerankerService (Singleton) Centralized service for managing reranker instances and performing note reranking. Caches reranker instances by model for efficient reuse. ```typescript import { RerankerService, parseRerankerConfiguration } from '@memberjunction/ai-reranker'; // Parse configuration from agent entity const config = parseRerankerConfiguration(agent.RerankerConfiguration); if (config?.enabled) { const result = await RerankerService.Instance.rerankNotes( vectorSearchResults, // NoteMatchResult[] from vector search userQuery, // The user's query for relevance scoring config, // RerankerConfiguration contextUser ); if (result.success) { console.log(`Reranked ${result.notes.length} notes in ${result.durationMs}ms`); } } ``` ### LLMReranker LLM-based reranking implementation that uses AI prompts to score document relevance. Extends `BaseReranker` from `@memberjunction/ai`. ```typescript import { createLLMReranker } from '@memberjunction/ai-reranker'; const reranker = createLLMReranker(modelId, contextUser); ``` ### RerankerConfiguration Configuration type stored as JSON on agent entities: ```typescript interface RerankerConfiguration { /** Whether reranking is enabled for this agent */ enabled: boolean; /** AI model ID to use for reranking */ modelId?: string; /** Maximum number of results to return after reranking */ topK?: number; /** Minimum relevance score threshold (0-1) */ minScore?: number; } ``` ### RerankServiceResult ```typescript interface RerankServiceResult { notes: NoteMatchResult[]; // Reranked notes sorted by relevance success: boolean; // Whether reranking succeeded durationMs: number; // Time taken in milliseconds usage?: { // Token usage for cost tracking promptTokens?: number; completionTokens?: number; cost?: number; }; runStepID?: string; // Created run step ID (if observability enabled) } ``` ### RerankObservabilityOptions Integration with agent run step tracking: ```typescript const result = await RerankerService.Instance.rerankNotes( notes, query, config, contextUser, { agentRunID: runId, // Link to agent run parentStepID: stepId, // Parent step for hierarchy stepNumber: 3 // Step sequence number } ); ``` ## How Two-Stage Retrieval Works 1. **Stage 1 -- Vector Search**: Fast approximate nearest-neighbor search using embeddings to retrieve a broad set of candidate notes (e.g., top 50) 2. **Stage 2 -- LLM Reranking**: An LLM evaluates each candidate note against the query and assigns a precise relevance score 3. **Result**: The top-K most relevant notes are returned, sorted by LLM-determined relevance This approach combines the speed of vector search with the accuracy of LLM-based understanding, significantly improving retrieval quality for agent memory. ### Interaction with Consolidation The candidate corpus the reranker scores is the in-process vector store (`AIEngine._noteVectorService`). Since v5.30.x, that store is kept in sync with persisted `Status='Active'` (see [`@memberjunction/aiengine` README](../Engine/README.md#vector-store-invariant-preservation)), which has two consequences for reranking: - **Consolidated source notes drop out immediately.** When MemoryManagerAgent's consolidation pipeline merges a cluster, source notes are revoked in the same operation that removes their vector entries. They stop appearing as rerank candidates without an MJAPI restart. - **Protection tier is metadata, not a rerank gate.** `ProtectionTier` (`Immutable` / `Protected` / `Standard` / `Ephemeral`) lives on the note entity and flows through to the reranker as part of each candidate's data. The reranker itself does not filter or weight by tier; downstream consumers (MemoryManagerAgent's decay phase, retrieval policies layered on top of `RerankServiceResult`) are responsible for any tier-aware logic. For the consolidation pipeline mechanics and protection-tier semantics, see [`@memberjunction/ai-agents`](../Agents/README.md#consolidation-pipeline). ## Dependencies - `@memberjunction/ai` -- BaseReranker, RerankParams, RerankResult - `@memberjunction/ai-prompts` -- AIPromptRunner for LLM-based reranking - `@memberjunction/ai-core-plus` -- Extended entity classes - `@memberjunction/aiengine` -- AIEngine, NoteMatchResult - `@memberjunction/core` -- MJ framework core - `@memberjunction/core-entities` -- Generated entity classes - `@memberjunction/global` -- Class factory