diff --git a/apps/webapp/app/services/knowledgeGraph.server.ts b/apps/webapp/app/services/knowledgeGraph.server.ts index 4ef6022..69f289b 100644 --- a/apps/webapp/app/services/knowledgeGraph.server.ts +++ b/apps/webapp/app/services/knowledgeGraph.server.ts @@ -112,11 +112,8 @@ export class KnowledgeGraphService { sessionContext, ); - const relatedEpisodesEntities = await getRelatedEpisodesEntities({ - embedding: await this.getEmbedding(normalizedEpisodeBody), - userId: params.userId, - minSimilarity: 0.7, - }); + const normalizedTime = Date.now() - startTime; + logger.log(`Normalized episode body in ${normalizedTime} ms`); if (normalizedEpisodeBody === "NOTHING_TO_REMEMBER") { logger.log("Nothing to remember"); @@ -127,6 +124,15 @@ export class KnowledgeGraphService { }; } + const relatedEpisodesEntities = await getRelatedEpisodesEntities({ + embedding: await this.getEmbedding(normalizedEpisodeBody), + userId: params.userId, + minSimilarity: 0.7, + }); + + const relatedTime = Date.now() - normalizedTime; + logger.log(`Related episodes entities in ${relatedTime} ms`); + // Step 2: Episode Creation - Create or retrieve the episode const episode: EpisodicNode = { uuid: crypto.randomUUID(), @@ -149,6 +155,9 @@ export class KnowledgeGraphService { previousEpisodes, ); + const extractedTime = Date.now(); + logger.log(`Extracted entities in ${extractedTime - relatedTime} ms`); + // Step 3.1: Context-aware entity resolution with preset type evolution await this.resolveEntitiesWithContext( extractedNodes, @@ -161,6 +170,9 @@ export class KnowledgeGraphService { episode, ); + const expandedTime = Date.now(); + logger.log(`Expanded entities in ${expandedTime - extractedTime} ms`); + // Step 4: Statement Extrraction - Extract statements (triples) instead of direct edges const extractedStatements = await this.extractStatements( episode, @@ -168,6 +180,11 @@ export class KnowledgeGraphService { previousEpisodes, ); + const extractedStatementsTime = Date.now(); + logger.log( + `Extracted statements in ${extractedStatementsTime - expandedTime} ms`, + ); + // Step 5: Entity Resolution - Resolve extracted nodes to existing nodes or create new ones const resolvedTriples = await this.resolveExtractedNodes( extractedStatements, @@ -175,6 +192,11 @@ export class KnowledgeGraphService { previousEpisodes, ); + const resolvedTriplesTime = Date.now(); + logger.log( + `Resolved Entities in ${resolvedTriplesTime - extractedStatementsTime} ms`, + ); + // Step 6: Statement Resolution - Resolve statements and detect contradictions const { resolvedStatements, invalidatedStatements } = await this.resolveStatements( @@ -183,12 +205,22 @@ export class KnowledgeGraphService { previousEpisodes, ); + const resolvedStatementsTime = Date.now(); + logger.log( + `Resolved statements in ${resolvedStatementsTime - resolvedTriplesTime} ms`, + ); + // Step 7: ADd attributes to entity nodes const updatedTriples = await this.addAttributesToEntities( resolvedStatements, episode, ); + const updatedTriplesTime = Date.now(); + logger.log( + `Updated triples in ${updatedTriplesTime - resolvedStatementsTime} ms`, + ); + for (const triple of updatedTriples) { const { subject, predicate, object, statement, provenance } = triple; const safeTriple = { @@ -215,6 +247,9 @@ export class KnowledgeGraphService { // Save triples in parallel for better performance await Promise.all(updatedTriples.map((triple) => saveTriple(triple))); + const saveTriplesTime = Date.now(); + logger.log(`Saved triples in ${saveTriplesTime - updatedTriplesTime} ms`); + // Invalidate invalidated statements await invalidateStatements({ statementIds: invalidatedStatements });