大数跨境
0
0

MAF快速入门(3)聊天记录持久化到数据库

MAF快速入门(3)聊天记录持久化到数据库 dotNET跨平台
2025-11-29
27
导读:大家好,我是Edison。上一篇,我们学习了MAF对于单个Agent的花样玩法,其中提到了聊天记录的持久化存

大家好,我是Edison。

上一篇,我们学习了MAF对于单个Agent的花样玩法,其中提到了聊天记录的持久化存储。本篇,我们来继续实践一下将聊天记录持久化到关系型数据库,这样用户在中断会话后返回时还能从上次断开的地方继续对话,提供给用户不间断的体验。

准备工作

在今天的这个案例中,我们创建了一个.NET控制台应用程序,安装了以下NuGet包:
  • Microsoft.EntityFrameworkCore.Sqlite
  • Microsoft.Agents.AI.OpenAI
  • Microsoft.Extensions.AI.OpenAI
我们的配置文件中定义了LLM API的信息:
{  "OpenAI": {    "EndPoint": "https://api.siliconflow.cn",    "ApiKey": "******************************",    "ModelId": "Qwen/Qwen2.5-32B-Instruct"  }}
这里我们使用 SiliconCloud 提供 Qwen2.5-32B-Instruct 模型
然后,我们将配置文件中的API信息读取出来:
var config = new ConfigurationBuilder()    .AddJsonFile($"appsettings.json", optionalfalse, reloadOnChangetrue)    .Build();var openAIProvider = config.GetSection("OpenAI").Get<OpenAIProvider>();

数据库初始化

为了将聊天记录持久化,我们定一个CustomChatHistory类来记录每次对话的内容:

public sealed class CustomChatHistory{    public string Id { getset; }    public string Context { getset; }    public DateTime CreatedTime { getset; }     public CustomChatHistory(string context)    {        Id = Guid.NewGuid().ToString();        Context = context;        CreatedTime = DateTime.UtcNow;    }}

然后,基于EF Core实现一个DbContext,这是老操作了:

public class ChatHistoryDbContext : DbContext{    public DbSet<CustomChatHistory> ChatHistories { getset; }    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)    {        optionsBuilder.UseSqlite("Data Source=ChatHistoryDb.db");    }}

有了DbContext后续我们就可以往数据库中写数据了。

创建一个AI Agent

通过MAF快速创建一个专注于回答马自达汽车知识的Agent:

var 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}");

执行结果下图所示:

可以看到,它洋洋洒洒地用了很多文字给我们介绍马三这款车。

对话记录持久化

假设我们这时要接一个电话,暂时就不跟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文件数据库,主要用于演示,十分便捷。

假设过了几分钟,我们接完电话回来准备继续对话了,Agent系统需要再从数据库中将我们的对话记录读取出来,也就是进行AgentThread的反序列化:

var savedConversation = dbContext.ChatHistories.First(c => c.Id == chatConversation.Id);var loadedThread = JsonSerializer.Deserialize<JsonElement>(savedConversation.ContextJsonSerializerOptions.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的确是包含了我们第一轮的对话记录:

其次,Agent在聊天记录的基础上回答这个问题的结果如下:

由上图可以看出,Agent准确的分析到了我们所说的 this car 指的是之前聊到的 Mazda 3这款车,并给了我们一些这款车的特性,清晰准确!

小结

本文介绍了如何将Agent中的聊天记录持久化到数据库中,这对于保持用户对话体验十分重要。
下一篇,我们将继续MAF的学习。
示例源码
参考资料
Microsoft Learn,《Agent Framework Tutorials》:https://learn.microsoft.com/en-us/agent-framework/overview/agent-framework-overview?wt.mc_id=MVP_397012
推荐学习
圣杰,《.NET + AI 智能体开发进阶
年终总结:Edison的2024年终总结
数字化转型:我在传统企业做数字化转型
C#刷算法题C#刷剑指Offer算法题系列文章目录
C#刷设计模式C#刷23种设计模式系列文章目录
.NET面试:.NET开发面试知识体系

【声明】内容源于网络
0
0
dotNET跨平台
专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,
内容 883
粉丝 0
dotNET跨平台 专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,
总阅读14.4k
粉丝0
内容883