哪个网站做线路攻略做得好淮安网站建设公司电话

张小明 2026/1/11 12:52:57
哪个网站做线路攻略做得好,淮安网站建设公司电话,pc端软件下载,旅游公司网站难做吗在构建生成式 AI 应用时#xff0c;我们经常面临一个关键挑战#xff1a;“记忆管理#xff08;Memory Management#xff09;”。在简单的 Demo 中#xff0c;我们通常把聊天记录#xff08;Chat History#xff09;直接存在内存的 ListChatMessage 中#xf…在构建生成式 AI 应用时我们经常面临一个关键挑战“记忆管理Memory Management”。在简单的 Demo 中我们通常把聊天记录Chat History直接存在内存的ListChatMessage中这很容易。但在实际的生产环境尤其是构建无状态Stateless的 Web API 时这种方式就完全不够用了服务器重启内存里的数据丢失负载均衡导致请求落在不同服务器导致上下文无法共享用户刷新浏览器session 消失多终端App / Web无法共享对话历史因此我们需要将“记忆”托管到一个外部存储中例如向量数据库Azure AI Search / pgvectorRedisCosmos DBSQL / NoSQL 数据库任意持久化服务本节我们将使用 Microsoft Agent Framework 来演示如何通过实现自定义的ChatMessageStore将 AI 的记忆托管给外部存储。示例中我们采用 InMemory VectorStore仅用于演示你可以替换为任意数据库。引用包需要的 NuGet 包Azure.AI.OpenAI (2.1.0)Azure.Identity (1.18.0-beta.2)Microsoft.Agents.AI.OpenAI (1.0.0-preview.251125.1)Microsoft.Extensions.AI.OpenAI (10.0.1-preview.1.25571.5)Microsoft.SemanticKernel.Connectors.InMemory (1.67.1-preview)可选使用命令行安装dotnet add package Azure.AI.OpenAI --version 2.1.0 dotnet add package Azure.Identity --version 1.18.0-beta.2 dotnet add package Microsoft.Agents.AI.OpenAI --version 1.0.0-preview.251125.1 dotnet add package Microsoft.Extensions.AI.OpenAI --version 10.0.1-preview.1.25571.5 dotnet add package Microsoft.SemanticKernel.Connectors.InMemory --version 1.67.1-preview我们这一节中使用Microsoft.SemanticKernel.Connectors.InMemory包来实现一个简单的内存存储。关于更多的第三方存储实现可以参考 Semantic Kernel与Postgres向量存储引用外部包后我们就可以开始编写代码了。老生常谈基础配置请参考使用 Microsoft Agent Framework 构建你的第一个 Agent 应用组装 Agent注入自定义 ChatMessageStore在创建 Agent 时通过ChatMessageStoreFactory参数告诉框架如何为每个AgentThread创建消息存储器。AIAgent agent new AzureOpenAIClient( new Uri(endpoint), new AzureCliCredential()) .GetChatClient(deploymentName) .CreateAIAgent(new ChatClientAgentOptions { Instructions 你是一位江湖说书人擅长用幽默、接地气的方式讲笑话和故事。, Name Joker, ChatMessageStoreFactory ctx { return new VectorChatMessageStore(vectorStore, ctx.SerializedState, ctx.JsonSerializerOptions); } });接着我们就可以使用这个 Agent 来进行对话了。// 创建线程并运行对话 AgentThread thread agent.GetNewThread(); // 运行代理传入线程以存储对话历史记录在向量存储中。 Console.WriteLine(await agent.RunAsync(给我讲一个发生在茶馆里的段子轻松一点的那种。, thread)); // 序列化线程状态以便稍后使用。 JsonElement serializedThread thread.Serialize(); Console.WriteLine(\n--- Serialized thread ---\n); Console.WriteLine(JsonSerializer.Serialize(serializedThread, new JsonSerializerOptions { WriteIndented true })); // 反序列化线程状态以恢复对话。 AgentThread resumedThread agent.DeserializeThread(serializedThread); // 继续与代理对话传入恢复的线程以访问以前的对话历史记录。 Console.WriteLine(await agent.RunAsync(现在把这个段子加上一些表情符号并用说书人的语气再讲一遍。, resumedThread)); // 我们能够通过线程的 GetService 方法访问 VectorChatMessageStore如果我们需要读取存储线程的键。 var messageStore resumedThread.GetServiceVectorChatMessageStore()!; Console.WriteLine($\n线程唯一ID存储在向量数据库中: {messageStore.ThreadDbKey}); Console.WriteLine(\n--- 完成 ---\n);接下来我们定义VectorChatMessageStore来实现存储逻辑。internal sealedclassVectorChatMessageStore : ChatMessageStore { privatereadonly VectorStore _vectorStore; public VectorChatMessageStore(VectorStore vectorStore, JsonElement serializedStoreState, JsonSerializerOptions? jsonSerializerOptions null) { this._vectorStore vectorStore ?? thrownew ArgumentNullException(nameof(vectorStore)); if (serializedStoreState.ValueKind is JsonValueKind.String) { this.ThreadDbKey serializedStoreState.Deserializestring(); } } publicstring? ThreadDbKey { get; privateset; } public override async Task AddMessagesAsync(IEnumerableChatMessage messages, CancellationToken cancellationToken default) { this.ThreadDbKey ?? Guid.NewGuid().ToString(N); var collection this._vectorStore.GetCollectionstring, ChatHistoryItem(ChatHistory); await collection.EnsureCollectionExistsAsync(cancellationToken); await collection.UpsertAsync(messages.Select(x new ChatHistoryItem() { Key this.ThreadDbKey x.MessageId, Timestamp DateTimeOffset.UtcNow, ThreadId this.ThreadDbKey, SerializedMessage JsonSerializer.Serialize(x), MessageText x.Text }), cancellationToken); } publicoverrideasync TaskIEnumerableChatMessage GetMessagesAsync(CancellationToken cancellationToken default) { var collection this._vectorStore.GetCollectionstring, ChatHistoryItem(ChatHistory); await collection.EnsureCollectionExistsAsync(cancellationToken); var records await collection .GetAsync( x x.ThreadId this.ThreadDbKey, 10, new() { OrderBy x x.Descending(y y.Timestamp) }, cancellationToken) .ToListAsync(cancellationToken); var messages records.ConvertAll(x JsonSerializer.DeserializeChatMessage(x.SerializedMessage!)!); messages.Reverse(); return messages; } public override JsonElement Serialize(JsonSerializerOptions? jsonSerializerOptions null) JsonSerializer.SerializeToElement(this.ThreadDbKey); /// summary /// /// /summary privatesealedclassChatHistoryItem { [VectorStoreKey] publicstring? Key { get; set; } [VectorStoreData] publicstring? ThreadId { get; set; } [VectorStoreData] public DateTimeOffset? Timestamp { get; set; } [VectorStoreData] publicstring? SerializedMessage { get; set; } [VectorStoreData] publicstring? MessageText { get; set; } } }实现存储逻辑需要继承ChatMessageStore并重写关键方法。存AddMessagesAsync不存内存直接写库。取GetMessagesAsync通过 ID 去库里查按时间排序。序列化Serialize当系统要求 Agent “序列化当前状态”时只返回 ID。public override JsonElement Serialize(JsonSerializerOptions? options null) // 哪怕聊了 100 句序列化结果也只是一个轻量级的 ID 字符串 JsonSerializer.SerializeToElement(this.ThreadDbKey);代码执行逻辑序列由于图片过大不太适合在手机上查看请在PC上点击放大查看总结通过解耦“计算”Agent与“存储”VectorStore让 AI 应用更健壮。扩展性可替换底层存储Redis、CosmosDB、Postgres可以使用不同的连接器。轻量化前端或客户端只需保存一个极小的 Thread ID。云原生友好无状态的服务端设计便于水平扩展。源代码地址https://github.com/bingbing-gui/aspnetcore-developer/tree/master/src/09-AI-Agent/Agent-Framework/07-StorageConversations
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

