@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.
- package/dist/__tests__/errors/rag.error.test.d.ts +2 -0
- package/dist/__tests__/errors/rag.error.test.d.ts.map +1 -0
- package/dist/__tests__/errors/rag.error.test.js +95 -0
- package/dist/__tests__/errors/rag.error.test.js.map +1 -0
- package/dist/__tests__/reranking/cohere.reranker.test.d.ts +2 -0
- package/dist/__tests__/reranking/cohere.reranker.test.d.ts.map +1 -0
- package/dist/__tests__/reranking/cohere.reranker.test.js +68 -0
- package/dist/__tests__/reranking/cohere.reranker.test.js.map +1 -0
- package/dist/__tests__/utils/debug.test.d.ts +2 -0
- package/dist/__tests__/utils/debug.test.d.ts.map +1 -0
- package/dist/__tests__/utils/debug.test.js +99 -0
- package/dist/__tests__/utils/debug.test.js.map +1 -0
- package/dist/errors/rag.error.d.ts +33 -0
- package/dist/errors/rag.error.d.ts.map +1 -0
- package/dist/errors/rag.error.js +64 -0
- package/dist/errors/rag.error.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/rag-pipeline.d.ts +39 -3
- package/dist/rag-pipeline.d.ts.map +1 -1
- package/dist/rag-pipeline.js +141 -11
- package/dist/rag-pipeline.js.map +1 -1
- package/dist/rag.service.d.ts +60 -11
- package/dist/rag.service.d.ts.map +1 -1
- package/dist/rag.service.js +390 -28
- package/dist/rag.service.js.map +1 -1
- package/dist/reranking/cohere.reranker.d.ts +34 -0
- package/dist/reranking/cohere.reranker.d.ts.map +1 -0
- package/dist/reranking/cohere.reranker.js +58 -0
- package/dist/reranking/cohere.reranker.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/debug.d.ts +29 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +82 -0
- package/dist/utils/debug.js.map +1 -0
- package/package.json +4 -4
package/dist/rag-pipeline.js
CHANGED
|
@@ -6,10 +6,73 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.RAGPipeline = void 0;
|
|
8
8
|
const types_1 = require("./types");
|
|
9
|
+
const bm25_1 = require("./retrieval/bm25");
|
|
10
|
+
const openai_embeddings_1 = require("./embeddings/openai-embeddings");
|
|
11
|
+
const cohere_embeddings_1 = require("./embeddings/cohere-embeddings");
|
|
12
|
+
const memory_vector_store_1 = require("./vector-stores/memory-vector-store");
|
|
13
|
+
const recursive_text_splitter_1 = require("./text-splitters/recursive-text-splitter");
|
|
9
14
|
class RAGPipeline {
|
|
10
15
|
constructor(config, llmFunction) {
|
|
16
|
+
this.bm25Indexed = false;
|
|
11
17
|
this.config = config;
|
|
12
18
|
this.llmFunction = llmFunction;
|
|
19
|
+
this.bm25 = new bm25_1.BM25();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a RAGPipeline with sensible defaults from minimal configuration.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* const pipeline = RAGPipeline.from({ provider: 'openai', topK: 5, llm: myLLM });
|
|
27
|
+
* await pipeline.initialize();
|
|
28
|
+
* await pipeline.addDocuments(docs);
|
|
29
|
+
* const result = await pipeline.query('What is X?');
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
static from(quick = {}) {
|
|
33
|
+
const provider = quick.provider ?? 'openai';
|
|
34
|
+
// Resolve embedding provider
|
|
35
|
+
let embeddingProvider;
|
|
36
|
+
switch (provider) {
|
|
37
|
+
case 'cohere': {
|
|
38
|
+
const apiKey = quick.apiKey ?? process.env.COHERE_API_KEY;
|
|
39
|
+
if (!apiKey) {
|
|
40
|
+
throw new Error('RAGPipeline.from(): Missing API key for Cohere. ' +
|
|
41
|
+
'Pass `apiKey` or set the COHERE_API_KEY environment variable.');
|
|
42
|
+
}
|
|
43
|
+
embeddingProvider = new cohere_embeddings_1.CohereEmbeddings({
|
|
44
|
+
apiKey,
|
|
45
|
+
model: quick.embeddingModel,
|
|
46
|
+
});
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case 'openai':
|
|
50
|
+
default: {
|
|
51
|
+
const apiKey = quick.apiKey ?? process.env.OPENAI_API_KEY;
|
|
52
|
+
if (!apiKey) {
|
|
53
|
+
throw new Error('RAGPipeline.from(): Missing API key for OpenAI. ' +
|
|
54
|
+
'Pass `apiKey` or set the OPENAI_API_KEY environment variable.');
|
|
55
|
+
}
|
|
56
|
+
embeddingProvider = new openai_embeddings_1.OpenAIEmbeddings({
|
|
57
|
+
apiKey,
|
|
58
|
+
model: quick.embeddingModel,
|
|
59
|
+
});
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Resolve vector store (currently only memory; extensible later)
|
|
64
|
+
const vectorStore = new memory_vector_store_1.MemoryVectorStore(embeddingProvider);
|
|
65
|
+
// Resolve text splitter
|
|
66
|
+
const textSplitter = new recursive_text_splitter_1.RecursiveTextSplitter({
|
|
67
|
+
chunkSize: quick.chunkSize ?? 1000,
|
|
68
|
+
chunkOverlap: quick.chunkOverlap ?? 200,
|
|
69
|
+
});
|
|
70
|
+
return new RAGPipeline({
|
|
71
|
+
vectorStore,
|
|
72
|
+
embeddingProvider,
|
|
73
|
+
textSplitter,
|
|
74
|
+
topK: quick.topK ?? 5,
|
|
75
|
+
}, quick.llm);
|
|
13
76
|
}
|
|
14
77
|
/**
|
|
15
78
|
* Initialize the RAG pipeline
|
|
@@ -26,7 +89,20 @@ class RAGPipeline {
|
|
|
26
89
|
if (this.config.textSplitter) {
|
|
27
90
|
processedDocs = this.config.textSplitter.splitDocuments(documents);
|
|
28
91
|
}
|
|
29
|
-
|
|
92
|
+
const ids = await this.config.vectorStore.addDocuments(processedDocs);
|
|
93
|
+
// Index in BM25 for hybrid search
|
|
94
|
+
const bm25Docs = processedDocs.map((doc, i) => ({
|
|
95
|
+
id: doc.id || ids[i],
|
|
96
|
+
content: doc.content,
|
|
97
|
+
tokens: doc.content
|
|
98
|
+
.toLowerCase()
|
|
99
|
+
.replace(/[^\w\s]/g, ' ')
|
|
100
|
+
.split(/\s+/)
|
|
101
|
+
.filter((t) => t.length > 0),
|
|
102
|
+
}));
|
|
103
|
+
this.bm25.addDocuments(bm25Docs);
|
|
104
|
+
this.bm25Indexed = true;
|
|
105
|
+
return ids;
|
|
30
106
|
}
|
|
31
107
|
/**
|
|
32
108
|
* Query the RAG system
|
|
@@ -55,16 +131,26 @@ class RAGPipeline {
|
|
|
55
131
|
* Retrieve relevant documents
|
|
56
132
|
*/
|
|
57
133
|
async retrieve(query, options = {}, strategy = types_1.RetrievalStrategy.SIMILARITY) {
|
|
134
|
+
let results;
|
|
58
135
|
switch (strategy) {
|
|
59
136
|
case types_1.RetrievalStrategy.SIMILARITY:
|
|
60
|
-
|
|
137
|
+
results = await this.config.vectorStore.search(query, options);
|
|
138
|
+
break;
|
|
61
139
|
case types_1.RetrievalStrategy.MMR:
|
|
62
|
-
|
|
140
|
+
results = await this.retrieveWithMMR(query, options);
|
|
141
|
+
break;
|
|
63
142
|
case types_1.RetrievalStrategy.HYBRID:
|
|
64
|
-
|
|
143
|
+
results = await this.retrieveHybrid(query, options);
|
|
144
|
+
break;
|
|
65
145
|
default:
|
|
66
|
-
|
|
146
|
+
results = await this.config.vectorStore.search(query, options);
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
// Apply reranker if configured
|
|
150
|
+
if (this.config.reranker && results.length > 0) {
|
|
151
|
+
results = await this.config.reranker.rerank(query, results, options.topK || this.config.topK || 5);
|
|
67
152
|
}
|
|
153
|
+
return results;
|
|
68
154
|
}
|
|
69
155
|
/**
|
|
70
156
|
* Retrieve with Maximal Marginal Relevance (MMR)
|
|
@@ -120,14 +206,56 @@ class RAGPipeline {
|
|
|
120
206
|
return selected;
|
|
121
207
|
}
|
|
122
208
|
/**
|
|
123
|
-
* Hybrid retrieval
|
|
124
|
-
*
|
|
125
|
-
* TODO: Implement keyword search integration
|
|
209
|
+
* Hybrid retrieval — combines BM25 keyword search with vector similarity.
|
|
210
|
+
* Uses weighted score fusion (default 0.7 vector, 0.3 keyword).
|
|
126
211
|
*/
|
|
127
212
|
async retrieveHybrid(query, options = {}) {
|
|
128
|
-
|
|
129
|
-
//
|
|
130
|
-
|
|
213
|
+
const topK = options.topK || this.config.topK || 5;
|
|
214
|
+
// Always run vector search
|
|
215
|
+
const vectorResults = await this.config.vectorStore.search(query, {
|
|
216
|
+
...options,
|
|
217
|
+
topK: topK * 2,
|
|
218
|
+
});
|
|
219
|
+
// If BM25 hasn't been indexed yet, fall back to vector-only
|
|
220
|
+
if (!this.bm25Indexed) {
|
|
221
|
+
return vectorResults.slice(0, topK);
|
|
222
|
+
}
|
|
223
|
+
// BM25 keyword search
|
|
224
|
+
const keywordResults = this.bm25.search(query, topK * 2);
|
|
225
|
+
// Normalize scores to [0, 1]
|
|
226
|
+
const normalize = (items) => {
|
|
227
|
+
if (items.length === 0)
|
|
228
|
+
return new Map();
|
|
229
|
+
const scores = items.map((r) => r.score);
|
|
230
|
+
const min = Math.min(...scores);
|
|
231
|
+
const max = Math.max(...scores);
|
|
232
|
+
const range = max - min || 1;
|
|
233
|
+
return new Map(items.map((r) => [r.id, (r.score - min) / range]));
|
|
234
|
+
};
|
|
235
|
+
const vectorScores = normalize(vectorResults.map((r) => ({ id: r.id, score: r.score })));
|
|
236
|
+
const keywordScores = normalize(keywordResults);
|
|
237
|
+
const vectorWeight = 0.7;
|
|
238
|
+
const keywordWeight = 0.3;
|
|
239
|
+
// Fuse scores
|
|
240
|
+
const allIds = new Set([...vectorScores.keys(), ...keywordScores.keys()]);
|
|
241
|
+
const fused = [];
|
|
242
|
+
for (const id of allIds) {
|
|
243
|
+
const vs = vectorScores.get(id) || 0;
|
|
244
|
+
const ks = keywordScores.get(id) || 0;
|
|
245
|
+
fused.push({ id, score: vectorWeight * vs + keywordWeight * ks });
|
|
246
|
+
}
|
|
247
|
+
fused.sort((a, b) => b.score - a.score);
|
|
248
|
+
// Map back to full SearchResult objects
|
|
249
|
+
const resultMap = new Map(vectorResults.map((r) => [r.id, r]));
|
|
250
|
+
return fused
|
|
251
|
+
.slice(0, topK)
|
|
252
|
+
.map((f) => {
|
|
253
|
+
const original = resultMap.get(f.id);
|
|
254
|
+
if (original)
|
|
255
|
+
return { ...original, score: f.score };
|
|
256
|
+
return null;
|
|
257
|
+
})
|
|
258
|
+
.filter((r) => r !== null);
|
|
131
259
|
}
|
|
132
260
|
/**
|
|
133
261
|
* Build context string from search results
|
|
@@ -175,6 +303,8 @@ class RAGPipeline {
|
|
|
175
303
|
*/
|
|
176
304
|
async clear() {
|
|
177
305
|
await this.config.vectorStore.clear();
|
|
306
|
+
this.bm25.clear();
|
|
307
|
+
this.bm25Indexed = false;
|
|
178
308
|
}
|
|
179
309
|
}
|
|
180
310
|
exports.RAGPipeline = RAGPipeline;
|
package/dist/rag-pipeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rag-pipeline.js","sourceRoot":"","sources":["../src/rag-pipeline.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,mCAOiB;
|
|
1
|
+
{"version":3,"file":"rag-pipeline.js","sourceRoot":"","sources":["../src/rag-pipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/rag.service.d.ts
CHANGED
|
@@ -11,10 +11,21 @@ export interface RAGServiceConfig {
|
|
|
11
11
|
textSplitter?: TextSplitter;
|
|
12
12
|
llmFunction?: LLMFunction;
|
|
13
13
|
topK?: number;
|
|
14
|
+
/** Custom query generator for multi-query retrieval (uses simple variations if not set). */
|
|
15
|
+
queryGenerator?: (question: string, numQueries: number) => Promise<string[]>;
|
|
16
|
+
/** Weights for hybrid search. Defaults: vectorWeight=0.7, keywordWeight=0.3. */
|
|
17
|
+
hybridWeights?: {
|
|
18
|
+
vectorWeight?: number;
|
|
19
|
+
keywordWeight?: number;
|
|
20
|
+
};
|
|
14
21
|
}
|
|
15
22
|
export declare class RAGService {
|
|
16
23
|
private config;
|
|
17
24
|
private pipeline;
|
|
25
|
+
private multiQueryRetrieval?;
|
|
26
|
+
private hybridRetrieval?;
|
|
27
|
+
private bm25;
|
|
28
|
+
private conversationHistory;
|
|
18
29
|
constructor(config: RAGServiceConfig);
|
|
19
30
|
/**
|
|
20
31
|
* Initialize the RAG service
|
|
@@ -24,6 +35,27 @@ export declare class RAGService {
|
|
|
24
35
|
* Index a document or multiple documents
|
|
25
36
|
*/
|
|
26
37
|
index(documents: Document | Document[]): Promise<string[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Ingest documents from a file path, URL, or directory.
|
|
40
|
+
* Auto-detects the source type and uses the appropriate loader.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* await rag.ingest('./docs/guide.pdf');
|
|
45
|
+
* await rag.ingest('./data/faq.csv');
|
|
46
|
+
* await rag.ingest('https://example.com/page');
|
|
47
|
+
* await rag.ingest('./knowledge-base/'); // loads entire directory
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
ingest(source: string): Promise<string[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Auto-detect source type and load documents.
|
|
53
|
+
*/
|
|
54
|
+
private loadSource;
|
|
55
|
+
/**
|
|
56
|
+
* Extract file extension from a path.
|
|
57
|
+
*/
|
|
58
|
+
private getExtension;
|
|
27
59
|
/**
|
|
28
60
|
* Search for similar documents
|
|
29
61
|
*/
|
|
@@ -47,24 +79,39 @@ export declare class RAGService {
|
|
|
47
79
|
}>;
|
|
48
80
|
/**
|
|
49
81
|
* Multi-query RAG
|
|
50
|
-
* Generates multiple search queries and combines
|
|
82
|
+
* Generates multiple search queries from a single question and combines
|
|
83
|
+
* deduplicated results, ranked by frequency and average score.
|
|
84
|
+
*/
|
|
85
|
+
multiQuery(question: string, numQueries?: number): Promise<SearchResult[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Compress retrieved context by removing low-relevance and redundant results.
|
|
88
|
+
* Uses LLM-based compression when available, otherwise applies score-based filtering
|
|
89
|
+
* with deduplication.
|
|
51
90
|
*/
|
|
52
|
-
|
|
91
|
+
compress(documents: SearchResult[], query: string): Promise<SearchResult[]>;
|
|
53
92
|
/**
|
|
54
|
-
*
|
|
93
|
+
* Jaccard similarity between two strings (token-level).
|
|
55
94
|
*/
|
|
56
|
-
|
|
95
|
+
private jaccardSimilarity;
|
|
57
96
|
/**
|
|
58
|
-
* Self-query with automatic metadata extraction
|
|
97
|
+
* Self-query with automatic metadata extraction.
|
|
98
|
+
* Extracts filter conditions from natural language when an LLM is available,
|
|
99
|
+
* then applies them as metadata filters on the vector search.
|
|
59
100
|
*/
|
|
60
101
|
selfQuery(naturalLanguageQuery: string): Promise<SearchResult[]>;
|
|
61
102
|
/**
|
|
62
|
-
* Conversational RAG with session memory
|
|
103
|
+
* Conversational RAG with session memory.
|
|
104
|
+
* Maintains per-session conversation history and rewrites the user's
|
|
105
|
+
* follow-up question into a standalone query before retrieval.
|
|
63
106
|
*/
|
|
64
|
-
chat(message: string,
|
|
107
|
+
chat(message: string, sessionId: string): Promise<{
|
|
65
108
|
answer: string;
|
|
66
109
|
sources: SearchResult[];
|
|
67
110
|
}>;
|
|
111
|
+
/**
|
|
112
|
+
* Clear conversation history for a session.
|
|
113
|
+
*/
|
|
114
|
+
clearChat(sessionId: string): void;
|
|
68
115
|
/**
|
|
69
116
|
* Hybrid search combining vector and keyword search
|
|
70
117
|
*/
|
|
@@ -73,13 +120,15 @@ export declare class RAGService {
|
|
|
73
120
|
keywordWeight?: number;
|
|
74
121
|
}): Promise<SearchResult[]>;
|
|
75
122
|
/**
|
|
76
|
-
* Rerank search results
|
|
123
|
+
* Rerank search results using cross-encoder-style LLM scoring.
|
|
124
|
+
* When no LLM is configured, falls back to BM25-boosted re-scoring.
|
|
77
125
|
*/
|
|
78
|
-
rerank(results: SearchResult[],
|
|
126
|
+
rerank(results: SearchResult[], query: string, topN?: number): Promise<SearchResult[]>;
|
|
79
127
|
/**
|
|
80
|
-
* Ensemble retrieval combining multiple
|
|
128
|
+
* Ensemble retrieval combining multiple retrieval strategies.
|
|
129
|
+
* Runs each strategy, normalizes scores, applies weights, and fuses results.
|
|
81
130
|
*/
|
|
82
|
-
ensemble(query: string,
|
|
131
|
+
ensemble(query: string, methods: RetrievalStrategy[], weights?: number[]): Promise<SearchResult[]>;
|
|
83
132
|
/**
|
|
84
133
|
* Time-weighted retrieval favoring recent documents
|
|
85
134
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rag.service.d.ts","sourceRoot":"","sources":["../src/rag.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAe,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,6BAA6B,CAAC;AAErC,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAClB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"rag.service.d.ts","sourceRoot":"","sources":["../src/rag.service.ts"],"names":[],"mappings":"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"}
|