npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@eucoder/rag

v0.3.1

Published

Advanced RAG module with Corrective RAG, Hybrid Search, Knowledge Graph, Agentic RAG, and Self-Improving capabilities

Readme

@eucode/rag

Modulo RAG (Retrieval-Augmented Generation) avanzato per EUCoder. Implementa pattern Corrective RAG, Hybrid Search, Knowledge Graph RAG, Agentic RAG e Self-Improving ispirati a awesome-llm-apps (Apache-2.0).

Stato: ✅ Implementato e testato (55 test passing). Integrato in IDE e CLI.

Funzionalità

1. Corrective RAG

RAG correttivo con grading di rilevanza e riformulazione query automatica.

import { createCorrectiveRag, LlmGrader, LlmQueryRewriter } from "@eucode/rag";

const rag = createCorrectiveRag({
  retriever: myRetriever,
  grader: new LlmGrader(llmProvider),
  rewriter: new LlmQueryRewriter(llmProvider),
  maxRewrites: 2,
  minGoodHits: 3,
  minScore: 0.7,
});

const answer = await rag.answer("Come funziona l'autenticazione?");
console.log(answer.text);
console.log(answer.citations); // [{ path, startLine, endLine, text }]
console.log(answer.steps); // ["Retrieved 10 hits", "Graded 5 as relevant", ...]

Caratteristiche:

  • Grading di rilevanza con LLM
  • Riformulazione query automatica se i risultati sono scarsi
  • Web fallback opzionale
  • Tracing completo del processo

2. Hybrid Search RAG

Combina semantic search e keyword search usando Reciprocal Rank Fusion (RRF).

import { HybridSearchRag } from "@eucode/rag";

const hybrid = new HybridSearchRag({
  semanticRetriever: embeddingRetriever,
  keywordRetriever: tfidfRetriever,
  semanticWeight: 0.6,
  keywordWeight: 0.4,
  rrfK: 60, // Costante RRF
  topK: 10,
});

const result = await hybrid.search("authentication");
console.log(result.hits); // Risultati fusi e ordinati
console.log(result.fusionMethod); // "rrf"
console.log(result.semanticCount); // Numero risultati semantic
console.log(result.keywordCount); // Numero risultati keyword

Formula RRF:

score(d) = Σ 1/(k + rank_i(d))

dove k è una costante (tipicamente 60) e rank_i è la posizione del documento nella lista i.

Vantaggi:

  • Migliora la recall combinando due approcci complementari
  • Documenti che appaiono in entrambe le liste vengono rankati più in alto
  • Pesi configurabili per bilanciare semantic vs keyword

3. Knowledge Graph RAG

Arricchisce i risultati con contesto da un grafo di conoscenza (entità e relazioni).

import { KnowledgeGraphRag, InMemoryKnowledgeGraph } from "@eucode/rag";

const graph = new InMemoryKnowledgeGraph();
const kgRag = new KnowledgeGraphRag({
  retriever: myRetriever,
  entityExtractor: llmEntityExtractor,
  relationExtractor: llmRelationExtractor,
  graph,
  topK: 10,
  maxDepth: 2, // Profondità massima per entità connesse
});

const result = await kgRag.search("user authentication");
console.log(result.answer);
console.log(result.entities); // [{ id, name, type, properties }]
console.log(result.relations); // [{ source, target, type }]
console.log(result.graphContext); // Contesto formattato dal grafo

Caratteristiche:

  • Estrazione automatica di entità e relazioni dai documenti
  • Grafo persistente in memoria (o custom implementation)
  • Contesto arricchito con entità connesse
  • Citazioni con path e line numbers

Knowledge Graph Persistente con Neo4j

Per uso in produzione, è disponibile un'implementazione persistente basata su Neo4j:

import { Neo4jKnowledgeGraph } from "@eucode/rag";

const graph = new Neo4jKnowledgeGraph({
  uri: "bolt://localhost:7687",
  username: "neo4j",
  password: "your-password",
  database: "neo4j", // opzionale, default "neo4j"
});

// Verifica connessione
const connected = await graph.verifyConnectivity();
if (!connected) {
  throw new Error("Neo4j non raggiungibile");
}

// Inizializza schema (indici e vincoli)
await graph.initializeSchema();

// Aggiungi entità
await graph.addEntity({
  id: "user-1",
  name: "Alice",
  type: "User",
  properties: { age: 30, role: "developer" },
});

// Aggiungi relazione
await graph.addRelation({
  id: "rel-1",
  source: "user-1",
  target: "user-2",
  type: "KNOWS",
  properties: { since: 2020 },
});

// Recupera entità
const user = await graph.getEntity("user-1");

// Recupera relazioni
const relations = await graph.getRelations("user-1");

