基于OpenAI的gpt-3.5模型API实现个人助手服务

引言

网上有不少OpenAI的API资料,实测下来,可能是环境因素踩了不少坑,这里分享一下我实践成功的技术路线。出于篇幅考虑,本文不会对开发前的部分工作,例如openai账号注册,外网访问权限获取,java,python环境搭建等问题过多赘述

相关资源地址

名称地址作用
ChatGPT访问地址https://chat.openai.com/chatchatgpt官方访问网址
GPT_KEYhttps://platform.openai.com/account/api-keys获取允许程序访问的key
discordhttps://dler.pro/auth/register?affid=142134获取外网访问权限
高德开放平台https://console.amap.com/dev/key/app获取高德开发平台服务,此案例中是需要高德的天气预报服务
163邮箱服务https://mail.163.com此案例中,通过邮件通知用户天气信息
腾讯云函数服务https://console.cloud.tencent.com/scf/list?rid=15&ns=default在本案例中没用到这个服务,曾经尝试过使用此服务作为python中转服务,因为节点可以选在国外,天然支持外网访问

设计思路

天气预报服务职能图

java端技术点及代码示例

  • 后台任务:目的是每天定时执行某段代码,此处采用的是公司产品自己封装的定时任务服务,用开源的同学可以自行去spring全家桶中找类似的框架
  • HTTP请求:采用的是post请求,代码可复用提供的HttpConnection类
  • 邮件发送:此处采用的是smtp协议,服务商为163,在使用163服务前需要去163邮箱官网开启smtp服务,并获取授权码。

定时任务及整体逻辑如下

