Skip to content

Commit d47d335

Browse files
committed
feat: Enhance embedding service with comprehensive analytics tracking
- Add detailed embedding text and model tracking for vector generation analysis - Capture query text and embedding dimensions for search insights - Track retrieved document content including embedding text, prompts, and code snippets - Enhance vector and hybrid search with comprehensive document metadata - Add performance metrics for embedding operations (latency, vector size, model) - Include similarity scores (vector, keyword, combined) for retrieval optimization - Store first 200 chars of code from retrieved documents for quick reference These enhancements enable better understanding of: - What text is being embedded vs original content - Query-to-document matching patterns - Retrieval effectiveness and ranking quality - Opportunities for vector database improvement
1 parent 3155885 commit d47d335

4 files changed

Lines changed: 69 additions & 10 deletions

File tree

src/lib/embedding-service.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,16 @@ export async function generateEmbedding(
8080
ragLog(options.rid, "embedding.complete", {
8181
model,
8282
elapsedMs,
83+
textLength: cleanedText.length,
8384
});
8485

85-
// Track in analytics
86+
// Track in analytics with enhanced information
8687
safeRAGAnalytics.trackEmbedding(
8788
options.rid,
8889
response.data[0].embedding,
89-
elapsedMs
90+
elapsedMs,
91+
cleanedText, // Pass the actual text that was embedded
92+
model // Pass the model used
9093
);
9194
}
9295

@@ -335,6 +338,15 @@ export async function vectorSearch({
335338
? new VectorValue(queryEmbedding)
336339
: queryEmbedding;
337340

341+
// Log the query text for analysis
342+
if (rid) {
343+
ragLog(rid, "vectorSearch.queryText", {
344+
query: query,
345+
queryLength: query.length,
346+
embeddingDimensions: queryEmbedding.length,
347+
});
348+
}
349+
338350
// Perform vector similarity search
339351
// Note: Firebase requires a specific index for vector search
340352
const results = await searchQuery
@@ -368,13 +380,16 @@ export async function vectorSearch({
368380
})),
369381
});
370382

371-
// Track retrieval in analytics
383+
// Track retrieval in analytics with enhanced information
372384
safeRAGAnalytics.trackRetrieval(
373385
rid,
374386
documents.map(doc => ({
375387
id: doc.id,
376388
similarity: doc.similarity,
377389
features: buildFeatureTags(doc),
390+
embeddingText: createEmbeddingText(doc), // Include embedding text
391+
code: doc.code || doc.src, // Include code
392+
prompt: doc.prompt || doc.task, // Include prompt
378393
})),
379394
"vector",
380395
Date.now() - startTime,
@@ -437,6 +452,8 @@ export async function hybridSearch({
437452
k: limit,
438453
lang,
439454
vectorWeight,
455+
query: query, // Log the query text
456+
queryLength: query.length,
440457
});
441458
}
442459

@@ -500,7 +517,7 @@ export async function hybridSearch({
500517
})),
501518
});
502519

503-
// Track hybrid search in analytics
520+
// Track hybrid search in analytics with enhanced information
504521
safeRAGAnalytics.trackRetrieval(
505522
rid,
506523
topResults.map(doc => ({
@@ -509,6 +526,9 @@ export async function hybridSearch({
509526
keywordScore: doc.keywordScore,
510527
combinedScore: doc.combinedScore,
511528
features: buildFeatureTags(doc),
529+
embeddingText: createEmbeddingText(doc), // Include embedding text
530+
code: doc.code || doc.src, // Include code
531+
prompt: doc.prompt || doc.task, // Include prompt
512532
})),
513533
"hybrid",
514534
Date.now() - startTime,

src/lib/rag-analytics-safe.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,11 @@ class SafeRAGAnalytics {
5959
/**
6060
* Safely track embedding
6161
*/
62-
trackEmbedding(requestId: string, embeddingVector: number[], latencyMs: number): void {
62+
trackEmbedding(requestId: string, embeddingVector: number[], latencyMs: number, embeddingText?: string, model?: string): void {
6363
if (!this.isEnabled()) return;
6464

6565
try {
66-
ragAnalytics.trackEmbedding(requestId, embeddingVector, latencyMs);
66+
ragAnalytics.trackEmbedding(requestId, embeddingVector, latencyMs, embeddingText, model);
6767
} catch (error) {
6868
this.handleError("trackEmbedding", error);
6969
}

src/lib/rag-analytics.ts

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ export interface RetrievedDocument {
3232
position: number;
3333
wasUsedInPrompt: boolean;
3434
features?: string[];
35+
embeddingText?: string; // Text used for embedding
36+
prompt?: string; // Original prompt/task from the document
37+
codeSnippet?: string; // Snippet of code from the document
3538
}
3639

3740
// Generation metrics
@@ -89,6 +92,16 @@ export interface RAGAnalyticsRecord {
8992
language: string;
9093
keywords?: string[];
9194
embeddingVector?: number[]; // Store first N dimensions for analysis
95+
embeddingDimensions?: number; // Total number of dimensions
96+
embeddingText?: string; // The actual text that was embedded
97+
embeddingModel?: string; // Model used for embedding
98+
};
99+
100+
// Embedding information
101+
embedding?: {
102+
latencyMs: number;
103+
vectorSize: number;
104+
model: string;
92105
};
93106

94107
// Retrieval information
@@ -273,16 +286,36 @@ export class RAGAnalyticsService {
273286
public trackEmbedding(
274287
requestId: string,
275288
embeddingVector: number[],
276-
latencyMs: number
289+
latencyMs: number,
290+
embeddingText?: string,
291+
model?: string
277292
): void {
278293
const record = this.activeRequests.get(requestId);
279294
if (!record) return;
280295

281-
// Store first 10 dimensions for analysis (to save space)
296+
// Store embedding details for analysis
282297
if (record.query) {
283-
record.query.embeddingVector = embeddingVector.slice(0, 10);
298+
record.query.embeddingVector = embeddingVector.slice(0, 10); // Store first 10 dimensions
299+
record.query.embeddingDimensions = embeddingVector.length;
300+
301+
// Store the actual text that was embedded (for debugging and enhancement)
302+
if (embeddingText) {
303+
record.query.embeddingText = embeddingText;
304+
}
305+
306+
// Store model information
307+
if (model) {
308+
record.query.embeddingModel = model;
309+
}
284310
}
285311

312+
// Track embedding performance metrics
313+
record.embedding = {
314+
latencyMs: latencyMs,
315+
vectorSize: embeddingVector.length,
316+
model: model || "text-embedding-3-small"
317+
};
318+
286319
this.endStage(requestId, "embedding");
287320
}
288321

@@ -297,6 +330,9 @@ export class RAGAnalyticsService {
297330
keywordScore?: number;
298331
combinedScore?: number;
299332
features?: string[];
333+
embeddingText?: string;
334+
code?: string;
335+
prompt?: string;
300336
}>,
301337
strategy: "vector" | "hybrid" | "keyword",
302338
latencyMs: number,
@@ -313,6 +349,9 @@ export class RAGAnalyticsService {
313349
position: index,
314350
wasUsedInPrompt: false, // Will be updated later
315351
features: doc.features,
352+
embeddingText: doc.embeddingText, // Text used for embedding
353+
prompt: doc.prompt, // Original prompt/task from the document
354+
codeSnippet: doc.code ? doc.code.substring(0, 200) : undefined, // First 200 chars of code
316355
}));
317356

318357
record.retrieval = {

tsconfig.tsbuildinfo

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)