news 2026/5/27 5:49:28

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MAF快速入门(3)聊天记录持久化到数据库

准备工作

在今天的这个案例中,我们创建了一个.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 模型,你可以通过这个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").Get<OpenAIProvider>();

数据库初始化

为了将聊天记录持久化,我们定一个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 DbSet<CustomChatHistory> ChatHistories { get; set; }

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

执行结果下图所示:

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.Deserialize<JsonElement>(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这款车,并给了我们一些这款车的特性,清晰准确!

小结

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 6:18:37

CST通过Save As Protected功能对工程进行加密保护

对外发资料有加密要求的用户&#xff0c;使用Save As Protected功能可以实现既呈现仿真结果&#xff0c;又对结构、材料、端口设置等内容进行加密保护。使用该功能时&#xff0c;需要先要保存一下工程。在保存状态下选择File > Project > Save As Protected,便可打开加密…

作者头像 李华
网站建设 2026/5/27 8:52:22

macOS窗口管理工具深度解析:从新手到专家的进阶指南

macOS窗口管理工具深度解析&#xff1a;从新手到专家的进阶指南 【免费下载链接】open-source-mac-os-apps serhii-londar/open-source-mac-os-apps: 是一个收集了众多开源 macOS 应用程序的仓库&#xff0c;这些应用程序涉及到各种领域&#xff0c;例如编程、生产力工具、游戏…

作者头像 李华
网站建设 2026/5/26 6:29:55

【AI工程化核心突破】:如何用Docker快速部署可扩展的智能Agent集群

第一章&#xff1a;智能 Agent 集群部署的挑战与演进随着分布式系统和人工智能技术的深度融合&#xff0c;智能 Agent 集群在边缘计算、自动驾驶协同、工业自动化等场景中扮演着关键角色。然而&#xff0c;其大规模部署面临诸多挑战&#xff0c;包括异构环境适配、动态负载均衡…

作者头像 李华
网站建设 2026/5/25 11:14:03

Shipit自动化部署工具终极指南:提升团队协作效率的完整解决方案

Shipit自动化部署工具终极指南&#xff1a;提升团队协作效率的完整解决方案 【免费下载链接】shipit Universal automation and deployment tool ⛵️ 项目地址: https://gitcode.com/gh_mirrors/sh/shipit 在当今快速迭代的软件开发环境中&#xff0c;高效的自动化部署…

作者头像 李华
网站建设 2026/5/26 22:52:04

计算机408考研冲刺阶段高效提分策略:从诊断到实战的全方位指南

考研计算机408科目在最后冲刺阶段如何实现分数突破&#xff1f;本文为你提供一套从问题诊断到实战演练的完整解决方案&#xff0c;帮助你在有限时间内最大化学习效果。 【免费下载链接】cs-408 计算机考研专业课程408相关的复习经验&#xff0c;资源和OneNote笔记 项目地址: …

作者头像 李华
网站建设 2026/5/27 16:48:44

BiliBili-UWP客户端:Windows系统专属B站应用全方位体验指南

还在为浏览器观看B站视频时卡顿、发热而烦恼吗&#xff1f;BiliBili-UWP客户端为Windows用户带来了全新的解决方案&#xff01;作为一款专为Windows平台打造的第三方B站应用&#xff0c;它不仅解决了浏览器性能瓶颈&#xff0c;更提供了专业级的视频播放和社区互动体验。&#…

作者头像 李华