@absolutejs/absolute 0.19.0-beta.531 → 0.19.0-beta.532

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.
@@ -1256,6 +1256,20 @@ export type RAGRerankerCandidate = {
1256
1256
  label?: string;
1257
1257
  rerank?: RAGRerankerProviderLike;
1258
1258
  };
1259
+ export type RAGRetrievalTraceComparisonSummary = {
1260
+ totalCases: number;
1261
+ modes: RAGHybridRetrievalMode[];
1262
+ vectorCases: number;
1263
+ lexicalCases: number;
1264
+ transformedCases: number;
1265
+ variantCases: number;
1266
+ averageFinalCount: number;
1267
+ averageVectorCount: number;
1268
+ averageLexicalCount: number;
1269
+ averageCandidateTopK: number;
1270
+ averageLexicalTopK: number;
1271
+ stageCounts: Partial<Record<RAGRetrievalTraceStage, number>>;
1272
+ };
1259
1273
  export type RAGRetrievalCandidate = {
1260
1274
  id: string;
1261
1275
  label?: string;
@@ -1268,6 +1282,7 @@ export type RAGRerankerComparisonEntry = {
1268
1282
  label: string;
1269
1283
  providerName?: string;
1270
1284
  response: RAGEvaluationResponse;
1285
+ traceSummary?: RAGRetrievalTraceComparisonSummary;
1271
1286
  };
1272
1287
  export type RAGRerankerComparisonSummary = {
1273
1288
  bestByPassingRate?: string;
@@ -1286,6 +1301,7 @@ export type RAGRetrievalComparisonEntry = {
1286
1301
  label: string;
1287
1302
  retrievalMode: RAGHybridRetrievalMode;
1288
1303
  response: RAGEvaluationResponse;
1304
+ traceSummary?: RAGRetrievalTraceComparisonSummary;
1289
1305
  };
1290
1306
  export type RAGRetrievalComparisonSummary = {
1291
1307
  bestByPassingRate?: string;
@@ -1768,6 +1768,114 @@ var buildRAGAnswerGroundingEvaluationLeaderboard = (runs) => {
1768
1768
  totalCases: run.response.totalCases
1769
1769
  }));
1770
1770
  };
