Semantic Kernel进阶:创建和管理聊天(ChatCompletion)历史记录对象(四)

news2025/1/16 13:47:50

一、引言

在构建基于Semantic Kernel的AI应用时,聊天历史记录对象(Chat History)是维护对话上下文和连续性的关键。本文将一步步指导你如何创建和管理聊天历史记录对象,从而为你的AI代理提供一个强大的对话管理工具。
在这里插入图片描述

二、聊天历史记录对象的重要性

聊天历史记录对象用于存储聊天会话中的所有消息,包括来自用户、助理、工具或系统的消息。它不仅帮助AI模型理解对话的上下文,还能确保对话的连贯性,无论对话跨越多少轮次。

三、实战

3.1创建聊天历史记录对象

创建聊天历史记录对象是一个简单的过程。以下是在C#中创建聊天历史记录对象的步骤:

  1. 引入必要的命名空间
using Microsoft.SemanticKernel.ChatCompletion;
  1. 创建聊天历史记录对象
ChatHistory history = new ChatHistory();
  1. 添加消息到聊天历史记录
history.AddSystemMessage("你是一个乐于助人的技术助手");

history.AddUserMessage("可以学到什么技术?");
history.AddAssistantMessage("关注我的博客,可以了解SemanticKernel、python、c#、docker等知识。您想要学点什么?");

在这个例子中,我们添加了系统消息、用户消息和助理消息,从而构建了一个简单的对话流程。

3.2 实战小例子

构建一个命令行聊天对话功能,具体代码如下,可以看到AI可以准确识别提到的每一项技术。
下面为完整代码,可以看前面几篇实战例子中的代码介绍。

        public static async Task RunAsync()
        {
#pragma warning disable SKEXP0001, SKEXP0010, SKEXP0050, SKEXP0020, ASP0000
            //如果使用依赖项注入,则可能需要将 AI 服务直接添加到服务提供商。
            //如果要创建 AI 服务的单一实例并在暂时性内核中重复使用它们,这非常有用。

            var builder = Host.CreateApplicationBuilder();

            // 创建语义内核
            Kernel kernel = Kernel.CreateBuilder()
                .AddOpenAIChatCompletion(
                    modelId: Global.Model,//你使用的模型
                    endpoint: new Uri(Global.EndpointKey),//你使用的模型请求地址
                    apiKey: Global.ApiKey)//你使用的key
                .Build();

            builder.Services.AddOpenAIChatCompletion(
                 modelId: Global.Model,
                    endpoint: new Uri(Global.EndpointKey),
                    apiKey: Global.ApiKey
            );

            builder.Services.AddTransient((serviceProvider) => {
                return new Kernel(serviceProvider);
            });

            //将聊天完成服务添加到内核后,可以使用 get 服务方法检索它们。 下面是如何从内核检索聊天完成服务的示例。
            var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

            Console.WriteLine("--------------问答--------------");


            string input;
            bool running = true;

            ChatHistory history = new ChatHistory();
            history.AddSystemMessage("你是一个乐于助人的技术助手");

            history.AddUserMessage("可以学到什么技术?");
            history.AddAssistantMessage("关注我的博客,可以了解SemanticKernel、python、c#、docker等知识。您想要学点什么?");

            while (running)
            {
                Console.WriteLine("当前历史对话数:" + history.Count);

                Console.WriteLine("请输入您的问题(输入'exit'退出):");
                input = Console.ReadLine();

                if (input.ToLower() == "exit")
                    running = false;
                else
                {
                    //将用户的问题添加到历史记录中
                    history.AddUserMessage(input);

                    var response = await chatCompletionService.GetChatMessageContentAsync(
                        history,
                        kernel: kernel
                    );

                    Console.WriteLine("AI回复内容如下:");
                    Console.WriteLine(response);
                    //将AI回复添加到历史记录中
                    history.Add(response);
                }

                Console.WriteLine("---------------下一次循环-------------");
                Console.WriteLine();

            }

            Console.WriteLine("程序退出。");

            
        }

