当前位置: 首页 > news >正文

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

小结

http://www.cnnetsun.cn/news/111916.html

相关文章:

  • 终极AI平台wgai:零门槛构建国产化智能识别系统
  • 基于VUE的企业协同管理系统 [VUE]-计算机毕业设计源码+LW文档
  • 如何快速使用bandcamp-dl:命令行音乐下载工具的完整教程
  • 【Excel VBA 编程】第61讲:两种方法驾驭文本处理猛兽
  • 探索金领冠珍护源初的纯净世界:2025年健康奶粉新篇章
  • Solon 不依赖 Java EE 是其最有价值的设计!
  • MegSpot:专业级图片视频对比工具全方位使用指南
  • LaMa图像修复模型性能优化实战:从PyTorch到TensorRT的完整加速方案
  • WAN2.2视频生成革命:如何用4步采样重新定义创作效率?
  • 终极Headscale配置指南:从零到精通
  • Sapiens视觉系统如何实现工业级稳定性:5个关键技术解析
  • so-vits-svc F0预测器实战指南:从问题诊断到性能调优
  • RapidJSON性能飞跃:揭秘C++ JSON解析的极限优化方案
  • 高效ESP32文件系统管理:专业级SPIFFS部署实战指南
  • linpack测试HPL.dat配置文件
  • sist2:构建高效文件检索系统的开源利器
  • 技术视角深析:2025年TOP5 AI种草营销服务商的架构设计与工程实现
  • Citra模拟器终极解决方案:5步快速修复常见问题指南
  • 揭秘Docker MCP网关常见错误:5个高频故障的根因分析与应对方案
  • 提升Monaco Editor行号显示效果:三种实用优化方案
  • 企业级多语言构建革命:Bazel如何重塑你的开发流程?
  • 【量子电路可视化终极指南】:手把手教你用VSCode打造高效渲染工作流
  • 快速掌握pandapower:电力系统建模与分析的终极指南 [特殊字符]
  • 突破性姿态识别引擎:打造智能动作分析新标杆
  • 5个让用户爱不释手的图片预览技巧:从基础到高级画廊
  • 数据恢复神器TestDisk:如何用3个关键步骤找回你丢失的所有文件?
  • 语音识别终极指南:解锁智能语音交互新体验
  • 毕业论文AI生成网站推荐:7大免费替代工具
  • 如何在最后30天实现计算机408分数质的飞跃?高效备考突破技巧全解析
  • 告别YouTube追踪:Invidious隐私保护生态完整搭建指南