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 (字符串) 必填

    函数名称。

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

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

相关文章

vite5+vue3+Ts5 开源图片预览器上线

images-viewer-vue3&#xff1a;一款Vue3的轻量级图像查看器&#xff0c;它基于Flip动画技术&#xff0c;支持PC和h5移动网页预览照片&#xff0c;如果它是Vue3开发的产品。 npm开源地址:https://www.npmjs.com/package/images-viewer-vue3?activeTabreadme Flip 动画 < …

Axure RP在智慧农场可视化大屏系统设计中的应用

随着科技的飞速发展&#xff0c;智慧农业已成为现代农业的重要发展方向。智慧农场可视化大屏系统作为智慧农业的重要组成部分&#xff0c;正逐步成为农场管理、决策和展示的核心工具。Axure RP&#xff0c;作为一款强大的原型设计工具&#xff0c;其在智慧农场可视化大屏系统的…

Docker多架构镜像构建踩坑记

背景 公司为了做信创项目的亮点&#xff0c;需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行&#xff0c;整个项目通过后端Java&#xff0c;前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建&#xff0c;于是只能手工构…

文档解析:如何从PDF中解析出表格结构和数据?

从PDF中解析出表格结构和数据&#xff0c;可以采用以下几种方法&#xff1a;从PDF中解析出表格结构和数据&#xff0c;主要用到以下算法和技术&#xff1a; OCR技术&#xff1a;光学字符识别技术&#xff0c;用于从扫描的PDF文件中提取文本信息&#xff0c;包括表格数据。这项…

克服大规模语言模型限制,构建新的应用方法——LangChain

大模型 大模型的出现和落地开启了人工智能(AI)新一轮的信息技术革命&#xff0c;改变了人们的生 活方式、工作方式和思维方式。大模型的落地需要数据、算力和算法三大要素。经过几 年发展&#xff0c;大模型的数据集(包括多模态数据集)制作已经形成了规约&#xff0c;Meta、Go…

两种距离度量简记

一、Lp距离/Minkowski 距离&#xff08;Minkowski distance&#xff09; 1、Lp距离&#xff1a; 特征空间中两个实例点的距离是两个实例点相似程度的反映。Lp距离是一种一般化的距离度量 设特征空间x是n维实数向量空间Rn xi&#xff0c;xj的Lp距离定义为&#xff08;p>1&…

读取电视剧MP4视频的每一帧,检测出现的每一个人脸并保存

检测效果还不错,就是追踪有点难做 import cv2 import mediapipe as mp import os from collections import defaultdict# pip install msvc-runtime# 初始化OpenCV的MultiTracker # multi_tracker = cv2.MultiTracker_create() # multi_tracker = cv2.legacy.MultiTracker_cre…

用最小的代价解决mybatis-plus关于批量保存的性能问题

1.问题说明 问题背景说明&#xff0c;在使用达梦数据库时&#xff0c;mybatis-plus的serviceImpl.saveBatch()方法或者updateBatchById()方法的时候&#xff0c;随着数据量、属性字段的增加&#xff0c;效率越发明显的慢。 serviceImpl.saveBatch(); serviceImpl.updateBatch…

OpenCV相机标定与3D重建(10)眼标定函数calibrateHandEye()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算手眼标定&#xff1a; g T c _{}^{g}\textrm{T}_c g​Tc​ cv::calibrateHandEye 是 OpenCV 中用于手眼标定的函数。该函数通过已知的机器人…

flink yarn模式3种提交任务方式

接上文&#xff1a;一文说清flink从编码到部署上线 1.引言 Apache Hadoop的Yarn是许多数据处理框架中非常流行的资源提供者。Flink的服务提交给Yarn的ResourceManager后&#xff0c;ResourceManager会在由Yarn的NodeManager管理的机器上动态分配运行容器。Flink在这些容器上部…

32.最长有效括号 python

