@hazeljs/rag 0.2.4 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/__tests__/errors/rag.error.test.d.ts +2 -0
  2. package/dist/__tests__/errors/rag.error.test.d.ts.map +1 -0
  3. package/dist/__tests__/errors/rag.error.test.js +95 -0
  4. package/dist/__tests__/errors/rag.error.test.js.map +1 -0
  5. package/dist/__tests__/reranking/cohere.reranker.test.d.ts +2 -0
  6. package/dist/__tests__/reranking/cohere.reranker.test.d.ts.map +1 -0
  7. package/dist/__tests__/reranking/cohere.reranker.test.js +68 -0
  8. package/dist/__tests__/reranking/cohere.reranker.test.js.map +1 -0
  9. package/dist/__tests__/utils/debug.test.d.ts +2 -0
  10. package/dist/__tests__/utils/debug.test.d.ts.map +1 -0
  11. package/dist/__tests__/utils/debug.test.js +99 -0
  12. package/dist/__tests__/utils/debug.test.js.map +1 -0
  13. package/dist/errors/rag.error.d.ts +33 -0
  14. package/dist/errors/rag.error.d.ts.map +1 -0
  15. package/dist/errors/rag.error.js +64 -0
  16. package/dist/errors/rag.error.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +11 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/rag-pipeline.d.ts +39 -3
  22. package/dist/rag-pipeline.d.ts.map +1 -1
  23. package/dist/rag-pipeline.js +141 -11
  24. package/dist/rag-pipeline.js.map +1 -1
  25. package/dist/rag.service.d.ts +60 -11
  26. package/dist/rag.service.d.ts.map +1 -1
  27. package/dist/rag.service.js +390 -28
  28. package/dist/rag.service.js.map +1 -1
  29. package/dist/reranking/cohere.reranker.d.ts +34 -0
  30. package/dist/reranking/cohere.reranker.d.ts.map +1 -0
  31. package/dist/reranking/cohere.reranker.js +58 -0
  32. package/dist/reranking/cohere.reranker.js.map +1 -0
  33. package/dist/types/index.d.ts +10 -0
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/types/index.js.map +1 -1
  36. package/dist/utils/debug.d.ts +29 -0
  37. package/dist/utils/debug.d.ts.map +1 -0
  38. package/dist/utils/debug.js +82 -0
  39. package/dist/utils/debug.js.map +1 -0
  40. package/package.json +4 -4
@@ -3,12 +3,45 @@
3
3
  * RAG Service
4
4
  * Main service for RAG operations in HazelJS
5
5
  */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
6
22
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
7
23
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8
24
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9
25
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
10
26
  return c > 3 && r && Object.defineProperty(target, key, r), r;
11
27
  };
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
12
45
  var __metadata = (this && this.__metadata) || function (k, v) {
13
46
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
14
47
  };
@@ -20,15 +53,39 @@ const prompts_1 = require("@hazeljs/prompts");
20
53
  require("./prompts/rag-answer.prompt");
21
54
  const rag_answer_prompt_1 = require("./prompts/rag-answer.prompt");
22
55
  const types_1 = require("./types");
56
+ const multi_query_1 = require("./retrieval/multi-query");
57
+ const hybrid_search_1 = require("./retrieval/hybrid-search");
58
+ const bm25_1 = require("./retrieval/bm25");
59
+ const text_file_loader_1 = require("./loaders/text-file.loader");
60
+ const json_file_loader_1 = require("./loaders/json-file.loader");
61
+ const csv_file_loader_1 = require("./loaders/csv-file.loader");
62
+ const markdown_file_loader_1 = require("./loaders/markdown-file.loader");
63
+ const html_file_loader_1 = require("./loaders/html-file.loader");
64
+ const directory_loader_1 = require("./loaders/directory.loader");
65
+ const web_loader_1 = require("./loaders/web.loader");
66
+ const debug_1 = require("./utils/debug");
67
+ const dbg = (0, debug_1.debug)('rag');
23
68
  let RAGService = class RAGService {
24
69
  constructor(config) {
25
70
  this.config = config;
71
+ this.conversationHistory = new Map();
26
72
  this.pipeline = new rag_pipeline_1.RAGPipeline({
27
73
  vectorStore: config.vectorStore,
28
74
  embeddingProvider: config.embeddingProvider,
29
75
  textSplitter: config.textSplitter,
30
76
  topK: config.topK,
31
77
  }, config.llmFunction);
78
+ // Initialize BM25 for keyword search
79
+ this.bm25 = new bm25_1.BM25();
80
+ // Initialize multi-query retrieval
81
+ this.multiQueryRetrieval = new multi_query_1.MultiQueryRetrieval(config.vectorStore, {
82
+ customGenerator: config.queryGenerator,
83
+ });
84
+ // Initialize hybrid search
85
+ this.hybridRetrieval = new hybrid_search_1.HybridSearchRetrieval(config.vectorStore, {
86
+ vectorWeight: config.hybridWeights?.vectorWeight ?? 0.7,
87
+ keywordWeight: config.hybridWeights?.keywordWeight ?? 0.3,
88
+ });
32
89
  }
33
90
  /**
34
91
  * Initialize the RAG service
@@ -43,12 +100,99 @@ let RAGService = class RAGService {
43
100
  const docs = Array.isArray(documents) ? documents : [documents];
44
101
  return this.pipeline.addDocuments(docs);
45
102
  }
103
+ /**
104
+ * Ingest documents from a file path, URL, or directory.
105
+ * Auto-detects the source type and uses the appropriate loader.
106
+ *
107
+ * @example
108
+ * ```ts
109
+ * await rag.ingest('./docs/guide.pdf');
110
+ * await rag.ingest('./data/faq.csv');
111
+ * await rag.ingest('https://example.com/page');
112
+ * await rag.ingest('./knowledge-base/'); // loads entire directory
113
+ * ```
114
+ */
115
+ async ingest(source) {
116
+ dbg('ingest start source=%s', source);
117
+ const docs = await this.loadSource(source);
118
+ dbg('ingest loaded docs=%d', docs.length);
119
+ const ids = await this.index(docs);
120
+ dbg('ingest complete ids=%d', ids.length);
121
+ return ids;
122
+ }
123
+ /**
124
+ * Auto-detect source type and load documents.
125
+ */
126
+ async loadSource(source) {
127
+ // URL detection
128
+ if (source.startsWith('http://') || source.startsWith('https://')) {
129
+ const loader = new web_loader_1.WebLoader({ url: source });
130
+ return loader.load();
131
+ }
132
+ // Detect if source is a directory (ends with / or has no extension)
133
+ const ext = this.getExtension(source);
134
+ if (!ext || source.endsWith('/')) {
135
+ const loader = new directory_loader_1.DirectoryLoader({ path: source });
136
+ return loader.load();
137
+ }
138
+ // File-based loading by extension
139
+ switch (ext) {
140
+ case '.txt':
141
+ case '.log':
142
+ return new text_file_loader_1.TextFileLoader({ path: source }).load();
143
+ case '.json':
144
+ return new json_file_loader_1.JSONFileLoader({ path: source }).load();
145
+ case '.csv':
146
+ return new csv_file_loader_1.CSVFileLoader({ path: source }).load();
147
+ case '.md':
148
+ case '.mdx':
149
+ return new markdown_file_loader_1.MarkdownFileLoader({ path: source }).load();
150
+ case '.html':
151
+ case '.htm':
152
+ return new html_file_loader_1.HTMLFileLoader({ path: source }).load();
153
+ case '.pdf': {
154
+ // Optional dependency — dynamic import
155
+ try {
156
+ const { PdfLoader } = await Promise.resolve().then(() => __importStar(require('./loaders/pdf.loader')));
157
+ return new PdfLoader({ path: source }).load();
158
+ }
159
+ catch {
160
+ throw new Error(`PDF loading requires the 'pdf-parse' package. Install it with: npm install pdf-parse`);
161
+ }
162
+ }
163
+ case '.docx': {
164
+ try {
165
+ const { DocxLoader } = await Promise.resolve().then(() => __importStar(require('./loaders/docx.loader')));
166
+ return new DocxLoader({ path: source }).load();
167
+ }
168
+ catch {
169
+ throw new Error(`DOCX loading requires the 'mammoth' package. Install it with: npm install mammoth`);
170
+ }
171
+ }
172
+ default:
173
+ // Fallback: treat as text file
174
+ return new text_file_loader_1.TextFileLoader({ path: source }).load();
175
+ }
176
+ }
177
+ /**
178
+ * Extract file extension from a path.
179
+ */
180
+ getExtension(filePath) {
181
+ const dotIndex = filePath.lastIndexOf('.');
182
+ const slashIndex = Math.max(filePath.lastIndexOf('/'), filePath.lastIndexOf('\\'));
183
+ if (dotIndex <= slashIndex || dotIndex === -1)
184
+ return '';
185
+ return filePath.slice(dotIndex).toLowerCase();
186
+ }
46
187
  /**
47
188
  * Search for similar documents
48
189
  */
49
190
  async search(query, options) {
191
+ dbg('search query=%s strategy=%s', query, options?.strategy || 'similarity');
50
192
  const { strategy, ...queryOptions } = options || {};
51
- return this.pipeline.retrieve(query, queryOptions, strategy);
193
+ const results = await this.pipeline.retrieve(query, queryOptions, strategy);
194
+ dbg('search results=%d', results.length);
195
+ return results;
52
196
  }
53
197
  /**
54
198
  * Retrieve relevant context for a query
@@ -76,41 +220,169 @@ let RAGService = class RAGService {
76
220
  * Full RAG pipeline: retrieve + generate
77
221
  */
78
222
  async ask(query, options) {
223
+ dbg('ask query=%s', query);
79
224
  const sources = await this.retrieve(query, options);
80
225
  const answer = await this.generate(query, sources);
226
+ dbg('ask complete answer_len=%d sources=%d', answer.length, sources.length);
81
227
  return { answer, sources };
82
228
  }
83
229
  /**
84
230
  * Multi-query RAG
85
- * Generates multiple search queries and combines results
231
+ * Generates multiple search queries from a single question and combines
232
+ * deduplicated results, ranked by frequency and average score.
86
233
  */
87
- async multiQuery(question, _numQueries = 3) {
88
- // TODO: Implement query generation using LLM
89
- // For now, just use the original query
90
- return this.search(question, { topK: 10 });
234
+ async multiQuery(question, numQueries = 3) {
235
+ dbg('multiQuery question=%s numQueries=%d', question, numQueries);
236
+ if (!this.multiQueryRetrieval) {
237
+ return this.search(question, { topK: 10 });
238
+ }
239
+ // Override numQueries on the fly
240
+ const retrieval = new multi_query_1.MultiQueryRetrieval(this.config.vectorStore, {
241
+ numQueries,
242
+ customGenerator: this.config.queryGenerator,
243
+ });
244
+ const results = await retrieval.retrieve(question, { topK: numQueries * 5 });
245
+ dbg('multiQuery results=%d', results.length);
246
+ return results;
91
247
  }
92
248
  /**
93
- * Compress retrieved context
249
+ * Compress retrieved context by removing low-relevance and redundant results.
250
+ * Uses LLM-based compression when available, otherwise applies score-based filtering
251
+ * with deduplication.
94
252
  */
95
- async compress(documents, _query) {
96
- // TODO: Implement context compression
97
- // For now, return top results
98
- return documents.slice(0, 5);
253
+ async compress(documents, query) {
254
+ if (documents.length === 0)
255
+ return [];
256
+ // Step 1: Remove results below a relevance threshold (adaptive: median * 0.6)
257
+ const scores = documents.map((d) => d.score);
258
+ const sortedScores = [...scores].sort((a, b) => a - b);
259
+ const median = sortedScores[Math.floor(sortedScores.length / 2)];
260
+ const threshold = median * 0.6;
261
+ let filtered = documents.filter((d) => d.score >= threshold);
262
+ // Step 2: Deduplicate near-identical content (Jaccard similarity > 0.8)
263
+ const deduplicated = [];
264
+ for (const doc of filtered) {
265
+ const isDuplicate = deduplicated.some((existing) => this.jaccardSimilarity(existing.content, doc.content) > 0.8);
266
+ if (!isDuplicate) {
267
+ deduplicated.push(doc);
268
+ }
269
+ }
270
+ filtered = deduplicated;
271
+ // Step 3: LLM-based compression if available
272
+ if (this.config.llmFunction && filtered.length > 5) {
273
+ try {
274
+ const contextBlock = filtered.map((d, i) => `[${i}] ${d.content}`).join('\n\n');
275
+ const compressPrompt = `Given the query: "${query}"\n\n` +
276
+ `Below are retrieved passages. Return ONLY the indices (comma-separated) of the ` +
277
+ `passages that are most relevant and non-redundant. Return at most 5 indices.\n\n` +
278
+ contextBlock;
279
+ const response = await this.config.llmFunction(compressPrompt);
280
+ const indices = response
281
+ .replace(/[^0-9,]/g, '')
282
+ .split(',')
283
+ .map(Number)
284
+ .filter((n) => !isNaN(n) && n >= 0 && n < filtered.length);
285
+ if (indices.length > 0) {
286
+ return indices.map((i) => filtered[i]);
287
+ }
288
+ }
289
+ catch {
290
+ // Fallback to score-based top-5 below
291
+ }
292
+ }
293
+ return filtered.slice(0, 5);
99
294
  }
100
295
  /**
101
- * Self-query with automatic metadata extraction
296
+ * Jaccard similarity between two strings (token-level).
297
+ */
298
+ jaccardSimilarity(a, b) {
299
+ const tokensA = new Set(a.toLowerCase().split(/\s+/));
300
+ const tokensB = new Set(b.toLowerCase().split(/\s+/));
301
+ const intersection = new Set([...tokensA].filter((t) => tokensB.has(t)));
302
+ const union = new Set([...tokensA, ...tokensB]);
303
+ return union.size === 0 ? 0 : intersection.size / union.size;
304
+ }
305
+ /**
306
+ * Self-query with automatic metadata extraction.
307
+ * Extracts filter conditions from natural language when an LLM is available,
308
+ * then applies them as metadata filters on the vector search.
102
309
  */
103
310
  async selfQuery(naturalLanguageQuery) {
104
- // TODO: Implement metadata extraction from natural language
105
- // For now, just do regular search
106
- return this.search(naturalLanguageQuery);
311
+ if (!this.config.llmFunction) {
312
+ return this.search(naturalLanguageQuery);
313
+ }
314
+ try {
315
+ const extractionPrompt = `Given the following natural language query, extract:\n` +
316
+ `1. A simplified search query (just the semantic intent)\n` +
317
+ `2. Any metadata filters expressed as JSON (e.g. {"category": "science", "year": 2024})\n\n` +
318
+ `Query: "${naturalLanguageQuery}"\n\n` +
319
+ `Respond in this exact JSON format:\n` +
320
+ `{"searchQuery": "...", "filters": {...}}`;
321
+ const response = await this.config.llmFunction(extractionPrompt);
322
+ const cleaned = response
323
+ .replace(/^```(?:json)?\s*/i, '')
324
+ .replace(/\s*```$/i, '')
325
+ .trim();
326
+ const parsed = JSON.parse(cleaned);
327
+ const searchQuery = parsed.searchQuery || naturalLanguageQuery;
328
+ const filter = parsed.filters && Object.keys(parsed.filters).length > 0 ? parsed.filters : undefined;
329
+ return this.search(searchQuery, { filter });
330
+ }
331
+ catch {
332
+ // Fallback to plain search on parse error
333
+ return this.search(naturalLanguageQuery);
334
+ }
107
335
  }
108
336
  /**
109
- * Conversational RAG with session memory
337
+ * Conversational RAG with session memory.
338
+ * Maintains per-session conversation history and rewrites the user's
339
+ * follow-up question into a standalone query before retrieval.
110
340
  */
111
- async chat(message, _sessionId) {
112
- // TODO: Implement conversation memory
113
- return this.ask(message);
341
+ async chat(message, sessionId) {
342
+ dbg('chat message=%s session=%s', message, sessionId);
343
+ // Get or create conversation history
344
+ if (!this.conversationHistory.has(sessionId)) {
345
+ this.conversationHistory.set(sessionId, []);
346
+ }
347
+ const history = this.conversationHistory.get(sessionId);
348
+ // Rewrite the follow-up into a standalone question using conversation context
349
+ let standaloneQuery = message;
350
+ if (history.length > 0 && this.config.llmFunction) {
351
+ try {
352
+ const historyText = history
353
+ .slice(-6) // last 3 exchanges
354
+ .map((m) => `${m.role}: ${m.content}`)
355
+ .join('\n');
356
+ const rewritePrompt = `Given the conversation history and a follow-up question, ` +
357
+ `rewrite the follow-up into a standalone question that captures the full context.\n\n` +
358
+ `Conversation:\n${historyText}\n\n` +
359
+ `Follow-up: ${message}\n\n` +
360
+ `Standalone question:`;
361
+ standaloneQuery = await this.config.llmFunction(rewritePrompt);
362
+ dbg('chat rewritten query=%s', standaloneQuery);
363
+ }
364
+ catch {
365
+ standaloneQuery = message;
366
+ }
367
+ }
368
+ // Retrieve and generate
369
+ const sources = await this.retrieve(standaloneQuery);
370
+ const answer = await this.generate(standaloneQuery, sources);
371
+ // Update conversation history
372
+ history.push({ role: 'user', content: message });
373
+ history.push({ role: 'assistant', content: answer });
374
+ // Keep history bounded
375
+ while (history.length > 20) {
376
+ history.shift();
377
+ }
378
+ dbg('chat complete answer_len=%d sources=%d history_len=%d', answer.length, sources.length, history.length);
379
+ return { answer, sources };
380
+ }
381
+ /**
382
+ * Clear conversation history for a session.
383
+ */
384
+ clearChat(sessionId) {
385
+ this.conversationHistory.delete(sessionId);
114
386
  }
115
387
  /**
116
388
  * Hybrid search combining vector and keyword search
@@ -119,19 +391,109 @@ let RAGService = class RAGService {
119
391
  return this.search(query, { ...options, strategy: types_1.RetrievalStrategy.HYBRID });
120
392
  }
121
393
  /**
122
- * Rerank search results
394
+ * Rerank search results using cross-encoder-style LLM scoring.
395
+ * When no LLM is configured, falls back to BM25-boosted re-scoring.
123
396
  */
124
- async rerank(results, _query, topN) {
125
- // TODO: Implement reranking with external model
126
- // For now, return top N results
127
- return results.slice(0, topN || 5);
397
+ async rerank(results, query, topN) {
398
+ const n = topN || 5;
399
+ if (results.length <= n)
400
+ return results;
401
+ // Strategy 1: LLM-based reranking (when available)
402
+ if (this.config.llmFunction) {
403
+ try {
404
+ const passages = results.map((r, i) => `[${i}] ${r.content.slice(0, 300)}`).join('\n\n');
405
+ const rerankPrompt = `Given the query: "${query}"\n\n` +
406
+ `Rank the following passages by relevance. Return ONLY the indices ` +
407
+ `in order from most to least relevant (comma-separated). ` +
408
+ `Return at most ${n} indices.\n\n${passages}`;
409
+ const response = await this.config.llmFunction(rerankPrompt);
410
+ const indices = response
411
+ .replace(/[^0-9,]/g, '')
412
+ .split(',')
413
+ .map(Number)
414
+ .filter((idx) => !isNaN(idx) && idx >= 0 && idx < results.length);
415
+ if (indices.length > 0) {
416
+ const seen = new Set();
417
+ const reranked = [];
418
+ for (const idx of indices) {
419
+ if (!seen.has(idx)) {
420
+ seen.add(idx);
421
+ reranked.push(results[idx]);
422
+ }
423
+ if (reranked.length >= n)
424
+ break;
425
+ }
426
+ return reranked;
427
+ }
428
+ }
429
+ catch {
430
+ // Fallback to BM25 boost below
431
+ }
432
+ }
433
+ // Strategy 2: BM25 keyword boost
434
+ const bm25 = new bm25_1.BM25();
435
+ const bm25Docs = results.map((r) => ({
436
+ id: r.id,
437
+ content: r.content,
438
+ tokens: r.content
439
+ .toLowerCase()
440
+ .replace(/[^\w\s]/g, ' ')
441
+ .split(/\s+/)
442
+ .filter(Boolean),
443
+ }));
444
+ bm25.addDocuments(bm25Docs);
445
+ const keywordScores = bm25.search(query, results.length);
446
+ const kwMap = new Map(keywordScores.map((k) => [k.id, k.score]));
447
+ // Normalize BM25 scores
448
+ const maxKw = Math.max(...keywordScores.map((k) => k.score), 1);
449
+ const boosted = results.map((r) => ({
450
+ ...r,
451
+ score: r.score * 0.7 + ((kwMap.get(r.id) || 0) / maxKw) * 0.3,
452
+ }));
453
+ return boosted.sort((a, b) => b.score - a.score).slice(0, n);
128
454
  }
129
455
  /**
130
- * Ensemble retrieval combining multiple methods
456
+ * Ensemble retrieval combining multiple retrieval strategies.
457
+ * Runs each strategy, normalizes scores, applies weights, and fuses results.
131
458
  */
132
- async ensemble(query, _methods, _weights) {
133
- // TODO: Implement ensemble retrieval
134
- return this.search(query);
459
+ async ensemble(query, methods, weights) {
460
+ if (methods.length === 0)
461
+ return this.search(query);
462
+ // Default: equal weights
463
+ const w = weights && weights.length === methods.length
464
+ ? weights
465
+ : methods.map(() => 1 / methods.length);
466
+ // Run all strategies in parallel
467
+ const allResults = await Promise.all(methods.map((strategy) => this.search(query, { strategy, topK: 20 })));
468
+ // Normalize and weight each result set
469
+ const scoreMap = new Map();
470
+ for (let i = 0; i < allResults.length; i++) {
471
+ const results = allResults[i];
472
+ const weight = w[i];
473
+ // Min-max normalize within this strategy
474
+ const scores = results.map((r) => r.score);
475
+ const min = Math.min(...scores, 0);
476
+ const max = Math.max(...scores, 1);
477
+ const range = max - min || 1;
478
+ for (const result of results) {
479
+ const normalizedScore = ((result.score - min) / range) * weight;
480
+ const existing = scoreMap.get(result.id);
481
+ if (existing) {
482
+ existing.score += normalizedScore;
483
+ }
484
+ else {
485
+ scoreMap.set(result.id, {
486
+ result: { ...result },
487
+ score: normalizedScore,
488
+ });
489
+ }
490
+ }
491
+ }
492
+ // Sort by fused score
493
+ const fused = [...scoreMap.values()]
494
+ .sort((a, b) => b.score - a.score)
495
+ .map(({ result, score }) => ({ ...result, score }));
496
+ return fused.slice(0, 10);
135
497
  }
136
498
  /**
137
499
  * Time-weighted retrieval favoring recent documents
@@ -1 +1 @@
1
- {"version":3,"file":"rag.service.js","sourceRoot":"","sources":["../src/rag.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rag.service.js","sourceRoot":"","sources":["../src/rag.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Cohere Reranker
3
+ *
4
+ * Uses Cohere's Rerank API to re-order search results by relevance to the query.
5
+ * This significantly improves RAG retrieval quality compared to pure vector search.
6
+ */
7
+ import { Reranker, SearchResult } from '../types';
8
+ export interface CohereRerankerConfig {
9
+ /** Cohere API Key */
10
+ apiKey: string;
11
+ /**
12
+ * The model to use.
13
+ * Default: rerank-english-v3.0
14
+ * Other options: rerank-multilingual-v3.0
15
+ */
16
+ model?: string;
17
+ /** Number of maximum chunks per document (defaults to 10) */
18
+ maxChunksPerDoc?: number;
19
+ }
20
+ export declare class CohereReranker implements Reranker {
21
+ private client;
22
+ private model;
23
+ private maxChunksPerDoc;
24
+ constructor(config: CohereRerankerConfig);
25
+ /**
26
+ * Reranks SearchResult objects based on how relevant they are to the given query.
27
+ *
28
+ * @param query The user's search query
29
+ * @param results The potentially relevant documents (e.g. from a vector store)
30
+ * @param topN How many top results to return (defaults to all returned results)
31
+ */
32
+ rerank(query: string, results: SearchResult[], topN?: number): Promise<SearchResult[]>;
33
+ }
34
+ //# sourceMappingURL=cohere.reranker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.reranker.d.ts","sourceRoot":"","sources":["../../src/reranking/cohere.reranker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKlD,MAAM,WAAW,oBAAoB;IACnC,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAAS;gBAEpB,MAAM,EAAE,oBAAoB;IASxC;;;;;;OAMG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAmC7F"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ /**
3
+ * Cohere Reranker
4
+ *
5
+ * Uses Cohere's Rerank API to re-order search results by relevance to the query.
6
+ * This significantly improves RAG retrieval quality compared to pure vector search.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CohereReranker = void 0;
10
+ class CohereReranker {
11
+ constructor(config) {
12
+ // Dynamically require to avoid hard peer dependency
13
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
14
+ const { CohereClient } = require('cohere-ai');
15
+ this.client = new CohereClient({ token: config.apiKey });
16
+ this.model = config.model || 'rerank-english-v3.0';
17
+ this.maxChunksPerDoc = config.maxChunksPerDoc || 10;
18
+ }
19
+ /**
20
+ * Reranks SearchResult objects based on how relevant they are to the given query.
21
+ *
22
+ * @param query The user's search query
23
+ * @param results The potentially relevant documents (e.g. from a vector store)
24
+ * @param topN How many top results to return (defaults to all returned results)
25
+ */
26
+ async rerank(query, results, topN) {
27
+ if (!results || results.length === 0) {
28
+ return [];
29
+ }
30
+ // Prepare documents for Cohere API (must be strings or objects with text)
31
+ const documents = results.map((r) => r.content);
32
+ try {
33
+ const response = await this.client.rerank({
34
+ model: this.model,
35
+ query,
36
+ documents,
37
+ topN: topN || results.length,
38
+ maxChunksPerDoc: this.maxChunksPerDoc,
39
+ returnDocuments: false, // We already have the documents in `results` array
40
+ });
41
+ // The response returns items with indices and relevance scores
42
+ // Re-map the newly scored results back to our SearchResult format
43
+ const reranked = response.results.map((item) => {
44
+ const originalResult = results[item.index];
45
+ return {
46
+ ...originalResult,
47
+ score: item.relevanceScore, // Override with the superior rerank score
48
+ };
49
+ });
50
+ return reranked;
51
+ }
52
+ catch (error) {
53
+ throw new Error(`Failed to rerank results using Cohere: ${error}`);
54
+ }
55
+ }
56
+ }
57
+ exports.CohereReranker = CohereReranker;
58
+ //# sourceMappingURL=cohere.reranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.reranker.js","sourceRoot":"","sources":["../../src/reranking/cohere.reranker.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAoBH,MAAa,cAAc;IAKzB,YAAY,MAA4B;QACtC,oDAAoD;QACpD,iEAAiE;QACjE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,qBAAqB,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;IACtD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAAuB,EAAE,IAAa;QAChE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,0EAA0E;QAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBACxC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK;gBACL,SAAS;gBACT,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,MAAM;gBAC5B,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,eAAe,EAAE,KAAK,EAAE,mDAAmD;aAC5E,CAAC,CAAC;YAEH,+DAA+D;YAC/D,kEAAkE;YAClE,MAAM,QAAQ,GAAmB,QAAQ,CAAC,OAAO,CAAC,GAAG,CACnD,CAAC,IAA+C,EAAE,EAAE;gBAClD,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3C,OAAO;oBACL,GAAG,cAAc;oBACjB,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,0CAA0C;iBACvE,CAAC;YACJ,CAAC,CACF,CAAC;YAEF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF;AAxDD,wCAwDC"}
@@ -112,6 +112,7 @@ export interface DocumentLoader {
112
112
  export interface RAGConfig {
113
113
  vectorStore: VectorStore;
114
114
  embeddingProvider: EmbeddingProvider;
115
+ reranker?: Reranker;
115
116
  textSplitter?: TextSplitter;
116
117
  chunkSize?: number;
117
118
  chunkOverlap?: number;
@@ -141,4 +142,13 @@ export interface RAGResponse {
141
142
  sources: SearchResult[];
142
143
  context: string;
143
144
  }
145
+ /**
146
+ * Reranker interface
147
+ */
148
+ export interface Reranker {
149
+ /**
150
+ * Rerank search results based on a query
151
+ */
152
+ rerank(query: string, results: SearchResult[], topN?: number): Promise<SearchResult[]>;
153
+ }
144
154
  //# sourceMappingURL=index.d.ts.map