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

C#实现一个HttpClient集成通义千问-多轮对话功能实现

多轮对话功能实现

  • 视频教程
  • 实现原理
    • 消息的类型
  • 功能开发
    • 消息类
    • 修改请求体
    • 修改发送请求函数
    • 修改用户消息输入
  • 多轮对话的token
  • 消息完整文档
    • 消息类型

视频教程

.Net+AI开发入门HttpClient实现通义千问集成-多轮对话功能实现

实现原理

一直保留更新messages

在这里插入图片描述

现在设置的meessages只设置了两条内容

  1. system:系统消息,给AI设置一个角色,
  2. user:用户消息,你提的问题

消息的类型

根据OpenAI API官网,消息有以下几种类型

在这里插入图片描述

我们现在主要用的就三个:

  • System Message :系统消息,用于指定模型的目标或角色(放在messages第一位)
  • User Message:用户消息,用户发送给模型的消息。
  • Assistant Message:助手消息,模型对用户消息的回复。

实现的效果:

messages:
system:xx
user:xxx
assistant:xxx
user:xxx
assistant:xxx

功能开发

消息类

创建一个消息类

 public class ChatMessage{public string role { get; set; }public string message { get; set; }}

修改请求体

修改请求体,将message内容改成一个占位字符串,用于后面修改

在这里插入图片描述

增加一个消息集合messages 用于存储消息

   List<ChatMessage> messages = new List<ChatMessage>();messages.Add(new ChatMessage() { role = "system", content = "你是一个C#高手" });

修改发送请求函数

