| 
									
										
										
										
											2025-02-18 10:24:43 +00:00
										 |  |  | using System.Text; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-22 19:51:06 +00:00
										 |  |  | using AIStudio.Agents; | 
					
						
							| 
									
										
										
										
											2025-02-18 10:24:43 +00:00
										 |  |  | using AIStudio.Chat; | 
					
						
							|  |  |  | using AIStudio.Provider; | 
					
						
							| 
									
										
										
										
											2025-02-22 19:51:06 +00:00
										 |  |  | using AIStudio.Settings; | 
					
						
							| 
									
										
										
										
											2025-02-18 10:24:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace AIStudio.Tools.RAG.AugmentationProcesses; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public sealed class AugmentationOne : IAugmentationProcess | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     #region Implementation of IAugmentationProcess | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /// <inheritdoc /> | 
					
						
							|  |  |  |     public string TechnicalName => "AugmentationOne"; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     /// <inheritdoc /> | 
					
						
							|  |  |  |     public string UIName => "Standard augmentation process"; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     /// <inheritdoc /> | 
					
						
							|  |  |  |     public string Description => "This is the standard augmentation process, which uses all retrieval contexts to augment the chat thread."; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     /// <inheritdoc /> | 
					
						
							|  |  |  |     public async Task<ChatThread> ProcessAsync(IProvider provider, IContent lastPrompt, ChatThread chatThread, IReadOnlyList<IRetrievalContext> retrievalContexts, CancellationToken token = default) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         var logger = Program.SERVICE_PROVIDER.GetService<ILogger<AugmentationOne>>()!; | 
					
						
							| 
									
										
										
										
											2025-02-22 19:51:06 +00:00
										 |  |  |         var settings = Program.SERVICE_PROVIDER.GetService<SettingsManager>()!; | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2025-02-18 10:24:43 +00:00
										 |  |  |         if(retrievalContexts.Count == 0) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             logger.LogWarning("No retrieval contexts were issued. Skipping the augmentation process."); | 
					
						
							|  |  |  |             return chatThread; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-02-22 19:51:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-18 10:24:43 +00:00
										 |  |  |         var numTotalRetrievalContexts = retrievalContexts.Count; | 
					
						
							| 
									
										
										
										
											2025-02-22 19:51:06 +00:00
										 |  |  |          | 
					
						
							|  |  |  |         // Want the user to validate all retrieval contexts? | 
					
						
							| 
									
										
										
										
											2025-02-23 14:05:29 +00:00
										 |  |  |         if (settings.ConfigurationData.AgentRetrievalContextValidation.EnableRetrievalContextValidation && chatThread.DataSourceOptions.AutomaticValidation) | 
					
						
							| 
									
										
										
										
											2025-02-22 19:51:06 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             // Let's get the validation agent & set up its provider: | 
					
						
							|  |  |  |             var validationAgent = Program.SERVICE_PROVIDER.GetService<AgentRetrievalContextValidation>()!; | 
					
						
							|  |  |  |             validationAgent.SetLLMProvider(provider); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             // Let's validate all retrieval contexts: | 
					
						
							|  |  |  |             var validationResults = await validationAgent.ValidateRetrievalContextsAsync(lastPrompt, chatThread, retrievalContexts, token); | 
					
						
							|  |  |  |           | 
					
						
							|  |  |  |             // | 
					
						
							|  |  |  |             // Now, filter the retrieval contexts to the most relevant ones: | 
					
						
							|  |  |  |             // | 
					
						
							|  |  |  |             var targetWindow = validationResults.DetermineTargetWindow(TargetWindowStrategy.TOP10_BETTER_THAN_GUESSING); | 
					
						
							|  |  |  |             var threshold = validationResults.GetConfidenceThreshold(targetWindow); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             // Filter the retrieval contexts: | 
					
						
							|  |  |  |             retrievalContexts = validationResults.Where(x => x.RetrievalContext is not null && x.Confidence >= threshold).Select(x => x.RetrievalContext!).ToList(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2025-02-18 10:24:43 +00:00
										 |  |  |         logger.LogInformation($"Starting the augmentation process over {numTotalRetrievalContexts:###,###,###,###} retrieval contexts."); | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // | 
					
						
							|  |  |  |         // We build a huge prompt from all retrieval contexts: | 
					
						
							|  |  |  |         // | 
					
						
							|  |  |  |         var sb = new StringBuilder(); | 
					
						
							|  |  |  |         sb.AppendLine("The following useful information will help you in processing the user prompt:"); | 
					
						
							|  |  |  |         sb.AppendLine(); | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2025-02-22 19:51:06 +00:00
										 |  |  |         // Let's convert all retrieval contexts to Markdown: | 
					
						
							|  |  |  |         await retrievalContexts.AsMarkdown(sb, token); | 
					
						
							| 
									
										
										
										
											2025-02-18 10:24:43 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2025-03-08 12:56:38 +00:00
										 |  |  |         // Add the augmented data to the chat thread: | 
					
						
							|  |  |  |         chatThread.AugmentedData = sb.ToString(); | 
					
						
							| 
									
										
										
										
											2025-02-18 10:24:43 +00:00
										 |  |  |         return chatThread; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     #endregion | 
					
						
							|  |  |  | } |