@eucoder/rag 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.
Files changed (103) hide show
  1. package/README.md +384 -0
  2. package/dist/ab-testing.d.ts +52 -0
  3. package/dist/ab-testing.d.ts.map +1 -0
  4. package/dist/ab-testing.js +144 -0
  5. package/dist/ab-testing.js.map +1 -0
  6. package/dist/ab-testing.test.d.ts +2 -0
  7. package/dist/ab-testing.test.d.ts.map +1 -0
  8. package/dist/ab-testing.test.js +147 -0
  9. package/dist/ab-testing.test.js.map +1 -0
  10. package/dist/agentic-rag.d.ts +23 -0
  11. package/dist/agentic-rag.d.ts.map +1 -0
  12. package/dist/agentic-rag.js +170 -0
  13. package/dist/agentic-rag.js.map +1 -0
  14. package/dist/agentic-rag.test.d.ts +2 -0
  15. package/dist/agentic-rag.test.d.ts.map +1 -0
  16. package/dist/agentic-rag.test.js +174 -0
  17. package/dist/agentic-rag.test.js.map +1 -0
  18. package/dist/corrective-rag.d.ts +16 -0
  19. package/dist/corrective-rag.d.ts.map +1 -0
  20. package/dist/corrective-rag.js +85 -0
  21. package/dist/corrective-rag.js.map +1 -0
  22. package/dist/corrective-rag.test.d.ts +2 -0
  23. package/dist/corrective-rag.test.d.ts.map +1 -0
  24. package/dist/corrective-rag.test.js +140 -0
  25. package/dist/corrective-rag.test.js.map +1 -0
  26. package/dist/feedback.d.ts +77 -0
  27. package/dist/feedback.d.ts.map +1 -0
  28. package/dist/feedback.js +44 -0
  29. package/dist/feedback.js.map +1 -0
  30. package/dist/feedback.test.d.ts +2 -0
  31. package/dist/feedback.test.d.ts.map +1 -0
  32. package/dist/feedback.test.js +202 -0
  33. package/dist/feedback.test.js.map +1 -0
  34. package/dist/hybrid-search.d.ts +14 -0
  35. package/dist/hybrid-search.d.ts.map +1 -0
  36. package/dist/hybrid-search.js +70 -0
  37. package/dist/hybrid-search.js.map +1 -0
  38. package/dist/hybrid-search.test.d.ts +2 -0
  39. package/dist/hybrid-search.test.d.ts.map +1 -0
  40. package/dist/hybrid-search.test.js +93 -0
  41. package/dist/hybrid-search.test.js.map +1 -0
  42. package/dist/index.d.ts +17 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +12 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/knowledge-graph.d.ts +24 -0
  47. package/dist/knowledge-graph.d.ts.map +1 -0
  48. package/dist/knowledge-graph.js +131 -0
  49. package/dist/knowledge-graph.js.map +1 -0
  50. package/dist/knowledge-graph.test.d.ts +2 -0
  51. package/dist/knowledge-graph.test.d.ts.map +1 -0
  52. package/dist/knowledge-graph.test.js +140 -0
  53. package/dist/knowledge-graph.test.js.map +1 -0
  54. package/dist/llm-grader.d.ts +19 -0
  55. package/dist/llm-grader.d.ts.map +1 -0
  56. package/dist/llm-grader.js +63 -0
  57. package/dist/llm-grader.js.map +1 -0
  58. package/dist/metrics.d.ts +26 -0
  59. package/dist/metrics.d.ts.map +1 -0
  60. package/dist/metrics.js +100 -0
  61. package/dist/metrics.js.map +1 -0
  62. package/dist/optimizer.d.ts +52 -0
  63. package/dist/optimizer.d.ts.map +1 -0
  64. package/dist/optimizer.js +228 -0
  65. package/dist/optimizer.js.map +1 -0
  66. package/dist/optimizer.test.d.ts +2 -0
  67. package/dist/optimizer.test.d.ts.map +1 -0
  68. package/dist/optimizer.test.js +201 -0
  69. package/dist/optimizer.test.js.map +1 -0
  70. package/dist/self-improving.d.ts +85 -0
  71. package/dist/self-improving.d.ts.map +1 -0
  72. package/dist/self-improving.js +163 -0
  73. package/dist/self-improving.js.map +1 -0
  74. package/dist/self-improving.test.d.ts +2 -0
  75. package/dist/self-improving.test.d.ts.map +1 -0
  76. package/dist/self-improving.test.js +234 -0
  77. package/dist/self-improving.test.js.map +1 -0
  78. package/dist/types.d.ts +117 -0
  79. package/dist/types.d.ts.map +1 -0
  80. package/dist/types.js +2 -0
  81. package/dist/types.js.map +1 -0
  82. package/package.json +42 -0
  83. package/src/ab-testing.test.ts +239 -0
  84. package/src/ab-testing.ts +214 -0
  85. package/src/agentic-rag.test.ts +201 -0
  86. package/src/agentic-rag.ts +220 -0
  87. package/src/corrective-rag.test.ts +166 -0
  88. package/src/corrective-rag.ts +115 -0
  89. package/src/feedback.test.ts +227 -0
  90. package/src/feedback.ts +118 -0
  91. package/src/hybrid-search.test.ts +107 -0
  92. package/src/hybrid-search.ts +86 -0
  93. package/src/index.ts +57 -0
  94. package/src/knowledge-graph.test.ts +170 -0
  95. package/src/knowledge-graph.ts +182 -0
  96. package/src/llm-grader.ts +69 -0
  97. package/src/metrics.ts +121 -0
  98. package/src/optimizer.test.ts +232 -0
  99. package/src/optimizer.ts +307 -0
  100. package/src/self-improving.test.ts +341 -0
  101. package/src/self-improving.ts +239 -0
  102. package/src/types.ts +139 -0
  103. package/tsconfig.json +9 -0
