@nahisaho/katashiro-rag 2.0.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.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/dist/RAGEngine.d.ts +58 -0
  3. package/dist/RAGEngine.d.ts.map +1 -0
  4. package/dist/RAGEngine.js +97 -0
  5. package/dist/RAGEngine.js.map +1 -0
  6. package/dist/RAGPipeline.d.ts +162 -0
  7. package/dist/RAGPipeline.d.ts.map +1 -0
  8. package/dist/RAGPipeline.js +222 -0
  9. package/dist/RAGPipeline.js.map +1 -0
  10. package/dist/Retriever.d.ts +49 -0
  11. package/dist/Retriever.d.ts.map +1 -0
  12. package/dist/Retriever.js +96 -0
  13. package/dist/Retriever.js.map +1 -0
  14. package/dist/chunking/DocumentChunker.d.ts +47 -0
  15. package/dist/chunking/DocumentChunker.d.ts.map +1 -0
  16. package/dist/chunking/DocumentChunker.js +171 -0
  17. package/dist/chunking/DocumentChunker.js.map +1 -0
  18. package/dist/chunking/index.d.ts +5 -0
  19. package/dist/chunking/index.d.ts.map +1 -0
  20. package/dist/chunking/index.js +5 -0
  21. package/dist/chunking/index.js.map +1 -0
  22. package/dist/embedding/AzureOpenAIEmbeddingProvider.d.ts +63 -0
  23. package/dist/embedding/AzureOpenAIEmbeddingProvider.d.ts.map +1 -0
  24. package/dist/embedding/AzureOpenAIEmbeddingProvider.js +133 -0
  25. package/dist/embedding/AzureOpenAIEmbeddingProvider.js.map +1 -0
  26. package/dist/embedding/BaseEmbeddingProvider.d.ts +43 -0
  27. package/dist/embedding/BaseEmbeddingProvider.d.ts.map +1 -0
  28. package/dist/embedding/BaseEmbeddingProvider.js +98 -0
  29. package/dist/embedding/BaseEmbeddingProvider.js.map +1 -0
  30. package/dist/embedding/EmbeddingFactory.d.ts +75 -0
  31. package/dist/embedding/EmbeddingFactory.d.ts.map +1 -0
  32. package/dist/embedding/EmbeddingFactory.js +153 -0
  33. package/dist/embedding/EmbeddingFactory.js.map +1 -0
  34. package/dist/embedding/EmbeddingManager.d.ts +41 -0
  35. package/dist/embedding/EmbeddingManager.d.ts.map +1 -0
  36. package/dist/embedding/EmbeddingManager.js +93 -0
  37. package/dist/embedding/EmbeddingManager.js.map +1 -0
  38. package/dist/embedding/MockEmbeddingProvider.d.ts +54 -0
  39. package/dist/embedding/MockEmbeddingProvider.d.ts.map +1 -0
  40. package/dist/embedding/MockEmbeddingProvider.js +91 -0
  41. package/dist/embedding/MockEmbeddingProvider.js.map +1 -0
  42. package/dist/embedding/OllamaEmbeddingProvider.d.ts +69 -0
  43. package/dist/embedding/OllamaEmbeddingProvider.d.ts.map +1 -0
  44. package/dist/embedding/OllamaEmbeddingProvider.js +136 -0
  45. package/dist/embedding/OllamaEmbeddingProvider.js.map +1 -0
  46. package/dist/embedding/OpenAIEmbeddingProvider.d.ts +83 -0
  47. package/dist/embedding/OpenAIEmbeddingProvider.d.ts.map +1 -0
  48. package/dist/embedding/OpenAIEmbeddingProvider.js +150 -0
  49. package/dist/embedding/OpenAIEmbeddingProvider.js.map +1 -0
  50. package/dist/embedding/index.d.ts +16 -0
  51. package/dist/embedding/index.d.ts.map +1 -0
  52. package/dist/embedding/index.js +15 -0
  53. package/dist/embedding/index.js.map +1 -0
  54. package/dist/index.d.ts +20 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +22 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/reranking/LLMReranker.d.ts +147 -0
  59. package/dist/reranking/LLMReranker.d.ts.map +1 -0
  60. package/dist/reranking/LLMReranker.js +262 -0
  61. package/dist/reranking/LLMReranker.js.map +1 -0
  62. package/dist/reranking/index.d.ts +7 -0
  63. package/dist/reranking/index.d.ts.map +1 -0
  64. package/dist/reranking/index.js +7 -0
  65. package/dist/reranking/index.js.map +1 -0
  66. package/dist/types.d.ts +144 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +8 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/vectordb/FileVectorStore.d.ts +93 -0
  71. package/dist/vectordb/FileVectorStore.d.ts.map +1 -0
  72. package/dist/vectordb/FileVectorStore.js +218 -0
  73. package/dist/vectordb/FileVectorStore.js.map +1 -0
  74. package/dist/vectordb/InMemoryVectorStore.d.ts +48 -0
  75. package/dist/vectordb/InMemoryVectorStore.d.ts.map +1 -0
  76. package/dist/vectordb/InMemoryVectorStore.js +86 -0
  77. package/dist/vectordb/InMemoryVectorStore.js.map +1 -0
  78. package/dist/vectordb/index.d.ts +8 -0
  79. package/dist/vectordb/index.d.ts.map +1 -0
  80. package/dist/vectordb/index.js +6 -0
  81. package/dist/vectordb/index.js.map +1 -0
  82. package/package.json +37 -0
  83. package/src/RAGEngine.ts +127 -0
  84. package/src/RAGPipeline.ts +357 -0
  85. package/src/Retriever.ts +121 -0
  86. package/src/chunking/DocumentChunker.ts +207 -0
  87. package/src/chunking/index.ts +5 -0
  88. package/src/embedding/AzureOpenAIEmbeddingProvider.ts +208 -0
  89. package/src/embedding/BaseEmbeddingProvider.ts +133 -0
  90. package/src/embedding/EmbeddingFactory.ts +225 -0
  91. package/src/embedding/EmbeddingManager.ts +110 -0
  92. package/src/embedding/MockEmbeddingProvider.ts +123 -0
  93. package/src/embedding/OllamaEmbeddingProvider.ts +197 -0
  94. package/src/embedding/OpenAIEmbeddingProvider.ts +226 -0
  95. package/src/embedding/index.ts +33 -0
  96. package/src/index.ts +55 -0
  97. package/src/reranking/LLMReranker.ts +401 -0
  98. package/src/reranking/index.ts +15 -0
  99. package/src/types.ts +157 -0
  100. package/src/vectordb/FileVectorStore.ts +289 -0
  101. package/src/vectordb/InMemoryVectorStore.ts +121 -0
  102. package/src/vectordb/index.ts +9 -0
