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

以腾讯混元模型为例,在管理平台上集成一个智能助手

背景

前几天,公司的同事们一起吃了个饭,餐桌上大家聊到大模型的落地场景。我个人在去年已经利用百度千帆平台写过案例,并发过博客(传送门👉:利用文心千帆打造一个属于自己的小师爷),只不过那时候没有再继续深入真正做好大模型在项目上的落地。

这次刚刚开发完的一个考试系统,里面正好有一个落地场景,利用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深度结合。

好了,基本就这样了

相关文章:

以腾讯混元模型为例,在管理平台上集成一个智能助手

背景 前几天&#xff0c;公司的同事们一起吃了个饭&#xff0c;餐桌上大家聊到大模型的落地场景。我个人在去年已经利用百度千帆平台写过案例&#xff0c;并发过博客&#xff08;传送门&#x1f449;&#xff1a;利用文心千帆打造一个属于自己的小师爷&#xff09;&#xff0c…...

15.初识接口1 C#

这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】&#xff08;文心一言AI生成&#xff09; 在C#编程世界中&#xff0c;接口&#xff08;Interface&#xff09;扮演着至关重要的角色&#xff0c;它定义了一组方法&#xff0c;但不提供这些方法的实现。它要求所…...

探索 Python编程 调试案例:计算小程序中修复偶数的bug

在 学习Python 编程的过程里&#xff0c;会遇到各种各样的bug。而修复bug调试代码就像是一场充满挑战的侦探游戏。每一个隐藏的 bug 都是谜题&#xff0c;等待开发者去揭开真相&#xff0c;让程序可以顺利运行。今天&#xff0c;让我们通过一个实际案例&#xff0c;深入探索 Py…...

【Unity/HFSM】使用UnityHFSM实现输入缓冲(预输入)和打断机制

文章目录 前言预输入Animancer的InputBuffer&#xff1a;在UnityHFSM中实现InputBuffer&#xff1a; 打断机制 前言 参考Animancer在状态机中的InputBuffer&#xff0c;在UnityHFSM中实现类似的InputBuffer机制&#xff0c;同时扩展一个状态打断机制 插件介绍&#xff1a; A…...

Unity 圆形循环复用滚动列表

一.在上一篇垂直循环复用滚动列表的基础上&#xff0c;扩展延申了圆形循环复用滚动列表。实现此效果需要导入垂直循环复用滚动列表里面的类。 1.基础类 using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using …...

聚水潭数据无缝集成到金蝶云星空的实现方案

聚水潭数据集成到金蝶云星空&#xff1a;聚水潭调拨对接金蝶直接调拨ok 在企业信息化管理中&#xff0c;数据的高效流动和准确对接是实现业务流程顺畅运行的关键。本文将分享一个具体的系统对接集成案例——如何通过轻易云数据集成平台&#xff0c;将聚水潭的数据无缝集成到金…...

虚拟机断网没有网络,需清理内存,删除后再重启

进入NetworkManager可能没权限&#xff0c;设置权限777 to...

[c++11(二)]Lambda表达式和Function包装器及bind函数

1.前言 Lambda表达式着重解决的是在某种场景下使用仿函数困难的问题&#xff0c;而function着重解决的是函数指针的问题&#xff0c;它能够将其简单化。 本章重点&#xff1a; 本章将着重讲解lambda表达式的规则和使用场景&#xff0c;以及function的使用场景及bind函数的相关使…...

基于字节大模型的论文翻译(含免费源码)

基于字节大模型的论文翻译 源代码&#xff1a; &#x1f44f; star ✨ https://github.com/boots-coder/LLM-application 展示 项目简介 本项目是一个基于大语言模型&#xff08;Large Language Model, LLM&#xff09;的论文阅读与翻译辅助工具。它通过用户界面&#xff08…...

Mysql语法之DQL查询的多行函数

Mysql的多行函数和分组 目录 Mysql的多行函数和分组多行函数概念常用的多行函数 数据分组概念语法where和having的区别 语句关键字及执行顺序语句关键字执行顺序 实际操作基本语句格式和多行操作筛选语句格式 多行函数 概念 不管函数处理多少条&#xff0c;只返回一条记录&…...

OpenSSL 心脏滴血漏洞(CVE-2014-0160)

OpenSSL 心脏滴血漏洞(CVE-2014-0160) Openssl简介: 该漏洞在国内被译为"OpenSSL心脏出血漏洞”&#xff0c;因其破坏性之大和影响的范围之广&#xff0c;堪称网络安全里程碑事件。 OpenSSL心脏滴血漏洞的大概原理是OpenSSL在2年前引入了心跳(hearbea0机制来维特TS链接的…...

监控视频汇聚融合云平台一站式解决视频资源管理痛点

随着5G技术的广泛应用&#xff0c;各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据&#xff0c;并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而&#xff0c;随着数字化建设和生产经营管理活动的长期开展&#xff0…...

ElasticSearch 数据同步

1、同步调用 操作步骤&#xff1a; 管理系统新增酒店数据添加到数据库调用 ES 更新文档接口&#xff0c;同步数据库的数据到 ES 文档 流程图&#xff1a; 特点: 优点&#xff1a;实现简单&#xff0c;粗暴缺点&#xff1a;业务耦合度高 2、异步消息通知 操作步骤&#xf…...

MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势

目录 前言1. 探讨2. 基本知识3. 总结 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#x…...

RabbitMQ个人理解与基本使用

目录 一. 作用&#xff1a; 二. RabbitMQ的5中队列模式&#xff1a; 1. 简单模式 2. Work模式 3. 发布/订阅模式 4. 路由模式 5. 主题模式 三. 消息持久化&#xff1a; 消息过期时间 ACK应答 四. 同步接收和异步接收&#xff1a; 应用场景 五. 基本使用 &#xff…...

Python球球大作战

系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…...

入侵他人电脑,实现远程控制(待补充)

待补充 在获取他人无线网网络密码后&#xff0c;进一步的操作是实现入侵他人电脑&#xff0c;这一步需要获取对方的IP地址并需要制作自己的代码工具自动化的开启或者打开对方的远程访问权限。 1、获取IP地址&#xff08;通过伪造的网页、伪造的Windows窗口、hook&#xff0c;信…...

数据分析实战—IMDB电影数据分析

1.实战内容 1.加载数据到movies_df&#xff0c;输出前5行&#xff0c;输出movies_df.info(),movies_df.describe() # &#xff08;1&#xff09;加载数据集&#xff0c;输出前5行 #导入库 import pandas as pd import numpy as np import matplotlib import matplotlib.pyplo…...

Google guava 最佳实践 学习指南之08 `BiMap`(双向映射)

guava 最佳实践 学习指南 Google Guava 库中的 BiMap&#xff08;双向映射&#xff09;是一种特殊的映射类型&#xff0c;它维护了映射的反向视图&#xff0c;并确保不存在重复值&#xff0c;且始终可以安全地使用值获取对应的键。以下是关于 Guava BiMap 的一些介绍和用法&am…...

【设计模式】空接口

&#xff08;空&#xff09;接口的用法总结 接口用于定义某个类的特定能力或特性。在工作流或任务管理系统中&#xff0c;接口可以帮助标识哪些任务可以在特定阶段执行。通过实现这些接口&#xff0c;任务类可以被标识为在相应的阶段可以执行&#xff0c;从而在验证和执行逻辑…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...