@knowledgine/core 0.2.1 → 0.4.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/dist/agents/index.d.ts +7 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/observer-agent.d.ts +31 -0
- package/dist/agents/observer-agent.d.ts.map +1 -0
- package/dist/agents/observer-agent.js +164 -0
- package/dist/agents/observer-agent.js.map +1 -0
- package/dist/agents/reflector-agent.d.ts +66 -0
- package/dist/agents/reflector-agent.d.ts.map +1 -0
- package/dist/agents/reflector-agent.js +420 -0
- package/dist/agents/reflector-agent.js.map +1 -0
- package/dist/agents/types.d.ts +47 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/vector-classification-rules.d.ts +14 -0
- package/dist/agents/vector-classification-rules.d.ts.map +1 -0
- package/dist/agents/vector-classification-rules.js +229 -0
- package/dist/agents/vector-classification-rules.js.map +1 -0
- package/dist/config/config-loader.d.ts +13 -0
- package/dist/config/config-loader.d.ts.map +1 -1
- package/dist/config/config-loader.js +19 -11
- package/dist/config/config-loader.js.map +1 -1
- package/dist/extraction/causal-link-detector.d.ts +16 -0
- package/dist/extraction/causal-link-detector.d.ts.map +1 -0
- package/dist/extraction/causal-link-detector.js +142 -0
- package/dist/extraction/causal-link-detector.js.map +1 -0
- package/dist/extraction/incremental-extractor.d.ts +21 -0
- package/dist/extraction/incremental-extractor.d.ts.map +1 -0
- package/dist/extraction/incremental-extractor.js +113 -0
- package/dist/extraction/incremental-extractor.js.map +1 -0
- package/dist/extraction/psp-detector.d.ts +3 -3
- package/dist/extraction/psp-detector.d.ts.map +1 -1
- package/dist/extraction/psp-detector.js +51 -3
- package/dist/extraction/psp-detector.js.map +1 -1
- package/dist/graph/entity-extractor.d.ts +1 -0
- package/dist/graph/entity-extractor.d.ts.map +1 -1
- package/dist/graph/entity-extractor.js +36 -2
- package/dist/graph/entity-extractor.js.map +1 -1
- package/dist/graph/graph-repository.d.ts +37 -5
- package/dist/graph/graph-repository.d.ts.map +1 -1
- package/dist/graph/graph-repository.js +68 -12
- package/dist/graph/graph-repository.js.map +1 -1
- package/dist/graph/temporal-query.d.ts +69 -0
- package/dist/graph/temporal-query.d.ts.map +1 -0
- package/dist/graph/temporal-query.js +172 -0
- package/dist/graph/temporal-query.js.map +1 -0
- package/dist/index.d.ts +29 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/llm/errors.d.ts +8 -0
- package/dist/llm/errors.d.ts.map +1 -0
- package/dist/llm/errors.js +11 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/index.d.ts +7 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +5 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/ollama-provider.d.ts +13 -0
- package/dist/llm/ollama-provider.d.ts.map +1 -0
- package/dist/llm/ollama-provider.js +130 -0
- package/dist/llm/ollama-provider.js.map +1 -0
- package/dist/llm/openai-provider.d.ts +15 -0
- package/dist/llm/openai-provider.d.ts.map +1 -0
- package/dist/llm/openai-provider.js +143 -0
- package/dist/llm/openai-provider.js.map +1 -0
- package/dist/llm/provider-factory.d.ts +3 -0
- package/dist/llm/provider-factory.d.ts.map +1 -0
- package/dist/llm/provider-factory.js +25 -0
- package/dist/llm/provider-factory.js.map +1 -0
- package/dist/llm/types.d.ts +50 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/provenance/provenance-repository.d.ts +23 -22
- package/dist/provenance/provenance-repository.d.ts.map +1 -1
- package/dist/provenance/provenance-repository.js +82 -44
- package/dist/provenance/provenance-repository.js.map +1 -1
- package/dist/search/knowledge-searcher.d.ts +12 -1
- package/dist/search/knowledge-searcher.d.ts.map +1 -1
- package/dist/search/knowledge-searcher.js +93 -31
- package/dist/search/knowledge-searcher.js.map +1 -1
- package/dist/search/query-classifier.d.ts +17 -0
- package/dist/search/query-classifier.d.ts.map +1 -0
- package/dist/search/query-classifier.js +63 -0
- package/dist/search/query-classifier.js.map +1 -0
- package/dist/search/query-orchestrator.d.ts +39 -0
- package/dist/search/query-orchestrator.d.ts.map +1 -0
- package/dist/search/query-orchestrator.js +239 -0
- package/dist/search/query-orchestrator.js.map +1 -0
- package/dist/search/reasoning-reranker.d.ts +59 -0
- package/dist/search/reasoning-reranker.d.ts.map +1 -0
- package/dist/search/reasoning-reranker.js +334 -0
- package/dist/search/reasoning-reranker.js.map +1 -0
- package/dist/services/knowledge-service.d.ts +6 -0
- package/dist/services/knowledge-service.d.ts.map +1 -1
- package/dist/services/knowledge-service.js +7 -2
- package/dist/services/knowledge-service.js.map +1 -1
- package/dist/storage/database.d.ts.map +1 -1
- package/dist/storage/database.js +46 -6
- package/dist/storage/database.js.map +1 -1
- package/dist/storage/knowledge-repository.d.ts +65 -1
- package/dist/storage/knowledge-repository.d.ts.map +1 -1
- package/dist/storage/knowledge-repository.js +163 -9
- package/dist/storage/knowledge-repository.js.map +1 -1
- package/dist/storage/migrations/007_spec_alignment.d.ts +3 -0
- package/dist/storage/migrations/007_spec_alignment.d.ts.map +1 -0
- package/dist/storage/migrations/007_spec_alignment.js +116 -0
- package/dist/storage/migrations/007_spec_alignment.js.map +1 -0
- package/dist/storage/migrations/008_knowledge_versioning.d.ts +15 -0
- package/dist/storage/migrations/008_knowledge_versioning.d.ts.map +1 -0
- package/dist/storage/migrations/008_knowledge_versioning.js +69 -0
- package/dist/storage/migrations/008_knowledge_versioning.js.map +1 -0
- package/dist/storage/migrations/009_extraction_metadata.d.ts +12 -0
- package/dist/storage/migrations/009_extraction_metadata.d.ts.map +1 -0
- package/dist/storage/migrations/009_extraction_metadata.js +39 -0
- package/dist/storage/migrations/009_extraction_metadata.js.map +1 -0
- package/dist/storage/migrations/010_memory_protocol.d.ts +12 -0
- package/dist/storage/migrations/010_memory_protocol.d.ts.map +1 -0
- package/dist/storage/migrations/010_memory_protocol.js +26 -0
- package/dist/storage/migrations/010_memory_protocol.js.map +1 -0
- package/dist/storage/migrator.d.ts +3 -1
- package/dist/storage/migrator.d.ts.map +1 -1
- package/dist/storage/migrator.js +2 -1
- package/dist/storage/migrator.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1,54 +1,116 @@
|
|
|
1
1
|
import { SemanticSearcher } from "./semantic-searcher.js";
|
|
2
2
|
import { HybridSearcher } from "./hybrid-searcher.js";
|
|
3
|
+
import { ReasoningReranker } from "./reasoning-reranker.js";
|
|
4
|
+
import { QueryOrchestrator } from "./query-orchestrator.js";
|
|
3
5
|
export class KnowledgeSearcher {
|
|
4
6
|
repository;
|
|
5
7
|
semanticSearcher;
|
|
6
8
|
hybridSearcher;
|
|
7
|
-
|
|
9
|
+
reranker;
|
|
10
|
+
agenticReranker;
|
|
11
|
+
orchestrator;
|
|
12
|
+
constructor(repository, embeddingProvider, hybridAlpha = 0.3, llmProvider, graphRepository) {
|
|
8
13
|
this.repository = repository;
|
|
9
14
|
if (embeddingProvider) {
|
|
10
15
|
this.semanticSearcher = new SemanticSearcher(repository, embeddingProvider);
|
|
11
16
|
this.hybridSearcher = new HybridSearcher(repository, embeddingProvider, hybridAlpha);
|
|
12
17
|
}
|
|
18
|
+
this.reranker = new ReasoningReranker(undefined, repository);
|
|
19
|
+
this.agenticReranker = new ReasoningReranker(llmProvider, repository);
|
|
20
|
+
// graphRepositoryが提供された場合はQueryOrchestratorを使用
|
|
21
|
+
if (graphRepository) {
|
|
22
|
+
this.orchestrator = new QueryOrchestrator(repository, graphRepository, embeddingProvider, llmProvider);
|
|
23
|
+
}
|
|
13
24
|
}
|
|
14
25
|
async search(options) {
|
|
15
|
-
|
|
26
|
+
// orchestratorが利用可能な場合はQueryOrchestratorに委譲
|
|
27
|
+
if (this.orchestrator && options.query) {
|
|
28
|
+
const results = await this.orchestrator.query(options);
|
|
29
|
+
return results.map((r) => ({
|
|
30
|
+
note: r.note,
|
|
31
|
+
score: r.score,
|
|
32
|
+
matchReason: r.matchReason,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
const { query, limit = 50, mode = "keyword", rerank = false, rerankWeights, includeDeprecated = false, agentic = false, dateFrom, dateTo, } = options;
|
|
16
36
|
if (!query) {
|
|
17
37
|
return [];
|
|
18
38
|
}
|
|
39
|
+
let results;
|
|
19
40
|
if (mode === "semantic" && this.semanticSearcher) {
|
|
20
|
-
|
|
41
|
+
results = await this.semanticSearcher.search(query, limit);
|
|
21
42
|
}
|
|
22
|
-
if (mode === "hybrid" && this.hybridSearcher) {
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
// Fall back to keyword search when semantic/hybrid requested but provider unavailable
|
|
26
|
-
const fellBack = mode !== "keyword" &&
|
|
27
|
-
((mode === "semantic" && !this.semanticSearcher) ||
|
|
28
|
-
(mode === "hybrid" && !this.hybridSearcher));
|
|
29
|
-
// keyword mode (デフォルト) — FTS5
|
|
30
|
-
const rows = this.repository.searchNotesWithRank(query, limit);
|
|
31
|
-
if (rows.length === 0) {
|
|
32
|
-
return [];
|
|
43
|
+
else if (mode === "hybrid" && this.hybridSearcher) {
|
|
44
|
+
results = await this.hybridSearcher.search(query, limit);
|
|
33
45
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (fellBack) {
|
|
44
|
-
reasons.push(`Warning: ${mode} search is not available. Showing keyword results instead. Run 'knowledgine upgrade --semantic' to enable.`);
|
|
46
|
+
else {
|
|
47
|
+
// Fall back to keyword search when semantic/hybrid requested but provider unavailable
|
|
48
|
+
const fellBack = mode !== "keyword" &&
|
|
49
|
+
((mode === "semantic" && !this.semanticSearcher) ||
|
|
50
|
+
(mode === "hybrid" && !this.hybridSearcher));
|
|
51
|
+
// keyword mode (デフォルト) — FTS5
|
|
52
|
+
const rows = this.repository.searchNotesWithRank(query, limit, includeDeprecated, dateFrom, dateTo);
|
|
53
|
+
if (rows.length === 0) {
|
|
54
|
+
return [];
|
|
45
55
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
56
|
+
// FTSスコアをmin-max正規化
|
|
57
|
+
const rawRanks = rows.map((r) => Math.abs(r.rank));
|
|
58
|
+
const minRank = Math.min(...rawRanks);
|
|
59
|
+
const maxRank = Math.max(...rawRanks);
|
|
60
|
+
const range = maxRank - minRank;
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
results = rows.map(({ note, rank }) => {
|
|
63
|
+
const normalized = range > 0 ? (Math.abs(rank) - minRank) / range : 1.0;
|
|
64
|
+
let score = 1 - normalized;
|
|
65
|
+
// valid_from スコアボーナス: 新しいほど高スコア (最大+0.5)
|
|
66
|
+
// yearsSinceNow が小さいほど (= より新しい) ボーナスが大きい
|
|
67
|
+
const validFrom = note.valid_from ?? note.created_at;
|
|
68
|
+
if (validFrom) {
|
|
69
|
+
const ageMs = now - new Date(validFrom).getTime();
|
|
70
|
+
const yearsSinceNow = ageMs / (1000 * 60 * 60 * 24 * 365);
|
|
71
|
+
// 新しさボーナス: 経過年数が少ないほど高い (上限0.5、最低0)
|
|
72
|
+
score += Math.max(0, 0.5 - yearsSinceNow * 0.1);
|
|
73
|
+
}
|
|
74
|
+
const reasons = [`キーワード一致: "${query}"`];
|
|
75
|
+
if (fellBack) {
|
|
76
|
+
reasons.push(`Warning: ${mode} search is not available. Showing keyword results instead. Run 'knowledgine upgrade --semantic' to enable.`);
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
note,
|
|
80
|
+
score,
|
|
81
|
+
matchReason: reasons,
|
|
82
|
+
fellBack,
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// agentic モード: LLMベース ReasoningReranker を使用
|
|
87
|
+
if (agentic && results.length > 0) {
|
|
88
|
+
const reranked = await this.agenticReranker.rerank(query, results);
|
|
89
|
+
return reranked.map((r) => ({
|
|
90
|
+
note: r.note,
|
|
91
|
+
score: r.score,
|
|
92
|
+
matchReason: [...r.matchReason, ...(r.reasoning ? [`LLM推論: ${r.reasoning}`] : [])],
|
|
93
|
+
fellBack: results.find((orig) => orig.note.id === r.note.id)?.fellBack,
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
if (rerank && results.length > 0) {
|
|
97
|
+
const currentReranker = rerankWeights
|
|
98
|
+
? new ReasoningReranker(undefined, this.repository, rerankWeights)
|
|
99
|
+
: this.reranker;
|
|
100
|
+
const rerankInputs = results.map((r) => ({
|
|
101
|
+
note: r.note,
|
|
102
|
+
baseScore: r.score,
|
|
103
|
+
matchReason: r.matchReason,
|
|
104
|
+
}));
|
|
105
|
+
const reranked = await currentReranker.rerankLegacy(rerankInputs, { query });
|
|
106
|
+
return reranked.map((r) => ({
|
|
107
|
+
note: r.note,
|
|
108
|
+
score: r.finalScore,
|
|
109
|
+
matchReason: r.matchReason,
|
|
110
|
+
fellBack: results.find((orig) => orig.note.id === r.note.id)?.fellBack,
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
return results;
|
|
52
114
|
}
|
|
53
115
|
async searchByTag(tag, limit = 50) {
|
|
54
116
|
return this.search({ tags: [tag], limit });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-searcher.js","sourceRoot":"","sources":["../../src/search/knowledge-searcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"knowledge-searcher.js","sourceRoot":"","sources":["../../src/search/knowledge-searcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type QueryType = "factual" | "temporal" | "exploratory" | "procedural";
|
|
2
|
+
export interface QueryWeights {
|
|
3
|
+
vector: number;
|
|
4
|
+
graph: number;
|
|
5
|
+
agentic: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* クエリ文字列を分析してクエリタイプを判定する。
|
|
9
|
+
* 優先順位: temporal > procedural > factual > exploratory
|
|
10
|
+
*/
|
|
11
|
+
export declare function classifyQuery(query: string): QueryType;
|
|
12
|
+
/**
|
|
13
|
+
* クエリタイプに応じた検索層の重みを返す。
|
|
14
|
+
* vector + graph + agentic の合計が 1.0 になることが保証される。
|
|
15
|
+
*/
|
|
16
|
+
export declare function getWeightsForQueryType(queryType: QueryType): QueryWeights;
|
|
17
|
+
//# sourceMappingURL=query-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-classifier.d.ts","sourceRoot":"","sources":["../../src/search/query-classifier.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,YAAY,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAyBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CA4BtD;AASD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,CAEzE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// 時間表現のパターン(量指定子を上限付きにして ReDoS を防止)
|
|
2
|
+
const TEMPORAL_PATTERNS = [
|
|
3
|
+
/先週|昨日|今日|今週|先月|今月|最近|直近/,
|
|
4
|
+
/\d{4}[-/]\d{1,2}[-/]\d{1,2}/, // YYYY-MM-DD or YYYY/MM/DD
|
|
5
|
+
/\d{1,6}月|\d{1,4}年/,
|
|
6
|
+
/before|after|ago|yesterday|last\s+week|last\s+month|recently/i,
|
|
7
|
+
];
|
|
8
|
+
// 手順・方法のパターン
|
|
9
|
+
const PROCEDURAL_PATTERNS = [
|
|
10
|
+
/手順|方法|やり方|やりかた|設定方法|デプロイ手順|インストール手順/,
|
|
11
|
+
/how\s+to|steps?|procedure|tutorial|guide|setup|configure|install/i,
|
|
12
|
+
];
|
|
13
|
+
// 事実・固有名詞のパターン(量指定子を上限付きにして ReDoS を防止)
|
|
14
|
+
const FACTUAL_PATTERNS = [
|
|
15
|
+
/とは|って何|というのは|定義/,
|
|
16
|
+
/v\d{1,4}\.\d{1,4}(?:\.\d{1,4})?/, // バージョン番号 v1.2.3
|
|
17
|
+
/\d{1,8}\.\d{1,8}(?:\.\d{1,8})?/, // バージョン番号 1.2.3
|
|
18
|
+
/what\s+is|what's|definition|version|release/i,
|
|
19
|
+
/[A-Z][a-z]+[A-Z][a-zA-Z]+/, // キャメルケース固有名詞 (TypeScript, ReactHooks等)
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* クエリ文字列を分析してクエリタイプを判定する。
|
|
23
|
+
* 優先順位: temporal > procedural > factual > exploratory
|
|
24
|
+
*/
|
|
25
|
+
export function classifyQuery(query) {
|
|
26
|
+
if (!query || query.trim() === "") {
|
|
27
|
+
return "exploratory";
|
|
28
|
+
}
|
|
29
|
+
// temporal: 時間表現が含まれているか
|
|
30
|
+
for (const pattern of TEMPORAL_PATTERNS) {
|
|
31
|
+
if (pattern.test(query)) {
|
|
32
|
+
return "temporal";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// procedural: 手順・方法に関するクエリか
|
|
36
|
+
for (const pattern of PROCEDURAL_PATTERNS) {
|
|
37
|
+
if (pattern.test(query)) {
|
|
38
|
+
return "procedural";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// factual: 固有名詞・バージョン・定義クエリか
|
|
42
|
+
for (const pattern of FACTUAL_PATTERNS) {
|
|
43
|
+
if (pattern.test(query)) {
|
|
44
|
+
return "factual";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// デフォルト: 探索的クエリ
|
|
48
|
+
return "exploratory";
|
|
49
|
+
}
|
|
50
|
+
const WEIGHTS_BY_TYPE = {
|
|
51
|
+
factual: { vector: 0.3, graph: 0.5, agentic: 0.2 },
|
|
52
|
+
temporal: { vector: 0.2, graph: 0.3, agentic: 0.5 },
|
|
53
|
+
exploratory: { vector: 0.5, graph: 0.3, agentic: 0.2 },
|
|
54
|
+
procedural: { vector: 0.3, graph: 0.2, agentic: 0.5 },
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* クエリタイプに応じた検索層の重みを返す。
|
|
58
|
+
* vector + graph + agentic の合計が 1.0 になることが保証される。
|
|
59
|
+
*/
|
|
60
|
+
export function getWeightsForQueryType(queryType) {
|
|
61
|
+
return WEIGHTS_BY_TYPE[queryType];
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=query-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-classifier.js","sourceRoot":"","sources":["../../src/search/query-classifier.ts"],"names":[],"mappings":"AAQA,oCAAoC;AACpC,MAAM,iBAAiB,GAAG;IACxB,yBAAyB;IACzB,6BAA6B,EAAE,2BAA2B;IAC1D,mBAAmB;IACnB,+DAA+D;CAChE,CAAC;AAEF,aAAa;AACb,MAAM,mBAAmB,GAAG;IAC1B,qCAAqC;IACrC,mEAAmE;CACpE,CAAC;AAEF,uCAAuC;AACvC,MAAM,gBAAgB,GAAG;IACvB,iBAAiB;IACjB,iCAAiC,EAAE,iBAAiB;IACpD,gCAAgC,EAAE,gBAAgB;IAClD,8CAA8C;IAC9C,2BAA2B,EAAE,wCAAwC;CACtE,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,eAAe,GAAoC;IACvD,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;IAClD,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;IACnD,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;IACtD,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;CACtD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAoB;IACzD,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { KnowledgeNote, KnowledgeRepository } from "../storage/knowledge-repository.js";
|
|
2
|
+
import type { GraphRepository } from "../graph/graph-repository.js";
|
|
3
|
+
import type { EmbeddingProvider } from "../embedding/embedding-provider.js";
|
|
4
|
+
import type { LLMProvider } from "../llm/types.js";
|
|
5
|
+
import type { EntityWithGraph } from "../types.js";
|
|
6
|
+
import type { SearchOptions } from "./knowledge-searcher.js";
|
|
7
|
+
export interface OrchestratedResult {
|
|
8
|
+
note: KnowledgeNote;
|
|
9
|
+
score: number;
|
|
10
|
+
layerScores: Record<string, number>;
|
|
11
|
+
matchReason: string[];
|
|
12
|
+
graphContext?: EntityWithGraph[];
|
|
13
|
+
}
|
|
14
|
+
export interface QueryOrchestratorConfig {
|
|
15
|
+
defaultWeights?: Record<string, number>;
|
|
16
|
+
maxResults?: number;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Vector(FTS5/semantic/hybrid) + Graph(entity traversal) + Agentic(ReasoningReranker)
|
|
21
|
+
* の3層統合検索エンジン。
|
|
22
|
+
*/
|
|
23
|
+
export declare class QueryOrchestrator {
|
|
24
|
+
private repository;
|
|
25
|
+
private graphRepository;
|
|
26
|
+
private semanticSearcher?;
|
|
27
|
+
private hybridSearcher?;
|
|
28
|
+
private agenticReranker;
|
|
29
|
+
private maxResults;
|
|
30
|
+
private timeoutMs;
|
|
31
|
+
constructor(repository: KnowledgeRepository, graphRepository: GraphRepository, embeddingProvider?: EmbeddingProvider, llmProvider?: LLMProvider, config?: QueryOrchestratorConfig);
|
|
32
|
+
query(options: SearchOptions): Promise<OrchestratedResult[]>;
|
|
33
|
+
private fetchVectorResults;
|
|
34
|
+
private fetchGraphResults;
|
|
35
|
+
private calculateGraphScore;
|
|
36
|
+
private mergeLayerResults;
|
|
37
|
+
private applyAgenticLayer;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=query-orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-orchestrator.d.ts","sourceRoot":"","sources":["../../src/search/query-orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC7F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAO7D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;GAGG;AACH,qBAAa,iBAAiB;IAQ1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,eAAe;IARzB,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;gBAGhB,UAAU,EAAE,mBAAmB,EAC/B,eAAe,EAAE,eAAe,EACxC,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,WAAW,CAAC,EAAE,WAAW,EACzB,MAAM,CAAC,EAAE,uBAAuB;IAW5B,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAwBpD,kBAAkB;YAuClB,iBAAiB;IAyE/B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,iBAAiB;YA4DX,iBAAiB;CAgEhC"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { SemanticSearcher } from "./semantic-searcher.js";
|
|
2
|
+
import { HybridSearcher } from "./hybrid-searcher.js";
|
|
3
|
+
import { ReasoningReranker } from "./reasoning-reranker.js";
|
|
4
|
+
import { classifyQuery, getWeightsForQueryType } from "./query-classifier.js";
|
|
5
|
+
const DEFAULT_MAX_RESULTS = 20;
|
|
6
|
+
const DEFAULT_TIMEOUT_MS = 5000;
|
|
7
|
+
const GRAPH_CANDIDATE_LIMIT = 20;
|
|
8
|
+
/**
|
|
9
|
+
* Vector(FTS5/semantic/hybrid) + Graph(entity traversal) + Agentic(ReasoningReranker)
|
|
10
|
+
* の3層統合検索エンジン。
|
|
11
|
+
*/
|
|
12
|
+
export class QueryOrchestrator {
|
|
13
|
+
repository;
|
|
14
|
+
graphRepository;
|
|
15
|
+
semanticSearcher;
|
|
16
|
+
hybridSearcher;
|
|
17
|
+
agenticReranker;
|
|
18
|
+
maxResults;
|
|
19
|
+
timeoutMs;
|
|
20
|
+
constructor(repository, graphRepository, embeddingProvider, llmProvider, config) {
|
|
21
|
+
this.repository = repository;
|
|
22
|
+
this.graphRepository = graphRepository;
|
|
23
|
+
if (embeddingProvider) {
|
|
24
|
+
this.semanticSearcher = new SemanticSearcher(repository, embeddingProvider);
|
|
25
|
+
this.hybridSearcher = new HybridSearcher(repository, embeddingProvider);
|
|
26
|
+
}
|
|
27
|
+
this.agenticReranker = new ReasoningReranker(llmProvider, repository);
|
|
28
|
+
this.maxResults = config?.maxResults ?? DEFAULT_MAX_RESULTS;
|
|
29
|
+
this.timeoutMs = config?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
30
|
+
}
|
|
31
|
+
async query(options) {
|
|
32
|
+
const { query, limit = this.maxResults, mode = "keyword", includeDeprecated = false } = options;
|
|
33
|
+
if (!query) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
const queryType = classifyQuery(query);
|
|
37
|
+
const weights = getWeightsForQueryType(queryType);
|
|
38
|
+
// Step 1: Vector層 — FTS5 / semantic / hybrid
|
|
39
|
+
const vectorResults = await this.fetchVectorResults(query, limit, mode, includeDeprecated);
|
|
40
|
+
// Step 2: Graph層 — Vector層の上位候補から関連エンティティを取得し追加候補を生成
|
|
41
|
+
const graphEnhanced = await this.fetchGraphResults(vectorResults, query, weights.graph);
|
|
42
|
+
// Step 3: Agentic層 — LLMによるリランキング(タイムアウト制御あり)
|
|
43
|
+
const mergedResults = this.mergeLayerResults(vectorResults, graphEnhanced, weights);
|
|
44
|
+
const finalResults = await this.applyAgenticLayer(query, mergedResults, weights.agentic);
|
|
45
|
+
return finalResults.sort((a, b) => b.score - a.score).slice(0, limit);
|
|
46
|
+
}
|
|
47
|
+
async fetchVectorResults(query, limit, mode, includeDeprecated) {
|
|
48
|
+
try {
|
|
49
|
+
if (mode === "semantic" && this.semanticSearcher) {
|
|
50
|
+
return await this.semanticSearcher.search(query, limit);
|
|
51
|
+
}
|
|
52
|
+
if (mode === "hybrid" && this.hybridSearcher) {
|
|
53
|
+
return await this.hybridSearcher.search(query, limit);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// フォールバック: FTS5
|
|
58
|
+
}
|
|
59
|
+
// FTS5 keyword検索
|
|
60
|
+
const rows = this.repository.searchNotesWithRank(query, limit, includeDeprecated);
|
|
61
|
+
if (rows.length === 0) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
const rawRanks = rows.map((r) => Math.abs(r.rank));
|
|
65
|
+
const minRank = Math.min(...rawRanks);
|
|
66
|
+
const maxRank = Math.max(...rawRanks);
|
|
67
|
+
const range = maxRank - minRank;
|
|
68
|
+
return rows.map(({ note, rank }) => {
|
|
69
|
+
const normalized = range > 0 ? (Math.abs(rank) - minRank) / range : 1.0;
|
|
70
|
+
const score = 1 - normalized;
|
|
71
|
+
return {
|
|
72
|
+
note,
|
|
73
|
+
score,
|
|
74
|
+
matchReason: [`キーワード一致: "${query}"`],
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async fetchGraphResults(vectorResults, _query, graphWeight) {
|
|
79
|
+
const graphResultMap = new Map();
|
|
80
|
+
if (graphWeight === 0 || vectorResults.length === 0) {
|
|
81
|
+
return graphResultMap;
|
|
82
|
+
}
|
|
83
|
+
// Vector層の上位20件を使ってGraph探索
|
|
84
|
+
const topCandidates = vectorResults.slice(0, GRAPH_CANDIDATE_LIMIT);
|
|
85
|
+
const additionalNoteIds = new Set(topCandidates.map((r) => r.note.id));
|
|
86
|
+
for (const result of topCandidates) {
|
|
87
|
+
const noteId = result.note.id;
|
|
88
|
+
const linkedEntities = this.graphRepository.getLinkedEntities(noteId);
|
|
89
|
+
if (linkedEntities.length === 0)
|
|
90
|
+
continue;
|
|
91
|
+
// 関連エンティティを取得してgraphContextとして付与
|
|
92
|
+
const entityGraphs = [];
|
|
93
|
+
const linkedNoteIds = new Set();
|
|
94
|
+
for (const entity of linkedEntities) {
|
|
95
|
+
const entityGraph = this.graphRepository.getEntityWithGraph(entity.id);
|
|
96
|
+
if (entityGraph) {
|
|
97
|
+
entityGraphs.push(entityGraph);
|
|
98
|
+
// 関連エンティティに紐づく他のノートを候補に追加
|
|
99
|
+
for (const ln of entityGraph.linkedNotes) {
|
|
100
|
+
if (!additionalNoteIds.has(ln.noteId)) {
|
|
101
|
+
linkedNoteIds.add(ln.noteId);
|
|
102
|
+
additionalNoteIds.add(ln.noteId);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// 既存vectorResultに対してgraphContextを付与
|
|
108
|
+
if (entityGraphs.length > 0) {
|
|
109
|
+
const graphScore = this.calculateGraphScore(linkedEntities.length, entityGraphs);
|
|
110
|
+
graphResultMap.set(noteId, {
|
|
111
|
+
score: graphScore,
|
|
112
|
+
graphContext: entityGraphs,
|
|
113
|
+
matchReason: [`グラフ関連エンティティ数: ${linkedEntities.length}`],
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
// 関連ノートを新規候補として追加
|
|
117
|
+
for (const additionalNoteId of linkedNoteIds) {
|
|
118
|
+
if (!graphResultMap.has(additionalNoteId)) {
|
|
119
|
+
const note = this.repository.getNoteById(additionalNoteId);
|
|
120
|
+
if (note) {
|
|
121
|
+
const graphScore = 0.3; // 間接的な関連のスコア
|
|
122
|
+
graphResultMap.set(additionalNoteId, {
|
|
123
|
+
score: graphScore,
|
|
124
|
+
graphContext: entityGraphs,
|
|
125
|
+
matchReason: [`グラフ経由の関連ノート (entity: ${linkedEntities[0]?.name ?? ""})`],
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return graphResultMap;
|
|
132
|
+
}
|
|
133
|
+
calculateGraphScore(entityCount, entityGraphs) {
|
|
134
|
+
// エンティティ数と関係の強度に基づいてスコアを計算
|
|
135
|
+
const entityBonus = Math.min(entityCount * 0.1, 0.5);
|
|
136
|
+
const relationStrength = entityGraphs.reduce((sum, eg) => {
|
|
137
|
+
const outgoing = eg.outgoingRelations.reduce((s, r) => s + (r.strength ?? 1.0), 0);
|
|
138
|
+
const incoming = eg.incomingRelations.reduce((s, r) => s + (r.strength ?? 1.0), 0);
|
|
139
|
+
const count = eg.outgoingRelations.length + eg.incomingRelations.length;
|
|
140
|
+
return sum + (count > 0 ? (outgoing + incoming) / count : 0);
|
|
141
|
+
}, 0);
|
|
142
|
+
const avgRelationStrength = entityGraphs.length > 0 ? relationStrength / entityGraphs.length : 0;
|
|
143
|
+
return Math.min(entityBonus + avgRelationStrength * 0.3, 1.0);
|
|
144
|
+
}
|
|
145
|
+
mergeLayerResults(vectorResults, graphResultMap, weights) {
|
|
146
|
+
// vectorResultsを基本候補として使用
|
|
147
|
+
const noteMap = new Map();
|
|
148
|
+
for (const vr of vectorResults) {
|
|
149
|
+
const graphData = graphResultMap.get(vr.note.id);
|
|
150
|
+
const vectorScore = vr.score;
|
|
151
|
+
const graphScore = graphData?.score ?? 0;
|
|
152
|
+
// agenticは後で上書き、ここでは仮で0
|
|
153
|
+
const agenticScore = 0;
|
|
154
|
+
const finalScore = weights.vector * vectorScore + weights.graph * graphScore + weights.agentic * agenticScore;
|
|
155
|
+
noteMap.set(vr.note.id, {
|
|
156
|
+
note: vr.note,
|
|
157
|
+
score: finalScore,
|
|
158
|
+
layerScores: {
|
|
159
|
+
vector: vectorScore,
|
|
160
|
+
graph: graphScore,
|
|
161
|
+
agentic: agenticScore,
|
|
162
|
+
},
|
|
163
|
+
matchReason: [...vr.matchReason, ...(graphData?.matchReason ?? [])],
|
|
164
|
+
graphContext: graphData?.graphContext,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
// graphResultMapに含まれる新規ノート(vectorになかったもの)を追加
|
|
168
|
+
for (const [noteId, graphData] of graphResultMap) {
|
|
169
|
+
if (!noteMap.has(noteId)) {
|
|
170
|
+
const note = this.repository.getNoteById(noteId);
|
|
171
|
+
if (!note)
|
|
172
|
+
continue;
|
|
173
|
+
const graphScore = graphData.score;
|
|
174
|
+
const finalScore = weights.graph * graphScore;
|
|
175
|
+
noteMap.set(noteId, {
|
|
176
|
+
note,
|
|
177
|
+
score: finalScore,
|
|
178
|
+
layerScores: {
|
|
179
|
+
vector: 0,
|
|
180
|
+
graph: graphScore,
|
|
181
|
+
agentic: 0,
|
|
182
|
+
},
|
|
183
|
+
matchReason: graphData.matchReason,
|
|
184
|
+
graphContext: graphData.graphContext,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return Array.from(noteMap.values());
|
|
189
|
+
}
|
|
190
|
+
async applyAgenticLayer(query, candidates, agenticWeight) {
|
|
191
|
+
if (candidates.length === 0 || agenticWeight === 0) {
|
|
192
|
+
return candidates;
|
|
193
|
+
}
|
|
194
|
+
// SearchResult形式に変換してReasoningRerankerに渡す
|
|
195
|
+
const searchResults = candidates.map((c) => ({
|
|
196
|
+
note: c.note,
|
|
197
|
+
score: c.score,
|
|
198
|
+
matchReason: c.matchReason,
|
|
199
|
+
}));
|
|
200
|
+
// タイムアウト制御: LLMが遅延した場合はVector+Graphのみで返却
|
|
201
|
+
const rerankedPromise = this.agenticReranker.rerank(query, searchResults);
|
|
202
|
+
const timeoutPromise = new Promise((resolve) => setTimeout(() => resolve(null), this.timeoutMs));
|
|
203
|
+
const reranked = await Promise.race([rerankedPromise, timeoutPromise]);
|
|
204
|
+
if (reranked === null) {
|
|
205
|
+
// タイムアウト: agenticScoreなしで返却
|
|
206
|
+
return candidates;
|
|
207
|
+
}
|
|
208
|
+
// rerankedのスコアをagenticScoreとして候補にマージ
|
|
209
|
+
const rerankedMap = new Map(reranked.map((r) => [r.note.id, r]));
|
|
210
|
+
return candidates.map((candidate) => {
|
|
211
|
+
const rerankedResult = rerankedMap.get(candidate.note.id);
|
|
212
|
+
if (!rerankedResult) {
|
|
213
|
+
return candidate;
|
|
214
|
+
}
|
|
215
|
+
const agenticScore = rerankedResult.score;
|
|
216
|
+
const vectorScore = candidate.layerScores["vector"] ?? 0;
|
|
217
|
+
const graphScore = candidate.layerScores["graph"] ?? 0;
|
|
218
|
+
// mergeLayerResultsで計算済みのvector+graphスコアにagenticを加算
|
|
219
|
+
// finalScore = w_v * vectorScore + w_g * graphScore + w_a * agenticScore
|
|
220
|
+
// candidateのscoreはすでに w_v * vectorScore + w_g * graphScore (agentic=0で計算済み)
|
|
221
|
+
// なのでagenticScore分を追加する
|
|
222
|
+
const finalScore = candidate.score + agenticWeight * agenticScore;
|
|
223
|
+
const agenticReasons = rerankedResult.reasoning
|
|
224
|
+
? [`LLM推論: ${rerankedResult.reasoning}`]
|
|
225
|
+
: [];
|
|
226
|
+
return {
|
|
227
|
+
...candidate,
|
|
228
|
+
score: finalScore,
|
|
229
|
+
layerScores: {
|
|
230
|
+
vector: vectorScore,
|
|
231
|
+
graph: graphScore,
|
|
232
|
+
agentic: agenticScore,
|
|
233
|
+
},
|
|
234
|
+
matchReason: [...candidate.matchReason, ...agenticReasons],
|
|
235
|
+
};
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=query-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-orchestrator.js","sourceRoot":"","sources":["../../src/search/query-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { LLMProvider } from "../llm/types.js";
|
|
2
|
+
import type { KnowledgeRepository, KnowledgeNote } from "../storage/knowledge-repository.js";
|
|
3
|
+
import type { SearchResult } from "./knowledge-searcher.js";
|
|
4
|
+
export interface RerankOptions {
|
|
5
|
+
maxCandidates?: number;
|
|
6
|
+
maxResults?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface RerankedResult {
|
|
9
|
+
note: KnowledgeNote;
|
|
10
|
+
score: number;
|
|
11
|
+
originalScore: number;
|
|
12
|
+
matchReason: string[];
|
|
13
|
+
reasoning?: string;
|
|
14
|
+
axes: {
|
|
15
|
+
temporal: number;
|
|
16
|
+
contextRelevance: number;
|
|
17
|
+
pspQuality: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface RerankInput {
|
|
21
|
+
note: KnowledgeNote;
|
|
22
|
+
baseScore: number;
|
|
23
|
+
matchReason: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface AxisScores {
|
|
26
|
+
temporal: number;
|
|
27
|
+
context: number;
|
|
28
|
+
psp: number;
|
|
29
|
+
}
|
|
30
|
+
export interface RerankResult {
|
|
31
|
+
note: KnowledgeNote;
|
|
32
|
+
baseScore: number;
|
|
33
|
+
scores: AxisScores;
|
|
34
|
+
finalScore: number;
|
|
35
|
+
matchReason: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface RerankerWeights {
|
|
38
|
+
temporalWeight?: number;
|
|
39
|
+
contextWeight?: number;
|
|
40
|
+
pspWeight?: number;
|
|
41
|
+
}
|
|
42
|
+
export declare class ReasoningReranker {
|
|
43
|
+
private llmProvider;
|
|
44
|
+
private repository;
|
|
45
|
+
private _legacyWeights?;
|
|
46
|
+
constructor(llmProvider: LLMProvider | undefined, repository: KnowledgeRepository, _legacyWeights?: RerankerWeights | undefined);
|
|
47
|
+
/**
|
|
48
|
+
* 新API: LLMベースのリランキング
|
|
49
|
+
*/
|
|
50
|
+
rerank(query: string, candidates: SearchResult[], options?: RerankOptions): Promise<RerankedResult[]>;
|
|
51
|
+
/**
|
|
52
|
+
* 旧API後方互換: RerankInput[] を受け取り RerankResult[] を返す
|
|
53
|
+
* KnowledgeSearcher が既存実装で呼んでいる形式
|
|
54
|
+
*/
|
|
55
|
+
rerankLegacy(inputs: RerankInput[], options: {
|
|
56
|
+
query: string;
|
|
57
|
+
}): Promise<RerankResult[]>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=reasoning-reranker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-reranker.d.ts","sourceRoot":"","sources":["../../src/search/reasoning-reranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAID,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8JD,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,UAAU;IAElB,OAAO,CAAC,cAAc,CAAC;gBAHf,WAAW,EAAE,WAAW,GAAG,SAAS,EACpC,UAAU,EAAE,mBAAmB,EAE/B,cAAc,CAAC,EAAE,eAAe,YAAA;IAG1C;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,YAAY,EAAE,EAC1B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,cAAc,EAAE,CAAC;IAwG5B;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CA0C/F"}
|