最新要闻
- 环球快讯:NVIDIA突然复活SLI!但不是你想的那样
- 每日看点!比尔·盖茨谈ChatGPT 赞其1980年以来最革命性技术进步
- 天天即时:爱子飞机上死亡:母亲怒告世界最大航司美国航空
- 谷歌的“GPT”终于憋出来了!但是 也不比百度强多少啊
- 当前热议!抖音救人一命!男子发头孢配酒视频获救:客服教科书式报警
- 头条:交700个税的工资多少_j700
- 天天热点!苹果官方推荐!iNote灵感笔记新版发布:超紧凑模式来了
- 热讯:金士顿无敌了!拿下2022年全渠道SSD市场占有率第一
- 高德、口碑正式合并:阿里旗下本地到店业务将统一整合
- 热推荐:国科微:目前晶圆产能较前两年已趋于缓和
- 世界快看点丨加快步伐!腾讯高管:“生成式AI”或纳入微信和QQ
- 天津金逸影城
- 3GB显存被封杀!《光环无限》都不让玩
- Opera浏览器推送97.0.4719.26更新:集成ChatGPT与AI总结功能
- 世界速递!碧桂园打造湖湘人居典范 护航品质生活
- 3599元 铭凡NUCG5迷你主机上架:碳纤维机身、下压式散热
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天简讯:使用C#开发微信公众号对接ChatGPT和DALL-E
本人是一家小公司的技术总监,工作包括写市场分析、工作汇报、产品推广文案及代码开发等。在ChatGPT推出之后本人一直在工作中使用,在头脑风暴、大纲生成、语句优化、代码生成方面很有效果。但ChatGPT在一些常识性生成方面并不理想,比如某个省有哪些旅游景点、三角数学公式推算等,大家使用中一定要注意并仔细甄别。ChatGPT的一些使用场景可以参考用 ChatGPT 来了解 ChatGPT。由于我之前一直是在电脑浏览器中使用,且经常碰见超时需要重新进入的情况,遂产生想法把ChatGPT和DALL-E(OpenAI开发的图片生成模型)集成到本人的公众号上,使用更加方便和稳定。二话不说,先上效果图和代码。
代码开发中主要使用了两个库:OpenAI-DotNet:一个简单的C# .NET客户端库,用于通过RESTful API使用chat-gpt、GPT-4、GPT-3.5-Turbo和Dall-E。这是一个独立开发的库,不是官方库,需要OpenAI API帐户。Senparc.Weixin —— 微信 .NET SDK:使用 Senparc.Weixin,您可以方便快速地开发微信全平台的应用(包括微信公众号、小程序、小游戏、企业号、开放平台、微信支付、JS-SDK、微信硬件/蓝牙,等等。
(资料图片)
- 新建一个空的.net core WebAPI项目并引入Nuget包如下:
Install-Package OpenAI-DotNetInstall-Package Senparc.Weixin.AspNetInstall-Package Senparc.Weixin.MP.Middleware
- 在Program.cs中引入微信配置代码
public static void Main(string[] args){ ... builder.Services.AddMemoryCache();//使用本地缓存必须添加 //Senparc.Weixin 微信注册 builder.Services.AddSenparcWeixinServices(builder.Configuration); ... //启用微信配置 var registerService = app.UseSenparcWeixin(app.Environment, null, null, register => { /* CO2NET 全局配置 */ }, (register, weixinSetting) => { register.RegisterMpAccount(weixinSetting); }); //启用微信消息处理中间件 app.UseMessageHandlerForMp("/WeixinAsync", CustomMessageHandler.GenerateMessageHandler, options => { options.AccountSettingFunc = context => Senparc.Weixin.Config.SenparcWeixinSetting; }); //Nginx部署使用 app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto }); ...}
- 新建一个类CustomMessageHandler用于处理微信消息
/// /// 自定义消息处理器/// public class CustomMessageHandler : MessageHandler{ private readonly ILogger _logger; private readonly string _openAPI_Key; private string appId = Config.SenparcWeixinSetting.MpSetting.WeixinAppId; /// /// 为中间件提供生成当前类的委托 /// public static Func GenerateMessageHandler = (stream, postModel, maxRecordCount, serviceProvider) => new CustomMessageHandler(stream, postModel, maxRecordCount, serviceProvider: serviceProvider); public CustomMessageHandler(Stream inputStream, PostModel postModel, int maxRecordCount, IServiceProvider serviceProvider) : base(inputStream, postModel, maxRecordCount, false, null, serviceProvider) { GlobalMessageContext.ExpireMinutes = 3; GlobalMessageContext.MaxRecordCount = 3; OmitRepeatedMessage = true; //启用消息去重功能 _logger = serviceProvider.GetService>(); _openAPI_Key = serviceProvider.GetService()["OpenAIKey"]; } /// /// 回复以文字形式发送的信息 /// public override async Task OnTextRequestAsync(RequestMessageText requestMessage) { #region 由于微信回复时长5秒限制,这里采用异步推送客服信息,后面直接返回空消息。 _ = Task.Factory.StartNew(async () => { OpenAIClient api = new OpenAIClient(_openAPI_Key); if (requestMessage.Content.Contains("图片", StringComparison.OrdinalIgnoreCase) || requestMessage.Content.Contains("图像", StringComparison.OrdinalIgnoreCase) || requestMessage.Content.Contains("照片", StringComparison.OrdinalIgnoreCase) || requestMessage.Content.Contains("Image", StringComparison.OrdinalIgnoreCase) || requestMessage.Content.Contains("Photo", StringComparison.OrdinalIgnoreCase)) //DALL-E 模型 { var imageRequest = requestMessage.Content.Replace("图片", "").Replace("图像", "").Replace("照片", "").Replace("Image", "").Replace("Photo", "").Trim(); var results = await api.ImagesEndPoint.GenerateImageAsync(imageRequest, 1, ImageSize.Small); //调用DALL-E模型接口生成图片 if (results.Count > 0) { var imageRemoteUrl = results[0]; #region 临时保存图片到本地 var imageLocalUrl = ServerUtility.ContentRootMapPath($"~/App_Data/TempImages/{Guid.NewGuid()}.png"); var client = new HttpClient(); client.Timeout = TimeSpan.FromSeconds(30); byte[] bytes = await client.GetByteArrayAsync(imageRemoteUrl); if (bytes.Length>0) { FileStream fs = new FileStream(imageLocalUrl, FileMode.Create); BinaryWriter w = new BinaryWriter(fs); try { w.Write(bytes); } finally { fs.Close(); w.Close(); } } #endregion var uploadResult = MediaApi.UploadTemporaryMedia(appId, UploadMediaFileType.image, imageLocalUrl); await CustomApi.SendImageAsync(appId, OpenId, uploadResult.media_id); } } else //GPT3_5_Turbo 模型 { var currentMessageContext = await base.GetCurrentMessageContext(); //使用StorageData保存对话上下文 if (currentMessageContext.StorageData == null || !(currentMessageContext.StorageData is List)) { currentMessageContext.StorageData = new List(); } var chatPrompts = (List)currentMessageContext.StorageData; chatPrompts.Add(new ChatPrompt("user", requestMessage.Content)); var chatRequest = new ChatRequest(chatPrompts, model: Model.GPT3_5_Turbo); var result = await api.ChatEndpoint.GetCompletionAsync(chatRequest); //调用GPT3_5_Turbo模型接口生成对话 var firstChoice = result.FirstChoice.ToString().Trim(); await CustomApi.SendTextAsync(appId, OpenId, firstChoice); chatPrompts.Add(new ChatPrompt("assistant", firstChoice)); currentMessageContext.StorageData = chatPrompts; GlobalMessageContext.UpdateMessageContext(currentMessageContext);//储存到缓存 } }).ContinueWith(async task => { if (task.Exception != null) { await CustomApi.SendTextAsync(appId, OpenId, $"生成失败,请稍后再试。"); _logger.LogError($"生成失败,错误信息:{task.Exception.InnerException}。"); } }); return new SuccessResponseMessage(); #endregion } /// /// 默认消息 /// public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage) { var responseMessage = base.CreateResponseMessage(); responseMessage.Content = $"欢迎来到车骑数说,该公众号已集成【ChatGPT 对话生成】和【DALL-E 图片生成】功能:\r\n1、如若使用ChatGPT 对话生成功能请直接输入想问的问题。\r\n1、如若使用DALL-E 图片生成请在描述文字后以“图片”结尾,比如“一匹马在月球上图片”。"; return responseMessage; }}
- 在配置文件appsettings.json里面添加对应配置
- 运行代码,在url后加上/WeixinAsync后缀,如果出现以下页面即代表开发成功。
OpenAI接口账号:注册完OpenAI账号后(具体注册过程请自行百度),打开https://platform.openai.com/,在用户管理里面的View API Keys里面创建一个New Secret Key,并保存下来用于API调用。每个用户有18美元的免费额度用于调用。具体使用额度可以在Usage页面查看。
后端部署由于OpenAI及接口不允许中国地区访问,所以在部署代码的时候有两种方案:
- 国内服务器+安装国外代理
- 国外服务器
同时对接微信公众号一定是需要域名的,目前域名和国外服务器绑定不需要备案,而和国内服务器绑定需要备案,如果考量备案时间关系建议使用国外服务器,而且部分国外服务器并不贵,这里推荐RackNerd,RackNerd是一家美国VPS服务商,其公司于2015年注册,可选机房有圣何塞、芝加哥、达拉斯、亚特兰大、纽约、阿什本等10个机房。一直以价格低廉、守候到位、服务器稳定而火爆市场。付款方式支持支付宝。促销款便宜套餐入口:套餐1 套餐2 套餐3 2023年最新优惠码:15OFFDEDI 官方网站:racknerd本人购买的是套餐2,一年大概170元。
我是部署在Ubuntu 20.4的操作系统上,主要有三步:
- 安装运行时 aspnetcore-runtime
添加 Microsoft 包存储库
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.debsudo dpkg -i packages-microsoft-prod.debrm packages-microsoft-prod.deb
安装运行时
sudo apt-get update && \ sudo apt-get install -y aspnetcore-runtime-6.0
- Nginx 安装配置
由于请求通过反向代理转发,因此使用 Microsoft.AspNetCore.HttpOverrides 包中的转接头中间件。 此中间件使用 X-Forwarded-Proto 标头来更新Request.Scheme,使重定向 URI 和其他安全策略能够正常工作。
using Microsoft.AspNetCore.HttpOverrides;...app.UseForwardedHeaders(new ForwardedHeadersOptions{ ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto});app.UseAuthentication();
安装 Nginxsudo apt-get install nginx
首次安装 Nginx,通过运行以下命令显式启动后确认浏览器显示 Nginx 的默认登陆页。sudo service nginx start
配置 Nginx修改 /etc/nginx/sites-available/default。 在文本编辑器中打开它,并将内容替换为以下代码片段,Nginx 将匹配的请求转发到 http://127.0.0.1:5000 中的 Kestrel上运行的 ASP.NET Core 应用。
server { listen 80; #server_name example.com *.example.com; location / { proxy_pass http://127.0.0.1:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }}
完成配置 Nginx 后,运行 sudo nginx -t 来验证配置文件的语法。 如果配置文件测试成功,可以通过运行 sudo nginx -s reload 强制 Nginx 选取更改。
- 设置服务自启动
systemd 可用于创建服务文件以启动和监视基础 Web 应用。 systemd 是一个初始系统,可以提供启动、停止和管理进程的许多强大的功能。创建服务定义文件:sudo nano /etc/systemd/system/wx-ai.service
并填充以下内容
[Unit]Description=wx-ai service[Service]WorkingDirectory=/var/www/wx-aiExecStart=/usr/bin/dotnet /var/www/wx-ai/OpenAI.Examples.WX.dllRestart=always# Restart service after 90 seconds if the dotnet service crashes:RestartSec=90KillSignal=SIGINTSyslogIdentifier=wx-aiUser=www-dataEnvironment=ASPNETCORE_ENVIRONMENT=ProductionEnvironment=DOTNET_PRINT_TELEMETRY_MESSAGE=false[Install]WantedBy=multi-user.target
systemd常用命令如下:
sudo systemctl enable wx-ai.service #开机启动sudo systemctl start wx-ai.service #启动服务sudo systemctl stop wx-ai.service #停止服务sudo systemctl status wx-ai.service #查看服务状态sudo systemctl restart wx-ai.service #重新启动服务
查看日志命令如下:sudo journalctl -fu wx-ai.service --since "2016-10-18" --until "2016-10-18 04:00"
至此部署完成,最后需要申请域名绑定服务器IP。
微信集成这里以微信测试公众号为例子,打开https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index,找到appID和appsecret放在ASP.NET Core 应用的配置文件里,把ASP.NET Core应用部署的地址+/WeixinAsync填入接口配置信息,并填写自定义Token,保证Token在微信配置和ASP.NET Core 应用的配置文件里一直。接下来就可以正式测试了。正式公众号配置类似,但这里有个比较尴尬的地方,ChatGPT和DALL-E和接口数据返回时间一般比较长,大于微信公众号普通回复接口5秒的时长限制,所以最好使用客服接口进行结果回复。而目前客服接口只适用于通过微信认知的企业公众号而非个人公众号。所以本人的个人公众号【车骑数说】无法接入,目前自己也只能在个人测试号上使用。不过我也正在开发小程序版本,后续开发完成后会及时更新。
关键词:
天天简讯:使用C#开发微信公众号对接ChatGPT和DALL-E
今日关注:关于人工智能的思考,写在chatGPT爆火之时
Vue——initRender【八】
环球快讯:NVIDIA突然复活SLI!但不是你想的那样
每日看点!比尔·盖茨谈ChatGPT 赞其1980年以来最革命性技术进步
天天即时:爱子飞机上死亡:母亲怒告世界最大航司美国航空
谷歌的“GPT”终于憋出来了!但是 也不比百度强多少啊
当前热议!抖音救人一命!男子发头孢配酒视频获救:客服教科书式报警
头条:交700个税的工资多少_j700
今日讯!SEO优化:友情链接!真心换真心?
通过 poe 免费使用ChatGPT、GPT-4
天天观察:71.C++标准库类型string
CTAS建表时报错ORA-65114
Go HTTP编程
天天热点!苹果官方推荐!iNote灵感笔记新版发布:超紧凑模式来了
热讯:金士顿无敌了!拿下2022年全渠道SSD市场占有率第一
高德、口碑正式合并:阿里旗下本地到店业务将统一整合
热推荐:国科微:目前晶圆产能较前两年已趋于缓和
全球最新:关于基于AWS-Cli的方式对RDS资源批量添加tag的方法
全球微速讯:小红书去水印技巧合集(亲测有效!!!)
每日热点:Git基本使用
RHEL无法配置网关问题一则
世界快看点丨加快步伐!腾讯高管:“生成式AI”或纳入微信和QQ
天津金逸影城
2023年3月22日(软件工程日报)
阿里云大使和代理商的优惠的区别与选择
动态焦点:美债市场危机四伏 “安全资产”吸引力或进一步下降
3GB显存被封杀!《光环无限》都不让玩
Opera浏览器推送97.0.4719.26更新:集成ChatGPT与AI总结功能
世界速递!碧桂园打造湖湘人居典范 护航品质生活
世界新动态:70.C++ using的三种用法详解
环球资讯:农业银行发行700亿元二级资本债进一步增强资本实力
3599元 铭凡NUCG5迷你主机上架:碳纤维机身、下压式散热
世界百事通!比RTX 4080小一半!NVIDIA发布RTX 4000 SFF半高卡:功耗仅70瓦
【世界新要闻】专家:沙尘天气里最好别戴隐形眼镜
焦点播报:成龙和甄子丹"打架"谁会赢?甄子丹:我老了 他更老
性价比更高 有哪些散片CPU值得入手?
每日精选:Swift 备忘清单_开发速查表分享
全球信息:利用“姿态相似度比较”功能,对运动(动作)识别检测“秒”适配
国民第一APP坐实了 微信月活破13亿无可匹敌
天天时讯:堆料最多的小米手机!曝小米13 Ultra最高配1TB UFS 4.0闪存
iPhone 15 Pro工业设计敲定!这外观果粉会打多少分?
1499元!微星发布MD271UL 4K显示器:P3色域可达99%
399元1TB 速度5000MB/s!影驰星曜X4 PRO SSD图赏
世界热推荐:IDC 预计 2023 年全球可穿戴设备出货量预计将出现反弹
微头条丨低代码开发,一场深度的IT效率革命
混合多云第二课——混合技术如何每年为京东节省上亿元成本?
【天天新视野】记录--我在前端干工地(three.js)
数据库系统原理之数据库编程
当前滚动:债市日报:3月22日
女子应聘被HR质疑23岁用苹果手机:称其年纪小 手机贵
天天速讯:四川一高校放7天春假 鼓励大家去恋爱!网友:坚持一个四川原则
环球速递!腾讯2022年人均年薪102.5万!一年增加近20万
世界资讯:“长胡子”了 比亚迪海豚泰国版发布:售价约16万人民币
【全球新视野】被马化腾视为腾讯希望!微信视频号使用时长已超朋友圈
世界看热讯:农历中的惊蛰到底有什么寓意?
天天快讯:Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
ThreadPool实现机制
焦点热议:nodejs处理嵌套对象的npm包:dot-prop
中国西北地区发现广泛分布的侏罗纪被子植物化石
3年陈花香白牡丹:董德福鼎白茶200g装128元大促(200元券)
环球快看:188GB显存 800W功耗!NVIDIA发布H100 NVL加速卡:ChatGPT提速2倍
世界新资讯:美国两囚犯用牙刷挖洞越狱成功:墙内钢筋松了!职能部门颜面扫地
当前观察:9岁女孩豪掷18.9万打赏游戏主播 偷偷记下密码还删除转账记录
天天速讯:新能源汽车高速没电竟然倒车回服务区充电 后方车辆纷纷避让
Geyser - Minecraft Server 基岩版与Java版互通教程
世界速讯:Rust 知识积累(5)
全球热文:CSIG企业行-走进合合信息成功举行,聚焦生成式人工智能、智能文档处理前沿热点
环球今日讯!webrtc QOS笔记三 RTT计算,SRS增加XR
你可能不那么知道的Tomcat生命周期管理 | 博学谷狂野架构师
全球新资讯:国家药监局:2022年抽检11类化妆品20368批次产品 合格率97.60%
每日速看!【财经分析】投资收益拖累2022年券商业绩 投行业务景气度仍处于高位
【聚看点】澳弘电子(605058.SH):年产高精密度多层板、高密度互连积层板120万平方米建设项目及研发中心升级改造项目结项
真我GT Neo5 SE“最终幻想”配色回归:赛博朋克风满满
当前消息!《黑暗荣耀2》蝉联网飞电视剧全球榜第一:观看时间过亿
当前热门:又一日系即将退出中国?广汽三菱否认传闻:正常运转
世界看点:被谷歌商店下架 拼多多驳斥恶意软件指控!
世界聚焦:上市五年市值缩水99.6%!昔日“明星”趣头条宣布退市
新资讯:火山引擎 VeDI 零售行业解决方案 聚焦精准营销场景提升品牌转化
面试官:ThreadLocal 为什么会内存泄漏吗?是怎么产生的?面试必问!
JavaSE笔记之注解和反射(含案例代码)
当前速递!Android BLE 广播定制
环球报道:关于asp.net core filters生命周期的探究
今头条!北方多地迎沙尘!长春直接下“泥雨”:汽车变泥车
环球速讯:OPPO、小米、vivo联盟:跨品牌一键换机新增第三方应用迁移
最新消息:史上最强骁龙7系 真我GT Neo5 SE跑分过百万:16+1TB存储确认
世界今热点:孤立森林(IForest)代码实现及与PyOD对比
最资讯丨three.js加载环境贴图
天天热讯:java中同步和异步的区别
今日关注:Alphaliner:2月底港口停运船比率达6.4% 增至去年同期3倍
4月上映!《长空之王》新预告出炉:王一博驾驶歼20一飞冲天
世界今头条!自嗨锅自热煲仔饭4桶到手价32.8元:15分钟速烹美食
今年以来最强沙尘来袭!你的城市在下雨 他的城市在下泥
邓紫棋你把我灌醉高音最高是多少?邓紫棋你把我灌醉歌词
苏菲日记是什么?苏菲日记的读后感怎么写?
strict怎么读?strict的反义词是什么?
主题班会的开场白有什么要求?主题班会的开场白怎么写?
河南洛阳旅游景点排名前十名有哪些?河南洛阳美食排行榜前十名
当前简讯:一种基于实时大数据的图指标解决方案
【天天报资讯】智能零售柜商品检测软件(Python+YOLOv5深度学习模型+清新界面)