最长有效括号 题目题目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;题目链接 题解算法步骤&#xff1a;python实现解释&#xff1a;提交结果 题目 题目描述 给你一个只包含 ‘(’ 和 ‘)’ 的字符串&#xff0c;找出最长有效&#xff08;格式…

OpenCV相机标定与3D重建(13)检测给定图像中是否存在符合指定尺寸的棋盘格图案函数checkChessboard()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::checkChessboard 是 OpenCV 库中的一个函数&#xff0c;用于检测给定图像中是否存在符合指定尺寸的棋盘格图案。这个函数对于相机校准非常重…

规范秩相关信息搜集Day2

系列博客目录 文章目录 系列博客目录1.A Survey on Tensor Techniques and Applications in Machine Learning2.有没有研究低秩矩阵有利于分类的计算机方面的论文呢3.Image classification based on low-rank matrix recovery and Naive Bayes collaborative representatio 基于…

2024年华中杯数学建模C题基于光纤传感器的平面曲线重建算法建模解题全过程文档及程序

2024年华中杯数学建模 C题 基于光纤传感器的平面曲线重建算法建模 原题再现 光纤传感技术是伴随着光纤及光通信技术发展起来的一种新型传感器技术。它是以光波为传感信号、光纤为传输载体来感知外界环境中的信号&#xff0c;其基本原理是当外界环境参数发生变化时&#xff0c…

【Golang】Go语言编程思想(六):Channel,第二节,使用Channel等待Goroutine结束

使用 Channel 等待任务结束 首先回顾上一节 channel 这一概念介绍时所写的代码&#xff1a; package mainimport ("fmt""time" )func worker(id int, c chan int) {for n : range c {fmt.Printf("Worker %d received %c\n",id, n)} }func crea…

【Windows】【P2P】ipv6 nmap ncat 测试电信、移动、联通两个4G 5G热点ipv6地址的连通性

测试场景 一台PC在电信4G热点下&#xff0c;一台PC在电信5G热点下。 扩展测试 电信、移动、联通的ipv6 下载安装nmap Download the Free Nmap Security Scanner for Linux/Mac/Windows 安装后&#xff0c;进入目录C:\Windows\System32\WindowsPowerShell\v1.0\powershell.e…

一文掌握 OpenGL 几何着色器的使用

学习本文需要具备 OpenGL ES 编程基础,如果看起来比较费劲,可以先看入门文章 OpenGL ES 3.0 从入门到精通系统性学习教程 。 什么是几何着色器 几何着色器(Geometry Shader) OpenGL 管线中的可选着色器阶段,位于顶点着色器(Vertex Shader) 和光栅化阶段 之间。 其核心…

C—初阶调试

对你有帮助的话能否一键三连啊&#xff01;祝每个人心想事成&#xff01; 什么是Bug? 首先我们先了解一下日常口语中的“Bug”是什么 Bug可以理解为计算机程序错误&#xff0c;编程时的漏洞 调试及重要性 顾名思义&#xff0c;调试就是通过工具找出bug存在&#xff0c;找出…

Capacitor 打包后的 iOS app 无法访问 http 的内容,解决办法

Capacitor 打包后的 iOS app 无法访问 http 的内容&#xff0c;解决办法 上篇文章中说了如何使用 Capacitor 打包成 iOS app 的过程中遇到的问题 Capacitor在 xcode 打包 iOS 应用发布的时候出错。 在这之后&#xff0c;遇到了一个新问题&#xff0c; 就是它无法访问 http 的内…

LLaMA Factory+ModelScope实战——使用 Web UI 进行监督微调

LLaMA FactoryModelScope实战——使用 Web UI 进行监督微调 文章原始地址&#xff1a;https://onlyar.site/2024/01/14/NLP-LLaMA-Factory-web-tuning/ 引言 大语言模型微调一直都是一个棘手的问题&#xff0c;不仅因为需要大量的计算资源&#xff0c;而且微调的方法也很多。在…