package nc.plugin.cw_ext.reminder;import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;import nc.bs.logging.Logger;
import nc.bs.pub.pa.PreAlertObject;
import nc.bs.pub.taskcenter.BgWorkingContext;
import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
import nc.util.mrsy.CommonUtil;
import nc.util.mrsy.HttpConnection;
import nc.util.mrsy.UtilConstants.MaillSender;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFDateTime;
import nccloud.message.util.MessageCenter;
import nccloud.message.vo.NCCMessage;
import nccloud.message.vo.NCCNoticeMessageVO;
import nccloud.util.cw_ext.JdbcUtil;
import nccloud.util.email.EmailUtil;/*** WeatherReminderTaskPlugin:天气预报邮件通知插件* @author	CYQ* @date	2023年5月20日 下午5:05:14* @version	1.0.0
*/ 
public class WeatherReminderTaskPlugin implements IBackgroundWorkPlugin {private CommonUtil util = CommonUtil.getCommonUtil();@Overridepublic PreAlertObject executeTask(BgWorkingContext context) throws BusinessException {try {String msg = sendEmail();//通过系统内置能力,调用消息通知,请忽略此功能sendMsg("CYQ",msg);context.setLogStr("天气预报邮件通知任务调用完成!");return null;} catch (Exception e) {throw new BusinessException("发生了未定义异常,"+e.getMessage());}}/*** sendEmail:	发送邮件* @param data	void	TODO(参数说明)* 创  建  人 :CYQ* 创建时间:2023年5月20日-下午5:53:50* @throws Exception */private String sendEmail() throws Exception {Logger.error("begin...sendEmail");//获取明天天气String weather = getGDAPI();//通过gpt3.5获取信息String gptbody = getGPTbody(weather);//发送邮件EmailUtil.sendEmail(MaillSender.we, "明日天气预报,请查收~", gptbody);return "天气预报发送完毕";}/*** 获取明天的天气* @throws BusinessException*/private String getGDAPI() throws BusinessException {//url为高德天气预报服务的url,详情请参阅:https://console.amap.com/dev/key/appString url = util.getParameter("gd_url");String msg = HttpConnection.doGet(url, null, null);Logger.error("高德返回消息:"+msg);Map map = util.initMap(msg);JSONArray forecasts = (JSONArray)JSON.parse(util.initstr(map.get("forecasts")));Map info = util.initMap(forecasts.get(0));JSONArray casts = (JSONArray)JSON.parse(util.initstr(info.get("casts")));String tomorrow = util.initstr(casts.get(1));return tomorrow;}/*** 调用GPT3.5中转服务,获取报文* @param body* @return* @throws BusinessException */private String getGPTbody(String data) throws BusinessException {Logger.error("begin...getGPTbody");//请将XX,YY替换为身份和昵称String req = "请替我向我的XX,昵称YY,用中文讲述天气及注意事项,并问好。以下是明天的天气信息:"+data;JSONObject json = new JSONObject(); json.put("msg", req);//由于python服务和java服务部署在一台机器上,所以访问127即可String msg = HttpConnection.doPost("http://127.0.0.1:8001/openai_gpt3", json.toString(), null);StringBuffer sb = new StringBuffer(msg);sb.delete(sb.length()-1, sb.length());sb.delete(0, 1);//解码unicode字符String text = unicodeDecode(sb.toString());Logger.error("getGPTbody...msg="+text);return text;}/*** @param string* @return 转换之后的内容* @Title: unicodeDecode* @Description: unicode解码 将Unicode的编码转换为中文*/private String unicodeDecode(String string) {Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");Matcher matcher = pattern.matcher(string);char ch;while (matcher.find()) {ch = (char) Integer.parseInt(matcher.group(2), 16);string = string.replace(matcher.group(1), ch + "");}return string;}/*** 失败信息发送指定业务员* * @MethodName: sendMsg* memo by CYQ 2023年4月26日 理论代码没问题,前台不显示通知,怀疑是标准bug* @author CYQ* @date 2023年2月26日*/private void sendMsg(String msg_users, String msg) throws BusinessException {try {if (msg_users == null || msg_users.isEmpty()) {throw new BusinessException("未加载到有效的[msg_users]参数,请检查!");}NCCMessage message = new NCCMessage();NCCNoticeMessageVO msgvo = new NCCNoticeMessageVO();// 消息标题内容msgvo.setSubject(msg);msgvo.setSender("NC_USER0000000000000");// 可以一次群发,发送人String pk = JdbcUtil.queryColumn("sm_user", "cuserid", "user_code", msg_users);msgvo.setReceiver(pk);// 消息内容msgvo.setContent(msg);msgvo.setMsgsourcetype("reconcilemeg");msgvo.setSendtime(new UFDateTime());
//			msgvo.setDetail(msg);msgvo.setContenttype("BIZ");// 内容格式msgvo.setMsgtype("nc");// 消息发送类型msgvo.setMsgsourcetype("notice");// 消息来源类型msgvo.setPriority(0);// 优先级msgvo.setSendtime(new UFDateTime());// 发送时间message.setMessage(msgvo);message.setMessageType("notice");// 消息类型——通知// 发送确认消息MessageCenter.sendMessage(new NCCMessage[] { message });} catch (Exception e) {throw new BusinessException("业务执行完毕,NC消息发送异常..." + e.getMessage());}}}

email工具类如下

package nccloud.util.email;
import java.util.Properties;import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;import nc.bs.logging.Logger;
import nc.util.mrsy.UtilConstants.MaillSender;
import nc.vo.pub.BusinessException;/*** 邮箱服务工具类*/
public class EmailUtil {public static void sendEmail(String to, String subject, String body) throws BusinessException {try {Logger.error("begin...sendEmail");// 设置邮件服务器属性Properties props = new Properties();props.put("mail.smtp.host", "smtp.163.com");props.put("mail.smtp.socketFactory.port", "465");props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");props.put("mail.smtp.auth", "true");props.put("mail.smtp.port", "465");// 创建邮件会话Session session = Session.getInstance(props,new javax.mail.Authenticator() {protected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(MaillSender.me, MaillSender.mailkey);}});// 创建邮件消息Message message = new MimeMessage(session);message.setFrom(new InternetAddress(MaillSender.me));message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));message.setSubject(subject);message.setText(body);// 发送邮件Transport.send(message);} catch (Exception e) {// TODO: handle exceptionthrow new BusinessException("邮件发送失败,"+e.getMessage(),"-1001");}}
}

http工具类如下

package nc.util.mrsy;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;import nc.vo.pub.BusinessException;/*** HttpConnection:HTTP工具类* * @author CYQ* @date 2021年12月6日 下午5:45:31* @version 1.0.0*/
public class HttpConnection {/*** doPost:	doPost方法* @param json* @param url* @return* @throws Exception	String	TODO(参数说明)* 创  建  人 :CYQ* 创建时间:2022年5月19日*/public static String doPost(String url, String json, Map<String,String> head) throws BusinessException {BufferedReader in = null;InputStream inputStream = null;OutputStream outputStream = null;HttpURLConnection httpURLConnection = null;try {		if(url == null || url.isEmpty()) {throw new BusinessException("URL不能为空!");}URL adress=new URL(url);// 创建连接 测试httpURLConnection = (HttpURLConnection) adress.openConnection();// 设置请求的内容类型httpURLConnection.setRequestProperty("x-zop-ns", "budget");httpURLConnection.setRequestProperty("accept", "*/*");httpURLConnection.setRequestProperty("connection", "Keep-Alive");httpURLConnection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");httpURLConnection.setRequestProperty("Content-Type","application/json");httpURLConnection.setRequestProperty("User-Agent","PostmanRuntime/7.32.2");httpURLConnection.setRequestProperty("Accept","*/*");httpURLConnection.setRequestProperty("Accept-Encoding","gzip, deflate, br");httpURLConnection.setRequestProperty("Connection","keep-alive");httpURLConnection.setConnectTimeout(30000000);httpURLConnection.setReadTimeout(30000000);//追加请求头if(head!=null && head.size()>0) {for(String key:head.keySet()) {httpURLConnection.setRequestProperty(key,head.get(key));}}// 设置发送数据httpURLConnection.setDoOutput(true);// 设置接受数据httpURLConnection.setDoInput(true);httpURLConnection.setUseCaches(false);// 发送数据,使用输出流outputStream = httpURLConnection.getOutputStream();// 发送的soap协议的数据String content = json.toString();// 发送数据outputStream.write(content.getBytes("UTF-8"));// 接收数据 inputStream = httpURLConnection.getInputStream();in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));StringBuffer buffer = new StringBuffer();String line = "";while ((line = in.readLine()) != null)buffer.append(line);String result = buffer.toString();outputStream.flush();outputStream.close();try {in.close();httpURLConnection.disconnect();} catch (IOException e) {e.printStackTrace();throw new Exception( e.getMessage()+e.getCause());}return result;} catch (Exception e) {e.printStackTrace();throw new BusinessException("doPost异常,"+e.getMessage()+e.getCause());}}}

python端技术点及代码示例