韩国展厅设计网站杭州seo按天计费

第一章:DifyPDF解密全流程详解,99%的人都忽略的关键步骤在构建基于 Dify 的智能文档处理系统时,PDF 解密是至关重要的前置环节。许多用户在集成 PDF 解析功能时忽略了加密文档的自动识别与解密逻辑,导致后续文本提取失败或流程中断…

张小明 2026/1/7 13:10:49 网站建设

网站开发的图片要求网页设计的发展前景如何

Windows 10 使用技巧全解析 1. 释放磁盘空间 当你的电脑磁盘空间紧张时,可以通过清理系统文件来释放空间。具体操作步骤如下: 1. 点击窗口中的“清理系统文件”按钮,Windows 会进一步检查并列出更多可删除的文件。 2. 勾选所有要删除的项目,然后点击“确定”。对于不明…

张小明 2026/1/7 12:04:49 网站建设

微信网站开场动画wordpress左边菜单

FFXIVQuickLauncher终极指南:告别缓慢启动的全新体验 【免费下载链接】FFXIVQuickLauncher Custom launcher for FFXIV 项目地址: https://gitcode.com/GitHub_Trending/ff/FFXIVQuickLauncher 在最终幻想14的游戏旅程中,我们常常面临启动器响应迟…

张小明 2026/1/2 20:21:33 网站建设

网站主机名零基础一个人做网站

目录已开发项目效果实现截图开发技术系统开发工具:核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式&…

张小明 2026/1/10 15:44:16 网站建设

做网站都需要哪些费用中铁建设门户网入口

实用 awk 程序集合 1. 字符转译相关 在一些较旧的系统(如 Solaris)中,系统版本的 tr 工具可能要求列表写成方括号括起来的范围表达式(如 [a-z] )并加上引号,以防止 shell 进行文件名扩展。 以下是一个简单的时间检查和处理程序: if (naptime <= 0) {print &…

张小明 2026/1/10 16:40:10 网站建设

c2c网站制作页面设置

《深入探究 send 命令:功能、应用与对比》 在自动化脚本和交互式程序控制中, send 命令是一个强大且常用的工具。它能够向进程发送字符串,并且具备多种特殊功能,如控制字符发送的时间间隔、处理多进程通信等。本文将详细介绍 send 命令的各个方面,包括隐式与显式 sp…

张小明 2026/1/9 23:40:06 网站建设