1、从DeepSeek API调用到Semantic Kernel集成:深度解析聊天机器人开发全链路

news/2025/3/17 15:44:34/文章来源:https://www.cnblogs.com/huangmingji/p/18776994

引言:AI时代下的聊天机器人开发范式演进

在生成式AI技术爆发的当下,基于大语言模型(LLM)的聊天机器人开发已形成标准化技术链路。本文将结合DeepSeek API与微软Semantic Kernel框架,以C#语言实战演示从基础API调用到高级框架集成的完整开发流程。

环境准备与基础配置

  • .NET 9 SDK
  • Visual Studio 2022或VSCode
  • DeepSeek API密钥 官网申请

DeepSeek API基础调用

DeepSeek API的Endpoint地址为:https://api.deepseek.com/chat/completions,相关文档可查看官方文档

  1. 单轮对话实现
    代码示例
public async Task<ResponseBody> GetChatMessageContentsAsync(CancellationToken cancellationToken = new CancellationToken())
{var client = new HttpClient();var request = new HttpRequestMessage(HttpMethod.Post, _builder.Endpoint);request.Headers.Add("Accept", "application/json");request.Headers.Add("Authorization", $"Bearer {_builder.ApiKey}");_body.Stream = false;var content = new StringContent(_body.SerializeObject(), null, "application/json");request.Content = content;var response = await client.SendAsync(request, cancellationToken);var responseBody = await response.Content.ReadAsStringAsync(cancellationToken);return JsonConvert.DeserializeObject<ResponseBody>(responseBody) ?? new ResponseBody();
}
  1. 流式响应处理
    代码示例
public async IAsyncEnumerable<ResponseBody> GetStreamingChatMessageContentsAsync([EnumeratorCancellation] CancellationToken cancellationToken = new CancellationToken())
{var client = new HttpClient();var request = new HttpRequestMessage(HttpMethod.Post, _builder.Endpoint);request.Headers.Add("Accept", "application/json");request.Headers.Add("Authorization", $"Bearer {_builder.ApiKey}");_body.Stream = true;var content = new StringContent(_body.SerializeObject(), null, "application/json");request.Content = content;var response = await client.SendAsync(request, cancellationToken);var stream = await response.Content.ReadAsStreamAsync(cancellationToken);var reader = new StreamReader(stream);while (!reader.EndOfStream){var line = await reader.ReadLineAsync(cancellationToken);if (string.IsNullOrEmpty(line) || line.StartsWith(":")) continue;if (line.StartsWith("data: ")){var jsonData = line["data: ".Length ..];if (jsonData == "[DONE]") break;yield return JsonConvert.DeserializeObject<ResponseBody>(jsonData) ?? new ResponseBody();}}
}

Semantic Kernel框架集成

Semantic Kernel是一种轻型开源开发工具包,可用于轻松生成 AI 代理并将最新的 AI 模型集成到 C#、Python 或 Java 代码库中。 它充当一个高效的中间件,可实现企业级解决方案的快速交付。
DeepSeek API与Semantic Kernel框架集成,可快速实现基于大语言模型的聊天机器人开发。由于DeepSeek API与OpenAI API的兼容性,因此DeepSeek API与Semantic Kernel框架的集成非常简单。只需使用OpenAI的连接器,即可快速实现DeepSeek API与Semantic Kernel框架的集成。

  1. NuGet包安装
dotnet add package Microsoft.SemanticKernel
  1. Semantic Kernel初始化
var openAIClientCredential = new ApiKeyCredential(apiKey);
var openAIClientOption = new OpenAIClientOptions
{Endpoint = new Uri("https://api.deepseek.com"),};
var builder = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId, new OpenAIClient(openAIClientCredential, openAIClientOption));var kernel = builder1.Build();
  1. 聊天机器人开发
var chatCompletionService = kernel1.GetRequiredService<IChatCompletionService>();Console.WriteLine("😀User >> "+ chatHistory.Last().Content);
var result = chatCompletionService.GetStreamingChatMessageContentsAsync(chatHistory
);
Console.Write("👨Assistant >> ");
await foreach (var item in result)
{Thread.Sleep(200);Console.Write(item.Content);
}

代码示例

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CH585 RF_Basic例程讲解含单向和双向发送

CH585_RF基础通讯例程见下图路径:1、RF初始化参数配置/******************************************************************************** @fn RFRole_Init** @brief RF应用层初始化** @param None.** @return None.*/ void RFRole_Init(void) {rfTaskID = TMOS_…

uniapp整合SQLite(Android)

一、勾选SQLite数据库选项 (1)HBuilder工具打开项目 (2)项目/manifest.json =>App模块配置 => 勾选SQLite(数据库)二、封装sqlite.ts 在项目根目录下创建sqlite/sqlite.ts// 数据库名称 const dbName = scan/*** 数据库地址* @type {String} 推荐以下划线为开头 _d…

No.68 Vue---vue3新特性

一、vue3新特性 1.1 六大亮点二、组合API(setup)2.1 ref或者reactive 1、创建项目 vue create vue-demo5 2、进入文件,启动服务。 3、 2.2 methods中定义的方法写在setup() 2.3setup()中使用props和context 在2.x中,组件的方法中可以通过this获取到当前组件的实例,并执…

2025年2月国产数据库大事记-墨天轮

​本文为墨天轮社区整理的2025年2月国产数据库大事件和重要产品发布消息,一起看看2月有哪些大事发生~本文为墨天轮社区整理的2025年2月国产数据库大事件和重要产品发布消息。 目录2025年2月国产数据库大事记 TOP10 2025年2月国产数据库大事记(时间线) 产品/版本发布 兼容认证…

Mybatis-入门

配置:JDBC:原始HDBC的问题:数据库连接池:lombok:

SimpleRev(buu-reverse)

IDA打开题目大致看主函数没什么东西,主要控制开始和退出,我们进入decry加密函数看看,下面给出ai注释后的伪代码方便理解点击查看代码 // 解密验证函数,返回栈保护校验值 unsigned __int64 Decry() {// 局部变量声明(IDA自动生成的变量名)char v1; // 临时存…

soildworks装配体流体仿真

模型分析区域缩放可以将一个零件的分析结果导入到另一仿真中去 右键项目>自定义树>调用边界条件> 右键边界条件,添加之前的边界条件

因为Apifox不支持离线,我果断选择了Apipost!

要说国内最有名的两款API开发工具不是Apipost就是Apifox,因为曾经遭遇到这样的事情,导致我坚定的选择了Apipost。一个以用户立场设计工具、愿意把选择权交给用户的工具,是充分考虑用户和尊重用户的,这才应该是工具进化的终极意义。要说国内最有名的两款API开发工具不是Apip…

DEPRECATION WARNING: Using / for division is deprecated and will be removed in Dart Sass 2.0.0.

为了向后兼容,sass 会提醒不推荐使用/运算符。修改方式也告诉我们了,就是替换成math.div($spacer, 2)。 进一步在sass的中文网站 查到这个函数的 API,对比下自己的版本有没有高于这个1.33.0。如没有先去升级,否则直接修改即可。但改完后报错了,说没有 math 模块。 解决方…

第十五课 推理和代理(第十四课脑机接口没有学)

那么LLM是否也可以进行推理呢?之前我们学过,LLM可以通过提示词或者few-shot,zero-shot-Cot等进行推理。下面介绍一个新方法:自我一致性(Self-Consistency)下面来看一下效果还有一种策略:将一个问题分解成多个小问题逐个解决这种方法的泛化性甚至很好,也就是说我们举出的…

java的基础之标识符

标识符的注意点:关键字:数据类型: