Fermer

juillet 23, 2025

Analyste de requête avec sémantique.kernel

Analyste de requête avec sémantique.kernel


Dans cet article, je vais démontrer SEMANTIC.KERNEL, un SDK AI open source fourni par Microsoft, ce qui facilite l’interaction avec les modèles de grande langue (LLM) et leurs services.

Ce message montre un chat console puissant, basé sur l’ensemble du schéma de base de données SQL Server, qui maintient l’historique de la session et du chat, affichant les résultats des requêtes exécutées et permettant aux utilisateurs de poser des questions sur les données.

Comment fonctionne cet exemple

J’ai commencé avec un modèle généré à partir de l’invite Claude AI et je l’ai personnalisé pour répondre à mes besoins. Il s’agit d’une application idéalisée principalement pour les personnes informatiques qui lit la structure d’une base de données et répond avec des données ou des commandes T-SQL. Il faut comprendre les données stockées et comment elles sont structurées dans la base de données.

Cette application est comme utiliser le copilote Microsoft intégré dans la dernière version de Microsoft SQL Server Management Studio sans abonnement à Azure AI.

L’application commence à lire les bases de données à partir du paramètre actuel ConnectionsTrings / SQLServer et permet à l’utilisateur d’en sélectionner un en naviguant avec les touches Arrow et en appuyant sur Entrée. Les chaînes de connexion contiennent la propriété ApplicationIntent=ReadOnlydonc les requêtes générées ne modifieront pas la base de données.

Après la sélection, il génère un cache du schéma actuel pour enregistrer les ressources de la prochaine session avec la même base de données.

La console permettra à l’utilisateur de discuter en langage naturel et de demander à créer des requêtes. Si une requête est générée, il est possible de l’exécuter. Lorsqu’il est exécuté, les données sont ajoutées à l’historique du chat, de sorte que la question suivante que vous posez tiendra compte des dernières données de requête.

Étapes de clé sémantique.kernal

« Le noyau sémantique est un kit de développement open-source léger qui vous permet de construire facilement des agents d’IA et d’intégrer les derniers modèles d’IA dans votre base de code C #, Python ou Java. Il sert de middleware efficace qui permet une livraison rapide de solutions de qualité d’entreprise. »

https://learn.microsoft.com/en-us/semantic-kernel/overview/

SEMANTIC.KERNEL utilise un plugin modulaire qui peut être réutilisé dans plusieurs solutions; Par exemple, nous pouvons appeler nos plugins et arguments dynamiquement. Il y a trop de code impliqué pour tout partager dans ce post, donc je vais simplement faire la démonstration des pièces principales ici.

J’ai construit une classe pour être un plugin, SqlQueryPlugin, par exemple:

1.	public class SqlQueryPlugin
2.	{
3.	    private readonly DatabaseSchema _databaseSchema;
4.	    public SqlQueryPlugin(DatabaseSchema databaseSchema)
5.	    {
6.	        _databaseSchema = databaseSchema;
7.	    }
8.	
9.	    [KernelFunction]
10.	    [Description("Generates a SQL query based on the user's natural language request and database schema")]
11.	    public async Task<string> GenerateSqlQuery(
12.	     [Description("User's natural language request for a SQL query")] string input,
13.	     Kernel kernel,
14.	     [Description("Optional chat history for context")] ChatHistory? existingHistory = null)
15.	    {

Et initialiser le sabotme sémantique:

1.	var builder = Kernel.CreateBuilder();
2.	
3.	string apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new Exception("OpenAI API Key not found");
4.	
5.	string modelId = "gpt-4o-mini";
6.	
7.	builder.AddOpenAIChatCompletion(
8.	    modelId: modelId,
9.	    apiKey: apiKey
10.	);            
11.	
12.	var kernel = builder.Build();

… Et activez-le:

1.	var sqlQueryPlugin = new SqlQueryPlugin(databaseSchema);
2.	
3.	kernel.Plugins.Add(KernelPluginFactory.CreateFromObject(sqlQueryPlugin, "SqlQueryPlugin"));

Remarque: nous pouvons sélectionner une liste de services à utiliser en fonction de nos besoins:

Console avec les aventureworks sélectionnés
Menu contextuel de vs 2022

Dans le code ci-dessus, nous utilisons le service AddopeAhatCompletion.

Pour invoquer le service, nous transmettons les arguments sur les kernelarguments:

1.	var arguments = new KernelArguments
2.	{
3.	    ["input"] = userInput,
4.	    ["existingHistory"] = chatHistory
5.	};
6.	
7.	var result = await kernel.InvokeAsync<string>("SqlQueryPlugin", "GenerateSqlQuery", arguments);

Le premier paramètre est notre nom de plugin, SqlQueryPlugin, et le second est la méthode que nous aimons utiliser.

Ceci est si puissant car votre logique peut charger les paramètres à partir des paramètres et les charger au besoin. Par exemple, au lieu du paramètre d’entrée, nous pouvons le charger à partir d’un var de mémoire avec toute autre valeur:

1.	var inputParam = isBasic ? “input” : "inputArg2";
2.	
3.	var arguments = new KernelArguments
4.	{
5.	    [inputParam] = userInput,
6.	    ["existingHistory"] = chatHistory
7.	};

Dans l’échantillon, au lieu de la statique "input"nous avons changé "input" à "inputArg2" Selon un var booléen isBasic. inputArg2 n’existait pas dans le code; C’est juste un échantillon d’utilisation.

Aussi, la chaîne du nom du plugin "SqlQueryPlugin" peut être un paramètre, et nous pouvons charger un autre plugin en fonction de nos besoins, par exemple, "MySqlQueryPlugin" ou un autre type de base de données – pas dans cet échantillon, qui est pour Microsoft SQLServer uniquement.

Échantillon de travail

Lors de l’exécution de l’application Console, nous aurons ce résultat:


Console avec les aventureworks sélectionnés

J’ai demandé: «Quelles sont les ventes totales par région en 2004?»


Rapide

Et l’invite a retourné ceci:

Pour calculer la région en 2004 ...

Remarque: la requête SQL violette a été extraite par un script filtrant le sql … de la sortie.

Nous pouvons demander ce que nous pouvons inviter:

Que puis-je demander sur les ventes
Rapide

Si vous ne le savez pas, l’invite répondra avec quelques idées:

Vous pouvez poser une variété de questions sur les données de vente pour obtenir un aperçu des performances, etc.
Sortie rapide

J’ai essayé: « Quelles sont les ventes moyennes par vendeur? »

Quelles sont les ventes AVG par vendeur
Rapide

C’est le résultat: ID et montant du vendeur:

Table avec ID de vendeur et montant
Résultat de la requête

Et j’ai demandé plus d’informations:

Et dis-moi leur nom
Rapide

Maintenant, la sortie renvoie le nom de premier et le nom de lastring:

La sortie renvoie le premier nom et le nom de dernier avec des ventes moyennes
Résultat de la requête

Maintenant, nous formons les données:

Montrez-nous $
Rapide

Le résultat est maintenant formaté:

La sortie renvoie le premier nom et le nom de dernier avec des ventes moyennes en USD
Résultat de la requête

Ces échantillons rapides démontrent que le noyau reconnaît l’histoire que nous avons créée avec l’objet du noyau:

1.	var chatHistory = new ChatHistory();
2.	
3.	chatHistory.AddSystemMessage($"You are a Data Analyst and SQL expert assistant for the database: {schemaExtractor.DatabaseName}");

Et mis à jour après l’exécution de la requête:

1.	 if (executeResponse.ToLower() == "yes" || executeResponse.ToLower() == "y")
2.	 {
3.	     WriteColorLine("Executing query...", ConsoleColors.Prompt);
4.	     var queryResults = await schemaExtractor.ExecuteQueryAsync(resultSql);
5.	     DisplayQueryResults(queryResults);
6.	
7.	     chatHistory.AddUserMessage(userInput);
8.	     chatHistory.AddAssistantMessage(result);
9.	     chatHistory.AddUserMessage($"I executed the query and it returned {queryResults.Rows.Count} rows.");
10.	 }
11.	 else
12.	 {
13.	     chatHistory.AddUserMessage(userInput);
14.	     chatHistory.AddAssistantMessage(result);
15.	     chatHistory.AddUserMessage("I chose not to execute this query.");
16.	 }

Et enfin

GenerateSqlQuery est le point final où les choses sont vraiment faites. Définissez le schéma de la base de données sur l’historique de la ligne 12. Définissez la configuration du service à la ligne 31. Dans les lignes 37, 38 et 40, nous obligeons l’IA à renvoyer une sortie plus déterministe. Et renvoyer le résultat à la ligne 44.

1.	public async Task<string> GenerateSqlQuery(
2.	    [Description("User's natural language request for a SQL query")] string input,
3.	    Kernel kernel,
4.	    [Description("Optional chat history for context")] ChatHistory? existingHistory = null)
5.	{
6.	    string schemaDescription = GetDatabaseSchemaDescription();
7.	         
8.	    var chatHistory = existingHistory ?? new ChatHistory();
9.	         
10.	    if (existingHistory == null || chatHistory.Count()==1)
11.	    {
12.	        chatHistory.AddSystemMessage(@$"
13.	# SQL Query Assistant
14.	
15.	You are a Data Analyst and SQL expert who helps translate natural language questions about databases into SQL queries.
16.	
17.	## Database Schema
18.	{schemaDescription}
19.	
20.	## Guidelines
21.	- Use proper T-SQL syntax for SQL Server
22.	- Include appropriate JOINs when data from multiple tables is needed
23.	- Format your output as a clear explanation followed by the SQL query in ```sql``` code blocks
24.	- Always use schema name in the query (example: dbo.TableName)
25.	- For queries that involve aggregations, add appropriate GROUP BY clauses
26.	- Handle NULLs appropriately");
27.	    }
28.	         
29.	    chatHistory.AddUserMessage(input);
30.	         
31.	    var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
32.	         
33.	    var completionResult = await chatCompletionService.GetChatMessageContentAsync(
34.	        chatHistory,
35.	        new OpenAIPromptExecutionSettings
36.	        {
37.	            MaxTokens = 2000,
38.	            Temperature = 0.0,
39.	            TopP = 0.95
40.	        });
41.	         
42.	    chatHistory.AddAssistantMessage(completionResult.ToString());
43.	
44.	    return completionResult.ToString().Trim();
45.	}

Conclusion

L’application est revenue principalement avec succès, mais il est nécessaire que l’utilisateur comprenne comment fonctionne une base de données, et les arguments système doivent expliquer des détails spécifiques sur la façon dont le schéma de base de données est conçu.

Pour les développeurs, les analystes de données et les DBA, c’est un excellent outil qui peut examiner, créer des requêtes, récupérer des informations sur la base de données et extraire les données.

SEMANTIC.KERNEL aide à créer un code source propre et organisé qui peut être partagé entre nos projets. Cette application peut être mise à niveau pour travailler avec d’autres types de bases de données en modifiant un peu le code de base.

Références

Microsoft Learn
Code source GitHub




Source link