// Recupera entità connesse (fino a profondità 2)
const connected = await graph.getConnectedEntities("user-1", 2);

// Cerca entità
const users = await graph.searchEntities({ type: "User" });
const alices = await graph.searchEntities({ name: "Alice" });

// Statistiche del grafo
const stats = await graph.getStats();
console.log(`Entities: ${stats.entityCount}, Relations: ${stats.relationCount}`);

// Elimina entità (e tutte le sue relazioni)
await graph.deleteEntity("user-1");

// Elimina relazione
await graph.deleteRelation("rel-1");

// Pulisci completamente il grafo
await graph.clear();

// Chiudi connessione
await graph.close();

Caratteristiche Neo4j:

  • Persistenza su database Neo4j
  • Indici automatici per query veloci
  • Supporto transazioni
  • Query Cypher per operazioni complesse
  • Scalabilità orizzontale
  • Backup e recovery integrati

Requisiti:

  • Neo4j 5.x o superiore
  • Driver neo4j-driver (incluso nelle dipendenze)

Setup Neo4j:

# Docker
docker run -d \
  --name neo4j \
  -p 7474:7474 -p 7687:7687 \
  -e NEO4J_AUTH=neo4j/your-password \
  -e NEO4J_PLUGINS='["apoc"]' \
  neo4j:latest

# Verifica connessione
curl http://localhost:7474

4. Agentic RAG

RAG agentico con reasoning, chain-of-thought e self-reflection.

import { AgenticRag } from "@eucode/rag";

const agentic = new AgenticRag({
  retriever: myRetriever,
  grader: llmGrader,
  rewriter: llmRewriter,
  maxIterations: 3,
  enableSelfReflection: true,
  enableChainOfThought: true,
});

const result = await agentic.search("Come implementare OAuth2?");
console.log(result.answer);
console.log(result.reasoningSteps); // [{ thought, action, observation }]
console.log(result.selfReflection); // Valutazione finale della qualità
console.log(result.iterations); // Numero di iterazioni eseguite
console.log(result.confidence); // Score di confidenza (0-1)

Ciclo di ragionamento:

  1. Thought: Analizza la query e pianifica l'approccio
  2. Action: Esegue retrieval e grading
  3. Observation: Valuta i risultati
  4. Self-Reflection: Valuta la qualità della risposta
  5. Itera se necessario (riformulazione query)

Caratteristiche:

  • Chain-of-thought esplicito e tracciabile
  • Self-reflection per valutare la qualità dei risultati
  • Iterazioni multiple con riformulazione query
  • Confidence score per ogni risposta
  • Early stopping quando i risultati sono sufficientemente buoni

5. Self-Improving RAG

Sistema completo per miglioramento automatico basato su feedback utente, A/B testing e ottimizzazione parametri.

import { SelfImprovingRag, InMemoryFeedbackStorage } from "@eucode/rag";

// Inizializza sistema self-improving
const storage = new InMemoryFeedbackStorage();
const selfImproving = new SelfImprovingRag({
  minFeedbackForOptimization: 20,
  minConfidenceForSuggestion: 0.7,
  minSamplesForABTest: 30,
  autoApplySuggestions: true,
  onOptimization: (suggestions) => {
    console.log("Nuove ottimizzazioni disponibili:", suggestions);
  },
}, storage);

// Registra strategie con parametri
selfImproving.registerStrategy(
  { name: "strategy-a", type: "corrective", params: {} },
  { minScore: 0.5, topK: 10 }
);

selfImproving.registerStrategy(
  { name: "strategy-b", type: "hybrid", params: {} },
  { semanticWeight: 0.6, keywordWeight: 0.4 }
);

// Registra feedback utente
await selfImproving.recordFeedback(
  "Come funziona l'autenticazione?",
  answer,
  {
    rating: 5,
    relevance: 0.9,
    completeness: 0.85,
    citationsQuality: 0.95,
  },
  "strategy-b"
);

// Seleziona strategia migliore basata su metriche
const best = await selfImproving.selectBestStrategy();
console.log("Migliore strategia:", best.strategy);

// Esegui A/B test
const abResult = await selfImproving.runABTest("strategy-a", "strategy-b");
console.log("Vincitore A/B test:", abResult.winner);

// Ottieni suggerimenti di ottimizzazione
const suggestions = await selfImproving.getSuggestions("strategy-a");
console.log("Suggerimenti:", suggestions);

// Genera report completo
const report = await selfImproving.generateReport("strategy-a");
console.log(report);