@@ -0,0 +1,401 @@
1
+ /**
2
+ * LLM Reranker
3
+ *
4
+ * LLMを使用して検索結果をリランキングするモジュール
5
+ *
6
+ * @requirement REQ-RAG-103
7
+ */
8
+
9
+ import {
10
+ getDefaultLLMProvider,
11
+ type LLMProvider,
12
+ type GenerateRequest,
13
+ } from '@nahisaho/katashiro-llm';
14
+ import type { RetrievalResult } from '../types.js';
15
+
16
+ /**
17
+ * リランキング設定
18
+ */
19
+ export interface LLMRerankerConfig {
20
+ /** LLMプロバイダー名 */
21
+ provider?: string;
22
+ /** モデル名 */
23
+ model?: string;
24
+ /** 上位K件を返す */
25
+ topK?: number;
26
+ /** スコアしきい値 */
27
+ scoreThreshold?: number;
28
+ /** バッチサイズ */
29
+ batchSize?: number;
30
+ /** 詳細スコアを含める */
31
+ includeDetails?: boolean;
32
+ /** キャッシュを使用 */
33
+ useCache?: boolean;
34
+ /** カスタムプロンプトテンプレート */
35
+ promptTemplate?: string;
36
+ /** 並列実行数 */
37
+ concurrency?: number;
38
+ }
39
+
40
+ /**
41
+ * リランキング結果
42
+ */
43
+ export interface RerankedResult extends RetrievalResult {
44
+ /** リランクスコア (0-1) */
45
+ rerankedScore: number;
46
+ /** 元のスコア */
47
+ originalScore: number;
48
+ /** 元の順位 */
49
+ originalRank: number;
50
+ /** 詳細情報 */
51
+ details?: {
52
+ reasoning?: string;
53
+ relevanceFactors?: string[];
54
+ confidence?: number;
55
+ };
56
+ }
57
+
58
+ /**
59
+ * リランキングレスポンス
60
+ */
61
+ export interface RerankerResponse {
62
+ /** リランクされた結果 */
63
+ results: RerankedResult[];
64
+ /** 処理時間(ミリ秒) */
65
+ durationMs: number;
66
+ /** トークン使用量 */
67
+ tokensUsed?: {
68
+ prompt: number;
69
+ completion: number;
70
+ total: number;
71
+ };
72
+ /** メタデータ */
73
+ metadata?: Record<string, unknown>;
74
+ }
75
+
76
+ /**
77
+ * デフォルト設定
78
+ */
79
+ export const DEFAULT_RERANKER_CONFIG: Required<
80
+ Omit<LLMRerankerConfig, 'promptTemplate'>
81
+ > & { promptTemplate?: string } = {
82
+ provider: 'openai',
83
+ model: 'gpt-4o-mini',
84
+ topK: 5,
85
+ scoreThreshold: 0.3,
86
+ batchSize: 10,
87
+ includeDetails: false,
88
+ useCache: true,
89
+ concurrency: 3,
90
+ promptTemplate: undefined,
91
+ };
92
+
93
+ /**
94
+ * デフォルトプロンプトテンプレート
95
+ */
96
+ export const DEFAULT_RERANKER_PROMPT = `You are a relevance scoring assistant. Given a query and a document, rate how relevant the document is to answering the query.
97
+
98
+ Query: {query}
99
+
100
+ Document:
101
+ {document}
102
+
103
+ Rate the relevance on a scale of 0-10, where:
104
+ - 0: Completely irrelevant
105
+ - 5: Somewhat relevant
106
+ - 10: Highly relevant and directly answers the query
107
+
108
+ Respond with ONLY a JSON object in this format:
109
+ {
110
+ "score": <number between 0 and 10>,
111
+ "reasoning": "<brief explanation>",
112
+ "relevanceFactors": ["factor1", "factor2"],
113
+ "confidence": <number between 0 and 1>
114
+ }`;
115
+
116
+ /**
117
+ * スコアレスポンス型
118
+ */
119
+ interface ScoreResponse {
120
+ score: number;
121
+ reasoning?: string;
122
+ relevanceFactors?: string[];
123
+ confidence?: number;
124
+ }
125
+
126
+ /**
127
+ * LLMリランカー
128
+ */
129
+ export class LLMReranker {
130
+ private config: Required<Omit<LLMRerankerConfig, 'promptTemplate'>> & {
131
+ promptTemplate?: string;
132
+ };
133
+ private provider: LLMProvider | null = null;
134
+ private cache: Map<string, ScoreResponse> = new Map();
135
+
136
+ constructor(config: LLMRerankerConfig = {}) {
137
+ this.config = { ...DEFAULT_RERANKER_CONFIG, ...config };
138
+ }
139
+
140
+ /**
141
+ * 検索結果をリランキング
142
+ */
143
+ async rerank(
144
+ query: string,
145
+ results: RetrievalResult[],
146
+ ): Promise<RerankerResponse> {
147
+ const startTime = Date.now();
148
+ let totalTokens = { prompt: 0, completion: 0, total: 0 };
149
+
150
+ if (results.length === 0) {
151
+ return {
152
+ results: [],
153
+ durationMs: Date.now() - startTime,
154
+ };
155
+ }
156
+
157
+ // プロバイダーの初期化
158
+ await this.initializeProvider();
159
+
160
+ // バッチ処理
161
+ const scoredResults: RerankedResult[] = [];
162
+ const batches = this.createBatches(results, this.config.batchSize);
163
+
164
+ for (const batch of batches) {
165
+ const batchResults = await this.processBatch(query, batch);
166
+ scoredResults.push(...batchResults.results);
167
+
168
+ if (batchResults.tokensUsed) {
169
+ totalTokens.prompt += batchResults.tokensUsed.prompt;
170
+ totalTokens.completion += batchResults.tokensUsed.completion;
171
+ totalTokens.total += batchResults.tokensUsed.total;
172
+ }
173
+ }
174
+
175
+ // スコアでソートしてtopK件を返す
176
+ const sortedResults = scoredResults
177
+ .sort((a, b) => b.rerankedScore - a.rerankedScore)
178
+ .filter((r) => r.rerankedScore >= this.config.scoreThreshold)
179
+ .slice(0, this.config.topK);
180
+
181
+ return {
182
+ results: sortedResults,
183
+ durationMs: Date.now() - startTime,
184
+ tokensUsed: totalTokens.total > 0 ? totalTokens : undefined,
185
+ };
186
+ }
187
+
188
+ /**
189
+ * 単一ドキュメントをスコアリング
190
+ */
191
+ async scoreDocument(
192
+ query: string,
193
+ document: string,
194
+ ): Promise<ScoreResponse> {
195
+ // キャッシュ確認
196
+ const cacheKey = this.getCacheKey(query, document);
197
+ if (this.config.useCache) {
198
+ const cached = this.cache.get(cacheKey);
199
+ if (cached) return cached;
200
+ }
201
+
202
+ await this.initializeProvider();
203
+
204
+ const prompt = this.formatPrompt(query, document);
205
+
206
+ try {
207
+ const request: GenerateRequest = {
208
+ model: this.config.model,
209
+ messages: [{ role: 'user', content: prompt }],
210
+ temperature: 0,
211
+ maxTokens: 200,
212
+ };
213
+
214
+ const response = await this.provider!.generate(request);
215
+
216
+ const result = this.parseScoreResponse(response.content);
217
+
218
+ // キャッシュに保存
219
+ if (this.config.useCache) {
220
+ this.cache.set(cacheKey, result);
221
+ }
222
+
223
+ return result;
224
+ } catch (error) {
225
+ // エラー時はデフォルトスコアを返す
226
+ return {
227
+ score: 0,
228
+ reasoning: `Error scoring document: ${error instanceof Error ? error.message : 'Unknown error'}`,
229
+ confidence: 0,
230
+ };
231
+ }
232
+ }
233
+
234
+ /**
235
+ * バッチ処理
236
+ */
237
+ private async processBatch(
238
+ query: string,
239
+ batch: Array<{ result: RetrievalResult; originalRank: number }>,
240
+ ): Promise<{
241
+ results: RerankedResult[];
242
+ tokensUsed?: { prompt: number; completion: number; total: number };
243
+ }> {
244
+ const results: RerankedResult[] = [];
245
+ let tokensUsed = { prompt: 0, completion: 0, total: 0 };
246
+
247
+ // 並列処理
248
+ const chunks = this.createChunks(batch, this.config.concurrency);
249
+
250
+ for (const chunk of chunks) {
251
+ const promises = chunk.map(async ({ result, originalRank }) => {
252
+ const scoreResult = await this.scoreDocument(query, result.content);
253
+ const normalizedScore = scoreResult.score / 10;
254
+
255
+ const rerankedResult: RerankedResult = {
256
+ ...result,
257
+ rerankedScore: normalizedScore,
258
+ originalScore: result.score,
259
+ originalRank,
260
+ };
261
+
262
+ if (this.config.includeDetails) {
263
+ rerankedResult.details = {
264
+ reasoning: scoreResult.reasoning,
265
+ relevanceFactors: scoreResult.relevanceFactors,
266
+ confidence: scoreResult.confidence,
267
+ };
268
+ }
269
+
270
+ return rerankedResult;
271
+ });
272
+
273
+ const chunkResults = await Promise.all(promises);
274
+ results.push(...chunkResults);
275
+ }
276
+
277
+ return { results, tokensUsed };
278
+ }
279
+
280
+ /**
281
+ * プロンプトをフォーマット
282
+ */
283
+ private formatPrompt(query: string, document: string): string {
284
+ const template = this.config.promptTemplate ?? DEFAULT_RERANKER_PROMPT;
285
+ return template
286
+ .replace('{query}', query)
287
+ .replace('{document}', document.slice(0, 2000)); // 2000文字に制限
288
+ }
289
+
290
+ /**
291
+ * スコアレスポンスをパース
292
+ */
293
+ private parseScoreResponse(content: string): ScoreResponse {
294
+ try {
295
+ // JSON部分を抽出
296
+ const jsonMatch = content.match(/\{[\s\S]*\}/);
297
+ if (!jsonMatch) {
298
+ throw new Error('No JSON found in response');
299
+ }
300
+
301
+ const parsed = JSON.parse(jsonMatch[0]) as ScoreResponse;
302
+
303
+ // スコアの正規化 (0-10の範囲に収める)
304
+ const score = Math.max(0, Math.min(10, Number(parsed.score) || 0));
305
+
306
+ return {
307
+ score,
308
+ reasoning: parsed.reasoning,
309
+ relevanceFactors: parsed.relevanceFactors,
310
+ confidence: parsed.confidence,
311
+ };
312
+ } catch {
313
+ // パース失敗時は数値のみ抽出を試みる
314
+ const numMatch = content.match(/\d+(\.\d+)?/);
315
+ const score = numMatch ? Math.min(10, Number(numMatch[0])) : 0;
316
+
317
+ return { score, confidence: 0.3 };
318
+ }
319
+ }
320
+
321
+ /**
322
+ * プロバイダー初期化
323
+ */
324
+ private async initializeProvider(): Promise<void> {
325
+ if (this.provider) return;
326
+
327
+ this.provider = getDefaultLLMProvider();
328
+ }
329
+
330
+ /**
331
+ * バッチ作成
332
+ */
333
+ private createBatches<T>(
334
+ items: T[],
335
+ batchSize: number,
336
+ ): Array<{ result: T; originalRank: number }[]> {
337
+ const batches: Array<{ result: T; originalRank: number }[]> = [];
338
+
339
+ for (let i = 0; i < items.length; i += batchSize) {
340
+ const batch = items.slice(i, i + batchSize).map((result, idx) => ({
341
+ result,
342
+ originalRank: i + idx + 1,
343
+ }));
344
+ batches.push(batch);
345
+ }
346
+
347
+ return batches;
348
+ }
349
+
350
+ /**
351
+ * 並列処理用チャンク作成
352
+ */
353
+ private createChunks<T>(items: T[], chunkSize: number): T[][] {
354
+ const chunks: T[][] = [];
355
+ for (let i = 0; i < items.length; i += chunkSize) {
356
+ chunks.push(items.slice(i, i + chunkSize));
357
+ }
358
+ return chunks;
359
+ }
360
+
361
+ /**
362
+ * キャッシュキー生成
363
+ */
364
+ private getCacheKey(query: string, document: string): string {
365
+ return `${query.slice(0, 100)}::${document.slice(0, 100)}`;
366
+ }
367
+
368
+ /**
369
+ * キャッシュクリア
370
+ */
371
+ clearCache(): void {
372
+ this.cache.clear();
373
+ }
374
+
375
+ /**
376
+ * キャッシュサイズ取得
377
+ */
378
+ getCacheSize(): number {
379
+ return this.cache.size;
380
+ }
381
+
382
+ /**
383
+ * 設定取得
384
+ */
385
+ getConfig(): typeof this.config {
386
+ return { ...this.config };
387
+ }
388
+ }
389
+
390
+ /**
391
+ * シンプルなリランキングヘルパー
392
+ */
393
+ export async function rerankResults(
394
+ query: string,
395
+ results: RetrievalResult[],
396
+ config?: LLMRerankerConfig,
397
+ ): Promise<RerankedResult[]> {
398
+ const reranker = new LLMReranker(config);
399
+ const response = await reranker.rerank(query, results);
400
+ return response.results;
401
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Reranking Module
3
+ *
4
+ * 検索結果のリランキング機能
5
+ */
6
+
7
+ export {
8
+ LLMReranker,
9
+ rerankResults,
10
+ DEFAULT_RERANKER_CONFIG,
11
+ DEFAULT_RERANKER_PROMPT,
12
+ type LLMRerankerConfig,
13
+ type RerankedResult,
14
+ type RerankerResponse,
15
+ } from './LLMReranker.js';
package/src/types.ts ADDED
@@ -0,0 +1,157 @@
1
+ /**
2
+ * RAG Package Types
3
+ *
4
+ * @requirement REQ-RAG-001〜006
5
+ * @design DES-KATASHIRO-003-RAG
6
+ */
7
+
8
+ /**
9
+ * ベクトル(埋め込み)
10
+ */
11
+ export type Vector = number[];
12
+
13
+ /**
14
+ * ドキュメント
15
+ */
16
+ export interface Document {
17
+ /** ドキュメントID */
18
+ id: string;
19
+ /** コンテンツ */
20
+ content: string;
21
+ /** メタデータ */
22
+ metadata?: Record<string, unknown>;
23
+ }
24
+
25
+ /**
26
+ * チャンク
27
+ */
28
+ export interface Chunk {
29
+ /** チャンクID */
30
+ id: string;
31
+ /** 元ドキュメントID */
32
+ documentId: string;
33
+ /** チャンクコンテンツ */
34
+ content: string;
35
+ /** メタデータ */
36
+ metadata: Record<string, unknown>;
37
+ }
38
+
39
+ /**
40
+ * 検索結果
41
+ */
42
+ export interface SearchResult {
43
+ /** チャンク */
44
+ chunk: Chunk;
45
+ /** スコア(類似度) */
46
+ score: number;
47
+ }
48
+
49
+ /**
50
+ * 検索取得結果(リランキング用)
51
+ */
52
+ export interface RetrievalResult {
53
+ /** コンテンツ */
54
+ content: string;
55
+ /** スコア(類似度) */
56
+ score: number;
57
+ /** メタデータ */
58
+ metadata?: Record<string, unknown>;
59
+ /** ソース(元のチャンクIDなど) */
60
+ source?: string;
61
+ }
62
+
63
+ /**
64
+ * Embeddingプロバイダーインターフェース
65
+ */
66
+ export interface EmbeddingProvider {
67
+ /** プロバイダー名 */
68
+ readonly name: string;
69
+ /** ベクトル次元数 */
70
+ readonly dimensions: number;
71
+
72
+ /**
73
+ * 単一テキストの埋め込み生成
74
+ */
75
+ embed(text: string): Promise<Vector>;
76
+
77
+ /**
78
+ * バッチ埋め込み生成
79
+ */
80
+ embedBatch(texts: string[]): Promise<Vector[]>;
81
+ }
82
+
83
+ /**
84
+ * VectorStoreインターフェース
85
+ */
86
+ export interface VectorStore {
87
+ /** ストア名 */
88
+ readonly name: string;
89
+
90
+ /**
91
+ * チャンクとベクトルの追加
92
+ */
93
+ add(chunk: Chunk, vector: Vector): Promise<void>;
94
+
95
+ /**
96
+ * バッチ追加
97
+ */
98
+ addBatch(items: Array<{ chunk: Chunk; vector: Vector }>): Promise<void>;
99
+
100
+ /**
101
+ * 類似検索
102
+ */
103
+ search(queryVector: Vector, topK: number): Promise<SearchResult[]>;
104
+
105
+ /**
106
+ * 削除
107
+ */
108
+ delete(chunkId: string): Promise<boolean>;
109
+ }
110
+
111
+ /**
112
+ * チャンク分割設定
113
+ */
114
+ export interface ChunkingConfig {
115
+ /** 分割戦略 */
116
+ strategy?: 'fixed' | 'sentence' | 'paragraph';
117
+ /** チャンクサイズ(文字数) */
118
+ chunkSize?: number;
119
+ /** オーバーラップサイズ */
120
+ chunkOverlap?: number;
121
+ /** セパレータ */
122
+ separators?: string[];
123
+ }
124
+
125
+ /**
126
+ * Retriever設定
127
+ */
128
+ export interface RetrieverConfig {
129
+ /** デフォルトのtopK */
130
+ topK?: number;
131
+ /** 最小スコア */
132
+ minScore?: number;
133
+ }
134
+
135
+ /**
136
+ * RAGエンジン設定
137
+ */
138
+ export interface RAGEngineConfig {
139
+ /** Chunking設定 */
140
+ chunking?: ChunkingConfig;
141
+ /** Retriever設定 */
142
+ retriever?: RetrieverConfig;
143
+ }
144
+
145
+ /**
146
+ * Embeddingプロバイダー設定
147
+ */
148
+ export interface EmbeddingConfig {
149
+ /** バッチサイズ */
150
+ batchSize?: number;
151
+ /** ベクトル次元数 */
152
+ dimensions?: number;
153
+ /** タイムアウト(ミリ秒) */
154
+ timeout?: number;
155
+ /** 最大リトライ回数 */
156
+ maxRetries?: number;
157
+ }