如下图,AI可以根据历史记录,准确无误地找到上面提到的4种技术(SemanticKernel、python、c#、docker)。

当提问第5种时,也可正确识别历史记录中是没有第5中技术的,AI就根据自身学习的内容,推荐了JS
在这里插入图片描述

在这里插入图片描述

四、结论

通过使用聊天历史记录对象,Semantic Kernel为AI应用程序提供了一种强大的方式,以维护对话的上下文和连续性。这不仅提高了用户体验,还使得AI模型能够更自然地参与对话。


希望这篇文章能帮助你理解如何使用聊天历史记录功能来增强你的Semantic Kernel应用程序。如果你有任何问题或需要进一步的帮助,请随时提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java平方根计算 C语言指针变量

1. public static void main(String[] args) { Scanner scnew Scanner(System.in);System.out.println("请输入你的数&#xff1a;"); int numsc.nextInt();for (int i 1; i < num; i) {if (i*inum){System.out.println(i"就是"num"的平方根"…

基于Python的B站视频数据分析与可视化

基于Python的B站视频数据分析与可视化 爬取视频、UP主信息、视频评论 功能列表 关键词搜索指定帖子ID爬取指定UP主的主页爬取支持评论爬取生成评论词云图支持数据存在数据库支持可视化 部分效果演示 爬取的UP主信息 关键词搜索爬取 指定UP主的主页爬取 指定为黑马的了 爬取视…

ubuntu2204配置cuda

ubuntu2204配置cuda ✅系统版本&#xff1a;ubuntu22.04 LTS ✅显卡&#xff1a;英伟达2070S ✅CPU&#xff1a;i9 10900 ✅主板&#xff1a;戴尔品牌机 教程&#x1f4a8;&#x1f4a8;&#x1f4a8;&#x1f4a8;&#xff1a; ps&#xff1a;本人按照该方法一遍成功&#…

Python的协程与传统的线程相比,是否能更有效地利用计算资源?在多大程度上,这种效率是可测量的?如何量化Python协程的优势|协程|线程|性能优化

目录 1. 协程与线程的基本概念 1.1 线程 1.2 协程 2. 协程的实现原理 2.1 基本示例 3. 协程与线程的效率对比 3.1 资源利用率 3.2 性能测试 4. 使用场景分析 4.1 适用场景 4.2 不适用场景 5. 性能监测与测量 5.1 使用时间记录 5.2 使用第三方库 6. 总结与展望 P…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——15.C++11(1)

1. 自动类型推导 (auto) C11 引入了 auto 关键字&#xff0c;可以根据初始值的类型自动推导变量的类型&#xff0c;从而减少了手动声明类型的繁琐。例如&#xff1a; std::vector<int> vec {1, 2, 3, 4}; auto it vec.begin(); // 自动推导类型为 std::vector<in…

C++类和对象 (中)

文章目录 前言一. 类的默认成员函数1.1 构造函数概念特点 1.2 析构函数定义与特点作用注意 1.3 拷贝构造函数概念特性 2. 赋值运算符重载2.1 运算符重载特性注意 2.2 赋值运算符重载定义特性 2.3 流运算符重载概念注意 3. 日期类实现4. const成员函数概念注意 5. 取地址运算符重…

【c++丨STL】string模拟实现(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 一、头文件&#xff08;成员变量与函数声明&#xff09; 二、源文件&#xff08;功能实现&#xff09; 交换两字符串 构造函数 拷贝构造…

人工智能进程;算子加速的具体计算部分;大模型GPT5:参数18万亿;大模型面临问题

目录 人工智能进程 算子加速的简单理解,举例说明 一、简单理解 二、举例说明 一、算子加速的具体计算部分 二、举例说明 三、算子加速是否仅针对GPU 大模型GPT5:参数18万亿 大模型面临问题 算力集群设计框架 人工智能进程

【c++高级篇】--多任务编程/多线程(Thread)

目录 1.进程和线程的概念&#xff1a; 1.1 进程&#xff08;Process&#xff09;&#xff1a; 1.2线程&#xff08;Thread&#xff09;&#xff1a; 1.3 对比总结&#xff1a; 2.多线程编程&#xff1a; 2.1 基于线程的多任务处理&#xff08;Thread&#xff09;&#xf…

jenkins ssh 免密报错Host key verification failed.

jenkins 发布项目&#xff0c;ssh连接远程服务器时报错&#xff1a;Host key verification failed. 解决&#xff1a; 原因是生成的sshkey不是用的jenkins用户&#xff0c;所以切换用户到&#xff1a;jenkins重新生成sshkey su jenkins ssh-keygen -t rsa ssh-copy-id -i ~/…

Linux: Shell编程入门

Shell 编程入门 1 ) Shell 概念 shell 是 在英语中 壳, 外壳的意思可以把它想象成嵌入在linux这样的操作系统里面的一个微型的编程语言不像C语言, C 或 Java 等编程语言那么完整&#xff0c;它可以帮我们完成很多自动化任务例如保存数据监测系统的负载等等&#xff0c;我们同样…

MATLAB生物细胞瞬态滞后随机建模定量分析

&#x1f3af;要点 基于随机动态行为受化学主方程控制&#xff0c;定量分析单细胞瞬态效应。确定性常微分方程描述双稳态和滞后现象。通过随机性偏微分方程描述出暂时性滞后会逐渐达到平稳状态&#xff0c;并利用熵方法或截断方法计算平衡收敛速度的估计值。随机定量分析模型使…

什么是字节序、大小端、高低字节、高低地址?

目录 1. 什么是字节序&#xff08;Endianness&#xff09;&#xff1f; 2. 什么是大小端&#xff08;Big-Endians and Little-Endian&#xff09;&#xff1f; 3. 什么时候需要用到大小端的概念&#xff1f; 4. 如何确认系统的大小端模式&#xff1f; 5. 什么是大小端定义…

[LVGL] MessageBox

该例子用lvgl9 来测试&#xff0c;对话框从底部升上来。当点击关闭或者确认按键时&#xff0c;会向绑定对象发送按键事件&#xff0c;参数 100/101. /*** file lv_demo_test.c**/#include "stdio.h" #include "stdlib.h" #include "lvgl.h"#ifde…

985研一,转嵌入式好还是后端开发好?

有个老铁问&#xff0c;985研一&#xff0c;转嵌入式好还是后端开发好&#xff1f; 我认为&#xff0c;这学历&#xff0c;两个随便挑&#xff0c;我说的&#xff0c;从趋势来看&#xff0c;更建议嵌入式&#xff0c;走供应链上游&#xff0c;芯片原厂、新能源车企、军工或者搞…

IDEA自动生成时序图插件-SequenceDiagram

目录 前言介绍安装在线安装离线安装 使用基本使用使用技巧 知识扩展为什么要画时序图&#xff1f;为什么要使用SequenceDiagram插件&#xff1f; 前言 工欲善其事&#xff0c;必先利其器&#xff0c;用对工具&#xff0c;事半功倍。我向大家介绍一款卓越的插件——Sequence Dia…

衡石分析平台系统分析人员手册-展示类控件创建富文本攻略

富文本​ 富文本控件是一种常见的控件&#xff0c;可用来展示文本信息、用户属性信息&#xff0c;在数据分析中起到辅助分析的功能。 富文本常见的使用场景有&#xff1a; 仅展示纯文本信息。在富文本中展示数据集字段、指标、参数等信息。使用富文本展示用户属性相关信息。在…

H3m-Blog

H3m-Blog 一、项目介绍 1.1 项目介绍 一个基于SpringBoot和Vue3的博客系统&#xff0c;博客名称来源于陈奕迅于2009年发布的粤语专辑《H3M》 1.2 技术架构 主要技术栈&#xff1a; SpringBoot2 Vue3 MySQL8.0 1.3 主要功能 内容丰富&#xff0c;尽情体验~ 二、快速开始…

Win11安装基于WSL2的Ubuntu

1. 概述 趁着还没有完全忘记&#xff0c;详细记录一下在Win11下安装基于WSL2的Ubuntu的详细过程。不得不说WSL2现在被微软开发的比较强大了&#xff0c;还是很值得安装和使用的&#xff0c;笔者就通过WSL2安装的Ubuntu成功搭建了ROS环境。 2. 详论 2.1 子系统安装 在Win11搜…

【HarmonyOS NEXT】使用 Navigation 对折叠屏设备页面进行分栏展示,优化 UI 交互

关键词&#xff1a;折叠屏、navigation、router、路由、分栏、UI 随着科技的发展&#xff0c;手机设备形态也由一面屏向多面屏进行发展&#xff0c;那么软件的UI适配也面临着问题&#xff0c;本篇文章主要解决大屏设备的页面 UI 适配问题&#xff0c;如折叠屏&#xff0c;平板&…