Caratteristiche:

  • Feedback Collection: Raccoglie rating, relevance, completeness e citations quality
  • A/B Testing: Confronta strategie con significatività statistica (t-test)
  • Parameter Optimization: Suggerisce ottimizzazioni basate su metriche
  • Auto-Apply: Applica automaticamente suggerimenti con confidence > threshold
  • Trend Analysis: Identifica trend in miglioramento o peggioramento
  • Metriche Aggregate: Overall score, confidence, standard deviation

Componenti:

  • InMemoryFeedbackStorage: Storage in-memory per feedback (estendibile)
  • MetricsCalculator: Calcola metriche aggregate e intervalli di confidenza
  • ABTestFramework: Framework per A/B testing con significatività statistica
  • ParameterOptimizer: Analizza feedback e suggerisce ottimizzazioni
  • SelfImprovingRag: Sistema integrato che orchestra tutti i componenti

Integrazione

IDE (Browser)

import { HybridSearchRag, AgenticRag } from "@eucode/rag";
import { semanticSearchIde } from "./codebaseIndexer";

// Hybrid Search
const hybrid = new HybridSearchRag({
  semanticRetriever: {
    search: (query, topK) => semanticSearchIde(query, topK),
  },
  keywordRetriever: {
    search: (query, topK) => keywordSearchIde(query, topK),
  },
});

// Agentic RAG
const agentic = new AgenticRag({
  retriever: {
    search: (query, topK) => semanticSearchIde(query, topK),
  },
  grader: llmGrader,
  rewriter: llmRewriter,
});

CLI (Node.js)

import { KnowledgeGraphRag, InMemoryKnowledgeGraph } from "@eucode/rag";
import { CodebaseIndexer } from "@eucode/indexer";

const indexer = new CodebaseIndexer(storage, options);
const graph = new InMemoryKnowledgeGraph();

const kgRag = new KnowledgeGraphRag({
  retriever: {
    search: (query, topK) => indexer.search(query, topK),
  },
  entityExtractor: llmEntityExtractor,
  relationExtractor: llmRelationExtractor,
  graph,
});

API Reference

Types

interface Retriever {
  search(query: string, topK: number): Promise<SearchHit[]>;
}

interface KeywordRetriever {
  search(query: string, topK: number): Promise<SearchHit[]>;
}

interface Grader {
  grade(query: string, hit: SearchHit): Promise<GraderResult>;
}

interface QueryRewriter {
  rewrite(query: string, context: string): Promise<string>;
}

interface EntityExtractor {
  extract(text: string): Promise<Entity[]>;
}

interface RelationExtractor {
  extract(text: string, entities: Entity[]): Promise<Relation[]>;
}

Risultati

interface RagAnswer {
  text: string;
  citations: RagCitation[];
  steps: string[];
  rewrites: number;
}

interface HybridSearchResult {
  hits: SearchHit[];
  fusionMethod: "rrf" | "weighted";
  semanticCount: number;
  keywordCount: number;
}

interface KnowledgeGraphRagResult {
  answer: string;
  citations: RagCitation[];
  entities: Entity[];
  relations: Relation[];
  graphContext: string;
}

interface AgenticRagResult {
  answer: string;
  citations: RagCitation[];
  reasoningSteps: ReasoningStep[];
  selfReflection?: string;
  iterations: number;
  confidence: number;
}

Test

cd packages/rag
pnpm test

55 test passing:

  • Corrective RAG: 6 test
  • Hybrid Search: 3 test
  • Knowledge Graph: 6 test
  • Agentic RAG: 6 test
  • Feedback & Metrics: 8 test
  • A/B Testing: 9 test
  • Parameter Optimizer: 7 test
  • Self-Improving: 10 test

Performance

Benchmark su codebase EUCoder (1000+ file):

| Metodo | Latency (p50) | Latency (p95) | Recall@10 | |--------|---------------|---------------|-----------| | Semantic only | 120ms | 250ms | 0.72 | | Keyword only | 80ms | 150ms | 0.65 | | Hybrid (RRF) | 180ms | 350ms | 0.85 | | Knowledge Graph | 250ms | 500ms | 0.82 | | Agentic (3 iter) | 800ms | 1500ms | 0.91 |

Roadmap

  • [ ] Integrazione con vector database (Pinecone, Weaviate)
  • [ ] Caching dei risultati per query frequenti
  • [ ] Multi-query RAG (esplora multiple reformulations in parallelo)
  • [ ] RAG con immagini (multimodal)
  • [ ] Self-RAG (decide quando usare RAG vs risposta diretta)
  • [ ] Persistenza feedback su database (PostgreSQL, MongoDB)
  • [ ] Dashboard web per visualizzare metriche e A/B test
  • [ ] Integrazione con sistemi di monitoring (Prometheus, Grafana)

Licenza / Attribuzione

Pattern adattati da awesome-llm-apps (Apache-2.0).