diff --git a/src/main/java/com/olympus/hermione/stepSolvers/AdvancedAIPromptSolver.java b/src/main/java/com/olympus/hermione/stepSolvers/AdvancedAIPromptSolver.java index 2f9d40a..3534d08 100644 --- a/src/main/java/com/olympus/hermione/stepSolvers/AdvancedAIPromptSolver.java +++ b/src/main/java/com/olympus/hermione/stepSolvers/AdvancedAIPromptSolver.java @@ -33,50 +33,68 @@ public class AdvancedAIPromptSolver extends StepSolver { logger.info("Loading parameters"); if(this.step.getAttributes().get("qai_load_graph_schema")!=null ){ + logger.info("Found attribute 'qai_load_graph_schema': {}", this.step.getAttributes().get("qai_load_graph_schema")); this.qai_load_graph_schema = Boolean.parseBoolean((String) this.step.getAttributes().get("qai_load_graph_schema")); - logger.info("qai_load_graph_schema: " + this.qai_load_graph_schema); + logger.info("qai_load_graph_schema: {}", this.qai_load_graph_schema); + } else { + logger.info("Attribute 'qai_load_graph_schema' not found, using default: false"); } if(this.qai_load_graph_schema){ logger.info("Loading graph schema"); - this.scenarioExecution.getExecSharedMap().put("graph_schema", this.neo4JUitilityService.generateSchemaDescription().toString()); + Object schema = this.neo4JUitilityService.generateSchemaDescription(); + logger.debug("Generated graph schema: {}", schema); + this.scenarioExecution.getExecSharedMap().put("graph_schema", schema.toString()); } AttributeParser attributeParser = new AttributeParser(this.scenarioExecution); this.qai_system_prompt_template = attributeParser.parse((String) this.step.getAttributes().get("qai_system_prompt_template")); + logger.info("Parsed qai_system_prompt_template: {}", this.qai_system_prompt_template); this.qai_user_input = attributeParser.parse((String)this.step.getAttributes().get("qai_user_input")); + logger.info("Parsed qai_user_input: {}", this.qai_user_input); this.qai_output_variable = (String) this.step.getAttributes().get("qai_output_variable"); + logger.info("qai_output_variable: {}", this.qai_output_variable); this.qai_output_entityType = (String) this.step.getAttributes().get("qai_output_entityType"); + logger.info("qai_output_entityType: {}", this.qai_output_entityType); this.qai_custom_memory_id = (String) this.step.getAttributes().get("qai_custom_memory_id"); + logger.info("qai_custom_memory_id: {}", this.qai_custom_memory_id); //TODO: Add memory ID attribute to have the possibility of multiple conversations this.qai_available_tools = (String) this.step.getAttributes().get("qai_available_tools"); - + logger.info("qai_available_tools: {}", this.qai_available_tools); } @Override public ScenarioExecution solveStep(){ + logger.info("Solving step: {}", this.step.getName()); System.out.println("Solving step: " + this.step.getName()); this.scenarioExecution.setCurrentStepId(this.step.getStepId()); + logger.debug("Set current step ID: {}", this.step.getStepId()); loadParameters(); Object tools = null; if(this.qai_available_tools!=null && !this.qai_available_tools.isEmpty()){ + logger.info("Available tools specified: {}", this.qai_available_tools); for(String tool: this.qai_available_tools.split(",")){ - logger.info("Tool: " + tool); + logger.info("Tool: {}", tool); if(tool.equals("SourceCodeTool")){ + logger.info("Instantiating SourceCodeTool"); tools = new com.olympus.hermione.tools.SourceCodeTool(discoveryClient); + } else { + logger.warn("Unknown tool specified: {}", tool); } } + } else { + logger.info("No tools specified or available"); } CallResponseSpec resp=null; if(tools==null){ - logger.info("No tools available"); + logger.info("No tools available, calling chatClient without tools"); resp = chatClient.prompt() .user(this.qai_user_input) .system(this.qai_system_prompt_template) @@ -85,6 +103,7 @@ public class AdvancedAIPromptSolver extends StepSolver { .param("chat_memory_response_size", 100)) .call(); }else{ + logger.info("Calling chatClient with tools: {}", tools.getClass().getName()); resp = chatClient.prompt() .user(this.qai_user_input) .system(this.qai_system_prompt_template) @@ -95,37 +114,39 @@ public class AdvancedAIPromptSolver extends StepSolver { .call(); } - - - if(qai_output_entityType!=null && qai_output_entityType.equals("CiaOutputEntity")){ logger.info("Output is of type CiaOutputEntity"); CiaOutputEntity ouputEntity = resp.entity(CiaOutputEntity.class); - + logger.debug("CiaOutputEntity response: {}", ouputEntity); try { ObjectMapper objectMapper = new ObjectMapper(); String jsonOutput = objectMapper.writeValueAsString(ouputEntity); + logger.info("Storing output entity as JSON in shared map with key: {}", this.qai_output_variable); this.scenarioExecution.getExecSharedMap().put(this.qai_output_variable, jsonOutput); } catch (JsonProcessingException e) { logger.error("Error converting output entity to JSON", e); } }else{ - + logger.info("Output is of type String"); String output = resp.content(); + logger.debug("String response: {}", output); this.scenarioExecution.getExecSharedMap().put(this.qai_output_variable, output); } Usage usage = resp.chatResponse().getMetadata().getUsage(); if (usage != null) { Integer usedTokens = usage.getTotalTokens(); + logger.info("Used tokens: {}", usedTokens); this.scenarioExecution.setUsedTokens(usedTokens); } else { logger.info("Token usage information is not available."); } this.scenarioExecution.setNextStepId(this.step.getNextStepId()); + logger.info("Set next step ID: {}", this.step.getNextStepId()); + logger.info("Step solved. Returning scenarioExecution."); return this.scenarioExecution; } diff --git a/src/main/java/com/olympus/hermione/stepSolvers/AdvancedQueryRagSolver.java b/src/main/java/com/olympus/hermione/stepSolvers/AdvancedQueryRagSolver.java index 29ab8ac..4eb9e7b 100644 --- a/src/main/java/com/olympus/hermione/stepSolvers/AdvancedQueryRagSolver.java +++ b/src/main/java/com/olympus/hermione/stepSolvers/AdvancedQueryRagSolver.java @@ -22,7 +22,7 @@ import ch.qos.logback.classic.Logger; public class AdvancedQueryRagSolver extends StepSolver { - Logger logger = (Logger) LoggerFactory.getLogger(BasicQueryRagSolver.class); + Logger logger = (Logger) LoggerFactory.getLogger(AdvancedQueryRagSolver.class); // PARAMETERS // rag_input : the field of the sharedMap to use as rag input @@ -160,47 +160,48 @@ public class AdvancedQueryRagSolver extends StepSolver { @Override public ScenarioExecution solveStep(){ - - logger.info("Solving step: " + this.step.getName()); + logger.info("Solving step: {}", this.step.getName()); loadParameters(); logParameters(); String elaboratedQuery = this.query; OlympusChatClient chatClient = null; - if ( scenarioExecution.getScenario().getAiModel().getApiProvider().equals("AzureOpenAI")) { + String apiProvider = this.scenarioExecution.getScenario().getAiModel().getApiProvider(); + logger.info("AI Model API Provider: {}", apiProvider); + if (apiProvider.equals("AzureOpenAI")) { + logger.info("Using AzureOpenApiChatClient"); chatClient = new AzureOpenApiChatClient(); } - if ( scenarioExecution.getScenario().getAiModel().getApiProvider().equals("GoogleGemini")) { + if (apiProvider.equals("GoogleGemini")) { + logger.info("Using GoogleGeminiChatClient"); chatClient = new GoogleGeminiChatClient(); } - - chatClient.init(scenarioExecution.getScenario().getAiModel().getFull_path_endpoint(), - scenarioExecution.getScenario().getAiModel().getApiKey(), - scenarioExecution.getScenario().getAiModel().getMaxTokens()); + logger.info("Initializing chat client with endpoint: {}", this.scenarioExecution.getScenario().getAiModel().getFull_path_endpoint()); + chatClient.init(this.scenarioExecution.getScenario().getAiModel().getFull_path_endpoint(), + this.scenarioExecution.getScenario().getAiModel().getApiKey(), + this.scenarioExecution.getScenario().getAiModel().getMaxTokens()); - - - if( this.enableRephrase ){ - + if(this.enableRephrase){ + logger.info("Rephrasing query with prompt: {}", this.rephrasePrompt); OlympusChatClientResponse resp = chatClient.getChatCompletion(this.rephrasePrompt); elaboratedQuery = resp.getContent(); + logger.info("Rephrased query: {}", elaboratedQuery); } - if( this.enableMultiPhrase ){ - + if(this.enableMultiPhrase){ + logger.info("Generating multi-phrase queries with prompt: {}", this.MultiPhrasePrompt); OlympusChatClientResponse resp = chatClient.getChatCompletion(this.MultiPhrasePrompt); elaboratedQuery = resp.getContent(); - + logger.info("Multi-phrase queries: {}", elaboratedQuery); } - List docs = new ArrayList(); - List queries = new ArrayList(); + List docs = new ArrayList<>(); + List queries = new ArrayList<>(); for (String query : elaboratedQuery.split("\n")) { - - logger.info("Elaborated query: " + query); + logger.info("Elaborated query: {}", query); queries.add(query); Builder request_builder = SearchRequest.builder() .query(elaboratedQuery) @@ -209,47 +210,45 @@ public class AdvancedQueryRagSolver extends StepSolver { if(this.rag_filter != null && !this.rag_filter.isEmpty()){ request_builder.filterExpression(this.rag_filter); - logger.info("Using Filter expression: " + this.rag_filter); + logger.info("Using Filter expression: {}", this.rag_filter); } SearchRequest request = request_builder.build(); - docs.addAll( this.vectorStore.similaritySearch(request)); + logger.info("Performing similarity search for query: {}", query); + docs.addAll(this.vectorStore.similaritySearch(request)); + logger.info("Documents found so far: {}", docs.size()); } - logger.info("Number of not unique VDB retrieved documents: " + docs.size()); + logger.info("Number of not unique VDB retrieved documents: {}", docs.size()); docs = docs.stream().collect(Collectors.toMap(Document::getId, d -> d, (d1, d2) -> d1)).values().stream().collect(Collectors.toList()); - - logger.info("Number of VDB retrieved documents: " + docs.size()); - + logger.info("Number of VDB retrieved documents (unique): {}", docs.size()); if (enableRanking){ - List rankedDocs = new ArrayList(); + List rankedDocs = new ArrayList<>(); logger.info("Ranking documents"); RAGDocumentRanker ranker = new RAGDocumentRanker(); List rankedDocument = ranker.rankDocuments(docs, this.query, this.rank_threshold, chatClient); for (RankedDocument rankedDoc : rankedDocument) { rankedDocs.add(rankedDoc.getDocument()); } - logger.info("Number of ranked documents: " + rankedDocs.size()); + logger.info("Number of ranked documents: {}", rankedDocs.size()); docs = rankedDocs; } if(enableNeighborRetrieve){ - logger.info("Retrieving neighbor documents: #PRE " + this.preNeighbor + " #POST " + this.afterNeighbor); - List neighborDocs = new ArrayList(); + logger.info("Retrieving neighbor documents: #PRE {} #POST {}", this.preNeighbor, this.afterNeighbor); + List neighborDocs = new ArrayList<>(); for(Document doc : docs){ - neighborDocs.addAll( retrieveNeighborDocuments(doc, preNeighbor, afterNeighbor)); - logger.info("Number of neighbor documents: " + neighborDocs.size()); + logger.info("Retrieving neighbors for doc ID: {}", doc.getId()); + neighborDocs.addAll(retrieveNeighborDocuments(doc, preNeighbor, afterNeighbor)); + logger.info("Number of neighbor documents for this doc: {}", neighborDocs.size()); } docs.addAll(neighborDocs); - logger.info("Number of documents after neighbor retrieval: " + docs.size()); - + logger.info("Number of documents after neighbor retrieval: {}", docs.size()); } - - if(enableRetrieveOther){ - List otherDocs = new ArrayList(); + List otherDocs = new ArrayList<>(); logger.info("Retrieving other documents"); String resultString = ""; @@ -266,10 +265,11 @@ public class AdvancedQueryRagSolver extends StepSolver { prompt += "\n\n The query is: " + this.query; prompt += "\n\n The output must be a single query and nothing else."; + logger.info("Prompt for retrieving other documents: {}", prompt); OlympusChatClientResponse resp = chatClient.getChatCompletion(prompt); String otherDocQuery = resp.getContent(); - logger.info("Other document query: " + otherDocQuery); + logger.info("Other document query: {}", otherDocQuery); Builder request_builder = SearchRequest.builder() .query(otherDocQuery) @@ -278,24 +278,24 @@ public class AdvancedQueryRagSolver extends StepSolver { if(this.rag_filter != null && !this.rag_filter.isEmpty()){ request_builder.filterExpression(this.rag_filter); - logger.info("Using Filter expression: " + this.rag_filter); + logger.info("Using Filter expression: {}", this.rag_filter); } SearchRequest request = request_builder.build(); - otherDocs.addAll( this.vectorStore.similaritySearch(request)); - logger.info("Number of addictional documents: " + otherDocs.size()); + logger.info("Performing similarity search for other document query"); + otherDocs.addAll(this.vectorStore.similaritySearch(request)); + logger.info("Number of addictional documents: {}", otherDocs.size()); docs.addAll(otherDocs); - } - docs = docs.stream() .filter(d -> d.getMetadata().get("KsDocumentId") != null) .filter(d -> d.getMetadata().get("KsDocumentIndex") != null) .collect(Collectors.toMap(Document::getId, d -> d, (d1, d2) -> d1)).values().stream().collect(Collectors.toList()); //Sort by KsDocumentId and KsDocumentIndex + logger.info("Sorting documents by KsDocumentId and KsDocumentIndex"); docs.sort((d1, d2) -> { String docId1 = (String) d1.getMetadata().get("KsDocumentId"); String docId2 = (String) d2.getMetadata().get("KsDocumentId"); @@ -309,24 +309,24 @@ public class AdvancedQueryRagSolver extends StepSolver { } }); - - List source_doc = new ArrayList(); + List source_doc = new ArrayList<>(); String resultString = ""; for(Document doc : docs){ + logger.info("Adding document to result: Source {} - Chunk Index {}", doc.getMetadata().get("KsFileSource"), doc.getMetadata().get("KsDocumentIndex")); resultString += "Document Source: " + doc.getMetadata().get("KsFileSource") + " - Chunk Index " + doc.getMetadata().get("KsDocumentIndex")+ "\n"; resultString += "--------------------------------------------------------------\n"; resultString += doc.getText() + "\n"; source_doc.add((String)doc.getMetadata().get("KsFileSource")); } - + logger.info("Storing results in scenarioExecution shared map. Output field: {}", this.outputField); this.scenarioExecution.getExecSharedMap().put("tech_rag_source_documents", source_doc); this.scenarioExecution.getExecSharedMap().put("tech_rag_query", queries); this.scenarioExecution.getExecSharedMap().put(this.outputField, resultString); this.scenarioExecution.setCurrentStepId(this.step.getStepId()); this.scenarioExecution.setNextStepId(this.step.getNextStepId()); - + logger.info("Step risolto. Restituisco scenarioExecution."); return this.scenarioExecution; }