以腾讯混元模型为例,在管理平台上集成一个智能助手
背景
前几天,公司的同事们一起吃了个饭,餐桌上大家聊到大模型的落地场景。我个人在去年已经利用百度千帆平台写过案例,并发过博客(传送门👉:利用文心千帆打造一个属于自己的小师爷),只不过那时候没有再继续深入真正做好大模型在项目上的落地。
这次刚刚开发完的一个考试系统,里面正好有一个落地场景,利用AI的能力来生成题库的解析内容,可以大幅提高效率。
准备工作
因为公司的云服务商是腾讯,所以我这次使用的是腾讯混元大模型,在开始集成工作前,要先去腾讯云的控制台开通相关的服务。
事实上,所有集成任何第三方云端大模型的步骤都差不多,这一步我就不多说了,参照文档操作即可(传送门👉:腾讯混元大模型)。
需要注意的是,新申请的服务,可以领取一定的免费额度,而且lite模型目前是一直免费的,这点和各家也都差不多。在这里插入图片描述

集成
接入方式
大模型集成到项目的方式有很多,有的可能就是一个模块,有的可能是一个独立服务,总之就是根据实际的项目情况,接入的方式,呈现的结果都是不一样的。
我这边把大模型在系统里的定位就是一个随叫随到的智能助手,在整个后台管理工作的场景中,都可以方便的和大模型交互。
业务代码之前
配置
"AiConfigs": [{"IsOpenaiApi": "yes","Model": "moonshotai","SecretKey": "","SecretId": "","AppId": "","ApiKey": "sk-{xxxxxxxxxx}"},{"IsOpenaiApi": "no","Model": "hunyuan","SecretId": "{xxx}","SecretKey": "{xxx}","AppId": "xxx","ApiKey": ""}
这里,我是把请求模型的密钥参数放到配置文件里了,事实上,生产环境中更推荐的做法是把密钥参数放到系统的环境变量里更加安全。
这里这样配置是为以后扩展做准备,此次集成的是混元大模型的sdk,申请的方式是按sdk的方式申请,云服务商一般会给到一组密钥对,包括secretid,secretkey等,而类似openai api的方式,是只有一个appkey,所以我这里是这样定义的参数,方便后续反序列化。
其实目前各家基本都支持openapi的方式了,但因为我这里只有公司腾讯云的子账号,申请openapi风格的key需要主账号,而且要主账号提供mfa验证码,我有点社恐,没去找主账号持有人沟通,就暂时没用~
但我还是申请了一个个人的月之暗面(moonshot)账户(传送门👉:Moonshot AI),并获得了一个openapi风格的apikey,确保两种接入方式都支持。
定义对照模型
public class AiConfig
{[JsonProperty("IsOpenaiApi")]public string IsOpenaiApi { get; set; }[JsonProperty("Model")]public string Model { get; set; }[JsonProperty("SecretKey")]public string SecretKey { get; set; }[JsonProperty("SecretId")]public string SecretId { get; set; }[JsonProperty("AppId")]public string AppId { get; set; }/// <summary>/// IsOpenaiApi为yes时,ApiKey为必填项/// </summary>[JsonProperty("ApiKey")]public string ApiKey { get; set; }//public string Token { get; set; }
}
这里的就是参照配置文件的格式,创建对照模型,方便后续的序列化工作。
创建工厂类
public class AiConfigFactory
{private readonly List<AiConfig> _aiConfigs;public AiConfigFactory(List<AiConfig> aiConfigs){_aiConfigs = aiConfigs;}public AiConfig GetConfigByModel(string Model){return _aiConfigs.FirstOrDefault(config => config.Model.Equals(Model, StringComparison.OrdinalIgnoreCase));}
}
注入服务
private static void ConfigureAi(this IServiceCollection services, IConfiguration configuration)
{var aiConfigs = new List<AiConfig>();configuration.GetSection("AiConfigs").Bind(aiConfigs);// 注册工厂为单例服务services.AddSingleton(new AiConfigFactory(aiConfigs));//...其他配置
}
...
//这里我是把每个中间件都分离成一个小模块,配置完成后,在入口处统一注册
//像这样
builder.Services.ConfigureAi(_configuration);
其他工作
因为是要全场景的运行ai助手,得充分发挥系统基础设施的能力,所以这里还有根据情况注入Redis,消息队列,数据库等中间件,这部分代码都是很常见的,不再赘述。
接入混元SDK
准备工作就绪以后,就可以引入混元sdk了,这部分就是标准的调参工作,非常简单,大家可以跳过本节,直接参照混元的接口文档(传送门👉:混元大模型),然后按照自己喜欢的放方式完成对接.
我这里简单介绍下
安装必要sdk
安装混元sdk,可以直接在vs的nuget包管理器搜索TencentCloudSDK.Hunyuan关键字安装,或者直接通过下面方式
# 命令行
dotnet add package TencentCloudSDK.Hunyuan
# 或者vs里打开程序包管理器控制台
Install-Package TencentCloudSDK.Hunyuan
创建控制器
这里我只给出几个关键的业务代码
//chat接口
[HttpPost,ValidateAntiForgeryToken]
public async Task<IActionResult> SimpleChat(ChatModel chatModel)
{if (string.IsNullOrWhiteSpace(chatModel.prompt))return Json(_resp.error("无输入"));try{if(string.IsNullOrEmpty(chatModel.admin))chatModel.admin = adminId;await _capPublisher.PublishAsync(CapConsts.PREFIX + "GetHunyuanResponse", chatModel);return Json(_resp.success(0, "ok"));}catch (Exception e){Assistant.Logger.Error(e);return Json(_resp.error("获取响应失败," + e.Message));}
}[HttpGet("airesp")]
public async Task AiResponseSse(string admin)
{Response.Headers["Content-Type"] = "text/event-stream";Response.Headers["Cache-Control"] = "no-cache";if (HttpContext.Request.Protocol.StartsWith("HTTP/1.1")){Response.Headers["Connection"] = "keep-alive";}try{if (string.IsNullOrEmpty(admin))admin = adminId;while (true){await Task.Delay(50);// 从通道中读取消息(这里等待消息到来)if (!await _redisCachingProvider.KeyExistsAsync("cacheId" + admin))return;var message = await _redisCachingProvider.LPopAsync<string>("cacheId" + admin);if (string.IsNullOrEmpty(message))continue;// 按照SSE协议格式发送数据到客户端await Response.WriteAsync($"data:{message}\n\n");await Response.Body.FlushAsync();}}catch (Exception ex){// 可以记录异常等处理Console.WriteLine(ex.Message);}
}[NonAction]
[CapSubscribe(CapConsts.PREFIX + "GetHunyuanResponse")]
public async Task GetHunyuanResponse(ChatModel chatModel)
{try{Assistant.Logger.Warning("开始请求混元接口");var commonParams = new HunyuanCommonParams();// 实例化一个client选项,可选的,没有特殊需求可以跳过ClientProfile clientProfile = new ClientProfile();// 实例化一个http选项,可选的,没有特殊需求可以跳过HttpProfile httpProfile = new HttpProfile();httpProfile.Endpoint = commonParams.Endpoint;clientProfile.HttpProfile = httpProfile;// 实例化要请求产品的client对象,clientProfile是可选的HunyuanClient client = new HunyuanClient(_cred, commonParams.Region, clientProfile);// 实例化一个请求对象,每个接口都会对应一个request对象ChatCompletionsRequest req = new ChatCompletionsRequest();req.Model = HunyuanModels.Lite;if (!string.IsNullOrWhiteSpace(chatModel.model))req.Model = chatModel.finalModel;Message message1 = new Message();message1.Role = "user";message1.Content = chatModel.prompt;req.Messages = [message1];req.Stream = true;ChatCompletionsResponse resp = await client.ChatCompletions(req);// 输出json格式的字符串回包if (resp.IsStream){// 流式响应foreach (var e in resp){Assistant.Logger.Debug(e.Data);await _redisCachingProvider.RPushAsync("cacheId" + chatModel.admin, new List<string>() { e.Data });}}else{// 非流式响应Assistant.Logger.Debug(JsonConvert.SerializeObject(resp));}}catch (Exception ex){Assistant.Logger.Error(ex);}finally{await _redisCachingProvider.KeyExpireAsync("cacheId" + chatModel.admin, 600);}
}
简单解释下,这段代码,主要分3个逻辑来处理云端返回的消息,
第一步是前端通过接口,把结构化的消息提交到服务端,也就是SimpleChat接口
第二步,SimpleChat接收到消息后,立刻返回,并发布任务让服务端后台开始请求混元的服务端,获取相应结果,并暂存到Redis队列里
第三步是服务端通过SSE链接的方式把Redis队列里的消息,推到本地客户端
事实上,不暂存直接推也是可以的,我这里因为有其他业务交叉,所以这样处理了一下。 另外,对接混元sdk的方法,还有一种common sdk的方式,更加轻量级,也就是把大量实例化和序列化的工作交给混元的服务器,我们自己的服务端只承担点传输的工作,对性能的优化也是有好处的,而且也能更方便的把sdk的代码写法改成openai api的方式,建议后续直接使用common sdk的方式。
前端代码就不在展示了,按照喜好实现即可
效果



演示视频
总结
目前来说只是初步接入到了系统,样式上还些问题需要处理,而且目前只支持文字模式,不支持图片,也没有完全和业务绑定,后续会把一些常见的场景,比如题目解析,智能分析用户的考卷等场景和ai深度结合。
好了,基本就这样了
相关文章:
以腾讯混元模型为例,在管理平台上集成一个智能助手
背景 前几天,公司的同事们一起吃了个饭,餐桌上大家聊到大模型的落地场景。我个人在去年已经利用百度千帆平台写过案例,并发过博客(传送门👉:利用文心千帆打造一个属于自己的小师爷),…...
15.初识接口1 C#
这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】(文心一言AI生成) 在C#编程世界中,接口(Interface)扮演着至关重要的角色,它定义了一组方法,但不提供这些方法的实现。它要求所…...
探索 Python编程 调试案例:计算小程序中修复偶数的bug
在 学习Python 编程的过程里,会遇到各种各样的bug。而修复bug调试代码就像是一场充满挑战的侦探游戏。每一个隐藏的 bug 都是谜题,等待开发者去揭开真相,让程序可以顺利运行。今天,让我们通过一个实际案例,深入探索 Py…...
【Unity/HFSM】使用UnityHFSM实现输入缓冲(预输入)和打断机制
文章目录 前言预输入Animancer的InputBuffer:在UnityHFSM中实现InputBuffer: 打断机制 前言 参考Animancer在状态机中的InputBuffer,在UnityHFSM中实现类似的InputBuffer机制,同时扩展一个状态打断机制 插件介绍: A…...
Unity 圆形循环复用滚动列表
一.在上一篇垂直循环复用滚动列表的基础上,扩展延申了圆形循环复用滚动列表。实现此效果需要导入垂直循环复用滚动列表里面的类。 1.基础类 using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using …...
聚水潭数据无缝集成到金蝶云星空的实现方案
聚水潭数据集成到金蝶云星空:聚水潭调拨对接金蝶直接调拨ok 在企业信息化管理中,数据的高效流动和准确对接是实现业务流程顺畅运行的关键。本文将分享一个具体的系统对接集成案例——如何通过轻易云数据集成平台,将聚水潭的数据无缝集成到金…...
虚拟机断网没有网络,需清理内存,删除后再重启
进入NetworkManager可能没权限,设置权限777 to...
[c++11(二)]Lambda表达式和Function包装器及bind函数
1.前言 Lambda表达式着重解决的是在某种场景下使用仿函数困难的问题,而function着重解决的是函数指针的问题,它能够将其简单化。 本章重点: 本章将着重讲解lambda表达式的规则和使用场景,以及function的使用场景及bind函数的相关使…...
基于字节大模型的论文翻译(含免费源码)
基于字节大模型的论文翻译 源代码: 👏 star ✨ https://github.com/boots-coder/LLM-application 展示 项目简介 本项目是一个基于大语言模型(Large Language Model, LLM)的论文阅读与翻译辅助工具。它通过用户界面(…...
Mysql语法之DQL查询的多行函数
Mysql的多行函数和分组 目录 Mysql的多行函数和分组多行函数概念常用的多行函数 数据分组概念语法where和having的区别 语句关键字及执行顺序语句关键字执行顺序 实际操作基本语句格式和多行操作筛选语句格式 多行函数 概念 不管函数处理多少条,只返回一条记录&…...
OpenSSL 心脏滴血漏洞(CVE-2014-0160)
OpenSSL 心脏滴血漏洞(CVE-2014-0160) Openssl简介: 该漏洞在国内被译为"OpenSSL心脏出血漏洞”,因其破坏性之大和影响的范围之广,堪称网络安全里程碑事件。 OpenSSL心脏滴血漏洞的大概原理是OpenSSL在2年前引入了心跳(hearbea0机制来维特TS链接的…...
监控视频汇聚融合云平台一站式解决视频资源管理痛点
随着5G技术的广泛应用,各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据,并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而,随着数字化建设和生产经营管理活动的长期开展࿰…...
ElasticSearch 数据同步
1、同步调用 操作步骤: 管理系统新增酒店数据添加到数据库调用 ES 更新文档接口,同步数据库的数据到 ES 文档 流程图: 特点: 优点:实现简单,粗暴缺点:业务耦合度高 2、异步消息通知 操作步骤…...
MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势
目录 前言1. 探讨2. 基本知识3. 总结 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全&#x…...
RabbitMQ个人理解与基本使用
目录 一. 作用: 二. RabbitMQ的5中队列模式: 1. 简单模式 2. Work模式 3. 发布/订阅模式 4. 路由模式 5. 主题模式 三. 消息持久化: 消息过期时间 ACK应答 四. 同步接收和异步接收: 应用场景 五. 基本使用 ÿ…...
Python球球大作战
系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…...
入侵他人电脑,实现远程控制(待补充)
待补充 在获取他人无线网网络密码后,进一步的操作是实现入侵他人电脑,这一步需要获取对方的IP地址并需要制作自己的代码工具自动化的开启或者打开对方的远程访问权限。 1、获取IP地址(通过伪造的网页、伪造的Windows窗口、hook,信…...
数据分析实战—IMDB电影数据分析
1.实战内容 1.加载数据到movies_df,输出前5行,输出movies_df.info(),movies_df.describe() # (1)加载数据集,输出前5行 #导入库 import pandas as pd import numpy as np import matplotlib import matplotlib.pyplo…...
Google guava 最佳实践 学习指南之08 `BiMap`(双向映射)
guava 最佳实践 学习指南 Google Guava 库中的 BiMap(双向映射)是一种特殊的映射类型,它维护了映射的反向视图,并确保不存在重复值,且始终可以安全地使用值获取对应的键。以下是关于 Guava BiMap 的一些介绍和用法&am…...
【设计模式】空接口
(空)接口的用法总结 接口用于定义某个类的特定能力或特性。在工作流或任务管理系统中,接口可以帮助标识哪些任务可以在特定阶段执行。通过实现这些接口,任务类可以被标识为在相应的阶段可以执行,从而在验证和执行逻辑…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
