mcp-local-rag 0.2.2 → 0.3.0
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/README.md +31 -11
- package/dist/chunker/index.d.ts.map +1 -1
- package/dist/chunker/index.js +14 -4
- package/dist/chunker/index.js.map +1 -1
- package/dist/embedder/index.d.ts +3 -3
- package/dist/embedder/index.d.ts.map +1 -1
- package/dist/embedder/index.js +12 -9
- package/dist/embedder/index.js.map +1 -1
- package/dist/index.js +55 -3
- package/dist/index.js.map +1 -1
- package/dist/parser/index.js +4 -4
- package/dist/parser/index.js.map +1 -1
- package/dist/server/index.d.ts +8 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +26 -12
- package/dist/server/index.js.map +1 -1
- package/dist/vectordb/index.d.ts +51 -7
- package/dist/vectordb/index.d.ts.map +1 -1
- package/dist/vectordb/index.js +272 -26
- package/dist/vectordb/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -179,10 +179,13 @@ claude mcp add local-rag --scope user \
|
|
|
179
179
|
| `BASE_DIR` | Current directory | Document root directory. Server only accesses files within this path (prevents accidental system file access). | Any valid path |
|
|
180
180
|
| `DB_PATH` | `./lancedb/` | Vector database storage location. Can grow large with many documents. | Any valid path |
|
|
181
181
|
| `CACHE_DIR` | `./models/` | Model cache directory. After first download, model stays here for offline use. | Any valid path |
|
|
182
|
-
| `MODEL_NAME` | `Xenova/all-MiniLM-L6-v2` | HuggingFace model identifier. Must be Transformers.js compatible. See [available models](https://huggingface.co/models?library=transformers.js&pipeline_tag=feature-extraction&sort=trending). **Note:** Changing models requires re-ingesting all documents
|
|
182
|
+
| `MODEL_NAME` | `Xenova/all-MiniLM-L6-v2` | HuggingFace model identifier. Must be Transformers.js compatible. See [available models](https://huggingface.co/models?library=transformers.js&pipeline_tag=feature-extraction&sort=trending). **Note:** Changing models requires deleting your database (`rm -rf ./lancedb/`) and re-ingesting all documents. See FAQ for details. | HF model ID |
|
|
183
183
|
| `MAX_FILE_SIZE` | `104857600` (100MB) | Maximum file size in bytes. Larger files rejected to prevent memory issues. | 1MB - 500MB |
|
|
184
184
|
| `CHUNK_SIZE` | `512` | Characters per chunk. Larger = more context but slower processing. | 128 - 2048 |
|
|
185
185
|
| `CHUNK_OVERLAP` | `100` | Overlap between chunks. Preserves context across boundaries. | 0 - (CHUNK_SIZE/2) |
|
|
186
|
+
| `RAG_MAX_DISTANCE` | (not set) | Maximum distance threshold for search results. Results with distance greater than this value are excluded. Lower values mean stricter filtering (e.g., `0.5` for high relevance only). | Positive number |
|
|
187
|
+
| `RAG_GROUPING` | (not set) | Grouping mode for quality filtering. `similar` returns only the most similar group (stops at first distance jump). `related` includes related groups (stops at second distance jump). | `similar` or `related` |
|
|
188
|
+
| `RAG_HYBRID_WEIGHT` | `0.6` | Balance between keyword (BM25) and semantic search. `0.0` = pure semantic, `1.0` = pure keyword. Default `0.6` prioritizes keyword matches—ideal for code/technical terms. Use `0.3-0.4` for natural language queries. | `0.0` - `1.0` |
|
|
186
189
|
|
|
187
190
|
## Usage
|
|
188
191
|
|
|
@@ -234,20 +237,22 @@ Ask questions in natural language:
|
|
|
234
237
|
"Search for error handling best practices"
|
|
235
238
|
```
|
|
236
239
|
|
|
237
|
-
The server:
|
|
238
|
-
1.
|
|
239
|
-
2.
|
|
240
|
-
|
|
240
|
+
The server uses **hybrid search** combining:
|
|
241
|
+
1. **Keyword matching (BM25)**: Finds exact term matches—crucial for code terms like `ProjectLifetimeScope` or error codes
|
|
242
|
+
2. **Semantic search**: Understands meaning, so "authentication" finds "login flow" content
|
|
243
|
+
|
|
244
|
+
This hybrid approach means searching for `useEffect` finds documents containing that exact term, not just semantically similar React concepts.
|
|
241
245
|
|
|
242
246
|
Results include the text content, which file it came from, and a relevance score. Your AI assistant then uses these results to answer your question.
|
|
243
247
|
|
|
244
|
-
You can
|
|
248
|
+
You can adjust the number of results:
|
|
245
249
|
|
|
246
250
|
```
|
|
247
|
-
"Search for database optimization tips, return
|
|
251
|
+
"Search for database optimization tips, return 5 results" # Fewer, more precise
|
|
252
|
+
"Search for database optimization tips, return 20 results" # Broader exploration
|
|
248
253
|
```
|
|
249
254
|
|
|
250
|
-
The limit parameter accepts 1-20 results.
|
|
255
|
+
The limit parameter accepts 1-20 results. Recommended: 5 for precision, 10 for balance, 20 for broad exploration.
|
|
251
256
|
|
|
252
257
|
### Managing Files
|
|
253
258
|
|
|
@@ -460,9 +465,13 @@ Each chunk goes through the Transformers.js embedding model, which converts text
|
|
|
460
465
|
|
|
461
466
|
Vectors are stored in LanceDB, a columnar vector database that works with local files. No server process, no complex setup. It's just a directory with data files.
|
|
462
467
|
|
|
463
|
-
When you search,
|
|
468
|
+
When you search, the server performs **hybrid search**:
|
|
469
|
+
1. Your query becomes a vector using the same embedding model
|
|
470
|
+
2. LanceDB performs both keyword search (BM25) and vector similarity search
|
|
471
|
+
3. Results are combined using a weighted linear combination (default: 60% keyword, 40% semantic)
|
|
472
|
+
4. The top matches return to your MCP client with their original text and metadata
|
|
464
473
|
|
|
465
|
-
|
|
474
|
+
This hybrid approach gets the best of both worlds: exact keyword matches (essential for code terms, error codes, function names) and semantic understanding (so "authentication" finds "login flow" content). The default weight prioritizes keyword matches, which works well for developer documentation where exact terms matter.
|
|
466
475
|
|
|
467
476
|
## FAQ
|
|
468
477
|
|
|
@@ -497,7 +506,18 @@ Want support for another format? [Open an issue](https://github.com/shinpr/mcp-l
|
|
|
497
506
|
|
|
498
507
|
**Can I customize the embedding model?**
|
|
499
508
|
|
|
500
|
-
Yes, set MODEL_NAME to any Transformers.js-compatible model from HuggingFace.
|
|
509
|
+
Yes, set MODEL_NAME to any Transformers.js-compatible model from HuggingFace.
|
|
510
|
+
|
|
511
|
+
However, switching models isn't as simple as changing a config value. Each model produces vectors of a specific dimension—`all-MiniLM-L6-v2` outputs 384 dimensions, while `multilingual-e5-small` outputs 384 and `embeddinggemma-300m` outputs 768. These vectors are fundamentally incompatible with each other.
|
|
512
|
+
|
|
513
|
+
When you change models, you must:
|
|
514
|
+
|
|
515
|
+
1. **Delete your existing database**: `rm -rf ./lancedb/` (or your custom DB_PATH)
|
|
516
|
+
2. **Re-ingest all your documents** with the new model
|
|
517
|
+
|
|
518
|
+
Simply re-ingesting without deleting won't work. LanceDB locks the vector dimension when you first insert data, and that schema persists even if you delete all documents. If you try to insert 768-dimensional vectors into a database that was created with 384-dimensional vectors, you'll get a dimension mismatch error.
|
|
519
|
+
|
|
520
|
+
The good news: if you do forget to delete the database, LanceDB will give you a clear error message like "Query vector size 768 does not match index column size 384"—so you'll know exactly what went wrong.
|
|
501
521
|
|
|
502
522
|
**How much does accuracy depend on the model?**
|
|
503
523
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chunker/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chunker/index.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAA;CACd;AAMD;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,aAAa;IAIjC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAWjC;;;;;OAKG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAiCpD"}
|
package/dist/chunker/index.js
CHANGED
|
@@ -4,6 +4,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.DocumentChunker = void 0;
|
|
5
5
|
const textsplitters_1 = require("@langchain/textsplitters");
|
|
6
6
|
// ============================================
|
|
7
|
+
// Constants
|
|
8
|
+
// ============================================
|
|
9
|
+
/**
|
|
10
|
+
* Minimum chunk length (characters)
|
|
11
|
+
* Chunks shorter than this are filtered out to remove noise (e.g., page markers)
|
|
12
|
+
*/
|
|
13
|
+
const MIN_CHUNK_LENGTH = 50;
|
|
14
|
+
// ============================================
|
|
7
15
|
// DocumentChunker Class
|
|
8
16
|
// ============================================
|
|
9
17
|
/**
|
|
@@ -26,7 +34,7 @@ class DocumentChunker {
|
|
|
26
34
|
chunkSize: this.config.chunkSize,
|
|
27
35
|
chunkOverlap: this.config.chunkOverlap,
|
|
28
36
|
});
|
|
29
|
-
console.
|
|
37
|
+
console.error(`DocumentChunker initialized: chunkSize=${this.config.chunkSize}, chunkOverlap=${this.config.chunkOverlap}`);
|
|
30
38
|
}
|
|
31
39
|
/**
|
|
32
40
|
* Split text into chunks
|
|
@@ -46,13 +54,15 @@ class DocumentChunker {
|
|
|
46
54
|
const startTime = Date.now();
|
|
47
55
|
// Split text
|
|
48
56
|
const chunks = await this.splitter.splitText(text);
|
|
49
|
-
//
|
|
50
|
-
const result = chunks
|
|
57
|
+
// Filter out short chunks and assign indices
|
|
58
|
+
const result = chunks
|
|
59
|
+
.filter((chunk) => chunk.length >= MIN_CHUNK_LENGTH)
|
|
60
|
+
.map((chunk, index) => ({
|
|
51
61
|
text: chunk,
|
|
52
62
|
index,
|
|
53
63
|
}));
|
|
54
64
|
const duration = Date.now() - startTime;
|
|
55
|
-
console.
|
|
65
|
+
console.error(`Chunked text into ${result.length} chunks in ${duration}ms`);
|
|
56
66
|
return result;
|
|
57
67
|
}
|
|
58
68
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chunker/index.ts"],"names":[],"mappings":";AAAA,qEAAqE;;;AAErE,4DAAyE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chunker/index.ts"],"names":[],"mappings":";AAAA,qEAAqE;;;AAErE,4DAAyE;AAEzE,+CAA+C;AAC/C,YAAY;AACZ,+CAA+C;AAE/C;;;GAGG;AACH,MAAM,gBAAgB,GAAG,EAAE,CAAA;AA0B3B,+CAA+C;AAC/C,wBAAwB;AACxB,+CAA+C;AAE/C;;;;;;GAMG;AACH,MAAa,eAAe;IAI1B,YAAY,MAAqB;QAHzB,aAAQ,GAA0C,IAAI,CAAA;QAI5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,QAAQ,GAAG,IAAI,8CAA8B,CAAC;YACjD,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAChC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;SACvC,CAAC,CAAA;QAEF,OAAO,CAAC,KAAK,CACX,0CAA0C,IAAI,CAAC,MAAM,CAAC,SAAS,kBAAkB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAC5G,CAAA;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QACpD,CAAC;QAED,uDAAuD;QACvD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAE5B,aAAa;YACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAElD,6CAA6C;YAC7C,MAAM,MAAM,GAAgB,MAAM;iBAC/B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,gBAAgB,CAAC;iBACnD,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtB,IAAI,EAAE,KAAK;gBACX,KAAK;aACN,CAAC,CAAC,CAAA;YAEL,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;YACvC,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,MAAM,cAAc,QAAQ,IAAI,CAAC,CAAA;YAE3E,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAA;YAC7C,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;CACF;AA7DD,0CA6DC"}
|
package/dist/embedder/index.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export declare class EmbeddingError extends Error {
|
|
|
20
20
|
* Embedding generation class using Transformers.js
|
|
21
21
|
*
|
|
22
22
|
* Responsibilities:
|
|
23
|
-
* - Generate embedding vectors (
|
|
23
|
+
* - Generate embedding vectors (dimension depends on model)
|
|
24
24
|
* - Transformers.js wrapper
|
|
25
25
|
* - Batch processing (size 8)
|
|
26
26
|
*/
|
|
@@ -42,14 +42,14 @@ export declare class Embedder {
|
|
|
42
42
|
* Convert single text to embedding vector
|
|
43
43
|
*
|
|
44
44
|
* @param text - Text
|
|
45
|
-
* @returns
|
|
45
|
+
* @returns Embedding vector (dimension depends on model)
|
|
46
46
|
*/
|
|
47
47
|
embed(text: string): Promise<number[]>;
|
|
48
48
|
/**
|
|
49
49
|
* Convert multiple texts to embedding vectors with batch processing
|
|
50
50
|
*
|
|
51
51
|
* @param texts - Array of texts
|
|
52
|
-
* @returns Array of
|
|
52
|
+
* @returns Array of embedding vectors (dimension depends on model)
|
|
53
53
|
*/
|
|
54
54
|
embedBatch(texts: string[]): Promise<number[][]>;
|
|
55
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embedder/index.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAA;CACjB;AAMD;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAGrB,KAAK,CAAC,EAAE,KAAK;gBAD7B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAMD;;;;;;;GAOG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAoD;IACjE,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,MAAM,EAAE,cAAc;IAIlC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBjC;;;OAGG;YACW,iBAAiB;IA+B/B;;;;;OAKG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embedder/index.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAA;CACjB;AAMD;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAGrB,KAAK,CAAC,EAAE,KAAK;gBAD7B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAMD;;;;;;;GAOG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAoD;IACjE,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,MAAM,EAAE,cAAc;IAIlC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBjC;;;OAGG;YACW,iBAAiB;IA+B/B;;;;;OAKG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiC5C;;;;;OAKG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CA0BvD"}
|
package/dist/embedder/index.js
CHANGED
|
@@ -24,7 +24,7 @@ exports.EmbeddingError = EmbeddingError;
|
|
|
24
24
|
* Embedding generation class using Transformers.js
|
|
25
25
|
*
|
|
26
26
|
* Responsibilities:
|
|
27
|
-
* - Generate embedding vectors (
|
|
27
|
+
* - Generate embedding vectors (dimension depends on model)
|
|
28
28
|
* - Transformers.js wrapper
|
|
29
29
|
* - Batch processing (size 8)
|
|
30
30
|
*/
|
|
@@ -45,10 +45,10 @@ class Embedder {
|
|
|
45
45
|
try {
|
|
46
46
|
// Set cache directory BEFORE creating pipeline
|
|
47
47
|
transformers_1.env.cacheDir = this.config.cacheDir;
|
|
48
|
-
console.
|
|
49
|
-
console.
|
|
48
|
+
console.error(`Embedder: Setting cache directory to "${this.config.cacheDir}"`);
|
|
49
|
+
console.error(`Embedder: Loading model "${this.config.modelPath}"...`);
|
|
50
50
|
this.model = await (0, transformers_1.pipeline)('feature-extraction', this.config.modelPath);
|
|
51
|
-
console.
|
|
51
|
+
console.error('Embedder: Model loaded successfully');
|
|
52
52
|
}
|
|
53
53
|
catch (error) {
|
|
54
54
|
throw new EmbeddingError(`Failed to initialize Embedder: ${error.message}`, error);
|
|
@@ -69,7 +69,7 @@ class Embedder {
|
|
|
69
69
|
return;
|
|
70
70
|
}
|
|
71
71
|
// Start initialization
|
|
72
|
-
console.
|
|
72
|
+
console.error('Embedder: First use detected. Initializing model (downloading ~90MB, may take 1-2 minutes)...');
|
|
73
73
|
this.initPromise = this.initialize().catch((error) => {
|
|
74
74
|
// Clear initPromise on failure to allow retry
|
|
75
75
|
this.initPromise = null;
|
|
@@ -82,15 +82,15 @@ class Embedder {
|
|
|
82
82
|
* Convert single text to embedding vector
|
|
83
83
|
*
|
|
84
84
|
* @param text - Text
|
|
85
|
-
* @returns
|
|
85
|
+
* @returns Embedding vector (dimension depends on model)
|
|
86
86
|
*/
|
|
87
87
|
async embed(text) {
|
|
88
88
|
// Lazy initialization: initialize on first use if not already initialized
|
|
89
89
|
await this.ensureInitialized();
|
|
90
90
|
try {
|
|
91
|
-
//
|
|
91
|
+
// Fail-fast for empty string: cannot generate meaningful embedding
|
|
92
92
|
if (text.length === 0) {
|
|
93
|
-
|
|
93
|
+
throw new EmbeddingError('Cannot generate embedding for empty text');
|
|
94
94
|
}
|
|
95
95
|
// Use type assertion to avoid complex Transformers.js type definitions
|
|
96
96
|
// This is due to external library type definition constraints, runtime behavior is guaranteed
|
|
@@ -102,6 +102,9 @@ class Embedder {
|
|
|
102
102
|
return embedding;
|
|
103
103
|
}
|
|
104
104
|
catch (error) {
|
|
105
|
+
if (error instanceof EmbeddingError) {
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
105
108
|
throw new EmbeddingError(`Failed to generate embedding: ${error.message}`, error);
|
|
106
109
|
}
|
|
107
110
|
}
|
|
@@ -109,7 +112,7 @@ class Embedder {
|
|
|
109
112
|
* Convert multiple texts to embedding vectors with batch processing
|
|
110
113
|
*
|
|
111
114
|
* @param texts - Array of texts
|
|
112
|
-
* @returns Array of
|
|
115
|
+
* @returns Array of embedding vectors (dimension depends on model)
|
|
113
116
|
*/
|
|
114
117
|
async embedBatch(texts) {
|
|
115
118
|
// Lazy initialization: initialize on first use if not already initialized
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embedder/index.ts"],"names":[],"mappings":";AAAA,+CAA+C;;;AAE/C,4DAAyD;AAkBzD,+CAA+C;AAC/C,gBAAgB;AAChB,+CAA+C;AAE/C;;GAEG;AACH,MAAa,cAAe,SAAQ,KAAK;IACvC,YACE,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF;AARD,wCAQC;AAED,+CAA+C;AAC/C,iBAAiB;AACjB,+CAA+C;AAE/C;;;;;;;GAOG;AACH,MAAa,QAAQ;IAKnB,YAAY,MAAsB;QAJ1B,UAAK,GAAgD,IAAI,CAAA;QACzD,gBAAW,GAAyB,IAAI,CAAA;QAI9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,8BAA8B;QAC9B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,+CAA+C;YAC/C,kBAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;YAEnC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embedder/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,45 @@
|
|
|
3
3
|
// Entry point for RAG MCP Server
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
const index_js_1 = require("./server/index.js");
|
|
6
|
+
/**
|
|
7
|
+
* Parse grouping mode from environment variable
|
|
8
|
+
*/
|
|
9
|
+
function parseGroupingMode(value) {
|
|
10
|
+
if (!value)
|
|
11
|
+
return undefined;
|
|
12
|
+
const normalized = value.toLowerCase().trim();
|
|
13
|
+
if (normalized === 'similar' || normalized === 'related') {
|
|
14
|
+
return normalized;
|
|
15
|
+
}
|
|
16
|
+
console.error(`Invalid RAG_GROUPING value: "${value}". Expected "similar" or "related". Ignoring.`);
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse max distance from environment variable
|
|
21
|
+
*/
|
|
22
|
+
function parseMaxDistance(value) {
|
|
23
|
+
if (!value)
|
|
24
|
+
return undefined;
|
|
25
|
+
const parsed = Number.parseFloat(value);
|
|
26
|
+
if (Number.isNaN(parsed) || parsed <= 0) {
|
|
27
|
+
console.error(`Invalid RAG_MAX_DISTANCE value: "${value}". Expected positive number. Ignoring.`);
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
return parsed;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parse hybrid weight from environment variable
|
|
34
|
+
*/
|
|
35
|
+
function parseHybridWeight(value) {
|
|
36
|
+
if (!value)
|
|
37
|
+
return undefined;
|
|
38
|
+
const parsed = Number.parseFloat(value);
|
|
39
|
+
if (Number.isNaN(parsed) || parsed < 0 || parsed > 1) {
|
|
40
|
+
console.error(`Invalid RAG_HYBRID_WEIGHT value: "${value}". Expected 0.0-1.0. Using default (0.6).`);
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
return parsed;
|
|
44
|
+
}
|
|
6
45
|
/**
|
|
7
46
|
* Entry point - Start RAG MCP Server
|
|
8
47
|
*/
|
|
@@ -18,13 +57,26 @@ async function main() {
|
|
|
18
57
|
chunkSize: Number.parseInt(process.env['CHUNK_SIZE'] || '512', 10),
|
|
19
58
|
chunkOverlap: Number.parseInt(process.env['CHUNK_OVERLAP'] || '100', 10),
|
|
20
59
|
};
|
|
21
|
-
|
|
22
|
-
|
|
60
|
+
// Add quality filter settings only if defined
|
|
61
|
+
const maxDistance = parseMaxDistance(process.env['RAG_MAX_DISTANCE']);
|
|
62
|
+
const grouping = parseGroupingMode(process.env['RAG_GROUPING']);
|
|
63
|
+
const hybridWeight = parseHybridWeight(process.env['RAG_HYBRID_WEIGHT']);
|
|
64
|
+
if (maxDistance !== undefined) {
|
|
65
|
+
config.maxDistance = maxDistance;
|
|
66
|
+
}
|
|
67
|
+
if (grouping !== undefined) {
|
|
68
|
+
config.grouping = grouping;
|
|
69
|
+
}
|
|
70
|
+
if (hybridWeight !== undefined) {
|
|
71
|
+
config.hybridWeight = hybridWeight;
|
|
72
|
+
}
|
|
73
|
+
console.error('Starting RAG MCP Server...');
|
|
74
|
+
console.error('Configuration:', config);
|
|
23
75
|
// Start RAGServer
|
|
24
76
|
const server = new index_js_1.RAGServer(config);
|
|
25
77
|
await server.initialize();
|
|
26
78
|
await server.run();
|
|
27
|
-
console.
|
|
79
|
+
console.error('RAG MCP Server started successfully');
|
|
28
80
|
}
|
|
29
81
|
catch (error) {
|
|
30
82
|
console.error('Failed to start RAG MCP Server:', error);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA,iCAAiC;;AAEjC,gDAA6C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/parser/index.js
CHANGED
|
@@ -125,7 +125,7 @@ class DocumentParser {
|
|
|
125
125
|
const buffer = await (0, promises_1.readFile)(filePath);
|
|
126
126
|
const parser = new pdf_parse_1.PDFParse({ data: buffer });
|
|
127
127
|
const result = await parser.getText();
|
|
128
|
-
console.
|
|
128
|
+
console.error(`Parsed PDF: ${filePath} (${result.text.length} characters)`);
|
|
129
129
|
return result.text;
|
|
130
130
|
}
|
|
131
131
|
catch (error) {
|
|
@@ -142,7 +142,7 @@ class DocumentParser {
|
|
|
142
142
|
async parseDocx(filePath) {
|
|
143
143
|
try {
|
|
144
144
|
const result = await mammoth_1.default.extractRawText({ path: filePath });
|
|
145
|
-
console.
|
|
145
|
+
console.error(`Parsed DOCX: ${filePath} (${result.value.length} characters)`);
|
|
146
146
|
return result.value;
|
|
147
147
|
}
|
|
148
148
|
catch (error) {
|
|
@@ -159,7 +159,7 @@ class DocumentParser {
|
|
|
159
159
|
async parseTxt(filePath) {
|
|
160
160
|
try {
|
|
161
161
|
const text = await (0, promises_1.readFile)(filePath, 'utf-8');
|
|
162
|
-
console.
|
|
162
|
+
console.error(`Parsed TXT: ${filePath} (${text.length} characters)`);
|
|
163
163
|
return text;
|
|
164
164
|
}
|
|
165
165
|
catch (error) {
|
|
@@ -176,7 +176,7 @@ class DocumentParser {
|
|
|
176
176
|
async parseMd(filePath) {
|
|
177
177
|
try {
|
|
178
178
|
const text = await (0, promises_1.readFile)(filePath, 'utf-8');
|
|
179
|
-
console.
|
|
179
|
+
console.error(`Parsed MD: ${filePath} (${text.length} characters)`);
|
|
180
180
|
return text;
|
|
181
181
|
}
|
|
182
182
|
catch (error) {
|
package/dist/parser/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type GroupingMode } from '../vectordb/index.js';
|
|
1
2
|
/**
|
|
2
3
|
* RAGServer configuration
|
|
3
4
|
*/
|
|
@@ -16,6 +17,12 @@ export interface RAGServerConfig {
|
|
|
16
17
|
chunkSize: number;
|
|
17
18
|
/** Chunk overlap */
|
|
18
19
|
chunkOverlap: number;
|
|
20
|
+
/** Maximum distance threshold for quality filtering (optional) */
|
|
21
|
+
maxDistance?: number;
|
|
22
|
+
/** Grouping mode for quality filtering (optional) */
|
|
23
|
+
grouping?: GroupingMode;
|
|
24
|
+
/** Hybrid search weight for BM25 (0.0 = vector only, 1.0 = BM25 only, default 0.6) */
|
|
25
|
+
hybridWeight?: number;
|
|
19
26
|
}
|
|
20
27
|
/**
|
|
21
28
|
* query_documents tool input
|
|
@@ -23,7 +30,7 @@ export interface RAGServerConfig {
|
|
|
23
30
|
export interface QueryDocumentsInput {
|
|
24
31
|
/** Natural language query */
|
|
25
32
|
query: string;
|
|
26
|
-
/** Number of results to retrieve (default
|
|
33
|
+
/** Number of results to retrieve (default 10) */
|
|
27
34
|
limit?: number;
|
|
28
35
|
}
|
|
29
36
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.js
CHANGED
|
@@ -26,7 +26,21 @@ class RAGServer {
|
|
|
26
26
|
constructor(config) {
|
|
27
27
|
this.server = new index_js_1.Server({ name: 'rag-mcp-server', version: '1.0.0' }, { capabilities: { tools: {} } });
|
|
28
28
|
// Component initialization
|
|
29
|
-
|
|
29
|
+
// Only pass quality filter settings if they are defined
|
|
30
|
+
const vectorStoreConfig = {
|
|
31
|
+
dbPath: config.dbPath,
|
|
32
|
+
tableName: 'chunks',
|
|
33
|
+
};
|
|
34
|
+
if (config.maxDistance !== undefined) {
|
|
35
|
+
vectorStoreConfig.maxDistance = config.maxDistance;
|
|
36
|
+
}
|
|
37
|
+
if (config.grouping !== undefined) {
|
|
38
|
+
vectorStoreConfig.grouping = config.grouping;
|
|
39
|
+
}
|
|
40
|
+
if (config.hybridWeight !== undefined) {
|
|
41
|
+
vectorStoreConfig.hybridWeight = config.hybridWeight;
|
|
42
|
+
}
|
|
43
|
+
this.vectorStore = new index_js_5.VectorStore(vectorStoreConfig);
|
|
30
44
|
this.embedder = new index_js_3.Embedder({
|
|
31
45
|
modelPath: config.modelName,
|
|
32
46
|
batchSize: 8,
|
|
@@ -61,7 +75,7 @@ class RAGServer {
|
|
|
61
75
|
},
|
|
62
76
|
limit: {
|
|
63
77
|
type: 'number',
|
|
64
|
-
description: 'Maximum number of results to return (default: 5,
|
|
78
|
+
description: 'Maximum number of results to return (default: 10). Recommended: 5 for precision, 10 for balance, 20 for broad exploration.',
|
|
65
79
|
},
|
|
66
80
|
},
|
|
67
81
|
required: ['query'],
|
|
@@ -131,7 +145,7 @@ class RAGServer {
|
|
|
131
145
|
async initialize() {
|
|
132
146
|
await this.vectorStore.initialize();
|
|
133
147
|
await this.chunker.initialize();
|
|
134
|
-
console.
|
|
148
|
+
console.error('RAGServer initialized');
|
|
135
149
|
}
|
|
136
150
|
/**
|
|
137
151
|
* query_documents tool handler
|
|
@@ -140,8 +154,8 @@ class RAGServer {
|
|
|
140
154
|
try {
|
|
141
155
|
// Generate query embedding
|
|
142
156
|
const queryVector = await this.embedder.embed(args.query);
|
|
143
|
-
//
|
|
144
|
-
const searchResults = await this.vectorStore.search(queryVector, args.limit ||
|
|
157
|
+
// Hybrid search (vector + BM25 keyword matching)
|
|
158
|
+
const searchResults = await this.vectorStore.search(queryVector, args.query, args.limit || 10);
|
|
145
159
|
// Format results
|
|
146
160
|
const results = searchResults.map((result) => ({
|
|
147
161
|
filePath: result.filePath,
|
|
@@ -182,8 +196,8 @@ class RAGServer {
|
|
|
182
196
|
if (existingFile && existingFile.chunkCount > 0) {
|
|
183
197
|
// Backup existing data (retrieve via search)
|
|
184
198
|
const queryVector = embeddings[0] || [];
|
|
185
|
-
if (queryVector.length
|
|
186
|
-
const allChunks = await this.vectorStore.search(queryVector, 20); // Retrieve max 20 items
|
|
199
|
+
if (queryVector.length > 0) {
|
|
200
|
+
const allChunks = await this.vectorStore.search(queryVector, undefined, 20); // Retrieve max 20 items
|
|
187
201
|
backup = allChunks
|
|
188
202
|
.filter((chunk) => chunk.filePath === args.filePath)
|
|
189
203
|
.map((chunk) => ({
|
|
@@ -196,7 +210,7 @@ class RAGServer {
|
|
|
196
210
|
timestamp: new Date().toISOString(),
|
|
197
211
|
}));
|
|
198
212
|
}
|
|
199
|
-
console.
|
|
213
|
+
console.error(`Backup created: ${backup?.length || 0} chunks for ${args.filePath}`);
|
|
200
214
|
}
|
|
201
215
|
}
|
|
202
216
|
catch (error) {
|
|
@@ -205,7 +219,7 @@ class RAGServer {
|
|
|
205
219
|
}
|
|
206
220
|
// Delete existing data
|
|
207
221
|
await this.vectorStore.deleteChunks(args.filePath);
|
|
208
|
-
console.
|
|
222
|
+
console.error(`Deleted existing chunks for: ${args.filePath}`);
|
|
209
223
|
// Create vector chunks
|
|
210
224
|
const timestamp = new Date().toISOString();
|
|
211
225
|
const vectorChunks = chunks.map((chunk, index) => {
|
|
@@ -230,7 +244,7 @@ class RAGServer {
|
|
|
230
244
|
// Insert vectors (transaction processing)
|
|
231
245
|
try {
|
|
232
246
|
await this.vectorStore.insertChunks(vectorChunks);
|
|
233
|
-
console.
|
|
247
|
+
console.error(`Inserted ${vectorChunks.length} chunks for: ${args.filePath}`);
|
|
234
248
|
// Delete backup on success
|
|
235
249
|
backup = null;
|
|
236
250
|
}
|
|
@@ -240,7 +254,7 @@ class RAGServer {
|
|
|
240
254
|
console.error('Ingestion failed, rolling back...', insertError);
|
|
241
255
|
try {
|
|
242
256
|
await this.vectorStore.insertChunks(backup);
|
|
243
|
-
console.
|
|
257
|
+
console.error(`Rollback completed: ${backup.length} chunks restored`);
|
|
244
258
|
}
|
|
245
259
|
catch (rollbackError) {
|
|
246
260
|
console.error('Rollback failed:', rollbackError);
|
|
@@ -352,7 +366,7 @@ class RAGServer {
|
|
|
352
366
|
async run() {
|
|
353
367
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
354
368
|
await this.server.connect(transport);
|
|
355
|
-
console.
|
|
369
|
+
console.error('RAGServer running on stdio transport');
|
|
356
370
|
}
|
|
357
371
|
}
|
|
358
372
|
exports.RAGServer = RAGServer;
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AAAA,0CAA0C;;;AAE1C,6CAAwC;AACxC,wEAAkE;AAClE,wEAAgF;AAChF,iEAAkG;AAClG,kDAAqD;AACrD,mDAA+C;AAC/C,iDAAmD;AACnD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/dist/vectordb/index.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grouping mode for quality filtering
|
|
3
|
+
* - 'similar': Only return the most similar group (stops at first distance jump)
|
|
4
|
+
* - 'related': Include related groups (stops at second distance jump)
|
|
5
|
+
*/
|
|
6
|
+
export type GroupingMode = 'similar' | 'related';
|
|
1
7
|
/**
|
|
2
8
|
* VectorStore configuration
|
|
3
9
|
*/
|
|
@@ -6,6 +12,12 @@ export interface VectorStoreConfig {
|
|
|
6
12
|
dbPath: string;
|
|
7
13
|
/** Table name */
|
|
8
14
|
tableName: string;
|
|
15
|
+
/** Maximum distance threshold for filtering results (optional) */
|
|
16
|
+
maxDistance?: number;
|
|
17
|
+
/** Grouping mode for quality filtering (optional) */
|
|
18
|
+
grouping?: GroupingMode;
|
|
19
|
+
/** Hybrid search weight for BM25 (0.0 = vector only, 1.0 = BM25 only, default 0.6) */
|
|
20
|
+
hybridWeight?: number;
|
|
9
21
|
}
|
|
10
22
|
/**
|
|
11
23
|
* Document metadata
|
|
@@ -30,7 +42,7 @@ export interface VectorChunk {
|
|
|
30
42
|
chunkIndex: number;
|
|
31
43
|
/** Chunk text */
|
|
32
44
|
text: string;
|
|
33
|
-
/** Embedding vector (
|
|
45
|
+
/** Embedding vector (dimension depends on model) */
|
|
34
46
|
vector: number[];
|
|
35
47
|
/** Metadata */
|
|
36
48
|
metadata: DocumentMetadata;
|
|
@@ -47,7 +59,7 @@ export interface SearchResult {
|
|
|
47
59
|
chunkIndex: number;
|
|
48
60
|
/** Chunk text */
|
|
49
61
|
text: string;
|
|
50
|
-
/**
|
|
62
|
+
/** Distance score using dot product (0 = identical, 1 = orthogonal, 2 = opposite) */
|
|
51
63
|
score: number;
|
|
52
64
|
/** Metadata */
|
|
53
65
|
metadata: DocumentMetadata;
|
|
@@ -71,6 +83,7 @@ export declare class VectorStore {
|
|
|
71
83
|
private db;
|
|
72
84
|
private table;
|
|
73
85
|
private readonly config;
|
|
86
|
+
private ftsEnabled;
|
|
74
87
|
constructor(config: VectorStoreConfig);
|
|
75
88
|
/**
|
|
76
89
|
* Initialize LanceDB and create table
|
|
@@ -89,13 +102,42 @@ export declare class VectorStore {
|
|
|
89
102
|
*/
|
|
90
103
|
insertChunks(chunks: VectorChunk[]): Promise<void>;
|
|
91
104
|
/**
|
|
92
|
-
*
|
|
105
|
+
* Ensure FTS index exists for hybrid search
|
|
106
|
+
* Creates the index if it doesn't exist, falls back gracefully on error
|
|
107
|
+
*/
|
|
108
|
+
private ensureFtsIndex;
|
|
109
|
+
/**
|
|
110
|
+
* Rebuild FTS index after data changes (insert/delete)
|
|
111
|
+
* LanceDB OSS requires explicit optimize() call to update FTS index
|
|
112
|
+
*/
|
|
113
|
+
private rebuildFtsIndex;
|
|
114
|
+
/**
|
|
115
|
+
* Apply grouping algorithm to filter results by detecting group boundaries.
|
|
93
116
|
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
117
|
+
* Uses statistical threshold (mean + k*std) to identify significant gaps (group boundaries).
|
|
118
|
+
* - 'similar': Returns only the first group (cuts at first boundary)
|
|
119
|
+
* - 'related': Returns up to 2 groups (cuts at second boundary)
|
|
120
|
+
*
|
|
121
|
+
* @param results - Search results sorted by distance (ascending)
|
|
122
|
+
* @param mode - Grouping mode ('similar' = 1 group, 'related' = 2 groups)
|
|
123
|
+
* @returns Filtered results
|
|
124
|
+
*/
|
|
125
|
+
private applyGrouping;
|
|
126
|
+
/**
|
|
127
|
+
* Execute vector search with quality filtering
|
|
128
|
+
* Supports hybrid search (BM25 + vector) when FTS index is enabled
|
|
129
|
+
*
|
|
130
|
+
* @param queryVector - Query vector (dimension depends on model)
|
|
131
|
+
* @param queryText - Optional query text for hybrid search (BM25)
|
|
132
|
+
* @param limit - Number of results to retrieve (default 10)
|
|
133
|
+
* @returns Array of search results (sorted by distance ascending, filtered by quality settings)
|
|
134
|
+
*/
|
|
135
|
+
search(queryVector: number[], queryText?: string, limit?: number): Promise<SearchResult[]>;
|
|
136
|
+
/**
|
|
137
|
+
* Rerank results from hybrid search using linear combination
|
|
138
|
+
* Weight is configurable via hybridWeight (default 0.6 = 60% BM25, 40% vector)
|
|
97
139
|
*/
|
|
98
|
-
|
|
140
|
+
private hybridRerank;
|
|
99
141
|
/**
|
|
100
142
|
* Get list of ingested files
|
|
101
143
|
*
|
|
@@ -116,6 +158,8 @@ export declare class VectorStore {
|
|
|
116
158
|
chunkCount: number;
|
|
117
159
|
memoryUsage: number;
|
|
118
160
|
uptime: number;
|
|
161
|
+
ftsIndexEnabled: boolean;
|
|
162
|
+
searchMode: 'hybrid' | 'vector-only';
|
|
119
163
|
}>;
|
|
120
164
|
}
|
|
121
165
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vectordb/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vectordb/index.ts"],"names":[],"mappings":"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"}
|
package/dist/vectordb/index.js
CHANGED
|
@@ -4,6 +4,61 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.VectorStore = exports.DatabaseError = void 0;
|
|
5
5
|
const lancedb_1 = require("@lancedb/lancedb");
|
|
6
6
|
// ============================================
|
|
7
|
+
// Constants
|
|
8
|
+
// ============================================
|
|
9
|
+
/**
|
|
10
|
+
* Standard deviation multiplier for detecting group boundaries.
|
|
11
|
+
* A gap is considered a "boundary" if it exceeds mean + k*std.
|
|
12
|
+
* Value of 1.5 means gaps > 1.5 standard deviations above mean are boundaries.
|
|
13
|
+
*/
|
|
14
|
+
const GROUPING_BOUNDARY_STD_MULTIPLIER = 1.5;
|
|
15
|
+
/** Multiplier for candidate count in hybrid search (to allow reranking) */
|
|
16
|
+
const HYBRID_SEARCH_CANDIDATE_MULTIPLIER = 2;
|
|
17
|
+
/** Maximum distance for dot product similarity (0 = identical, 2 = opposite) */
|
|
18
|
+
const DOT_PRODUCT_MAX_DISTANCE = 2;
|
|
19
|
+
// ============================================
|
|
20
|
+
// Type Guards
|
|
21
|
+
// ============================================
|
|
22
|
+
/**
|
|
23
|
+
* Type guard for DocumentMetadata
|
|
24
|
+
*/
|
|
25
|
+
function isDocumentMetadata(value) {
|
|
26
|
+
if (typeof value !== 'object' || value === null)
|
|
27
|
+
return false;
|
|
28
|
+
const obj = value;
|
|
29
|
+
return (typeof obj['fileName'] === 'string' &&
|
|
30
|
+
typeof obj['fileSize'] === 'number' &&
|
|
31
|
+
typeof obj['fileType'] === 'string');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Type guard for LanceDB raw search result
|
|
35
|
+
*/
|
|
36
|
+
function isLanceDBRawResult(value) {
|
|
37
|
+
if (typeof value !== 'object' || value === null)
|
|
38
|
+
return false;
|
|
39
|
+
const obj = value;
|
|
40
|
+
return (typeof obj['filePath'] === 'string' &&
|
|
41
|
+
typeof obj['chunkIndex'] === 'number' &&
|
|
42
|
+
typeof obj['text'] === 'string' &&
|
|
43
|
+
isDocumentMetadata(obj['metadata']));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Convert LanceDB raw result to SearchResult with type validation
|
|
47
|
+
* @throws DatabaseError if the result is invalid
|
|
48
|
+
*/
|
|
49
|
+
function toSearchResult(raw) {
|
|
50
|
+
if (!isLanceDBRawResult(raw)) {
|
|
51
|
+
throw new DatabaseError('Invalid search result format from LanceDB');
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
filePath: raw.filePath,
|
|
55
|
+
chunkIndex: raw.chunkIndex,
|
|
56
|
+
text: raw.text,
|
|
57
|
+
score: raw._distance ?? raw._score ?? 0,
|
|
58
|
+
metadata: raw.metadata,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// ============================================
|
|
7
62
|
// Error Classes
|
|
8
63
|
// ============================================
|
|
9
64
|
/**
|
|
@@ -32,6 +87,7 @@ class VectorStore {
|
|
|
32
87
|
constructor(config) {
|
|
33
88
|
this.db = null;
|
|
34
89
|
this.table = null;
|
|
90
|
+
this.ftsEnabled = false;
|
|
35
91
|
this.config = config;
|
|
36
92
|
}
|
|
37
93
|
/**
|
|
@@ -46,13 +102,15 @@ class VectorStore {
|
|
|
46
102
|
if (tableNames.includes(this.config.tableName)) {
|
|
47
103
|
// Open existing table
|
|
48
104
|
this.table = await this.db.openTable(this.config.tableName);
|
|
49
|
-
console.
|
|
105
|
+
console.error(`VectorStore: Opened existing table "${this.config.tableName}"`);
|
|
106
|
+
// Ensure FTS index exists (migration for existing databases)
|
|
107
|
+
await this.ensureFtsIndex();
|
|
50
108
|
}
|
|
51
109
|
else {
|
|
52
110
|
// Create new table (schema auto-defined on first data insertion)
|
|
53
|
-
console.
|
|
111
|
+
console.error(`VectorStore: Table "${this.config.tableName}" will be created on first data insertion`);
|
|
54
112
|
}
|
|
55
|
-
console.
|
|
113
|
+
console.error(`VectorStore initialized: ${this.config.dbPath}`);
|
|
56
114
|
}
|
|
57
115
|
catch (error) {
|
|
58
116
|
throw new DatabaseError('Failed to initialize VectorStore', error);
|
|
@@ -66,7 +124,7 @@ class VectorStore {
|
|
|
66
124
|
async deleteChunks(filePath) {
|
|
67
125
|
if (!this.table) {
|
|
68
126
|
// If table doesn't exist, no deletion targets, return normally
|
|
69
|
-
console.
|
|
127
|
+
console.error('VectorStore: Skipping deletion as table does not exist');
|
|
70
128
|
return;
|
|
71
129
|
}
|
|
72
130
|
try {
|
|
@@ -77,7 +135,9 @@ class VectorStore {
|
|
|
77
135
|
// so call delete directly
|
|
78
136
|
// Note: Field names are case-sensitive, use backticks for camelCase fields
|
|
79
137
|
await this.table.delete(`\`filePath\` = '${escapedFilePath}'`);
|
|
80
|
-
console.
|
|
138
|
+
console.error(`VectorStore: Deleted chunks for file "${filePath}"`);
|
|
139
|
+
// Rebuild FTS index after deleting data
|
|
140
|
+
await this.rebuildFtsIndex();
|
|
81
141
|
}
|
|
82
142
|
catch (error) {
|
|
83
143
|
// If error occurs, output warning log
|
|
@@ -110,54 +170,236 @@ class VectorStore {
|
|
|
110
170
|
// LanceDB's createTable API accepts data as Record<string, unknown>[]
|
|
111
171
|
const records = chunks.map((chunk) => chunk);
|
|
112
172
|
this.table = await this.db.createTable(this.config.tableName, records);
|
|
113
|
-
console.
|
|
173
|
+
console.error(`VectorStore: Created table "${this.config.tableName}"`);
|
|
174
|
+
// Create FTS index for hybrid search
|
|
175
|
+
await this.ensureFtsIndex();
|
|
114
176
|
}
|
|
115
177
|
else {
|
|
116
178
|
// Add data to existing table
|
|
117
179
|
const records = chunks.map((chunk) => chunk);
|
|
118
180
|
await this.table.add(records);
|
|
181
|
+
// Rebuild FTS index after adding new data
|
|
182
|
+
await this.rebuildFtsIndex();
|
|
119
183
|
}
|
|
120
|
-
console.
|
|
184
|
+
console.error(`VectorStore: Inserted ${chunks.length} chunks`);
|
|
121
185
|
}
|
|
122
186
|
catch (error) {
|
|
123
187
|
throw new DatabaseError('Failed to insert chunks', error);
|
|
124
188
|
}
|
|
125
189
|
}
|
|
126
190
|
/**
|
|
127
|
-
*
|
|
191
|
+
* Ensure FTS index exists for hybrid search
|
|
192
|
+
* Creates the index if it doesn't exist, falls back gracefully on error
|
|
193
|
+
*/
|
|
194
|
+
async ensureFtsIndex() {
|
|
195
|
+
if (!this.table || this.ftsEnabled) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
// Create FTS index on the 'text' column
|
|
200
|
+
await this.table.createIndex('text', {
|
|
201
|
+
config: lancedb_1.Index.fts(),
|
|
202
|
+
});
|
|
203
|
+
this.ftsEnabled = true;
|
|
204
|
+
console.error('VectorStore: FTS index created successfully');
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
// FTS index creation failed, continue with vector-only search
|
|
208
|
+
console.error('VectorStore: FTS index creation failed, using vector-only search:', error);
|
|
209
|
+
this.ftsEnabled = false;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Rebuild FTS index after data changes (insert/delete)
|
|
214
|
+
* LanceDB OSS requires explicit optimize() call to update FTS index
|
|
215
|
+
*/
|
|
216
|
+
async rebuildFtsIndex() {
|
|
217
|
+
if (!this.table || !this.ftsEnabled) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
// Optimize table to rebuild indexes including FTS
|
|
222
|
+
await this.table.optimize();
|
|
223
|
+
console.error('VectorStore: FTS index rebuilt successfully');
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
// Log warning but don't fail the operation
|
|
227
|
+
console.warn('VectorStore: FTS index rebuild failed:', error);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Apply grouping algorithm to filter results by detecting group boundaries.
|
|
232
|
+
*
|
|
233
|
+
* Uses statistical threshold (mean + k*std) to identify significant gaps (group boundaries).
|
|
234
|
+
* - 'similar': Returns only the first group (cuts at first boundary)
|
|
235
|
+
* - 'related': Returns up to 2 groups (cuts at second boundary)
|
|
236
|
+
*
|
|
237
|
+
* @param results - Search results sorted by distance (ascending)
|
|
238
|
+
* @param mode - Grouping mode ('similar' = 1 group, 'related' = 2 groups)
|
|
239
|
+
* @returns Filtered results
|
|
240
|
+
*/
|
|
241
|
+
applyGrouping(results, mode) {
|
|
242
|
+
if (results.length <= 1)
|
|
243
|
+
return results;
|
|
244
|
+
// Calculate gaps between consecutive results with their indices
|
|
245
|
+
const gaps = [];
|
|
246
|
+
for (let i = 0; i < results.length - 1; i++) {
|
|
247
|
+
const current = results[i];
|
|
248
|
+
const next = results[i + 1];
|
|
249
|
+
if (current !== undefined && next !== undefined) {
|
|
250
|
+
gaps.push({ index: i + 1, gap: next.score - current.score });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (gaps.length === 0)
|
|
254
|
+
return results;
|
|
255
|
+
// Calculate statistical threshold to identify significant gaps (group boundaries)
|
|
256
|
+
const gapValues = gaps.map((g) => g.gap);
|
|
257
|
+
const mean = gapValues.reduce((a, b) => a + b, 0) / gapValues.length;
|
|
258
|
+
const variance = gapValues.reduce((a, b) => a + (b - mean) ** 2, 0) / gapValues.length;
|
|
259
|
+
const std = Math.sqrt(variance);
|
|
260
|
+
const threshold = mean + GROUPING_BOUNDARY_STD_MULTIPLIER * std;
|
|
261
|
+
// Find all significant gaps (group boundaries)
|
|
262
|
+
const boundaries = gaps.filter((g) => g.gap > threshold).map((g) => g.index);
|
|
263
|
+
// If no boundaries found, return all results
|
|
264
|
+
if (boundaries.length === 0)
|
|
265
|
+
return results;
|
|
266
|
+
// Determine how many groups to include based on mode
|
|
267
|
+
// 'similar': 1 group (cut at first boundary)
|
|
268
|
+
// 'related': 2 groups (cut at second boundary, or return all if only 1 boundary)
|
|
269
|
+
const groupsToInclude = mode === 'similar' ? 1 : 2;
|
|
270
|
+
const boundaryIndex = groupsToInclude - 1;
|
|
271
|
+
// If we don't have enough boundaries, return all results for 'related' mode
|
|
272
|
+
if (boundaryIndex >= boundaries.length) {
|
|
273
|
+
return mode === 'related' ? results : results.slice(0, boundaries[0]);
|
|
274
|
+
}
|
|
275
|
+
// Cut at the appropriate boundary
|
|
276
|
+
return results.slice(0, boundaries[boundaryIndex]);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Execute vector search with quality filtering
|
|
280
|
+
* Supports hybrid search (BM25 + vector) when FTS index is enabled
|
|
128
281
|
*
|
|
129
|
-
* @param queryVector - Query vector (
|
|
130
|
-
* @param
|
|
131
|
-
* @
|
|
282
|
+
* @param queryVector - Query vector (dimension depends on model)
|
|
283
|
+
* @param queryText - Optional query text for hybrid search (BM25)
|
|
284
|
+
* @param limit - Number of results to retrieve (default 10)
|
|
285
|
+
* @returns Array of search results (sorted by distance ascending, filtered by quality settings)
|
|
132
286
|
*/
|
|
133
|
-
async search(queryVector, limit =
|
|
287
|
+
async search(queryVector, queryText, limit = 10) {
|
|
134
288
|
if (!this.table) {
|
|
135
289
|
// Return empty array if table doesn't exist
|
|
136
|
-
console.
|
|
290
|
+
console.error('VectorStore: Returning empty results as table does not exist');
|
|
137
291
|
return [];
|
|
138
292
|
}
|
|
139
|
-
if (queryVector.length !== 384) {
|
|
140
|
-
throw new DatabaseError(`Invalid query vector dimension: expected 384, got ${queryVector.length}`);
|
|
141
|
-
}
|
|
142
293
|
if (limit < 1 || limit > 20) {
|
|
143
294
|
throw new DatabaseError(`Invalid limit: expected 1-20, got ${limit}`);
|
|
144
295
|
}
|
|
145
296
|
try {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
297
|
+
let rawResults;
|
|
298
|
+
// Use hybrid search if FTS is enabled, query text is provided, and hybridWeight > 0
|
|
299
|
+
const hybridWeight = this.config.hybridWeight ?? 0.6;
|
|
300
|
+
if (this.ftsEnabled && queryText && queryText.trim().length > 0 && hybridWeight > 0) {
|
|
301
|
+
try {
|
|
302
|
+
const candidateLimit = limit * HYBRID_SEARCH_CANDIDATE_MULTIPLIER;
|
|
303
|
+
// Hybrid search: combine FTS (BM25) and vector search
|
|
304
|
+
rawResults = await this.table
|
|
305
|
+
.search(queryText, 'fts', 'text')
|
|
306
|
+
.select(['filePath', 'chunkIndex', 'text', 'metadata'])
|
|
307
|
+
.limit(candidateLimit) // Get more candidates for reranking
|
|
308
|
+
.toArray();
|
|
309
|
+
// Also perform vector search
|
|
310
|
+
const vectorResults = await this.table
|
|
311
|
+
.vectorSearch(queryVector)
|
|
312
|
+
.distanceType('dot')
|
|
313
|
+
.limit(candidateLimit)
|
|
314
|
+
.toArray();
|
|
315
|
+
// Combine and rerank using linear combination (70% vector, 30% FTS)
|
|
316
|
+
rawResults = this.hybridRerank(rawResults, vectorResults, limit);
|
|
317
|
+
}
|
|
318
|
+
catch (ftsError) {
|
|
319
|
+
// FTS search failed, fall back to vector-only search
|
|
320
|
+
console.error('VectorStore: FTS search failed, falling back to vector-only:', ftsError);
|
|
321
|
+
this.ftsEnabled = false;
|
|
322
|
+
let query = this.table.vectorSearch(queryVector).distanceType('dot').limit(limit);
|
|
323
|
+
if (this.config.maxDistance !== undefined) {
|
|
324
|
+
query = query.distanceRange(undefined, this.config.maxDistance);
|
|
325
|
+
}
|
|
326
|
+
rawResults = await query.toArray();
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
// Vector-only search
|
|
331
|
+
let query = this.table.vectorSearch(queryVector).distanceType('dot').limit(limit);
|
|
332
|
+
// Apply distance threshold if configured
|
|
333
|
+
if (this.config.maxDistance !== undefined) {
|
|
334
|
+
query = query.distanceRange(undefined, this.config.maxDistance);
|
|
335
|
+
}
|
|
336
|
+
rawResults = await query.toArray();
|
|
337
|
+
}
|
|
338
|
+
// Convert to SearchResult format with type validation
|
|
339
|
+
let results = rawResults.map((result) => toSearchResult(result));
|
|
340
|
+
// Apply maxDistance filter (for hybrid search results that weren't filtered at query level)
|
|
341
|
+
if (this.config.maxDistance !== undefined) {
|
|
342
|
+
results = results.filter((result) => result.score <= this.config.maxDistance);
|
|
343
|
+
}
|
|
344
|
+
// Apply grouping filter if configured
|
|
345
|
+
if (this.config.grouping && results.length > 1) {
|
|
346
|
+
results = this.applyGrouping(results, this.config.grouping);
|
|
347
|
+
}
|
|
348
|
+
return results;
|
|
156
349
|
}
|
|
157
350
|
catch (error) {
|
|
158
351
|
throw new DatabaseError('Failed to search vectors', error);
|
|
159
352
|
}
|
|
160
353
|
}
|
|
354
|
+
/**
|
|
355
|
+
* Rerank results from hybrid search using linear combination
|
|
356
|
+
* Weight is configurable via hybridWeight (default 0.6 = 60% BM25, 40% vector)
|
|
357
|
+
*/
|
|
358
|
+
hybridRerank(ftsResults, vectorResults, limit) {
|
|
359
|
+
const scoreMap = new Map();
|
|
360
|
+
// Get weight from config (default 0.6 = BM25 60%, vector 40%)
|
|
361
|
+
const bm25Weight = this.config.hybridWeight ?? 0.6;
|
|
362
|
+
const vectorWeight = 1 - bm25Weight;
|
|
363
|
+
// Process vector results (lower distance = better, convert to 0-1 score)
|
|
364
|
+
for (let i = 0; i < vectorResults.length; i++) {
|
|
365
|
+
const result = vectorResults[i];
|
|
366
|
+
if (!result)
|
|
367
|
+
continue;
|
|
368
|
+
const key = `${result['filePath']}:${result['chunkIndex']}`;
|
|
369
|
+
const distance = result['_distance'] ?? 1;
|
|
370
|
+
// Convert distance to similarity score (0-1 range, higher is better)
|
|
371
|
+
const vectorScore = Math.max(0, 1 - distance / DOT_PRODUCT_MAX_DISTANCE);
|
|
372
|
+
scoreMap.set(key, { result, score: vectorScore * vectorWeight });
|
|
373
|
+
}
|
|
374
|
+
// Process FTS results (rank-based scoring)
|
|
375
|
+
for (let i = 0; i < ftsResults.length; i++) {
|
|
376
|
+
const result = ftsResults[i];
|
|
377
|
+
if (!result)
|
|
378
|
+
continue;
|
|
379
|
+
const key = `${result['filePath']}:${result['chunkIndex']}`;
|
|
380
|
+
// FTS score based on rank position (higher rank = higher score)
|
|
381
|
+
const ftsScore = 1 - i / ftsResults.length;
|
|
382
|
+
if (scoreMap.has(key)) {
|
|
383
|
+
// Combine scores
|
|
384
|
+
const existing = scoreMap.get(key);
|
|
385
|
+
if (existing) {
|
|
386
|
+
existing.score += ftsScore * bm25Weight;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
scoreMap.set(key, { result, score: ftsScore * bm25Weight });
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// Sort by combined score and return top results
|
|
394
|
+
const sortedResults = Array.from(scoreMap.values())
|
|
395
|
+
.sort((a, b) => b.score - a.score)
|
|
396
|
+
.slice(0, limit)
|
|
397
|
+
.map((item) => ({
|
|
398
|
+
...item.result,
|
|
399
|
+
_distance: 1 - item.score, // Convert back to distance for consistency
|
|
400
|
+
}));
|
|
401
|
+
return sortedResults;
|
|
402
|
+
}
|
|
161
403
|
/**
|
|
162
404
|
* Get list of ingested files
|
|
163
405
|
*
|
|
@@ -212,6 +454,8 @@ class VectorStore {
|
|
|
212
454
|
chunkCount: 0,
|
|
213
455
|
memoryUsage: 0,
|
|
214
456
|
uptime: process.uptime(),
|
|
457
|
+
ftsIndexEnabled: false,
|
|
458
|
+
searchMode: 'vector-only',
|
|
215
459
|
};
|
|
216
460
|
}
|
|
217
461
|
try {
|
|
@@ -230,6 +474,8 @@ class VectorStore {
|
|
|
230
474
|
chunkCount,
|
|
231
475
|
memoryUsage,
|
|
232
476
|
uptime,
|
|
477
|
+
ftsIndexEnabled: this.ftsEnabled,
|
|
478
|
+
searchMode: this.ftsEnabled && (this.config.hybridWeight ?? 0.6) > 0 ? 'hybrid' : 'vector-only',
|
|
233
479
|
};
|
|
234
480
|
}
|
|
235
481
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vectordb/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vectordb/index.ts"],"names":[],"mappings":"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"}
|