@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.
- package/LICENSE +21 -0
- package/dist/RAGEngine.d.ts +58 -0
- package/dist/RAGEngine.d.ts.map +1 -0
- package/dist/RAGEngine.js +97 -0
- package/dist/RAGEngine.js.map +1 -0
- package/dist/RAGPipeline.d.ts +162 -0
- package/dist/RAGPipeline.d.ts.map +1 -0
- package/dist/RAGPipeline.js +222 -0
- package/dist/RAGPipeline.js.map +1 -0
- package/dist/Retriever.d.ts +49 -0
- package/dist/Retriever.d.ts.map +1 -0
- package/dist/Retriever.js +96 -0
- package/dist/Retriever.js.map +1 -0
- package/dist/chunking/DocumentChunker.d.ts +47 -0
- package/dist/chunking/DocumentChunker.d.ts.map +1 -0
- package/dist/chunking/DocumentChunker.js +171 -0
- package/dist/chunking/DocumentChunker.js.map +1 -0
- package/dist/chunking/index.d.ts +5 -0
- package/dist/chunking/index.d.ts.map +1 -0
- package/dist/chunking/index.js +5 -0
- package/dist/chunking/index.js.map +1 -0
- package/dist/embedding/AzureOpenAIEmbeddingProvider.d.ts +63 -0
- package/dist/embedding/AzureOpenAIEmbeddingProvider.d.ts.map +1 -0
- package/dist/embedding/AzureOpenAIEmbeddingProvider.js +133 -0
- package/dist/embedding/AzureOpenAIEmbeddingProvider.js.map +1 -0
- package/dist/embedding/BaseEmbeddingProvider.d.ts +43 -0
- package/dist/embedding/BaseEmbeddingProvider.d.ts.map +1 -0
- package/dist/embedding/BaseEmbeddingProvider.js +98 -0
- package/dist/embedding/BaseEmbeddingProvider.js.map +1 -0
- package/dist/embedding/EmbeddingFactory.d.ts +75 -0
- package/dist/embedding/EmbeddingFactory.d.ts.map +1 -0
- package/dist/embedding/EmbeddingFactory.js +153 -0
- package/dist/embedding/EmbeddingFactory.js.map +1 -0
- package/dist/embedding/EmbeddingManager.d.ts +41 -0
- package/dist/embedding/EmbeddingManager.d.ts.map +1 -0
- package/dist/embedding/EmbeddingManager.js +93 -0
- package/dist/embedding/EmbeddingManager.js.map +1 -0
- package/dist/embedding/MockEmbeddingProvider.d.ts +54 -0
- package/dist/embedding/MockEmbeddingProvider.d.ts.map +1 -0
- package/dist/embedding/MockEmbeddingProvider.js +91 -0
- package/dist/embedding/MockEmbeddingProvider.js.map +1 -0
- package/dist/embedding/OllamaEmbeddingProvider.d.ts +69 -0
- package/dist/embedding/OllamaEmbeddingProvider.d.ts.map +1 -0
- package/dist/embedding/OllamaEmbeddingProvider.js +136 -0
- package/dist/embedding/OllamaEmbeddingProvider.js.map +1 -0
- package/dist/embedding/OpenAIEmbeddingProvider.d.ts +83 -0
- package/dist/embedding/OpenAIEmbeddingProvider.d.ts.map +1 -0
- package/dist/embedding/OpenAIEmbeddingProvider.js +150 -0
- package/dist/embedding/OpenAIEmbeddingProvider.js.map +1 -0
- package/dist/embedding/index.d.ts +16 -0
- package/dist/embedding/index.d.ts.map +1 -0
- package/dist/embedding/index.js +15 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/reranking/LLMReranker.d.ts +147 -0
- package/dist/reranking/LLMReranker.d.ts.map +1 -0
- package/dist/reranking/LLMReranker.js +262 -0
- package/dist/reranking/LLMReranker.js.map +1 -0
- package/dist/reranking/index.d.ts +7 -0
- package/dist/reranking/index.d.ts.map +1 -0
- package/dist/reranking/index.js +7 -0
- package/dist/reranking/index.js.map +1 -0
- package/dist/types.d.ts +144 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/vectordb/FileVectorStore.d.ts +93 -0
- package/dist/vectordb/FileVectorStore.d.ts.map +1 -0
- package/dist/vectordb/FileVectorStore.js +218 -0
- package/dist/vectordb/FileVectorStore.js.map +1 -0
- package/dist/vectordb/InMemoryVectorStore.d.ts +48 -0
- package/dist/vectordb/InMemoryVectorStore.d.ts.map +1 -0
- package/dist/vectordb/InMemoryVectorStore.js +86 -0
- package/dist/vectordb/InMemoryVectorStore.js.map +1 -0
- package/dist/vectordb/index.d.ts +8 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +6 -0
- package/dist/vectordb/index.js.map +1 -0
- package/package.json +37 -0
- package/src/RAGEngine.ts +127 -0
- package/src/RAGPipeline.ts +357 -0
- package/src/Retriever.ts +121 -0
- package/src/chunking/DocumentChunker.ts +207 -0
- package/src/chunking/index.ts +5 -0
- package/src/embedding/AzureOpenAIEmbeddingProvider.ts +208 -0
- package/src/embedding/BaseEmbeddingProvider.ts +133 -0
- package/src/embedding/EmbeddingFactory.ts +225 -0
- package/src/embedding/EmbeddingManager.ts +110 -0
- package/src/embedding/MockEmbeddingProvider.ts +123 -0
- package/src/embedding/OllamaEmbeddingProvider.ts +197 -0
- package/src/embedding/OpenAIEmbeddingProvider.ts +226 -0
- package/src/embedding/index.ts +33 -0
- package/src/index.ts +55 -0
- package/src/reranking/LLMReranker.ts +401 -0
- package/src/reranking/index.ts +15 -0
- package/src/types.ts +157 -0
- package/src/vectordb/FileVectorStore.ts +289 -0
- package/src/vectordb/InMemoryVectorStore.ts +121 -0
- package/src/vectordb/index.ts +9 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Embedding Provider
|
|
3
|
+
*
|
|
4
|
+
* Esperanto-style abstraction for embedding providers
|
|
5
|
+
*
|
|
6
|
+
* @requirement REQ-RAG-001
|
|
7
|
+
* @design DES-KATASHIRO-003-RAG
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* デフォルト設定
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_CONFIG = {
|
|
13
|
+
batchSize: 100,
|
|
14
|
+
dimensions: 1536,
|
|
15
|
+
timeout: 60000,
|
|
16
|
+
maxRetries: 3,
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* 抽象Embeddingプロバイダー基底クラス
|
|
20
|
+
*/
|
|
21
|
+
export class BaseEmbeddingProvider {
|
|
22
|
+
config;
|
|
23
|
+
constructor(config = {}) {
|
|
24
|
+
this.config = {
|
|
25
|
+
...DEFAULT_CONFIG,
|
|
26
|
+
...config,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* バッチ埋め込み生成
|
|
31
|
+
*/
|
|
32
|
+
async embedBatch(texts) {
|
|
33
|
+
const batchSize = this.config.batchSize ?? 100;
|
|
34
|
+
const results = [];
|
|
35
|
+
for (let i = 0; i < texts.length; i += batchSize) {
|
|
36
|
+
const batch = texts.slice(i, i + batchSize);
|
|
37
|
+
const embeddings = await this.embedBatchInternal(batch);
|
|
38
|
+
results.push(...embeddings);
|
|
39
|
+
}
|
|
40
|
+
return results;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 内部バッチ処理(プロバイダー固有実装)
|
|
44
|
+
*/
|
|
45
|
+
async embedBatchInternal(texts) {
|
|
46
|
+
// デフォルト: 個別に処理
|
|
47
|
+
return Promise.all(texts.map((text) => this.embed(text)));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* HTTPリクエストヘルパー(タイムアウト対応)
|
|
51
|
+
*/
|
|
52
|
+
async fetchWithTimeout(url, options, timeout) {
|
|
53
|
+
const controller = new AbortController();
|
|
54
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout ?? this.config.timeout);
|
|
55
|
+
try {
|
|
56
|
+
const response = await fetch(url, {
|
|
57
|
+
...options,
|
|
58
|
+
signal: controller.signal,
|
|
59
|
+
});
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
const errorText = await response.text();
|
|
62
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText} - ${errorText}`);
|
|
63
|
+
}
|
|
64
|
+
return response;
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
clearTimeout(timeoutId);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* リトライ付き実行
|
|
72
|
+
*/
|
|
73
|
+
async withRetry(operation, maxRetries) {
|
|
74
|
+
const retries = maxRetries ?? this.config.maxRetries ?? 3;
|
|
75
|
+
let lastError;
|
|
76
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
77
|
+
try {
|
|
78
|
+
return await operation();
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
82
|
+
if (attempt < retries) {
|
|
83
|
+
// Exponential backoff
|
|
84
|
+
const delay = Math.min(1000 * Math.pow(2, attempt), 10000);
|
|
85
|
+
await this.sleep(delay);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
throw lastError;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* スリープヘルパー
|
|
93
|
+
*/
|
|
94
|
+
sleep(ms) {
|
|
95
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=BaseEmbeddingProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseEmbeddingProvider.js","sourceRoot":"","sources":["../../src/embedding/BaseEmbeddingProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Provider Factory
|
|
3
|
+
*
|
|
4
|
+
* Esperanto-style factory for creating embedding providers
|
|
5
|
+
*
|
|
6
|
+
* @requirement REQ-RAG-001
|
|
7
|
+
* @design DES-KATASHIRO-003-RAG
|
|
8
|
+
*/
|
|
9
|
+
import type { EmbeddingProvider, EmbeddingConfig } from '../types.js';
|
|
10
|
+
import type { OllamaEmbeddingConfig } from './OllamaEmbeddingProvider.js';
|
|
11
|
+
import type { OpenAIEmbeddingConfig } from './OpenAIEmbeddingProvider.js';
|
|
12
|
+
import type { AzureOpenAIEmbeddingConfig } from './AzureOpenAIEmbeddingProvider.js';
|
|
13
|
+
/**
|
|
14
|
+
* プロバイダータイプ
|
|
15
|
+
*/
|
|
16
|
+
export type EmbeddingProviderType = 'mock' | 'ollama' | 'openai' | 'openai-compatible' | 'azure-openai';
|
|
17
|
+
/**
|
|
18
|
+
* プロバイダー設定マップ
|
|
19
|
+
*/
|
|
20
|
+
export interface EmbeddingProviderConfigMap {
|
|
21
|
+
mock: EmbeddingConfig;
|
|
22
|
+
ollama: OllamaEmbeddingConfig;
|
|
23
|
+
openai: OpenAIEmbeddingConfig;
|
|
24
|
+
'openai-compatible': OpenAIEmbeddingConfig;
|
|
25
|
+
'azure-openai': AzureOpenAIEmbeddingConfig;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Embedding Provider Factory
|
|
29
|
+
*
|
|
30
|
+
* Esperantoスタイルのファクトリクラス
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* // 利用可能なプロバイダーを確認
|
|
35
|
+
* const providers = EmbeddingFactory.getAvailableProviders();
|
|
36
|
+
*
|
|
37
|
+
* // プロバイダーを作成
|
|
38
|
+
* const provider = EmbeddingFactory.create('ollama', {
|
|
39
|
+
* baseUrl: 'http://192.168.224.1:11434',
|
|
40
|
+
* model: 'nomic-embed-text',
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* // または環境変数から自動設定
|
|
44
|
+
* const provider = EmbeddingFactory.create('openai');
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare class EmbeddingFactory {
|
|
48
|
+
/**
|
|
49
|
+
* プロバイダー作成
|
|
50
|
+
*/
|
|
51
|
+
static create<T extends EmbeddingProviderType>(provider: T, config?: Partial<EmbeddingProviderConfigMap[T]>): EmbeddingProvider;
|
|
52
|
+
/**
|
|
53
|
+
* 利用可能なプロバイダー一覧
|
|
54
|
+
*/
|
|
55
|
+
static getAvailableProviders(): EmbeddingProviderType[];
|
|
56
|
+
/**
|
|
57
|
+
* デフォルトプロバイダー取得
|
|
58
|
+
*
|
|
59
|
+
* 環境変数から自動判定
|
|
60
|
+
*/
|
|
61
|
+
static getDefaultProvider(): EmbeddingProvider;
|
|
62
|
+
/**
|
|
63
|
+
* プロバイダーの利用可能確認
|
|
64
|
+
*/
|
|
65
|
+
static isProviderConfigured(provider: EmbeddingProviderType): boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 便利関数: Embeddingプロバイダー作成
|
|
69
|
+
*/
|
|
70
|
+
export declare function createEmbeddingProvider<T extends EmbeddingProviderType>(provider: T, config?: Partial<EmbeddingProviderConfigMap[T]>): EmbeddingProvider;
|
|
71
|
+
/**
|
|
72
|
+
* 便利関数: デフォルトプロバイダー取得
|
|
73
|
+
*/
|
|
74
|
+
export declare function getDefaultEmbeddingProvider(): EmbeddingProvider;
|
|
75
|
+
//# sourceMappingURL=EmbeddingFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbeddingFactory.d.ts","sourceRoot":"","sources":["../../src/embedding/EmbeddingFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAItE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAEpF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,mBAAmB,GACnB,cAAc,CAAC;AAEnB;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,mBAAmB,EAAE,qBAAqB,CAAC;IAC3C,cAAc,EAAE,0BAA0B,CAAC;CAC5C;AA8CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,qBAAqB,EAC3C,QAAQ,EAAE,CAAC,EACX,MAAM,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,GAC9C,iBAAiB;IAkCpB;;OAEG;IACH,MAAM,CAAC,qBAAqB,IAAI,qBAAqB,EAAE;IAIvD;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,IAAI,iBAAiB;IAqB9C;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO;CA0BtE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,qBAAqB,EACrE,QAAQ,EAAE,CAAC,EACX,MAAM,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,GAC9C,iBAAiB,CAEnB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,iBAAiB,CAE/D"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Provider Factory
|
|
3
|
+
*
|
|
4
|
+
* Esperanto-style factory for creating embedding providers
|
|
5
|
+
*
|
|
6
|
+
* @requirement REQ-RAG-001
|
|
7
|
+
* @design DES-KATASHIRO-003-RAG
|
|
8
|
+
*/
|
|
9
|
+
import { MockEmbeddingProvider } from './MockEmbeddingProvider.js';
|
|
10
|
+
import { OllamaEmbeddingProvider } from './OllamaEmbeddingProvider.js';
|
|
11
|
+
import { OpenAIEmbeddingProvider } from './OpenAIEmbeddingProvider.js';
|
|
12
|
+
import { AzureOpenAIEmbeddingProvider } from './AzureOpenAIEmbeddingProvider.js';
|
|
13
|
+
/**
|
|
14
|
+
* 環境変数から設定を取得
|
|
15
|
+
*/
|
|
16
|
+
function getConfigFromEnv(provider) {
|
|
17
|
+
switch (provider) {
|
|
18
|
+
case 'ollama':
|
|
19
|
+
return {
|
|
20
|
+
baseUrl: process.env.OLLAMA_BASE_URL ?? process.env.OLLAMA_HOST,
|
|
21
|
+
model: process.env.OLLAMA_EMBEDDING_MODEL,
|
|
22
|
+
};
|
|
23
|
+
case 'openai':
|
|
24
|
+
return {
|
|
25
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
26
|
+
organization: process.env.OPENAI_ORGANIZATION,
|
|
27
|
+
baseUrl: process.env.OPENAI_BASE_URL,
|
|
28
|
+
model: process.env.OPENAI_EMBEDDING_MODEL,
|
|
29
|
+
};
|
|
30
|
+
case 'openai-compatible':
|
|
31
|
+
return {
|
|
32
|
+
apiKey: process.env.OPENAI_COMPATIBLE_API_KEY_EMBEDDING ??
|
|
33
|
+
process.env.OPENAI_COMPATIBLE_API_KEY,
|
|
34
|
+
baseUrl: process.env.OPENAI_COMPATIBLE_BASE_URL_EMBEDDING ??
|
|
35
|
+
process.env.OPENAI_COMPATIBLE_BASE_URL,
|
|
36
|
+
};
|
|
37
|
+
case 'azure-openai':
|
|
38
|
+
return {
|
|
39
|
+
endpoint: process.env.AZURE_OPENAI_ENDPOINT,
|
|
40
|
+
apiKey: process.env.AZURE_OPENAI_API_KEY,
|
|
41
|
+
deploymentName: process.env.AZURE_OPENAI_EMBEDDING_DEPLOYMENT,
|
|
42
|
+
apiVersion: process.env.AZURE_OPENAI_API_VERSION,
|
|
43
|
+
};
|
|
44
|
+
default:
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Embedding Provider Factory
|
|
50
|
+
*
|
|
51
|
+
* Esperantoスタイルのファクトリクラス
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* // 利用可能なプロバイダーを確認
|
|
56
|
+
* const providers = EmbeddingFactory.getAvailableProviders();
|
|
57
|
+
*
|
|
58
|
+
* // プロバイダーを作成
|
|
59
|
+
* const provider = EmbeddingFactory.create('ollama', {
|
|
60
|
+
* baseUrl: 'http://192.168.224.1:11434',
|
|
61
|
+
* model: 'nomic-embed-text',
|
|
62
|
+
* });
|
|
63
|
+
*
|
|
64
|
+
* // または環境変数から自動設定
|
|
65
|
+
* const provider = EmbeddingFactory.create('openai');
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export class EmbeddingFactory {
|
|
69
|
+
/**
|
|
70
|
+
* プロバイダー作成
|
|
71
|
+
*/
|
|
72
|
+
static create(provider, config) {
|
|
73
|
+
// 環境変数からの設定とマージ
|
|
74
|
+
const envConfig = getConfigFromEnv(provider);
|
|
75
|
+
const mergedConfig = { ...envConfig, ...config };
|
|
76
|
+
switch (provider) {
|
|
77
|
+
case 'mock':
|
|
78
|
+
return new MockEmbeddingProvider({
|
|
79
|
+
dimensions: mergedConfig.dimensions ?? 1536,
|
|
80
|
+
delay: mergedConfig.delay ?? 0,
|
|
81
|
+
shouldFail: mergedConfig.shouldFail ?? false,
|
|
82
|
+
});
|
|
83
|
+
case 'ollama':
|
|
84
|
+
return new OllamaEmbeddingProvider(mergedConfig);
|
|
85
|
+
case 'openai':
|
|
86
|
+
case 'openai-compatible':
|
|
87
|
+
return new OpenAIEmbeddingProvider(mergedConfig);
|
|
88
|
+
case 'azure-openai':
|
|
89
|
+
return new AzureOpenAIEmbeddingProvider(mergedConfig);
|
|
90
|
+
default:
|
|
91
|
+
throw new Error(`Unknown embedding provider: ${provider}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 利用可能なプロバイダー一覧
|
|
96
|
+
*/
|
|
97
|
+
static getAvailableProviders() {
|
|
98
|
+
return ['mock', 'ollama', 'openai', 'openai-compatible', 'azure-openai'];
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* デフォルトプロバイダー取得
|
|
102
|
+
*
|
|
103
|
+
* 環境変数から自動判定
|
|
104
|
+
*/
|
|
105
|
+
static getDefaultProvider() {
|
|
106
|
+
// 優先順位: AZURE > OPENAI > OLLAMA > MOCK
|
|
107
|
+
if (process.env.AZURE_OPENAI_ENDPOINT &&
|
|
108
|
+
process.env.AZURE_OPENAI_API_KEY) {
|
|
109
|
+
return this.create('azure-openai');
|
|
110
|
+
}
|
|
111
|
+
if (process.env.OPENAI_API_KEY) {
|
|
112
|
+
return this.create('openai');
|
|
113
|
+
}
|
|
114
|
+
if (process.env.OLLAMA_BASE_URL || process.env.OLLAMA_HOST) {
|
|
115
|
+
return this.create('ollama');
|
|
116
|
+
}
|
|
117
|
+
// フォールバック: モック
|
|
118
|
+
return this.create('mock');
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* プロバイダーの利用可能確認
|
|
122
|
+
*/
|
|
123
|
+
static isProviderConfigured(provider) {
|
|
124
|
+
switch (provider) {
|
|
125
|
+
case 'mock':
|
|
126
|
+
return true;
|
|
127
|
+
case 'ollama':
|
|
128
|
+
return !!(process.env.OLLAMA_BASE_URL || process.env.OLLAMA_HOST);
|
|
129
|
+
case 'openai':
|
|
130
|
+
return !!process.env.OPENAI_API_KEY;
|
|
131
|
+
case 'openai-compatible':
|
|
132
|
+
return !!(process.env.OPENAI_COMPATIBLE_BASE_URL_EMBEDDING ||
|
|
133
|
+
process.env.OPENAI_COMPATIBLE_BASE_URL);
|
|
134
|
+
case 'azure-openai':
|
|
135
|
+
return !!(process.env.AZURE_OPENAI_ENDPOINT && process.env.AZURE_OPENAI_API_KEY);
|
|
136
|
+
default:
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 便利関数: Embeddingプロバイダー作成
|
|
143
|
+
*/
|
|
144
|
+
export function createEmbeddingProvider(provider, config) {
|
|
145
|
+
return EmbeddingFactory.create(provider, config);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 便利関数: デフォルトプロバイダー取得
|
|
149
|
+
*/
|
|
150
|
+
export function getDefaultEmbeddingProvider() {
|
|
151
|
+
return EmbeddingFactory.getDefaultProvider();
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=EmbeddingFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbeddingFactory.js","sourceRoot":"","sources":["../../src/embedding/EmbeddingFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Manager
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-RAG-001
|
|
5
|
+
* @design DES-KATASHIRO-003-RAG §3.1
|
|
6
|
+
*/
|
|
7
|
+
import type { EmbeddingProvider, Vector } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* EmbeddingManager - Embedding生成の管理
|
|
10
|
+
* キャッシュとバッチ処理をサポート
|
|
11
|
+
*/
|
|
12
|
+
export declare class EmbeddingManager {
|
|
13
|
+
private provider;
|
|
14
|
+
private cache;
|
|
15
|
+
constructor(provider: EmbeddingProvider);
|
|
16
|
+
/**
|
|
17
|
+
* ベクトル次元数
|
|
18
|
+
*/
|
|
19
|
+
get dimensions(): number;
|
|
20
|
+
/**
|
|
21
|
+
* プロバイダー名
|
|
22
|
+
*/
|
|
23
|
+
get providerName(): string;
|
|
24
|
+
/**
|
|
25
|
+
* 単一テキストの埋め込み生成
|
|
26
|
+
*/
|
|
27
|
+
embed(text: string): Promise<Vector>;
|
|
28
|
+
/**
|
|
29
|
+
* バッチ埋め込み生成
|
|
30
|
+
*/
|
|
31
|
+
embedBatch(texts: string[]): Promise<Vector[]>;
|
|
32
|
+
/**
|
|
33
|
+
* キャッシュをクリア
|
|
34
|
+
*/
|
|
35
|
+
clearCache(): void;
|
|
36
|
+
/**
|
|
37
|
+
* キャッシュキーを生成
|
|
38
|
+
*/
|
|
39
|
+
private getCacheKey;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=EmbeddingManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbeddingManager.d.ts","sourceRoot":"","sources":["../../src/embedding/EmbeddingManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE7D;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,KAAK,CAAkC;gBAEnC,QAAQ,EAAE,iBAAiB;IAIvC;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB1C;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsCpD;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,OAAO,CAAC,WAAW;CAGpB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Manager
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-RAG-001
|
|
5
|
+
* @design DES-KATASHIRO-003-RAG §3.1
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* EmbeddingManager - Embedding生成の管理
|
|
9
|
+
* キャッシュとバッチ処理をサポート
|
|
10
|
+
*/
|
|
11
|
+
export class EmbeddingManager {
|
|
12
|
+
provider;
|
|
13
|
+
cache = new Map();
|
|
14
|
+
constructor(provider) {
|
|
15
|
+
this.provider = provider;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* ベクトル次元数
|
|
19
|
+
*/
|
|
20
|
+
get dimensions() {
|
|
21
|
+
return this.provider.dimensions;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* プロバイダー名
|
|
25
|
+
*/
|
|
26
|
+
get providerName() {
|
|
27
|
+
return this.provider.name;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 単一テキストの埋め込み生成
|
|
31
|
+
*/
|
|
32
|
+
async embed(text) {
|
|
33
|
+
// キャッシュチェック
|
|
34
|
+
const cacheKey = this.getCacheKey(text);
|
|
35
|
+
const cached = this.cache.get(cacheKey);
|
|
36
|
+
if (cached) {
|
|
37
|
+
return cached;
|
|
38
|
+
}
|
|
39
|
+
// 生成
|
|
40
|
+
const embedding = await this.provider.embed(text);
|
|
41
|
+
// キャッシュ保存
|
|
42
|
+
this.cache.set(cacheKey, embedding);
|
|
43
|
+
return embedding;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* バッチ埋め込み生成
|
|
47
|
+
*/
|
|
48
|
+
async embedBatch(texts) {
|
|
49
|
+
// 全部キャッシュチェックして、なければ一括生成
|
|
50
|
+
const results = new Array(texts.length);
|
|
51
|
+
const uncachedTexts = [];
|
|
52
|
+
const uncachedIndices = [];
|
|
53
|
+
for (let i = 0; i < texts.length; i++) {
|
|
54
|
+
const text = texts[i];
|
|
55
|
+
const cacheKey = this.getCacheKey(text);
|
|
56
|
+
const cached = this.cache.get(cacheKey);
|
|
57
|
+
if (cached) {
|
|
58
|
+
results[i] = cached;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
uncachedTexts.push(text);
|
|
62
|
+
uncachedIndices.push(i);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// 未キャッシュのものを生成
|
|
66
|
+
if (uncachedTexts.length > 0) {
|
|
67
|
+
const newEmbeddings = await this.provider.embedBatch(uncachedTexts);
|
|
68
|
+
for (let j = 0; j < newEmbeddings.length; j++) {
|
|
69
|
+
const originalIndex = uncachedIndices[j];
|
|
70
|
+
const text = uncachedTexts[j];
|
|
71
|
+
const embedding = newEmbeddings[j];
|
|
72
|
+
results[originalIndex] = embedding;
|
|
73
|
+
// キャッシュ保存
|
|
74
|
+
const cacheKey = this.getCacheKey(text);
|
|
75
|
+
this.cache.set(cacheKey, embedding);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return results;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* キャッシュをクリア
|
|
82
|
+
*/
|
|
83
|
+
clearCache() {
|
|
84
|
+
this.cache.clear();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* キャッシュキーを生成
|
|
88
|
+
*/
|
|
89
|
+
getCacheKey(text) {
|
|
90
|
+
return `${this.provider.name}:${text}`;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=EmbeddingManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbeddingManager.js","sourceRoot":"","sources":["../../src/embedding/EmbeddingManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Embedding Provider - テスト用
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-RAG-001
|
|
5
|
+
* @design DES-KATASHIRO-003-RAG §3.1
|
|
6
|
+
*/
|
|
7
|
+
import type { EmbeddingProvider, Vector } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* MockEmbeddingProvider設定
|
|
10
|
+
*/
|
|
11
|
+
export interface MockEmbeddingProviderConfig {
|
|
12
|
+
/** ベクトル次元数 */
|
|
13
|
+
dimensions?: number;
|
|
14
|
+
/** 遅延(ミリ秒) */
|
|
15
|
+
delay?: number;
|
|
16
|
+
/** エラーを発生させるか */
|
|
17
|
+
shouldFail?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* テスト用モックEmbeddingプロバイダー
|
|
21
|
+
*/
|
|
22
|
+
export declare class MockEmbeddingProvider implements EmbeddingProvider {
|
|
23
|
+
readonly name = "mock";
|
|
24
|
+
readonly dimensions: number;
|
|
25
|
+
private delay;
|
|
26
|
+
private shouldFail;
|
|
27
|
+
private callCount;
|
|
28
|
+
constructor(config?: MockEmbeddingProviderConfig);
|
|
29
|
+
/**
|
|
30
|
+
* 呼び出し回数取得
|
|
31
|
+
*/
|
|
32
|
+
getCallCount(): number;
|
|
33
|
+
/**
|
|
34
|
+
* リセット
|
|
35
|
+
*/
|
|
36
|
+
reset(): void;
|
|
37
|
+
embed(text: string): Promise<Vector>;
|
|
38
|
+
embedBatch(texts: string[]): Promise<Vector[]>;
|
|
39
|
+
/**
|
|
40
|
+
* テキストから決定的なベクトルを生成
|
|
41
|
+
* 同じテキストからは常に同じベクトルが生成される
|
|
42
|
+
*/
|
|
43
|
+
private generateDeterministicVector;
|
|
44
|
+
/**
|
|
45
|
+
* 文字列のシンプルなハッシュ
|
|
46
|
+
*/
|
|
47
|
+
private hashString;
|
|
48
|
+
/**
|
|
49
|
+
* 線形合同法による擬似乱数
|
|
50
|
+
*/
|
|
51
|
+
private nextRandom;
|
|
52
|
+
private sleep;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=MockEmbeddingProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockEmbeddingProvider.d.ts","sourceRoot":"","sources":["../../src/embedding/MockEmbeddingProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,cAAc;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAK;gBAEV,MAAM,GAAE,2BAAgC;IAMpD;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIP,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcpC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAcpD;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAenC;;OAEG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Embedding Provider - テスト用
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-RAG-001
|
|
5
|
+
* @design DES-KATASHIRO-003-RAG §3.1
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* テスト用モックEmbeddingプロバイダー
|
|
9
|
+
*/
|
|
10
|
+
export class MockEmbeddingProvider {
|
|
11
|
+
name = 'mock';
|
|
12
|
+
dimensions;
|
|
13
|
+
delay;
|
|
14
|
+
shouldFail;
|
|
15
|
+
callCount = 0;
|
|
16
|
+
constructor(config = {}) {
|
|
17
|
+
this.dimensions = config.dimensions ?? 1536;
|
|
18
|
+
this.delay = config.delay ?? 0;
|
|
19
|
+
this.shouldFail = config.shouldFail ?? false;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 呼び出し回数取得
|
|
23
|
+
*/
|
|
24
|
+
getCallCount() {
|
|
25
|
+
return this.callCount;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* リセット
|
|
29
|
+
*/
|
|
30
|
+
reset() {
|
|
31
|
+
this.callCount = 0;
|
|
32
|
+
}
|
|
33
|
+
async embed(text) {
|
|
34
|
+
this.callCount++;
|
|
35
|
+
if (this.delay > 0) {
|
|
36
|
+
await this.sleep(this.delay);
|
|
37
|
+
}
|
|
38
|
+
if (this.shouldFail) {
|
|
39
|
+
throw new Error('Mock embedding provider error');
|
|
40
|
+
}
|
|
41
|
+
return this.generateDeterministicVector(text);
|
|
42
|
+
}
|
|
43
|
+
async embedBatch(texts) {
|
|
44
|
+
this.callCount++;
|
|
45
|
+
if (this.delay > 0) {
|
|
46
|
+
await this.sleep(this.delay);
|
|
47
|
+
}
|
|
48
|
+
if (this.shouldFail) {
|
|
49
|
+
throw new Error('Mock embedding provider error');
|
|
50
|
+
}
|
|
51
|
+
return texts.map((text) => this.generateDeterministicVector(text));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* テキストから決定的なベクトルを生成
|
|
55
|
+
* 同じテキストからは常に同じベクトルが生成される
|
|
56
|
+
*/
|
|
57
|
+
generateDeterministicVector(text) {
|
|
58
|
+
const vector = new Array(this.dimensions);
|
|
59
|
+
let seed = this.hashString(text);
|
|
60
|
+
for (let i = 0; i < this.dimensions; i++) {
|
|
61
|
+
seed = this.nextRandom(seed);
|
|
62
|
+
// -1から1の範囲に正規化
|
|
63
|
+
vector[i] = (seed / 2147483647) * 2 - 1;
|
|
64
|
+
}
|
|
65
|
+
// L2正規化
|
|
66
|
+
const norm = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));
|
|
67
|
+
return vector.map((v) => v / norm);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 文字列のシンプルなハッシュ
|
|
71
|
+
*/
|
|
72
|
+
hashString(str) {
|
|
73
|
+
let hash = 0;
|
|
74
|
+
for (let i = 0; i < str.length; i++) {
|
|
75
|
+
const char = str.charCodeAt(i);
|
|
76
|
+
hash = ((hash << 5) - hash) + char;
|
|
77
|
+
hash = hash & hash;
|
|
78
|
+
}
|
|
79
|
+
return Math.abs(hash);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 線形合同法による擬似乱数
|
|
83
|
+
*/
|
|
84
|
+
nextRandom(seed) {
|
|
85
|
+
return (seed * 1103515245 + 12345) & 2147483647;
|
|
86
|
+
}
|
|
87
|
+
sleep(ms) {
|
|
88
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=MockEmbeddingProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockEmbeddingProvider.js","sourceRoot":"","sources":["../../src/embedding/MockEmbeddingProvider.ts"],"names":[],"mappings":"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"}
|