@@ -0,0 +1,85 @@
1
+ const DEFAULT_MAX_REWRITES = 1;
2
+ const DEFAULT_MIN_GOOD_HITS = 2;
3
+ const DEFAULT_MIN_SCORE = 0.3;
4
+ const DEFAULT_TOP_K = 8;
5
+ export class CorrectiveRag {
6
+ retriever;
7
+ grader;
8
+ rewriter;
9
+ maxRewrites;
10
+ minGoodHits;
11
+ minScore;
12
+ webFallback;
13
+ constructor(options) {
14
+ this.retriever = options.retriever;
15
+ this.grader = options.grader;
16
+ this.rewriter = options.rewriter;
17
+ this.maxRewrites = options.maxRewrites ?? DEFAULT_MAX_REWRITES;
18
+ this.minGoodHits = options.minGoodHits ?? DEFAULT_MIN_GOOD_HITS;
19
+ this.minScore = options.minScore ?? DEFAULT_MIN_SCORE;
20
+ this.webFallback = options.webFallback;
21
+ }
22
+ async answer(query) {
23
+ const steps = [];
24
+ let currentQuery = query;
25
+ let rewrites = 0;
26
+ steps.push(`Initial query: "${query}"`);
27
+ let hits = await this.retriever.search(currentQuery, DEFAULT_TOP_K);
28
+ steps.push(`Retrieved ${hits.length} candidates`);
29
+ let goodHits = await this.gradeHits(currentQuery, hits);
30
+ steps.push(`Graded: ${goodHits.length} relevant hits (min score: ${this.minScore})`);
31
+ while (goodHits.length < this.minGoodHits && rewrites < this.maxRewrites) {
32
+ rewrites++;
33
+ steps.push(`Rewriting query (attempt ${rewrites}/${this.maxRewrites})`);
34
+ const context = goodHits.map((h) => h.text).join("\n");
35
+ currentQuery = await this.rewriter.rewrite(currentQuery, context);
36
+ steps.push(`Rewritten query: "${currentQuery}"`);
37
+ hits = await this.retriever.search(currentQuery, DEFAULT_TOP_K);
38
+ steps.push(`Retrieved ${hits.length} candidates after rewrite`);
39
+ goodHits = await this.gradeHits(currentQuery, hits);
40
+ steps.push(`Graded: ${goodHits.length} relevant hits`);
41
+ }
42
+ if (goodHits.length < this.minGoodHits && this.webFallback) {
43
+ steps.push(`Falling back to web search`);
44
+ const webHits = await this.webFallback(currentQuery);
45
+ goodHits = [...goodHits, ...webHits];
46
+ steps.push(`Added ${webHits.length} web results`);
47
+ }
48
+ const citations = goodHits.map((hit) => ({
49
+ path: hit.path,
50
+ startLine: hit.startLine,
51
+ endLine: hit.endLine,
52
+ text: hit.text,
53
+ }));
54
+ const text = this.formatAnswer(currentQuery, goodHits);
55
+ return {
56
+ text,
57
+ citations,
58
+ steps,
59
+ rewrites,
60
+ };
61
+ }
62
+ async gradeHits(query, hits) {
63
+ const graded = await Promise.all(hits.map(async (hit) => {
64
+ const result = await this.grader.grade(query, hit);
65
+ return { hit, result };
66
+ }));
67
+ return graded
68
+ .filter(({ result }) => result.relevant && result.score >= this.minScore)
69
+ .map(({ hit }) => hit);
70
+ }
71
+ formatAnswer(query, hits) {
72
+ if (hits.length === 0) {
73
+ return `No relevant results found for: "${query}"`;
74
+ }
75
+ const sections = hits.map((hit, i) => {
76
+ const location = `${hit.path}:${hit.startLine}-${hit.endLine}`;
77
+ return `## Result ${i + 1} (${location})\n\n${hit.text}`;
78
+ });
79
+ return sections.join("\n\n---\n\n");
80
+ }
81
+ }
82
+ export function createCorrectiveRag(options) {
83
+ return new CorrectiveRag(options);
84
+ }
85
+ //# sourceMappingURL=corrective-rag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corrective-rag.js","sourceRoot":"","sources":["../src/corrective-rag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=corrective-rag.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corrective-rag.test.d.ts","sourceRoot":"","sources":["../src/corrective-rag.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,140 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { CorrectiveRag } from "./corrective-rag.js";
3
+ class MockRetriever {
4
+ hits;
5
+ constructor(hits) {
6
+ this.hits = hits;
7
+ }
8
+ async search(_query, _topK) {
9
+ return this.hits;
10
+ }
11
+ }
12
+ class MockGrader {
13
+ relevantIds;
14
+ constructor(relevantIds) {
15
+ this.relevantIds = relevantIds;
16
+ }
17
+ async grade(_query, hit) {
18
+ const relevant = this.relevantIds.has(hit.id);
19
+ return {
20
+ relevant,
21
+ score: relevant ? 0.9 : 0.1,
22
+ };
23
+ }
24
+ }
25
+ class MockRewriter {
26
+ async rewrite(query, _context) {
27
+ return `${query} (rewritten)`;
28
+ }
29
+ }
30
+ function createHit(id, path, text) {
31
+ return {
32
+ id,
33
+ path,
34
+ startLine: 1,
35
+ endLine: 10,
36
+ text,
37
+ score: 0.5,
38
+ };
39
+ }
40
+ describe("CorrectiveRag", () => {
41
+ it("returns relevant hits without rewriting when enough good hits", async () => {
42
+ const hits = [
43
+ createHit("1", "src/auth.ts", "function login() { ... }"),
44
+ createHit("2", "src/auth.ts", "function logout() { ... }"),
45
+ createHit("3", "src/billing.ts", "function charge() { ... }"),
46
+ ];
47
+ const rag = new CorrectiveRag({
48
+ retriever: new MockRetriever(hits),
49
+ grader: new MockGrader(new Set(["1", "2"])),
50
+ rewriter: new MockRewriter(),
51
+ minGoodHits: 2,
52
+ });
53
+ const result = await rag.answer("authentication");
54
+ expect(result.citations).toHaveLength(2);
55
+ expect(result.rewrites).toBe(0);
56
+ expect(result.steps).toContain("Initial query: \"authentication\"");
57
+ });
58
+ it("rewrites query when not enough relevant hits", async () => {
59
+ const hits = [
60
+ createHit("1", "src/auth.ts", "function login() { ... }"),
61
+ createHit("2", "src/billing.ts", "function charge() { ... }"),
62
+ ];
63
+ const rag = new CorrectiveRag({
64
+ retriever: new MockRetriever(hits),
65
+ grader: new MockGrader(new Set(["1"])),
66
+ rewriter: new MockRewriter(),
67
+ minGoodHits: 2,
68
+ maxRewrites: 1,
69
+ });
70
+ const result = await rag.answer("authentication");
71
+ expect(result.rewrites).toBe(1);
72
+ expect(result.steps.some((s) => s.includes("Rewriting query"))).toBe(true);
73
+ });
74
+ it("respects maxRewrites limit", async () => {
75
+ const hits = [
76
+ createHit("1", "src/billing.ts", "function charge() { ... }"),
77
+ ];
78
+ const rag = new CorrectiveRag({
79
+ retriever: new MockRetriever(hits),
80
+ grader: new MockGrader(new Set()),
81
+ rewriter: new MockRewriter(),
82
+ minGoodHits: 2,
83
+ maxRewrites: 2,
84
+ });
85
+ const result = await rag.answer("authentication");
86
+ expect(result.rewrites).toBe(2);
87
+ });
88
+ it("formats answer with citations", async () => {
89
+ const hits = [
90
+ createHit("1", "src/auth.ts", "function login() { return true; }"),
91
+ createHit("2", "src/auth.ts", "function logout() { return false; }"),
92
+ ];
93
+ const rag = new CorrectiveRag({
94
+ retriever: new MockRetriever(hits),
95
+ grader: new MockGrader(new Set(["1", "2"])),
96
+ rewriter: new MockRewriter(),
97
+ minGoodHits: 2,
98
+ });
99
+ const result = await rag.answer("authentication");
100
+ expect(result.text).toContain("src/auth.ts:1-10");
101
+ expect(result.citations).toHaveLength(2);
102
+ expect(result.citations[0].path).toBe("src/auth.ts");
103
+ });
104
+ it("returns empty answer when no relevant hits found", async () => {
105
+ const hits = [
106
+ createHit("1", "src/billing.ts", "function charge() { ... }"),
107
+ ];
108
+ const rag = new CorrectiveRag({
109
+ retriever: new MockRetriever(hits),
110
+ grader: new MockGrader(new Set()),
111
+ rewriter: new MockRewriter(),
112
+ minGoodHits: 1,
113
+ maxRewrites: 0,
114
+ });
115
+ const result = await rag.answer("authentication");
116
+ expect(result.citations).toHaveLength(0);
117
+ expect(result.text).toContain("No relevant results found");
118
+ });
119
+ it("uses web fallback when configured", async () => {
120
+ const hits = [
121
+ createHit("1", "src/billing.ts", "function charge() { ... }"),
122
+ ];
123
+ const webHits = [
124
+ createHit("web1", "https://example.com", "Web result about auth"),
125
+ ];
126
+ const rag = new CorrectiveRag({
127
+ retriever: new MockRetriever(hits),
128
+ grader: new MockGrader(new Set()),
129
+ rewriter: new MockRewriter(),
130
+ minGoodHits: 1,
131
+ maxRewrites: 0,
132
+ webFallback: async (_query) => webHits,
133
+ });
134
+ const result = await rag.answer("authentication");
135
+ expect(result.citations).toHaveLength(1);
136
+ expect(result.citations[0].path).toBe("https://example.com");
137
+ expect(result.steps.some((s) => s.includes("Falling back to web search"))).toBe(true);
138
+ });
139
+ });
140
+ //# sourceMappingURL=corrective-rag.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corrective-rag.test.js","sourceRoot":"","sources":["../src/corrective-rag.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { RagAnswer } from "./types.js";
2
+ /**
3
+ * Feedback per una risposta RAG
4
+ */
5
+ export interface RagFeedback {
6
+ id: string;
7
+ query: string;
8
+ answer: RagAnswer;
9
+ rating: number;
10
+ relevance: number;
11
+ completeness: number;
12
+ citationsQuality: number;
13
+ comments?: string;
14
+ timestamp: Date;
15
+ strategy?: string;
16
+ }
17
+ /**
18
+ * Metriche aggregate per una strategia RAG
19
+ */
20
+ export interface RagMetrics {
21
+ strategy: string;
22
+ totalQueries: number;
23
+ averageRating: number;
24
+ averageRelevance: number;
25
+ averageCompleteness: number;
26
+ averageCitationsQuality: number;
27
+ overallScore: number;
28
+ confidence: number;
29
+ }
30
+ /**
31
+ * Risultato A/B test
32
+ */
33
+ export interface ABTestResult {
34
+ strategyA: string;
35
+ strategyB: string;
36
+ winner: "A" | "B" | "tie";
37
+ metricsA: RagMetrics;
38
+ metricsB: RagMetrics;
39
+ improvement: number;
40
+ statisticalSignificance: number;
41
+ recommendation: string;
42
+ }
43
+ /**
44
+ * Suggerimento di ottimizzazione
45
+ */
46
+ export interface OptimizationSuggestion {
47
+ type: "parameter" | "strategy" | "prompt";
48
+ target: string;
49
+ current: unknown;
50
+ suggested: unknown;
51
+ expectedImprovement: number;
52
+ confidence: number;
53
+ reasoning: string;
54
+ }
55
+ /**
56
+ * Storage per feedback e metriche
57
+ */
58
+ export interface FeedbackStorage {
59
+ saveFeedback(feedback: RagFeedback): Promise<void>;
60
+ getFeedback(strategy?: string, limit?: number): Promise<RagFeedback[]>;
61
+ getMetrics(strategy: string): Promise<RagMetrics | null>;
62
+ saveMetrics(metrics: RagMetrics): Promise<void>;
63
+ clearFeedback(strategy?: string): Promise<void>;
64
+ }
65
+ /**
66
+ * In-memory implementation di FeedbackStorage
67
+ */
68
+ export declare class InMemoryFeedbackStorage implements FeedbackStorage {
69
+ private feedbacks;
70
+ private metrics;
71
+ saveFeedback(feedback: RagFeedback): Promise<void>;
72
+ getFeedback(strategy?: string, limit?: number): Promise<RagFeedback[]>;
73
+ getMetrics(strategy: string): Promise<RagMetrics | null>;
74
+ saveMetrics(metrics: RagMetrics): Promise<void>;
75
+ clearFeedback(strategy?: string): Promise<void>;
76
+ }
77
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uBAAuB,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;IAC1B,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,UAAU,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB,EAAE,MAAM,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACzD,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,OAAO,CAAsC;IAE/C,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlD,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAetE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIxD,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAStD"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * In-memory implementation di FeedbackStorage
3
+ */
4
+ export class InMemoryFeedbackStorage {
5
+ feedbacks = new Map();
6
+ metrics = new Map();
7
+ async saveFeedback(feedback) {
8
+ const strategy = feedback.strategy || "default";
9
+ if (!this.feedbacks.has(strategy)) {
10
+ this.feedbacks.set(strategy, []);
11
+ }
12
+ this.feedbacks.get(strategy).push(feedback);
13
+ }
14
+ async getFeedback(strategy, limit) {
15
+ if (strategy) {
16
+ const feedbacks = this.feedbacks.get(strategy) || [];
17
+ return limit ? feedbacks.slice(-limit) : feedbacks;
18
+ }
19
+ // Tutti i feedback
20
+ const all = [];
21
+ for (const feedbacks of this.feedbacks.values()) {
22
+ all.push(...feedbacks);
23
+ }
24
+ all.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
25
+ return limit ? all.slice(-limit) : all;
26
+ }
27
+ async getMetrics(strategy) {
28
+ return this.metrics.get(strategy) || null;
29
+ }
30
+ async saveMetrics(metrics) {
31
+ this.metrics.set(metrics.strategy, metrics);
32
+ }
33
+ async clearFeedback(strategy) {
34
+ if (strategy) {
35
+ this.feedbacks.delete(strategy);
36
+ this.metrics.delete(strategy);
37
+ }
38
+ else {
39
+ this.feedbacks.clear();
40
+ this.metrics.clear();
41
+ }
42
+ }
43
+ }
44
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAsEA;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAC1B,SAAS,GAA+B,IAAI,GAAG,EAAE,CAAC;IAClD,OAAO,GAA4B,IAAI,GAAG,EAAE,CAAC;IAErD,KAAK,CAAC,YAAY,CAAC,QAAqB;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAiB,EAAE,KAAc;QACjD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrD,CAAC;QAED,mBAAmB;QACnB,MAAM,GAAG,GAAkB,EAAE,CAAC;QAC9B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAChD,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QACzB,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAmB;QACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAiB;QACnC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=feedback.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.test.d.ts","sourceRoot":"","sources":["../src/feedback.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,202 @@
1
+ import { describe, it, expect, beforeEach } from "vitest";
2
+ import { InMemoryFeedbackStorage } from "./feedback.js";
3
+ import { MetricsCalculator } from "./metrics.js";
4
+ describe("InMemoryFeedbackStorage", () => {
5
+ let storage;
6
+ beforeEach(() => {
7
+ storage = new InMemoryFeedbackStorage();
8
+ });
9
+ it("should save and retrieve feedback", async () => {
10
+ const feedback = {
11
+ id: "test-1",
12
+ query: "test query",
13
+ answer: {
14
+ text: "test answer",
15
+ citations: [],
16
+ steps: [],
17
+ rewrites: 0,
18
+ },
19
+ rating: 4,
20
+ relevance: 0.8,
21
+ completeness: 0.7,
22
+ citationsQuality: 0.9,
23
+ timestamp: new Date(),
24
+ strategy: "strategy-a",
25
+ };
26
+ await storage.saveFeedback(feedback);
27
+ const retrieved = await storage.getFeedback("strategy-a");
28
+ expect(retrieved).toHaveLength(1);
29
+ expect(retrieved[0]?.id).toBe("test-1");
30
+ });
31
+ it("should filter feedback by strategy", async () => {
32
+ const feedback1 = {
33
+ id: "test-1",
34
+ query: "query 1",
35
+ answer: { text: "answer 1", citations: [], steps: [], rewrites: 0 },
36
+ rating: 4,
37
+ relevance: 0.8,
38
+ completeness: 0.7,
39
+ citationsQuality: 0.9,
40
+ timestamp: new Date(),
41
+ strategy: "strategy-a",
42
+ };
43
+ const feedback2 = {
44
+ id: "test-2",
45
+ query: "query 2",
46
+ answer: { text: "answer 2", citations: [], steps: [], rewrites: 0 },
47
+ rating: 5,
48
+ relevance: 0.9,
49
+ completeness: 0.8,
50
+ citationsQuality: 0.95,
51
+ timestamp: new Date(),
52
+ strategy: "strategy-b",
53
+ };
54
+ await storage.saveFeedback(feedback1);
55
+ await storage.saveFeedback(feedback2);
56
+ const retrievedA = await storage.getFeedback("strategy-a");
57
+ const retrievedB = await storage.getFeedback("strategy-b");
58
+ expect(retrievedA).toHaveLength(1);
59
+ expect(retrievedB).toHaveLength(1);
60
+ expect(retrievedA[0]?.strategy).toBe("strategy-a");
61
+ expect(retrievedB[0]?.strategy).toBe("strategy-b");
62
+ });
63
+ it("should limit feedback results", async () => {
64
+ for (let i = 0; i < 10; i++) {
65
+ await storage.saveFeedback({
66
+ id: `test-${i}`,
67
+ query: `query ${i}`,
68
+ answer: { text: `answer ${i}`, citations: [], steps: [], rewrites: 0 },
69
+ rating: 4,
70
+ relevance: 0.8,
71
+ completeness: 0.7,
72
+ citationsQuality: 0.9,
73
+ timestamp: new Date(),
74
+ strategy: "strategy-a",
75
+ });
76
+ }
77
+ const retrieved = await storage.getFeedback("strategy-a", 5);
78
+ expect(retrieved).toHaveLength(5);
79
+ });
80
+ it("should clear feedback", async () => {
81
+ await storage.saveFeedback({
82
+ id: "test-1",
83
+ query: "query 1",
84
+ answer: { text: "answer 1", citations: [], steps: [], rewrites: 0 },
85
+ rating: 4,
86
+ relevance: 0.8,
87
+ completeness: 0.7,
88
+ citationsQuality: 0.9,
89
+ timestamp: new Date(),
90
+ strategy: "strategy-a",
91
+ });
92
+ await storage.clearFeedback("strategy-a");
93
+ const retrieved = await storage.getFeedback("strategy-a");
94
+ expect(retrieved).toHaveLength(0);
95
+ });
96
+ });
97
+ describe("MetricsCalculator", () => {
98
+ it("should calculate metrics from feedback", () => {
99
+ const feedbacks = [
100
+ {
101
+ id: "test-1",
102
+ query: "query 1",
103
+ answer: { text: "answer 1", citations: [], steps: [], rewrites: 0 },
104
+ rating: 4,
105
+ relevance: 0.8,
106
+ completeness: 0.7,
107
+ citationsQuality: 0.9,
108
+ timestamp: new Date(),
109
+ strategy: "strategy-a",
110
+ },
111
+ {
112
+ id: "test-2",
113
+ query: "query 2",
114
+ answer: { text: "answer 2", citations: [], steps: [], rewrites: 0 },
115
+ rating: 5,
116
+ relevance: 0.9,
117
+ completeness: 0.8,
118
+ citationsQuality: 0.95,
119
+ timestamp: new Date(),
120
+ strategy: "strategy-a",
121
+ },
122
+ ];
123
+ const metrics = MetricsCalculator.calculateMetrics(feedbacks, "strategy-a");
124
+ expect(metrics.strategy).toBe("strategy-a");
125
+ expect(metrics.totalQueries).toBe(2);
126
+ expect(metrics.averageRating).toBe(4.5);
127
+ expect(metrics.averageRelevance).toBeCloseTo(0.85, 10);
128
+ expect(metrics.averageCompleteness).toBeCloseTo(0.75, 10);
129
+ expect(metrics.averageCitationsQuality).toBeCloseTo(0.925, 10);
130
+ expect(metrics.overallScore).toBeGreaterThan(0);
131
+ expect(metrics.confidence).toBeGreaterThan(0);
132
+ });
133
+ it("should return zero metrics for empty feedback", () => {
134
+ const metrics = MetricsCalculator.calculateMetrics([], "strategy-a");
135
+ expect(metrics.totalQueries).toBe(0);
136
+ expect(metrics.averageRating).toBe(0);
137
+ expect(metrics.overallScore).toBe(0);
138
+ expect(metrics.confidence).toBe(0);
139
+ });
140
+ it("should calculate standard deviation", () => {
141
+ const feedbacks = [
142
+ {
143
+ id: "test-1",
144
+ query: "query 1",
145
+ answer: { text: "answer 1", citations: [], steps: [], rewrites: 0 },
146
+ rating: 3,
147
+ relevance: 0.6,
148
+ completeness: 0.5,
149
+ citationsQuality: 0.7,
150
+ timestamp: new Date(),
151
+ strategy: "strategy-a",
152
+ },
153
+ {
154
+ id: "test-2",
155
+ query: "query 2",
156
+ answer: { text: "answer 2", citations: [], steps: [], rewrites: 0 },
157
+ rating: 5,
158
+ relevance: 0.9,
159
+ completeness: 0.8,
160
+ citationsQuality: 0.95,
161
+ timestamp: new Date(),
162
+ strategy: "strategy-a",
163
+ },
164
+ ];
165
+ const stdDev = MetricsCalculator.calculateStandardDeviation(feedbacks, "relevance");
166
+ expect(stdDev).toBeGreaterThan(0);
167
+ });
168
+ it("should identify trend", () => {
169
+ const feedbacks = [];
170
+ // Older feedback with lower relevance
171
+ for (let i = 0; i < 10; i++) {
172
+ feedbacks.push({
173
+ id: `old-${i}`,
174
+ query: `query ${i}`,
175
+ answer: { text: `answer ${i}`, citations: [], steps: [], rewrites: 0 },
176
+ rating: 3,
177
+ relevance: 0.5,
178
+ completeness: 0.5,
179
+ citationsQuality: 0.5,
180
+ timestamp: new Date(Date.now() - 1000000),
181
+ strategy: "strategy-a",
182
+ });
183
+ }
184
+ // Recent feedback with higher relevance
185
+ for (let i = 0; i < 10; i++) {
186
+ feedbacks.push({
187
+ id: `new-${i}`,
188
+ query: `query ${i}`,
189
+ answer: { text: `answer ${i}`, citations: [], steps: [], rewrites: 0 },
190
+ rating: 5,
191
+ relevance: 0.9,
192
+ completeness: 0.9,
193
+ citationsQuality: 0.9,
194
+ timestamp: new Date(),
195
+ strategy: "strategy-a",
196
+ });
197
+ }
198
+ const trend = MetricsCalculator.identifyTrend(feedbacks, 10);
199
+ expect(trend).toBe("improving");
200
+ });
201
+ });
202
+ //# sourceMappingURL=feedback.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.test.js","sourceRoot":"","sources":["../src/feedback.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { HybridSearchOptions, HybridSearchResult } from "./types.js";
2
+ /**
3
+ * Hybrid Search RAG - Combina semantic search e keyword search usando RRF (Reciprocal Rank Fusion)
4
+ *
5
+ * RRF Formula: score(d) = Σ 1/(k + rank_i(d))
6
+ * dove k è una costante (tipicamente 60) e rank_i è la posizione del documento nella lista i
7
+ */
8
+ export declare class HybridSearchRag {
9
+ private options;
10
+ constructor(options: HybridSearchOptions);
11
+ search(query: string, topK?: number): Promise<HybridSearchResult>;
12
+ private reciprocalRankFusion;
13
+ }
14
+ //# sourceMappingURL=hybrid-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-search.d.ts","sourceRoot":"","sources":["../src/hybrid-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE1E;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAgC;gBAEnC,OAAO,EAAE,mBAAmB;IAUlC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuBvE,OAAO,CAAC,oBAAoB;CAwC7B"}