1771
+ var buildTraceStageCounts = (traces) => {
1772
+ const counts = {};
1773
+ for (const trace of traces) {
1774
+ for (const step of trace.steps) {
1775
+ counts[step.stage] = (counts[step.stage] ?? 0) + 1;
1776
+ }
1777
+ }
1778
+ return counts;
1779
+ };
1780
+ var roundTraceAverage = (value, total) => total > 0 ? Number((value / total).toFixed(2)) : 0;
1781
+ var summarizeRetrievalTraces = (traces) => {
1782
+ if (traces.length === 0) {
1783
+ return;
1784
+ }
1785
+ const totalCases = traces.length;
1786
+ const modeSet = new Set;
1787
+ let vectorCases = 0;
1788
+ let lexicalCases = 0;
1789
+ let transformedCases = 0;
1790
+ let variantCases = 0;
1791
+ let finalCountSum = 0;
1792
+ let vectorCountSum = 0;
1793
+ let lexicalCountSum = 0;
1794
+ let candidateTopKSum = 0;
1795
+ let lexicalTopKSum = 0;
1796
+ for (const trace of traces) {
1797
+ modeSet.add(trace.mode);
1798
+ if (trace.runVector) {
1799
+ vectorCases += 1;
1800
+ }
1801
+ if (trace.runLexical) {
1802
+ lexicalCases += 1;
1803
+ }
1804
+ if (trace.transformedQuery !== trace.query) {
1805
+ transformedCases += 1;
1806
+ }
1807
+ if (trace.variantQueries.length > 0) {
1808
+ variantCases += 1;
1809
+ }
1810
+ finalCountSum += trace.resultCounts.final;
1811
+ vectorCountSum += trace.resultCounts.vector;
1812
+ lexicalCountSum += trace.resultCounts.lexical;
1813
+ candidateTopKSum += trace.candidateTopK;
1814
+ lexicalTopKSum += trace.lexicalTopK;
1815
+ }
1816
+ return {
1817
+ averageCandidateTopK: roundTraceAverage(candidateTopKSum, totalCases),
1818
+ averageFinalCount: roundTraceAverage(finalCountSum, totalCases),
1819
+ averageLexicalCount: roundTraceAverage(lexicalCountSum, totalCases),
1820
+ averageLexicalTopK: roundTraceAverage(lexicalTopKSum, totalCases),
1821
+ averageVectorCount: roundTraceAverage(vectorCountSum, totalCases),
1822
+ lexicalCases,
1823
+ modes: Array.from(modeSet),
1824
+ stageCounts: buildTraceStageCounts(traces),
1825
+ totalCases,
1826
+ transformedCases,
1827
+ variantCases,
1828
+ vectorCases
1829
+ };
1830
+ };
1831
+ var evaluateRAGCollectionCases = async ({
1832
+ collection,
1833
+ input,
1834
+ defaultTopK = DEFAULT_TOP_K,
1835
+ rerank,
1836
+ includeTrace = false
1837
+ }) => {
1838
+ if (input.dryRun) {
1839
+ return executeDryRunRAGEvaluation(input, defaultTopK).map((caseResult) => ({
1840
+ caseResult,
1841
+ trace: undefined
1842
+ }));
1843
+ }
1844
+ return Promise.all(input.cases.map(async (caseInput, caseIndex) => {
1845
+ const startedAt = Date.now();
1846
+ const mode = resolveEvaluationMode(caseInput);
1847
+ const query = caseInput.query.trim();
1848
+ const expectedIds = normalizeExpectedIds(mode === "chunkId" ? caseInput.expectedChunkIds ?? [] : mode === "source" ? caseInput.expectedSources ?? [] : caseInput.expectedDocumentIds ?? []);
1849
+ const topK = typeof caseInput.topK === "number" ? caseInput.topK : typeof input.topK === "number" ? input.topK : defaultTopK;
1850
+ const searchInput = {
1851
+ filter: typeof caseInput.filter === "object" ? caseInput.filter : input.filter,
1852
+ model: caseInput.model ?? input.model,
1853
+ query,
1854
+ rerank,
1855
+ scoreThreshold: typeof caseInput.scoreThreshold === "number" ? caseInput.scoreThreshold : input.scoreThreshold,
1856
+ topK
1857
+ };
1858
+ const searchOutcome = includeTrace ? await collection.searchWithTrace(searchInput) : {
1859
+ results: await collection.search(searchInput),
1860
+ trace: undefined
1861
+ };
1862
+ const sources = buildSources(searchOutcome.results);
1863
+ const elapsedMs = Date.now() - startedAt;
1864
+ const retrievedIds = normalizeExpectedIds(sources.map((source) => extractExpectedId(source, mode)));
1865
+ return {
1866
+ caseResult: summarizeRAGEvaluationCase({
1867
+ caseIndex,
1868
+ caseInput: { ...caseInput, topK },
1869
+ elapsedMs,
1870
+ expectedIds,
1871
+ mode,
1872
+ query,
1873
+ retrievedIds
1874
+ }),
1875
+ trace: searchOutcome.trace
1876
+ };
1877
+ }));
1878
+ };
1771
1879
  var buildRAGAnswerGroundingCaseDifficultyLeaderboard = (entries) => {
1772
1880
  const grouped = new Map;
1773
1881
  for (const entry of entries) {
@@ -2403,17 +2511,20 @@ var compareRAGRerankers = async ({
2403
2511
  defaultTopK = DEFAULT_TOP_K
2404
2512
  }) => {
2405
2513
  const entries = await Promise.all(rerankers.map(async (candidate) => {
2406
- const response = await evaluateRAGCollection({
2514
+ const evaluated = await evaluateRAGCollectionCases({
2407
2515
  collection,
2408
2516
  defaultTopK,
2409
2517
  input: suite.input,
2518
+ includeTrace: true,
2410
2519
  rerank: candidate.rerank
2411
2520
  });
2521
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2412
2522
  return {
2413
2523
  label: candidate.label ?? candidate.id,
2414
2524
  providerName: typeof candidate.rerank === "function" ? undefined : candidate.rerank?.providerName,
2415
2525
  response,
2416
- rerankerId: candidate.id
2526
+ rerankerId: candidate.id,
2527
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
2417
2528
  };
2418
2529
  }));
2419
2530
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -2468,25 +2579,37 @@ var compareRAGRetrievalStrategies = async ({
2468
2579
  defaultTopK = DEFAULT_TOP_K
2469
2580
  }) => {
2470
2581
  const entries = await Promise.all(retrievals.map(async (candidate) => {
2471
- const response = await evaluateRAGCollection({
2582
+ const tracedCollection = {
2583
+ ...collection,
2584
+ search: (input) => collection.search({
2585
+ ...input,
2586
+ queryTransform: candidate.queryTransform ?? input.queryTransform,
2587
+ rerank: candidate.rerank ?? input.rerank,
2588
+ retrieval: candidate.retrieval ?? input.retrieval
2589
+ }),
2590
+ searchWithTrace: (input) => collection.searchWithTrace({
2591
+ ...input,
2592
+ queryTransform: candidate.queryTransform ?? input.queryTransform,
2593
+ rerank: candidate.rerank ?? input.rerank,
2594
+ retrieval: candidate.retrieval ?? input.retrieval
2595
+ })
2596
+ };
2597
+ const evaluated = await evaluateRAGCollectionCases({
2472
2598
  collection: {
2473
- ...collection,
2474
- search: (input) => collection.search({
2475
- ...input,
2476
- queryTransform: candidate.queryTransform ?? input.queryTransform,
2477
- rerank: candidate.rerank ?? input.rerank,
2478
- retrieval: candidate.retrieval ?? input.retrieval
2479
- })
2599
+ ...tracedCollection
2480
2600
  },
2481
2601
  defaultTopK,
2482
2602
  input: suite.input,
2603
+ includeTrace: true,
2483
2604
  rerank: candidate.rerank
2484
2605
  });
2606
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2485
2607
  return {
2486
2608
  label: candidate.label ?? candidate.id,
2487
2609
  response,
2488
2610
  retrievalId: candidate.id,
2489
- retrievalMode: resolveRetrievalMode(candidate)
2611
+ retrievalMode: resolveRetrievalMode(candidate),
2612
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
2490
2613
  };
2491
2614
  }));
2492
2615
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -2513,37 +2636,14 @@ var evaluateRAGCollection = async ({
2513
2636
  defaultTopK = DEFAULT_TOP_K,
2514
2637
  rerank
2515
2638
  }) => {
2516
- if (input.dryRun) {
2517
- return buildRAGEvaluationResponse(executeDryRunRAGEvaluation(input, defaultTopK));
2518
- }
2519
- const evaluated = await Promise.all(input.cases.map(async (caseInput, caseIndex) => {
2520
- const startedAt = Date.now();
2521
- const mode = resolveEvaluationMode(caseInput);
2522
- const query = caseInput.query.trim();
2523
- const expectedIds = normalizeExpectedIds(mode === "chunkId" ? caseInput.expectedChunkIds ?? [] : mode === "source" ? caseInput.expectedSources ?? [] : caseInput.expectedDocumentIds ?? []);
2524
- const topK = typeof caseInput.topK === "number" ? caseInput.topK : typeof input.topK === "number" ? input.topK : defaultTopK;
2525
- const searchResults = await collection.search({
2526
- filter: typeof caseInput.filter === "object" ? caseInput.filter : input.filter,
2527
- model: caseInput.model ?? input.model,
2528
- query,
2529
- rerank,
2530
- scoreThreshold: typeof caseInput.scoreThreshold === "number" ? caseInput.scoreThreshold : input.scoreThreshold,
2531
- topK
2532
- });
2533
- const sources = buildSources(searchResults);
2534
- const elapsedMs = Date.now() - startedAt;
2535
- const retrievedIds = normalizeExpectedIds(sources.map((source) => extractExpectedId(source, mode)));
2536
- return summarizeRAGEvaluationCase({
2537
- caseIndex,
2538
- caseInput: { ...caseInput, topK },
2539
- elapsedMs,
2540
- expectedIds,
2541
- mode,
2542
- query,
2543
- retrievedIds
2544
- });
2545
- }));
2546
- return buildRAGEvaluationResponse(evaluated);
2639
+ const evaluated = await evaluateRAGCollectionCases({
2640
+ collection,
2641
+ defaultTopK,
2642
+ includeTrace: false,
2643
+ input,
2644
+ rerank
2645
+ });
2646
+ return buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2547
2647
  };
2548
2648
  var executeDryRunRAGEvaluation = (input, defaultTopK = DEFAULT_TOP_K) => input.cases.map((caseInput, caseIndex) => {
2549
2649
  const mode = resolveEvaluationMode(caseInput);
@@ -3302,5 +3402,5 @@ export {
3302
3402
  AIStreamKey
3303
3403
  };
3304
3404
 
3305
- //# debugId=116FD5B922628A2864756E2164756E21
3405
+ //# debugId=28BD639F9F0C6C1364756E2164756E21
3306
3406
  //# sourceMappingURL=index.js.map