Ciao a tutti,
In questo post voglio condividere come implementare un agent in c# sfruttando il semantic Kernel.
Ma partiamo dalle basi, cos' è un Agent? e a cosa ci serve?
Cos'è un Agent?
Un agent può essere inteso come un sistema in grado di prendere decisioni in modo autonomo, seguendo obiettivi e regole che gli sono stati dati, sfruttando le informazioni in un suo possesso.
A Cosa ci servono gli Agent?
Gli agent ci possono aiutare ad automatizzare tutta una serie di operazioni e a velocizzare il nostro lavoro quotidiano.
Il caso più banale è quello dell'operatore di customer care, che deve recuperare e verificare la situazione del cliente, a seguito della richiesta del cliente, bene queste sono operazioni che può eseguire un Agent addestrato a fare ciò.
Cos'è Il Semantic Kernel ?
Il Semantic Kernel è un Framework che permette l'integrazione dell'AI all'interno di vari linguaggi di programmazione questo ci permette appunto di sviluppare agent, ma non solo gli agent sono solo una parte di ciò che possiamo fare con il Semantic Kernel
Costruiamo un semplice agente
Bene a questo punto vi mostro gli step per costruire un agent.
Per sviluppare questo piccolo progetto, ho usato come modello "llama3.2" su un Container con Ollama,
STEP 1 Creazione del progetto e aggiunta dei pacchetti necessari.
Creiamo una console e andiamo ad aggiungere i seguenti pacchetti nuget
Microsoft.SemanticKernel
Microsoft.SemanticKernel.Core
Microsoft.SemanticKernel.Agents.Core
Microsoft.SemanticKernel.Connectors.Ollama → in pre-release
STEP 2 Creazione dell'agent
Ora possiamo già procedere con la creazione dell'agent,
Andremo a Instanziare l'agent e a dargli le istruzioni, nel mio caso gli ho detto di inventare storie divertenti.
using System.ComponentModel;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.ChatCompletion;
var builder = Kernel.CreateBuilder();
// Add the Ollama chat completion service
// Ensure you have Ollama running and the model "llama3.2:3b" is available
// You can change the model name and URI as needed
builder.AddOllamaChatCompletion("llama3.2:3b", new Uri("http://localhost:11434"));
var kernel = builder.Build();
ChatCompletionAgent agent = new() // 👈🏼 Definition of the agent
{
Instructions = "You are an agent who creates funny stories.",
Name = "Story Agent",
Description = "This agent can create funny stories based on user input.",
Kernel = kernel
};
STEP 3 Interazione con l'agent
è il momento di scrivere l'interazione con l'agent, io ho simulato un chatbot botta e risposta giusto per divertirmi un po
string userMessage = string.Empty;
do
{
Console.WriteLine("What kind of story would you like me to tell you? Type 'exit' to stop the chat.");
userMessage = Console.ReadLine();
if (!string.IsNullOrEmpty(userMessage) && userMessage != "exit")
{
ChatHistory chat =
[
new ChatMessageContent(AuthorRole.User, userMessage)
];
await foreach (var response in agent.InvokeAsync(chat))
{
chat.Add(response);
Console.WriteLine(response.Message.Content);
}
userMessage = string.Empty;
}
}
while (userMessage != "exit");
A questo punto la console può essere eseguita e testata.
Integrazione con Function
Ovviamente per rendere l'agent più centrato sui nostri obiettivi, possiamo definire delle funzioni custom con le quali lui andrà a recuperare le informazioni.
Ad esempio il recupero delle informazioni relative al cliente stesso, all'interno dei sistemi. Di seguito ho simulato un esempio dell'utilizzo delle funzioni
STEP 4 Definire le funzioni
[Description("Get the residence city from the user")]
string GetCity(string name)
{
return "Roma";
}
[Description("Get the age of a user")]
int GetUserAge(string name)
{
return 25;
}
Definite le funzioni le associamo al nostro agent
Andiamo ad aggiungere ai plugin le funzioni che abbiamo scritto sopra, in modo tale che questo possa invocarle quando necessario
agent.Kernel.Plugins.Add(GetCity);
agent.Kernel.Plugins.Add(GetUserAge);
Definire gli arguments nella definizione dell'agent
ChatCompletionAgent agent = new() // 👈🏼 Definition of the agent
{
Instructions = "You are an agent who creates funny stories. If you find any
information related to the user through plugins or tools, include it in
the story to make it more personal and engaging.",
Name = "Story Agent",
Description = "This agent can create funny stories based on user input.",
Kernel = kernel,
Arguments = new KernelArguments(new PromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
}) // 👈🏼 Set the function choice behavior to auto
};