2026/4/18 13:36:21
网站建设
项目流程
全国建设部网站官网,建立手机也可浏览的网站教程,商丘做手机做网站,网络ip查询网站准备工作在今天的这个案例中#xff0c;我们创建了一个.NET控制台应用程序#xff0c;安装了以下NuGet包#xff1a;Microsoft.EntityFrameworkCore.SqliteMicrosoft.Agents.AI.OpenAIMicrosoft.Extensions.AI.OpenAI我们的配置文件中定义了LLM API的信息#xff1a;复制代…准备工作在今天的这个案例中我们创建了一个.NET控制台应用程序安装了以下NuGet包Microsoft.EntityFrameworkCore.SqliteMicrosoft.Agents.AI.OpenAIMicrosoft.Extensions.AI.OpenAI我们的配置文件中定义了LLM API的信息复制代码{OpenAI: {EndPoint: https://api.siliconflow.cn,ApiKey: ******************************,ModelId: Qwen/Qwen2.5-32B-Instruct}}复制代码这里我们使用 SiliconCloud 提供的 Qwen2.5-32B-Instruct 模型你可以通过这个URL注册账号https://cloud.siliconflow.cn/i/DomqCefW 获取大量免费的Token来进行本次实验。然后我们将配置文件中的API信息读取出来var config new ConfigurationBuilder().AddJsonFile($appsettings.json, optional: false, reloadOnChange: true).Build();var openAIProvider config.GetSection(OpenAI).GetOpenAIProvider();数据库初始化为了将聊天记录持久化我们定一个CustomChatHistory类来记录每次对话的内容复制代码public sealed class CustomChatHistory{public string Id { get; set; }public string Context { get; set; }public DateTime CreatedTime { get; set; }public CustomChatHistory(string context){Id Guid.NewGuid().ToString();Context context;CreatedTime DateTime.UtcNow;}}复制代码然后基于EF Core实现一个DbContext这是老操作了复制代码public class ChatHistoryDbContext : DbContext{public DbSetCustomChatHistory ChatHistories { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseSqlite(Data SourceChatHistoryDb.db);}}复制代码有了DbContext后续我们就可以往数据库中写数据了。创建一个AI Agent通过MAF快速创建一个专注于回答马自达汽车知识的Agentvar mazdaAgent new OpenAIClient(new ApiKeyCredential(openAIProvider.ApiKey),new OpenAIClientOptions { Endpoint new Uri(openAIProvider.Endpoint) }).GetChatClient(openAIProvider.ModelId).CreateAIAgent(name: Powerful Assistant, instructions: You are a helpful assistant who responds user message in Mazda cars.);开始第一轮对话开启第一轮对话我们想了解下Mazda 3这款车var userMessage Hello, can you tell me about the Mazda 3?;Console.WriteLine($User {userMessage});var thread mazdaAgent.GetNewThread();var agentResponse await mazdaAgent.RunAsync(userMessage, thread);Console.WriteLine($Agent {agentResponse});执行结果下图所示image可以看到它洋洋洒洒地用了很多文字给我们介绍马三这款车。对话记录持久化假设我们这时要接一个电话暂时就不跟Agent对话了。那么Agent需要将对话记录存下来这里我们就需要进行AgentThread的序列化并将其存到数据库复制代码var serializedThread thread.Serialize(JsonSerializerOptions.Web).GetRawText();var chatConversation new CustomChatHistory(serializedThread);var dbContext new ChatHistoryDbContext();dbContext.Database.EnsureCreated();dbContext.ChatHistories.Add(chatConversation);await dbContext.SaveChangesAsync();复制代码这里我们存入的是一个Sqlite文件数据库主要用于演示十分便捷。image假设过了几分钟我们接完电话回来准备继续对话了Agent系统需要再从数据库中将我们的对话记录读取出来也就是进行AgentThread的反序列化var savedConversation dbContext.ChatHistories.First(c c.Id chatConversation.Id);var loadedThread JsonSerializer.DeserializeJsonElement(savedConversation.Context, JsonSerializerOptions.Web);var resumedThread mazdaAgent.DeserializeThread(loadedThread, JsonSerializerOptions.Web);开始第二轮对话我们刚刚问了Mazda 3这款车的基本信息现在我们想了解下这款车的一些特性。这里我直接问“What are the feautres of this car?”这个 this car 就需要结合上下文才能知道我问的是哪一款车。userMessage What are the features of this car?;Console.WriteLine($User {userMessage});agentResponse await mazdaAgent.RunAsync(userMessage, resumedThread);Console.WriteLine($Agent {agentResponse});执行结果如下图所示首先通过debug我们可以看到反序列化出来的AgentThread的确是包含了我们第一轮的对话记录image其次Agent在聊天记录的基础上回答这个问题的结果如下image由上图可以看出Agent准确的分析到了我们所说的 this car 指的是之前聊到的 Mazda 3这款车并给了我们一些这款车的特性清晰准确小结