  • python版本采用的是3.11
  • 使用falcon发布http_post接口
  • 调用openai依赖获取gpt服务

具体服务发布步骤如下:

  1. 请确保python服务及pip服务安装正确
  2. 执行以下指令安装falcon依赖
pip install falcon
  1. 执行以下指令安装openai依赖
pip install openai
  1. 编写openai调用工具,文件命名为【api.py】,具体代码如下

案例中使用的gpt-3.5-turbo模型是综合了使用体验和费用的综合选择,若想使用其他模型,可以修改模型编码

# -*- coding: utf-8 -*-import openaiopenai.api_key = "填入openai中的key"
model_engine = "gpt-3.5-turbo"def getgpt(reqmsg):# 发送API请求,获取响应response = openai.ChatCompletion.create(model=model_engine,messages=[{"role": "user", "content": reqmsg}])# 解析响应,获取回复output_text = response["choices"][0]["message"]["content"]return output_text
  1. 发布post接口,文件命名为【app.py】,具体代码如下
# -*- coding: utf-8 -*-import falcon
import json
import apiclass AppResource(object):# get请求def on_get(req, resp):msg = {"message": "Welcome to the Falcon"}resp.body = json.dumps(msg)# post请求def on_post(self, req, resp):try:result = req.mediareqmsg = result['msg']msg = api.getgpt(reqmsg)resp.body = json.dumps(msg)except Exception as e:print(str(e))resp.body = '调用发生异常'+str(e)except SyntaxError as e1:print(str(e1))resp.body = '调用发生异常'+str(e1)app = falcon.API()
app.add_route("/openai_gpt3", AppResource())if __name__ == "__main__":from wsgiref import simple_serverhttpd = simple_server.make_server("127.0.0.1", 8001, app)httpd.serve_forever()
  1. 在cmd中执行以下指令,启动python中转服务
python app.py

效果如图所示
启动python服务

效果展示

效果展示

注:此技术路线仅为最终测试通过的路线,中间还验证过使用java,okhttp访问openai服务,使用腾讯云函数实现免费访问外网等技术路线,最终因种种原因未能验证通过。

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

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

相关文章

人人都可实测体验的ChatGPT来了

来源&#xff1a;量子位 所有人都能上手微软Bing了&#xff01; 今天&#xff0c;微软突然官宣全面开放BingChat&#xff1a; 无需任何等待。只需注册一个账户&#xff0c;首页即可体验。 更关键的是&#xff0c;还有一大堆堪称“家底”的新功能来袭&#xff01; 支持100种语言…

最快下载微软必应Bing搜索背景图片的方法

1.打开谷歌Chrome浏览器。 2.打开https://cn.bing.com/或https://cn.bing.com/ 3.CtrlShiftI 4.CtrlO 5.输入 jpg 6.点击链接 7.鼠标右键图片&#xff0c;选择最后两个菜单都能下载&#xff0c;个人偏好第三个 8.另存为即可 第4步 还可以使用CtrlF &#xff0c;在Eleme…

分享:企业内部通信 〖局域网QQ〗Bing(必应)1.0 正式发布,包括:聊天、视频、语音、电话、截屏、涂鸦、文件传输 等

分享&#xff1a;企业内部通信 〖局域网QQ〗Bing&#xff08;必应&#xff09;1.0 正式发布,包括&#xff1a;聊天、视频、语音、电话、截屏、涂鸦、文件传输 等 局域网QQ Bing&#xff08;必应&#xff09;1.0 正式发布 Bing&#xff08;必应&#xff09;是一款优秀的企业局…

【IDEA插件】 EasyCode

Easycode是idea的一个插件&#xff0c;可以直接对数据的表生成 entity,controller,service,dao,mapper,无需任何编码&#xff0c;简单而强大。 1、安装(EasyCode) img 我这里的话是已经那装好了。 建议大家再安装一个插件&#xff0c;Lombok。Lombok能通过注解的方式&#x…

IDEA集成chatGTP让你编码如虎添翼

如果您 还没有chatGTP账号,请移步以下文章中注册章节: ​​​​​​独立部署基于apiKey或accessToken的GPT聊天工具_云台095的博客-CSDN博客 IDEA集成chatGTP让你编码如虎添翼 第一步,打开您的IDEA, 打开首选项(Preference) -> 插件(Plugin) 在插件市场搜索 c…

Docker容器编排

Docker容器编排 简介为什么需要 Compose?安装docker-compose常用命令使用步骤小案例总结 简介 Compose&#xff08;容器编排&#xff09; 是 Docker 公司推出的一个工具软件&#xff0c;可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-com…

云编排技术:探索您的选择

最近 IT 行业有很多围绕云编排的议论&#xff0c;而且许多人想知道云编排到底是怎么回事。本文将探索云编排的概念&#xff0c;以及它将如何融入云计算的大发展趋势中。我将分析各种编排工具并介绍它们之间的区别&#xff0c;使您能够更好地了解有哪些可用的选择。 首先&#x…

终于有本书讲清了ChatGPT和AIGC的前世今生!(文末送书)

AIGC的各大门派是谁&#xff1f;典型技术都有什么&#xff1f; AIGC为什么在绘画领域先破圈&#xff1f;ChatGPT的有哪些局限性&#xff1f; 为何科技企业争相推出大模型&#xff1f; 人类的创新能力会被AIGC取代吗…… 诸如此类的这些话题呈现爆发性增长&#xff0c;频频被科技…

ChatGPT等AIGC如何移动边缘部署?南洋理工最新《 在移动网络中释放边云生成AI的力量:AIGC服务》综述其技术体系...

人工智能生成内容(AIGC)是一种使用人工智能算法创造性地生成、操作和修改有价值和多样化数据的自动化方法。本文重点研究了ChatGPT和Dall-E等AIGC应用在移动边缘网络(mobile AIGC networks)中的部署&#xff0c;这些应用在维护用户隐私的同时&#xff0c;提供个性化和定制化的实…

【ChatGPTAIGC研讨社】“iPhone时刻”:未来已来

文章目录 前言一、ChaGPT&AIGC研讨社简介二、ChatGPT&AIGC研讨社的优势1.丰富充实的资料库Github开源&#xff1a;[ChatGPT_Project](https://github.com/shawshany/ChatGPT_Project)飞书资料库 2.重量级嘉宾3.工作机会4.投资资源 总结 前言 去年年末&#xff0c;Chat…

线上渠道拓展:澳洲爱他美产品如何利用新媒体平台宣传?

爱他美作为澳大利亚本土的婴儿配方奶粉品牌&#xff0c;在澳大利亚市场拥有越来越多的支持者&#xff0c;为了进一步扩大澳大利亚市场份额&#xff0c;开拓线上市场&#xff0c;有必要利用新媒体平台来推广产品。 爱他美应该利用新媒体平台进行市场宣传。新媒体平台&#xff0c…

轻松玩转开源大语言模型bloom(一)

前言 chatgpt已经成为了当下热门&#xff0c;github首页的trending排行榜上天天都有它的相关项目&#xff0c;但背后隐藏的却是openai公司提供的api收费服务。作为一名开源爱好者&#xff0c;我非常不喜欢知识付费或者服务收费的理念&#xff0c;所以便有决心写下此系列&#…

ChatGPT官方第一手资料:这七个小技巧帮你用好ChatGPT

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 学习技术最好的方式是什么&#xff1f;看官方资料。 然而&#xff0c;官方教材总有些晦涩难懂&#xff0c;所以大白话将意思做个翻译&#xff0c;就成为了必然。我个人建议有条件的话&#xff0c;先看官方指南。…

【GPT】让你事半功倍特别好用的5个GPT工具

文章目录 前言一、现在还能开通ChatGPT4.0吗&#xff1f;二、推荐五款与ChatGPT的相关实用工具1.一款浏览器插件&#xff1a;ChatGPT for Google2.一款生成图片的AI工具&#xff1a;midjourney3.推荐两款AI自动生成PPT&#xff1a;闪击PPT、mindshow4.识别PFD文件内容对话&…

【PTA】谷歌的招聘(C语言)

2004 年 7 月&#xff0c;谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌&#xff08;如下图&#xff09;用于招聘。内容超级简单&#xff0c;就是一个以 .com 结尾的网址&#xff0c;而前面的网址是一个 10 位素数&#xff0c;这个素数是自然常数 e 中最早出现的 10 位连续…

中兴校招笔试题-算法工程师-python

两个编程题&#xff0c;不是很难。 一、字符串分割 一个字符串内只包含T和S&#xff0c;问如何分割&#xff0c;是的每个字串有且仅有2个T&#xff0c;请计算总共有多少种分割方式&#xff1f; 说明&#xff1a; 字符串字母顺序不可改变&#xff1b; 字符串个数为奇数时&a…

如何用ChatGPT创造财富?

在当今的信息时代&#xff0c;人工智能技术的不断发展已经成为推动经济发展的新动力之一。ChatGPT作为其中的代表之一&#xff0c;可以帮助人们创造更多的财富。在本文中&#xff0c;我将会探讨如何使用ChatGPT来创造财富。 一、利用ChatGPT实现个性化服务 人工智能技术在个性…

基于ChatGLM-6B模型 + prompt实现角色扮演功能

★★★ 本文源自AlStudio社区精品项目&#xff0c;【点击此处】查看更多精品内容 >>> 1. 引言 1.1 什么是ChatGLM General Language Model (GLM)&#xff0c;据论文 https://arxiv.org/pdf/2103.10360.pdf 所述&#xff0c;是一种基于自回归空白填充的通用语言模型…

启真医学大模型

启真医学大模型 QiZhenGPT: An Open Source Chinese Medical Large Language Model 本项目利用启真医学知识库构建的中文医学指令数据集&#xff0c;并基于此在LLaMA-7B模型上进行指令精调&#xff0c;大幅提高了模型在中文医疗场景下效果&#xff0c;首先针对药品知识问答发…