增加一个result,获取流式输出的content完整内容,返回完整的助手消息内容,用于后续添加到messages中

 private static async Task<string> SendPostRequestAsync(string url,string jsonContent,string apiKey){using (var content = new StringContent(jsonContent, Encoding.UTF8, "application/json")){// 发送请求并获取响应HttpResponseMessage response = await httpClient.PostAsync(url, content);// 处理响应if (response.IsSuccessStatusCode){string result = "";using (Stream stream = await response.Content.ReadAsStreamAsync())using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)){string line;while ((line = await reader.ReadLineAsync()) != null){if (string.IsNullOrEmpty(line))continue;string data = line.Substring(6);if (data == "[DONE]"){//结束标志break;}var streamObject = JsonSerializer.Deserialize<StreamObject>(data);if (streamObject.choices.Count() > 0){var contentRes = streamObject.choices[0].delta.content;Console.Write(contentRes);result += contentRes;}if (streamObject.usage != null){Console.WriteLine($"Usage: prompt_tokens:{streamObject.usage.prompt_tokens}, completion_tokens:{streamObject.usage.completion_tokens}, total_tokens:{streamObject.usage.total_tokens}");}Thread.Sleep(200);}Console.WriteLine();}return result;// return await response.Content.ReadAsStringAsync();}else{Console.WriteLine($"请求失败: {response.StatusCode}");return $"请求失败: {response.StatusCode}";}}}

将httpclient设置请求头的代码拿到一开始,只设置一次

在这里插入图片描述

修改用户消息输入

  1. 修改用户消息,改成用户直接在控制台上输入,输入之后再加入到消息中
  2. 然后将消息集合messages序列化成字符串,替换掉jsonContent里面的消息占位符messagesContent,再发送出去
  3. 接收到模型返回的助手消息之后,将助手消息也添加到messages中去,role为"assistant"
  4. 然后下次发送,这些消息累加一起再发送
  while (true){Console.Write("User:");var usermessage = Console.ReadLine();if (string.IsNullOrEmpty(usermessage)){continue;}if (usermessage == "exit"){break;}var user = new ChatMessage() { role = "user", content = usermessage };messages.Add(user);var str = JsonSerializer.Serialize(messages);var send = jsonContent.Replace("messagesContent", str);// 发送请求并获取响应Console.WriteLine("assistant:");var result = await SendPostRequestAsync(url, send, apiKey);messages.Add(new ChatMessage() { role = "assistant", content = result });}

多轮对话的token

多轮对话的token是持续累加的,第二次发送的时候相当于第一次发送和返回的消息也发送了,都算在第二次发送的token中

在这里插入图片描述


消息完整文档

以下详细内容来着OpenAI API翻译

https://platform.openai.com/docs/api-reference/chat/create

消息类型

系统消息 (System message)

object

  • content (字符串或数组) 必填

    系统消息的内容。

  • role (字符串) 必填

    消息作者的角色,此处为 "system"

  • name (字符串) 可选

    用于区分相同角色参与者的可选名称。


用户消息 (User message)

object

  • content (字符串或数组) 必填

    用户消息的内容。

  • role (字符串) 必填

    消息作者的角色,此处为 "user"

  • name (字符串) 可选

    用于区分相同角色参与者的可选名称。

助手消息 (Assistant message)

object

  • content (字符串或数组) 可选

    助手消息的内容。除非指定 tool_callsfunction_call,否则必填。

  • refusal (字符串或 null) 可选

    助手的拒绝消息。

  • role (字符串) 必填

    消息作者的角色,此处为 "assistant"

  • name (字符串) 可选

    用于区分相同角色参与者的可选名称。

  • audio (对象或 null) 可选

    与助手之前的音频响应相关的数据。

    • id (字符串)必填

      唯一标识模型生成的音频响应。

  • tool_call (数组) 必填

    模型生成的工具调用列表(例如函数调用)。

    • id (字符串)必填

      具调用的唯一 ID。

    • type (字符串)必填

      工具类型,目前仅支持 function

    • function (对象)必填

      模型调用的函数。

      • name (字符串)必填

        要调用的函数名称。

      • arguments (字符串)必填

        模型以 JSON 格式生成的函数调用参数。

        • 注意:模型生成的参数可能无效,或者包含未在函数定义中描述的参数。
        • 建议: 在调用函数之前,应在代码中验证参数
  • function_call 已弃用 (对象 或者 null) 选填

    模型生成的工具调用列表(例如函数调用)。

    • name (字符串)必填

      要调用的函数名称。

    • arguments (字符串)必填

      模型以 JSON 格式生成的函数调用参数。


工具消息 (Tool message)

object

  • role (字符串) 必填

    消息作者的角色,此处为 "tool"

  • content (字符串或数组) 必填

    工具消息的内容。

  • tool_call_id (字符串) 必填

    对应工具调用的消息 ID。


函数消息 (Function message)

(已弃用)

object

  • role (字符串) 必填

    消息作者的角色,此处为 "function"

  • content (字符串或 null) 必填

    函数消息的内容。

  • name (字符串) 必填

    函数名称。

相关文章:

C#实现一个HttpClient集成通义千问-多轮对话功能实现

多轮对话功能实现 视频教程实现原理消息的类型 功能开发消息类修改请求体修改发送请求函数修改用户消息输入 多轮对话的token消息完整文档消息类型 视频教程 .NetAI开发入门HttpClient实现通义千问集成-多轮对话功能实现 实现原理 一直保留更新messages 现在设置的meessages只…...

Java Web 7 请求响应(Postman)

前言&#xff08;SpringBoot程序请求响应流程&#xff09; 以上一章的程序为例&#xff0c;一个基于SpringBoot的方式开发一个web应用&#xff0c;浏览器发起请求 /hello 后 &#xff0c;给浏览器返回字符串 “Hello World ~”。 而我们在开发web程序时呢&#xff0c;定义了一…...

Android APP自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 Android导入已有外部数据库 2015.06.26在QQ空间记录&#xff1a;在Android中不能直接打开res aw目录中的数据…...

Linux 系统报打开的文件过多

1.问题 1804012290 [reactor-http-epoll-1] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. - io.nett…...

javaWeb之过滤器(Filter)

目录 前言 过滤器概述 什么是过滤器 过滤器详细 过滤器的生命周期 过滤器的应用 创建一个简单的Filter类步骤 注意&#xff1a;指定拦截路径&#xff0c;我们有两种方式 实例 前言 本篇博客的核心 知道过滤器的整个拦截过程知道如何指定拦截路径知道过滤器的生命周期…...

ModStartBlog v10.0.0 发布时间自定义,多图快速粘贴,博客编辑器升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …...

Unexpected token ‘<‘, “<!doctype “... is not valid JSON

Unexpected token ‘<’, "<!doctype "… is not valid JSON 在前端开发时&#xff0c;遇到以下报错内容。 1.报错内容如下&#xff1a; // 报错内容 Uncaught (in promise) SyntaxError: Unexpected token <, "<!doctype "... is not valid…...

24/12/9 算法笔记<强化学习> PPO,DPPO

PPO是目前非常流行的增强学习算法&#xff0c;OpenAI把PPO作为目前baseline算法&#xff0c;首选PPO&#xff0c;可想而知&#xff0c;PPO可能不是最强的&#xff0c;但是是最广泛的。 PPO是基于AC架构&#xff0c;因为AC架构有一个好处&#xff0c;就是解决了连续动作空间的问…...

Linux下编译安装METIS

本文记录Linux下编译安装METIS的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1 一、安装依赖 1.1 下载GKlib sudo apt-get install build-essential sudo apt-get install cmake 2.2 编译安装GKlib 下载GKlib代码&#xff0c; …...

【数据库】关系代数和SQL语句

一 对于教学数据库的三个基本表 学生S(S#,SNAME,AGE,SEX) 学习SC(S#,C#,GRADE) 课程(C#,CNAME,TEACHER) &#xff08;1&#xff09;试用关系代数表达式和SQL语句表示&#xff1a;检索WANG同学不学的课程号 select C# from C where C# not in(select C# from SCwhere S# in…...

amazon亚马逊滑动识别验证码

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/15 亚马逊的滑动还原验证码数据集如下: 和某顶象的差不多,图片分割高度是中间固定的,…...

Android Studio 创建虚拟设备的详细图文操作教程

本篇文章主要讲解 Android Studio 创建模拟器详细图文操作&#xff0c;包含了每一步的详细操作&#xff0c;便于理解和掌握对模拟的创建。 日期&#xff1a;2024年12月9日 作者&#xff1a;任聪聪 运行效果&#xff1a; 说明&#xff1a;创建运行后&#xff0c;点击右侧如下图…...

网络安全法-附则

第七章 附 则 第七十六条 本法下列用语的含义&#xff1a; &#xff08;一&#xff09;网络&#xff0c;是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息进行收集、存储、传输、交换、处理的系统。 &#xff08;二&#xff09;网络安全&#xff…...

CSS核心(上)

CSS 介绍 层叠样式表&#xff08;英语&#xff1a;Cascading Style Sheets, 缩写:CSS; 又叫串样式列表&#xff0c;级联样式表&#xff0c;串接样式表&#xff0c;阶层式样式表&#xff09;是一种用来为结构化文档&#xff08;HTML或XML应用&#xff09;添加样式&#xff08;…...

深度学习常用损失函数介绍

均方差损失&#xff08;Mean Square Error&#xff0c;MSE&#xff09; 均方误差损失又称为二次损失、L2损失&#xff0c;常用于回归预测任务中。均方误差函数通过计算预测值和实际值之间距离&#xff08;即误差&#xff09;的平方来衡量模型优劣。即预测值和真实值越接近&…...

HarmonyOS-中级(四)

文章目录 Native适配开发三方库的基本使用 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月09日11点12分 Native适配开发 Node-API HarmonyOS Node-API 是 HarmonyOS 提供的…...

React v19稳定版发布12.5

&#x1f916; 作者简介&#xff1a;水煮白菜王 &#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧✍。 感谢支持&#x1f495;&#x1f495;&#x1f495; 目…...

【毕业设计选题】深度学习类毕业设计选题参考 开题指导

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整…...

NanoLog起步笔记-4-Server端的两个线程

nonolog起步笔记-4-Server端的两个线程 Server端的两个线程两个线程的角色与各自的职责RuntimeLogger::compressionThreadMain线程 详细学习一下相关的代码第三个线程第一次出现原位置swip buffer Server端的两个线程 如前所述&#xff0c;nanolog的server端&#xff0c;相对而…...

linux zookeeper安装并服务化

1.版本信息 系统&#xff1a;centos7.6 java版本&#xff1a;java 8(已经安装好) zookeeper版本&#xff1a;3.6.3 2.zookeeper安装并测试 1.上传文件至指定目录并解压 切换至cd downloads 目录下&#xff0c; rz上传文件 解压&#xff1a;tar -zxvf apache-zookeeper-3.…...

Cisco Packet Tracer新手必看:5分钟搞定路由器静态路由配置(附避坑指南)

Cisco Packet Tracer静态路由配置实战&#xff1a;从零到精通的完整指南 刚接触网络工程的朋友们&#xff0c;第一次在Cisco Packet Tracer中配置静态路由时&#xff0c;是不是经常遇到"网络不通"的困扰&#xff1f;作为网络通信的基础技能&#xff0c;静态路由配置看…...

【深度强化学习】DDPG算法在连续动作空间中的实战解析

1. DDPG算法初探&#xff1a;为什么我们需要它&#xff1f; 第一次接触DDPG&#xff08;Deep Deterministic Policy Gradient&#xff09;算法时&#xff0c;我完全被这个拗口的名字吓到了。但当我真正理解它的设计初衷后&#xff0c;才发现它其实解决了一个非常实际的问题——…...

GD32F30x串口DMA+空闲中断接收不定长数据,一个LED控制项目带你搞懂

GD32F30x串口DMA空闲中断实战&#xff1a;从零构建LED智能控制系统 在嵌入式开发中&#xff0c;串口通信就像设备的"嘴巴"和"耳朵"&#xff0c;而DMA技术则是解放CPU的"隐形助手"。想象一下这样的场景&#xff1a;你需要通过手机APP远程控制实验…...

别再死记ResNet结构了!用PyTorch手搓一个ResNet-50,从零理解残差连接

从零构建ResNet-50&#xff1a;用PyTorch拆解残差网络的秘密 深度学习领域最令人着迷的突破之一&#xff0c;莫过于残差网络&#xff08;ResNet&#xff09;的诞生。2015年&#xff0c;何恺明团队提出的这一架构不仅横扫ImageNet竞赛&#xff0c;更彻底改变了我们对深度神经网络…...

告别黑盒调试:为VS2022和Halcon HImage定制一个带暗色主题的视觉化调试器

为VS2022和Halcon HImage打造沉浸式暗色调试器&#xff1a;从UI优化到高效开发实践 在计算机视觉开发领域&#xff0c;Halcon凭借其强大的图像处理能力成为工业检测、医疗影像等场景的首选工具。然而&#xff0c;长时间面对传统调试界面容易导致视觉疲劳&#xff0c;影响开发效…...

OpenClaw技能扩展实战:基于Qwen3-32B开发自定义文件处理器

OpenClaw技能扩展实战&#xff1a;基于Qwen3-32B开发自定义文件处理器 1. 为什么需要自定义文件处理器 上周处理季度数据时&#xff0c;我又遇到了那个老问题&#xff1a;手头有37个CSV文件需要清洗格式、去重合并&#xff0c;还要按日期归档。这种重复性工作既耗时又容易出错…...

全格式文档智能处理:AnythingLLM的多模态知识管理解决方案

全格式文档智能处理&#xff1a;AnythingLLM的多模态知识管理解决方案 【免费下载链接】anything-llm 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&#xff08…...

STM32实现智能酒驾监测系统设计

基于STM32的酒后驾车监测报警系统设计与实现1. 项目概述1.1 系统背景酒后驾车是全球交通事故的主要诱因之一&#xff0c;传统的人工检测方法存在效率低、覆盖范围有限等问题。随着嵌入式系统和物联网技术的发展&#xff0c;智能化的酒精监测系统成为解决这一问题的有效方案。1.…...

OpenClaw自动化测试:Qwen3.5-9B在API接口校验中的实战应用

OpenClaw自动化测试&#xff1a;Qwen3.5-9B在API接口校验中的实战应用 1. 为什么选择OpenClaw做接口自动化测试 去年接手一个个人项目时&#xff0c;我遇到了接口测试的痛点&#xff1a;每次后端更新都要手动验证几十个API&#xff0c;不仅耗时还容易遗漏边缘case。尝试过Pos…...

ArcGIS Pro模型构建器实战:从零搭建自动化地理处理工作流

1. 初识ArcGIS Pro模型构建器 第一次接触ArcGIS Pro的模型构建器时&#xff0c;我完全被它的可视化操作界面惊艳到了。这就像搭积木一样&#xff0c;不需要写一行代码&#xff0c;就能把复杂的地理处理流程串起来。记得当时有个项目需要批量处理上百个乡镇的耕地数据&#xff0…...