@cogitator-ai/rag 0.1.9 → 0.2.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 +66 -31
- package/dist/chunkers/create-chunker.js.map +1 -1
- package/dist/chunkers/index.d.ts.map +1 -1
- package/dist/chunkers/index.js.map +1 -1
- package/dist/chunkers/recursive-chunker.d.ts +2 -3
- package/dist/chunkers/recursive-chunker.d.ts.map +1 -1
- package/dist/chunkers/recursive-chunker.js +89 -118
- package/dist/chunkers/recursive-chunker.js.map +1 -1
- package/dist/chunkers/semantic-chunker.d.ts +2 -0
- package/dist/chunkers/semantic-chunker.d.ts.map +1 -1
- package/dist/chunkers/semantic-chunker.js +72 -38
- package/dist/chunkers/semantic-chunker.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/loaders/csv-loader.d.ts.map +1 -1
- package/dist/loaders/csv-loader.js +12 -4
- package/dist/loaders/csv-loader.js.map +1 -1
- package/dist/loaders/html-loader.d.ts +4 -0
- package/dist/loaders/html-loader.d.ts.map +1 -1
- package/dist/loaders/html-loader.js +26 -2
- package/dist/loaders/html-loader.js.map +1 -1
- package/dist/loaders/index.d.ts.map +1 -1
- package/dist/loaders/index.js.map +1 -1
- package/dist/loaders/json-loader.d.ts +1 -0
- package/dist/loaders/json-loader.d.ts.map +1 -1
- package/dist/loaders/json-loader.js +15 -3
- package/dist/loaders/json-loader.js.map +1 -1
- package/dist/loaders/markdown-loader.d.ts.map +1 -1
- package/dist/loaders/markdown-loader.js +8 -4
- package/dist/loaders/markdown-loader.js.map +1 -1
- package/dist/loaders/pdf-loader.d.ts +1 -0
- package/dist/loaders/pdf-loader.d.ts.map +1 -1
- package/dist/loaders/pdf-loader.js +22 -3
- package/dist/loaders/pdf-loader.js.map +1 -1
- package/dist/loaders/text-loader.js +1 -1
- package/dist/loaders/text-loader.js.map +1 -1
- package/dist/loaders/web-loader.d.ts +33 -0
- package/dist/loaders/web-loader.d.ts.map +1 -1
- package/dist/loaders/web-loader.js +262 -8
- package/dist/loaders/web-loader.js.map +1 -1
- package/dist/rag-builder.d.ts +10 -1
- package/dist/rag-builder.d.ts.map +1 -1
- package/dist/rag-builder.js +71 -6
- package/dist/rag-builder.js.map +1 -1
- package/dist/rag-pipeline.d.ts +2 -1
- package/dist/rag-pipeline.d.ts.map +1 -1
- package/dist/rag-pipeline.js +58 -23
- package/dist/rag-pipeline.js.map +1 -1
- package/dist/rerankers/cohere-reranker.d.ts +2 -2
- package/dist/rerankers/cohere-reranker.d.ts.map +1 -1
- package/dist/rerankers/cohere-reranker.js +5 -0
- package/dist/rerankers/cohere-reranker.js.map +1 -1
- package/dist/rerankers/index.d.ts.map +1 -1
- package/dist/rerankers/index.js.map +1 -1
- package/dist/rerankers/llm-reranker.d.ts +1 -1
- package/dist/rerankers/llm-reranker.d.ts.map +1 -1
- package/dist/rerankers/llm-reranker.js +26 -13
- package/dist/rerankers/llm-reranker.js.map +1 -1
- package/dist/retrievers/chunk-indexer.d.ts +19 -0
- package/dist/retrievers/chunk-indexer.d.ts.map +1 -0
- package/dist/retrievers/chunk-indexer.js +8 -0
- package/dist/retrievers/chunk-indexer.js.map +1 -0
- package/dist/retrievers/create-retriever.d.ts +2 -0
- package/dist/retrievers/create-retriever.d.ts.map +1 -1
- package/dist/retrievers/create-retriever.js +6 -0
- package/dist/retrievers/create-retriever.js.map +1 -1
- package/dist/retrievers/hybrid-retriever.d.ts +8 -1
- package/dist/retrievers/hybrid-retriever.d.ts.map +1 -1
- package/dist/retrievers/hybrid-retriever.js +18 -5
- package/dist/retrievers/hybrid-retriever.js.map +1 -1
- package/dist/retrievers/index.d.ts +2 -0
- package/dist/retrievers/index.d.ts.map +1 -1
- package/dist/retrievers/index.js +1 -0
- package/dist/retrievers/index.js.map +1 -1
- package/dist/retrievers/mmr-retriever.d.ts +5 -0
- package/dist/retrievers/mmr-retriever.d.ts.map +1 -1
- package/dist/retrievers/mmr-retriever.js +34 -8
- package/dist/retrievers/mmr-retriever.js.map +1 -1
- package/dist/retrievers/multi-query-retriever.d.ts +14 -1
- package/dist/retrievers/multi-query-retriever.d.ts.map +1 -1
- package/dist/retrievers/multi-query-retriever.js +50 -6
- package/dist/retrievers/multi-query-retriever.js.map +1 -1
- package/dist/retrievers/similarity-retriever.d.ts.map +1 -1
- package/dist/retrievers/similarity-retriever.js +2 -1
- package/dist/retrievers/similarity-retriever.js.map +1 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +16 -2
- package/dist/schema.js.map +1 -1
- package/dist/tools.d.ts +11 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +43 -9
- package/dist/tools.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -52,23 +52,42 @@ await pipeline.ingest('./docs');
|
|
|
52
52
|
const results = await pipeline.query('How does authentication work?');
|
|
53
53
|
|
|
54
54
|
for (const r of results) {
|
|
55
|
-
console.log(`[${r.score.toFixed(3)}] ${r.content.slice(0, 100)}...`);
|
|
55
|
+
console.log(`[${r.score.toFixed(3)}] ${r.source}: ${r.content.slice(0, 100)}...`);
|
|
56
56
|
}
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
+
Every stored chunk carries the document's loader metadata (e.g. Markdown frontmatter, PDF page numbers, CSV metadata columns, page title/URL) plus `documentId`, `source`, `sourceType`, `order`, `startOffset` and `endOffset`. Retrieval results expose the document path/URL as `result.source` and the rest in `result.metadata`.
|
|
60
|
+
|
|
59
61
|
---
|
|
60
62
|
|
|
61
63
|
## Document Loaders
|
|
62
64
|
|
|
63
|
-
| Loader | Formats | Optional Dep | Notes
|
|
64
|
-
| ---------------- | --------------------- | ------------ |
|
|
65
|
-
| `TextLoader` | `.txt` | — | Files and directories
|
|
66
|
-
| `MarkdownLoader` | `.md`
|
|
67
|
-
| `JSONLoader` | `.json` | — | Configurable content field
|
|
68
|
-
| `CSVLoader` | `.csv` | `papaparse` | Column selection, row
|
|
69
|
-
| `HTMLLoader` | `.html`, `.htm` | `cheerio` | CSS selector
|
|
70
|
-
| `PDFLoader` | `.pdf` | `pdf-parse` |
|
|
71
|
-
| `WebLoader` | `http://`, `https://` | `cheerio` |
|
|
65
|
+
| Loader | Formats | Optional Dep | Notes |
|
|
66
|
+
| ---------------- | --------------------- | ------------ | ------------------------------------------------------ |
|
|
67
|
+
| `TextLoader` | `.txt` | — | Files and directories |
|
|
68
|
+
| `MarkdownLoader` | `.md`, `.mdx` | — | Optional frontmatter -> metadata |
|
|
69
|
+
| `JSONLoader` | `.json` | — | Configurable content field |
|
|
70
|
+
| `CSVLoader` | `.csv` | `papaparse` | Column selection, `row` number in metadata |
|
|
71
|
+
| `HTMLLoader` | `.html`, `.htm` | `cheerio` | CSS selector, scripts/styles removed, block-aware text |
|
|
72
|
+
| `PDFLoader` | `.pdf` | `pdf-parse` | Whole document or one document per page |
|
|
73
|
+
| `WebLoader` | `http://`, `https://` | `cheerio` | HTML, plain text and JSON pages; SSRF-protected |
|
|
74
|
+
|
|
75
|
+
Directory sources (`TextLoader`, `MarkdownLoader`) are loaded in sorted file-name order.
|
|
76
|
+
|
|
77
|
+
### WebLoader security
|
|
78
|
+
|
|
79
|
+
`WebLoader` blocks loopback, private, link-local, CGNAT, multicast and cloud-metadata addresses — including IPv4-mapped IPv6 forms and hostnames that **resolve** to such addresses. The check runs at connect time for every redirect hop, so DNS rebinding cannot bypass it. To ingest an intranet site, opt in explicitly:
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
const intranet = new WebLoader({
|
|
83
|
+
allowPrivateNetwork: true,
|
|
84
|
+
headers: { Authorization: `Bearer ${process.env.WIKI_TOKEN}` },
|
|
85
|
+
timeoutMs: 15_000,
|
|
86
|
+
maxResponseBytes: 10 * 1024 * 1024,
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Responses are decompressed (gzip, deflate, br), decoded using the declared charset, and limited to `maxResponseBytes` (50MB by default). Non-text content types are rejected.
|
|
72
91
|
|
|
73
92
|
```typescript
|
|
74
93
|
import { MarkdownLoader, WebLoader, CSVLoader } from '@cogitator-ai/rag';
|
|
@@ -101,7 +120,7 @@ const chunks = chunker.chunk(text, documentId);
|
|
|
101
120
|
|
|
102
121
|
### Recursive
|
|
103
122
|
|
|
104
|
-
Splits on configurable separators (`\n\n`, `\n`, `. `, ` `) trying to keep paragraphs and sentences intact.
|
|
123
|
+
Splits on configurable separators (`\n\n`, `\n`, `. `, ` `) trying to keep paragraphs and sentences intact. Chunk offsets always point into the original text, chunks never exceed `chunkSize`, sentence punctuation is kept and overlap never produces a chunk fully contained in the previous one.
|
|
105
124
|
|
|
106
125
|
```typescript
|
|
107
126
|
import { RecursiveChunker } from '@cogitator-ai/rag';
|
|
@@ -115,7 +134,7 @@ const chunker = new RecursiveChunker({
|
|
|
115
134
|
|
|
116
135
|
### Semantic
|
|
117
136
|
|
|
118
|
-
Uses embedding similarity between sentences to find natural breakpoints. Async — requires an `EmbeddingService`.
|
|
137
|
+
Uses embedding similarity between sentences (and blank-line separated blocks) to find natural breakpoints. Async — requires an `EmbeddingService`.
|
|
119
138
|
|
|
120
139
|
```typescript
|
|
121
140
|
import { SemanticChunker } from '@cogitator-ai/rag';
|
|
@@ -152,6 +171,29 @@ const chunker = createChunker(
|
|
|
152
171
|
| `hybrid` | `HybridRetriever` | Combines BM25 keyword search with vector search (RRF) |
|
|
153
172
|
| `multi-query` | `MultiQueryRetriever` | Expands query into variants, merges results |
|
|
154
173
|
|
|
174
|
+
`RAGPipelineBuilder` builds the retriever matching `retrieval.strategy` when no custom `withRetriever()` is given:
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
const pipeline = new RAGPipelineBuilder()
|
|
178
|
+
.withLoader(loader)
|
|
179
|
+
.withEmbeddingService(embeddingService)
|
|
180
|
+
.withEmbeddingAdapter(embeddingAdapter)
|
|
181
|
+
.withHybridSearch(new HybridSearch({ embeddingAdapter, embeddingService })) // 'hybrid'
|
|
182
|
+
.withQueryExpander(expandWithLLM) // 'multi-query'
|
|
183
|
+
.withConfig({
|
|
184
|
+
chunking: { strategy: 'recursive', chunkSize: 500, chunkOverlap: 50 },
|
|
185
|
+
retrieval: { strategy: 'multi-query', multiQueryCount: 3, topK: 5 },
|
|
186
|
+
})
|
|
187
|
+
.build();
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
| Strategy | Builder requirement | Config used |
|
|
191
|
+
| ------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------- |
|
|
192
|
+
| `similarity` | — | `topK`, `threshold` |
|
|
193
|
+
| `mmr` | — | `mmrLambda`, `topK`, `threshold` |
|
|
194
|
+
| `hybrid` | `withHybridSearch(hybridSearch, weights?)` | `topK`, `threshold` |
|
|
195
|
+
| `multi-query` | `withQueryExpander(fn)` | `multiQueryCount` (max variants), `topK`; base is hybrid when `withHybridSearch()` is set, similarity otherwise |
|
|
196
|
+
|
|
155
197
|
### Similarity
|
|
156
198
|
|
|
157
199
|
```typescript
|
|
@@ -169,7 +211,7 @@ const results = await retriever.retrieve('What is TypeScript?');
|
|
|
169
211
|
|
|
170
212
|
### MMR
|
|
171
213
|
|
|
172
|
-
Reduces redundancy by penalizing results that are too similar to already-selected ones.
|
|
214
|
+
Reduces redundancy by penalizing results that are too similar to already-selected ones. If the vector store does not return stored vectors (e.g. Qdrant), candidates are re-embedded to compute diversity.
|
|
173
215
|
|
|
174
216
|
```typescript
|
|
175
217
|
import { MMRRetriever } from '@cogitator-ai/rag';
|
|
@@ -184,7 +226,7 @@ const retriever = new MMRRetriever({
|
|
|
184
226
|
|
|
185
227
|
### Hybrid
|
|
186
228
|
|
|
187
|
-
Requires `HybridSearch` from `@cogitator-ai/memory`.
|
|
229
|
+
Requires `HybridSearch` from `@cogitator-ai/memory`. Chunks ingested through `RAGPipeline` are added to the HybridSearch BM25 index automatically (any retriever implementing `ChunkIndexer.indexChunk()` is notified on ingest), and keyword-only hits are mapped back to their chunk, document and metadata.
|
|
188
230
|
|
|
189
231
|
```typescript
|
|
190
232
|
import { HybridRetriever } from '@cogitator-ai/rag';
|
|
@@ -198,7 +240,7 @@ const retriever = new HybridRetriever({
|
|
|
198
240
|
|
|
199
241
|
### Multi-Query
|
|
200
242
|
|
|
201
|
-
Generates query variations and merges results. You provide the expansion function (typically an LLM call).
|
|
243
|
+
Generates query variations and merges results (best score per chunk). You provide the expansion function (typically an LLM call). The original query is always searched; variants are de-duplicated and capped by `defaultMaxQueries` / `multiQueryCount`. If expansion fails the original query is used alone; if every retrieval fails the error is thrown.
|
|
202
244
|
|
|
203
245
|
```typescript
|
|
204
246
|
import { MultiQueryRetriever } from '@cogitator-ai/rag';
|
|
@@ -211,6 +253,7 @@ const retriever = new MultiQueryRetriever({
|
|
|
211
253
|
);
|
|
212
254
|
return response.split('\n').filter(Boolean);
|
|
213
255
|
},
|
|
256
|
+
defaultMaxQueries: 3,
|
|
214
257
|
});
|
|
215
258
|
```
|
|
216
259
|
|
|
@@ -279,9 +322,8 @@ Use `ragTools()` to give a Cogitator agent access to your knowledge base.
|
|
|
279
322
|
|
|
280
323
|
```typescript
|
|
281
324
|
import { Agent, tool } from '@cogitator-ai/core';
|
|
282
|
-
import { RAGPipelineBuilder, TextLoader,
|
|
325
|
+
import { RAGPipelineBuilder, TextLoader, ragTools } from '@cogitator-ai/rag';
|
|
283
326
|
import { InMemoryEmbeddingAdapter, OpenAIEmbeddingService } from '@cogitator-ai/memory';
|
|
284
|
-
import { z } from 'zod';
|
|
285
327
|
|
|
286
328
|
const pipeline = new RAGPipelineBuilder()
|
|
287
329
|
.withLoader(new TextLoader())
|
|
@@ -295,27 +337,20 @@ const pipeline = new RAGPipelineBuilder()
|
|
|
295
337
|
|
|
296
338
|
await pipeline.ingest('./knowledge-base');
|
|
297
339
|
|
|
298
|
-
const ragSearch =
|
|
299
|
-
|
|
300
|
-
const searchKB = tool({
|
|
301
|
-
name: ragSearch.name,
|
|
302
|
-
description: ragSearch.description,
|
|
303
|
-
parameters: z.object({
|
|
304
|
-
query: z.string().describe('Search query'),
|
|
305
|
-
limit: z.number().int().positive().optional(),
|
|
306
|
-
threshold: z.number().min(0).max(1).optional(),
|
|
307
|
-
}),
|
|
308
|
-
execute: async (params) => ragSearch.execute(params),
|
|
309
|
-
});
|
|
340
|
+
const [ragSearch, ragIngest] = ragTools(pipeline, { allowedRoots: ['./knowledge-base'] });
|
|
310
341
|
|
|
311
342
|
const agent = new Agent({
|
|
312
343
|
name: 'docs-assistant',
|
|
313
|
-
model: 'gpt-4o',
|
|
344
|
+
model: 'openai/gpt-4o',
|
|
314
345
|
instructions: 'Use rag_search to find information before answering.',
|
|
315
|
-
tools: [
|
|
346
|
+
tools: [tool(ragSearch), tool(ragIngest)],
|
|
316
347
|
});
|
|
317
348
|
```
|
|
318
349
|
|
|
350
|
+
`RAGTool` objects carry Zod parameter schemas and can be passed to `tool()` directly. `rag_search` falls back to the pipeline's configured `topK`/`threshold` when the model omits `limit`/`threshold`.
|
|
351
|
+
|
|
352
|
+
**Security:** `rag_ingest` reads whatever source the model passes. When the tool is exposed to an LLM, restrict it with `allowedRoots` (paths are canonicalized, so `..` traversal and symlink escapes are rejected) and `allowUrls: false` if web ingestion is not needed. URL ingestion goes through the SSRF-protected `WebLoader` when the pipeline uses one.
|
|
353
|
+
|
|
319
354
|
---
|
|
320
355
|
|
|
321
356
|
## Pipeline Stats
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-chunker.js","sourceRoot":"","sources":["../../src/chunkers/create-chunker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"create-chunker.js","sourceRoot":"","sources":["../../src/chunkers/create-chunker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,UAAU,aAAa,CAC3B,MAAsB,EACtB,gBAAmC;IAEnC,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,IAAI,gBAAgB,CAAC;gBAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;aAClC,CAAC,CAAC;QAEL,KAAK,WAAW;YACd,OAAO,IAAI,gBAAgB,CAAC;gBAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;QAEL,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,IAAI,eAAe,CAAC;gBACzB,gBAAgB;gBAChB,YAAY,EAAE,MAAM,CAAC,SAAS;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC,QAAQ,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chunkers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chunkers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chunkers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAgC,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chunkers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAgC,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAgC,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,eAAe,EAA+B,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -10,9 +10,8 @@ export declare class RecursiveChunker implements Chunker {
|
|
|
10
10
|
private readonly separators;
|
|
11
11
|
constructor(options: RecursiveChunkerOptions);
|
|
12
12
|
chunk(text: string, documentId: string): DocumentChunk[];
|
|
13
|
-
private
|
|
13
|
+
private mergePieces;
|
|
14
|
+
private splitSpan;
|
|
14
15
|
private charSplit;
|
|
15
|
-
private mergeWithOverlap;
|
|
16
|
-
private mergeWithOverlapSimple;
|
|
17
16
|
}
|
|
18
17
|
//# sourceMappingURL=recursive-chunker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recursive-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/recursive-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIlE,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;gBAE1B,OAAO,EAAE,uBAAuB;IAe5C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE;IAOxD,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"recursive-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/recursive-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIlE,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;gBAE1B,OAAO,EAAE,uBAAuB;IAe5C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE;IAOxD,OAAO,CAAC,WAAW;IAwCnB,OAAO,CAAC,SAAS;IAyDjB,OAAO,CAAC,SAAS;CAOlB"}
|
|
@@ -21,141 +21,112 @@ export class RecursiveChunker {
|
|
|
21
21
|
chunk(text, documentId) {
|
|
22
22
|
if (text.length === 0)
|
|
23
23
|
return [];
|
|
24
|
-
const
|
|
25
|
-
return this.
|
|
24
|
+
const pieces = this.splitSpan(text, { start: 0, end: text.length }, 0);
|
|
25
|
+
return this.mergePieces(pieces, text, documentId);
|
|
26
26
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
mergePieces(pieces, text, documentId) {
|
|
28
|
+
const chunks = [];
|
|
29
|
+
let i = 0;
|
|
30
|
+
while (i < pieces.length) {
|
|
31
|
+
const chunkStart = pieces[i].start;
|
|
32
|
+
let j = i + 1;
|
|
33
|
+
while (j < pieces.length && pieces[j].end - chunkStart <= this.chunkSize) {
|
|
34
|
+
j++;
|
|
35
|
+
}
|
|
36
|
+
const chunkEnd = pieces[j - 1].end;
|
|
37
|
+
chunks.push({
|
|
38
|
+
id: nanoid(),
|
|
39
|
+
documentId,
|
|
40
|
+
content: text.slice(chunkStart, chunkEnd),
|
|
41
|
+
startOffset: chunkStart,
|
|
42
|
+
endOffset: chunkEnd,
|
|
43
|
+
order: chunks.length,
|
|
44
|
+
});
|
|
45
|
+
if (j >= pieces.length)
|
|
46
|
+
break;
|
|
47
|
+
let next = j;
|
|
48
|
+
if (this.chunkOverlap > 0) {
|
|
49
|
+
const overlapTarget = chunkEnd - this.chunkOverlap;
|
|
50
|
+
while (next > i + 1 && pieces[next - 1].start >= overlapTarget) {
|
|
51
|
+
next--;
|
|
52
|
+
}
|
|
53
|
+
while (next < j && pieces[j].end - pieces[next].start > this.chunkSize) {
|
|
54
|
+
next++;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
i = next;
|
|
32
58
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
59
|
+
return chunks;
|
|
60
|
+
}
|
|
61
|
+
splitSpan(text, span, separatorIndex) {
|
|
62
|
+
const trimmed = trimSpan(text, span);
|
|
63
|
+
if (!trimmed)
|
|
64
|
+
return [];
|
|
65
|
+
if (trimmed.end - trimmed.start <= this.chunkSize)
|
|
66
|
+
return [trimmed];
|
|
67
|
+
let index = separatorIndex;
|
|
68
|
+
while (index < this.separators.length) {
|
|
69
|
+
const separator = this.separators[index];
|
|
70
|
+
if (separator === '')
|
|
71
|
+
break;
|
|
72
|
+
if (text.slice(trimmed.start, trimmed.end).includes(separator))
|
|
73
|
+
break;
|
|
74
|
+
index++;
|
|
36
75
|
}
|
|
37
|
-
const
|
|
38
|
-
if (
|
|
39
|
-
return this.
|
|
76
|
+
const separator = this.separators[index];
|
|
77
|
+
if (separator === undefined || separator === '') {
|
|
78
|
+
return this.charSplit(trimmed);
|
|
79
|
+
}
|
|
80
|
+
const kept = /^\S*/.exec(separator)[0].length;
|
|
81
|
+
const segments = [];
|
|
82
|
+
let cursor = trimmed.start;
|
|
83
|
+
for (;;) {
|
|
84
|
+
const at = text.indexOf(separator, cursor);
|
|
85
|
+
if (at === -1 || at >= trimmed.end) {
|
|
86
|
+
segments.push({ start: cursor, end: trimmed.end });
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
segments.push({ start: cursor, end: Math.min(at + kept, trimmed.end) });
|
|
90
|
+
cursor = at + separator.length;
|
|
40
91
|
}
|
|
41
92
|
const merged = [];
|
|
42
|
-
let current =
|
|
43
|
-
for (const
|
|
44
|
-
|
|
93
|
+
let current = null;
|
|
94
|
+
for (const raw of segments) {
|
|
95
|
+
const segment = trimSpan(text, raw);
|
|
96
|
+
if (!segment)
|
|
45
97
|
continue;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
98
|
+
if (current && segment.end - current.start <= this.chunkSize) {
|
|
99
|
+
current = { start: current.start, end: segment.end };
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (current)
|
|
103
|
+
merged.push(current);
|
|
104
|
+
if (segment.end - segment.start > this.chunkSize) {
|
|
105
|
+
merged.push(...this.splitSpan(text, segment, index + 1));
|
|
106
|
+
current = null;
|
|
49
107
|
}
|
|
50
108
|
else {
|
|
51
|
-
|
|
52
|
-
merged.push(current);
|
|
53
|
-
if (part.length > this.chunkSize) {
|
|
54
|
-
const subParts = this.splitText(part, separatorIndex + 1);
|
|
55
|
-
merged.push(...subParts);
|
|
56
|
-
current = '';
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
current = part;
|
|
60
|
-
}
|
|
109
|
+
current = segment;
|
|
61
110
|
}
|
|
62
111
|
}
|
|
63
112
|
if (current)
|
|
64
113
|
merged.push(current);
|
|
65
114
|
return merged;
|
|
66
115
|
}
|
|
67
|
-
charSplit(
|
|
116
|
+
charSplit(span) {
|
|
68
117
|
const result = [];
|
|
69
|
-
for (let
|
|
70
|
-
result.push(
|
|
118
|
+
for (let start = span.start; start < span.end; start += this.chunkSize) {
|
|
119
|
+
result.push({ start, end: Math.min(start + this.chunkSize, span.end) });
|
|
71
120
|
}
|
|
72
121
|
return result;
|
|
73
122
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
startOffset: offset,
|
|
83
|
-
endOffset: offset + content.length,
|
|
84
|
-
order: i,
|
|
85
|
-
};
|
|
86
|
-
offset += content.length;
|
|
87
|
-
return chunk;
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
const joined = texts.join('');
|
|
91
|
-
const chunks = [];
|
|
92
|
-
let order = 0;
|
|
93
|
-
let textIndex = 0;
|
|
94
|
-
let i = 0;
|
|
95
|
-
while (i < texts.length) {
|
|
96
|
-
let content = texts[i];
|
|
97
|
-
let consumed = 1;
|
|
98
|
-
while (i + consumed < texts.length) {
|
|
99
|
-
const next = content + texts[i + consumed];
|
|
100
|
-
if (next.length <= this.chunkSize) {
|
|
101
|
-
content = next;
|
|
102
|
-
consumed++;
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
const startOffset = joined.indexOf(content, textIndex > 0 ? Math.max(0, textIndex - this.chunkOverlap) : 0);
|
|
109
|
-
chunks.push({
|
|
110
|
-
id: nanoid(),
|
|
111
|
-
documentId,
|
|
112
|
-
content,
|
|
113
|
-
startOffset: startOffset >= 0 ? startOffset : textIndex,
|
|
114
|
-
endOffset: (startOffset >= 0 ? startOffset : textIndex) + content.length,
|
|
115
|
-
order: order++,
|
|
116
|
-
});
|
|
117
|
-
textIndex += content.length;
|
|
118
|
-
const overlapChars = Math.min(this.chunkOverlap, content.length);
|
|
119
|
-
const overlapText = content.slice(content.length - overlapChars);
|
|
120
|
-
i += consumed;
|
|
121
|
-
if (i < texts.length) {
|
|
122
|
-
const remaining = texts.slice(i);
|
|
123
|
-
const withOverlap = overlapText + remaining.join('');
|
|
124
|
-
if (withOverlap.length <= this.chunkSize) {
|
|
125
|
-
chunks.push({
|
|
126
|
-
id: nanoid(),
|
|
127
|
-
documentId,
|
|
128
|
-
content: withOverlap,
|
|
129
|
-
startOffset: textIndex - overlapChars,
|
|
130
|
-
endOffset: textIndex - overlapChars + withOverlap.length,
|
|
131
|
-
order: order++,
|
|
132
|
-
});
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
const reSplit = this.splitText(withOverlap, 0);
|
|
136
|
-
const subChunks = this.mergeWithOverlapSimple(reSplit, documentId, textIndex - overlapChars, order);
|
|
137
|
-
chunks.push(...subChunks);
|
|
138
|
-
break;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return chunks;
|
|
142
|
-
}
|
|
143
|
-
mergeWithOverlapSimple(texts, documentId, baseOffset, startOrder) {
|
|
144
|
-
const chunks = [];
|
|
145
|
-
let offset = baseOffset;
|
|
146
|
-
let order = startOrder;
|
|
147
|
-
for (const content of texts) {
|
|
148
|
-
chunks.push({
|
|
149
|
-
id: nanoid(),
|
|
150
|
-
documentId,
|
|
151
|
-
content,
|
|
152
|
-
startOffset: offset,
|
|
153
|
-
endOffset: offset + content.length,
|
|
154
|
-
order: order++,
|
|
155
|
-
});
|
|
156
|
-
offset += content.length;
|
|
157
|
-
}
|
|
158
|
-
return chunks;
|
|
159
|
-
}
|
|
123
|
+
}
|
|
124
|
+
function trimSpan(text, span) {
|
|
125
|
+
let { start, end } = span;
|
|
126
|
+
while (start < end && /\s/.test(text[start]))
|
|
127
|
+
start++;
|
|
128
|
+
while (end > start && /\s/.test(text[end - 1]))
|
|
129
|
+
end--;
|
|
130
|
+
return start < end ? { start, end } : null;
|
|
160
131
|
}
|
|
161
132
|
//# sourceMappingURL=recursive-chunker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recursive-chunker.js","sourceRoot":"","sources":["../../src/chunkers/recursive-chunker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;AAQzD,MAAM,OAAO,gBAAgB;IACV,SAAS,CAAS;IAClB,YAAY,CAAS;IACrB,UAAU,CAAW;IAEtC,YAAY,OAAgC;QAC1C,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,UAAkB;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEjC,MAAM,
|
|
1
|
+
{"version":3,"file":"recursive-chunker.js","sourceRoot":"","sources":["../../src/chunkers/recursive-chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,9 @@ export declare class SemanticChunker implements AsyncChunker {
|
|
|
13
13
|
constructor(options: SemanticChunkerOptions);
|
|
14
14
|
chunk(text: string, documentId: string): Promise<DocumentChunk[]>;
|
|
15
15
|
private mergeSmallGroups;
|
|
16
|
+
private findSentenceOffset;
|
|
16
17
|
private buildChunks;
|
|
17
18
|
private splitLargeGroup;
|
|
19
|
+
private emitSentenceGroup;
|
|
18
20
|
}
|
|
19
21
|
//# sourceMappingURL=semantic-chunker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/semantic-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEzF,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"semantic-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/semantic-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEzF,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA8BD,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,EAAE,sBAAsB;IAqBrC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAuCvE,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,WAAW;IA4CnB,OAAO,CAAC,eAAe;IA2EvB,OAAO,CAAC,iBAAiB;CAqB1B"}
|