ChatGPT大火后,国内不少人开始测试使用,但openAI做了地域限制,在中国区当前是没法使用openai的,刚好手里有海外的机器资源和手机号,注册了下openai的帐号,通过调用其API,实现了Text completion功能的测试。

一、注册及调用

注册openai站点帐户(打开 https://openai.com/api/ 页,右上角sign up注册,注册需海外手机号短信验证),打开 beta.openai.com/account/api-keys 页面获取api-key信息 ,见下图:

openai-apikey
openai-apikey

API调用测试,这里使用是text-davinci-003模型,其他GPT3模型可以参考文档:https://platform.openai.com/docs/models/gpt-3

python测试代码如下:

 1[root@ecs-668b mnt]# cat chatgpttest.py
 2import openai
 3
 4openai.api_key = "your api key"
 5
 6def generate_response(prompt):
 7    model_engine = "text-davinci-003"
 8    prompt = (f"{prompt}")
 9
10    completions = openai.Completion.create(
11        engine=model_engine,
12        prompt=prompt,
13        max_tokens=1024,
14        n=1,
15        stop=None,
16        temperature=0.5,
17    )
18
19    message = completions.choices[0].text
20    return message.strip()
21
22prompt = input("Enter your question: ")
23response = generate_response(prompt)
24
25print(response)

注意这里openai模块需要安装,其会有pandas等模块依赖。

执行测试结果如下:

二、web封装调用

想要实现的效果:通过谷歌或百度一样的搜索框,输入查询关键字,返回openai 调用后返回的结果。具体代码如下:

  1// 实现的几个文件
  2(base) [root@ecs-668b chat]# tree
  3.
  4├── demaon.sh
  5├── main.py
  6└── templates
  7    ├── index.html
  8    └── result.html
  9
 101 directory, 4 files
 11
 12//通过flask框架简单实现API的调用并通过模板文件渲染结果
 13(base) [root@ecs-668b chat]# cat main.py
 14from flask import Flask,jsonify,render_template,render_template_string,request
 15import requests,json
 16import openai
 17
 18openai.api_key = "your api key"
 19
 20app = Flask(__name__,template_folder='./templates')
 21@app.route('/')
 22def index():
 23    return render_template("index.html")
 24@app.route('/chatgpt', methods=['POST'])
 25
 26def chatgpt():
 27  q = request.form['question']
 28  print(str(q))
 29  response = generate_response(str(q))
 30  #return response
 31  return render_template("result.html", question=q,result=response)
 32def generate_response(prompt):
 33    model_engine = "text-davinci-003"
 34
 35    completions = openai.Completion.create(
 36        engine=model_engine,
 37        prompt=prompt,
 38        max_tokens=1024,
 39        n=1,
 40        stop=None,
 41        temperature=0.5,
 42    )
 43
 44    message = completions.choices[0].text
 45    return message.strip()
 46
 47if __name__ == '__main__':
 48   app.run("0.0.0.0",port=80)
 49(base) [root@ecs-668b chat]#
 50
 51//首页模板文件输出搜索框将输入结果传给flask处理
 52(base) [root@ecs-668b chat]# cat templates/index.html
 53
 54<html>
 55<head>
 56<meta charset="utf-8">
 57<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 58<title>Examples</title>
 59<meta name="description" content="">
 60<meta name="keywords" content="">
 61<link href="" rel="stylesheet">
 62<style type="text/css">
 63.container {
 64                width: 500px;
 65                height: 50px;
 66                margin: 100px auto;
 67            }
 68
 69            .parent {
 70                width: 100%;
 71                height: 42px;
 72                top: 4px;
 73                position: relative;
 74            }
 75
 76            .parent>input:first-of-type {
 77                /*输入框高度设置为40px, border占据2px总高度为42px*/
 78                width: 380px;
 79                height: 40px;
 80                border: 1px solid #ccc;
 81                font-size: 16px;
 82                outline: none;
 83            }
 84
 85            .parent>input:first-of-type:focus {
 86                border: 1px solid #317ef3;
 87                padding-left: 10px;
 88            }
 89
 90            .parent>input:last-of-type {
 91                /*button按钮border并不占据外围大小设置高度42px*/
 92                width: 100px;
 93                height: 44px;
 94                position: absolute;
 95                background: #317ef3;
 96                border: 1px solid #317ef3;
 97                color: #fff;
 98                font-size: 16px;
 99                outline: none;
100            }
101</style>
102</head>
103<body>
104   <div class="container">
105        <form action="/chatgpt" method="post" class="parent">
106        <input type="search" name="question" placeholder="请输入问题">
107        <input type="submit" id="search" value="查询">
108        </form>
109    </div>
110</body>
111</html>
112(base) [root@ecs-668b chat]#
113
114//返回查询结果页并在本页可以继续查询
115(base) [root@ecs-668b chat]# cat templates/result.html
116
117<html>
118<head>
119<style>
120div {
121  background-color: lightgrey;
122  width: 500px;
123  border: 15px solid green;
124  padding: 150px;
125  margin: 10px auto;
126}
127</style>
128</head>
129<body>
130
131<h2 align="center">ChatGPT查询</h2>
132
133<p align="center">您的问题是<font color="#FF0000"><strong> {{ question }} </strong></font>chatGPT查询结果如下</p>
134
135<div align="center">
136{{ result }}
137</div>
138
139        <form action="/chatgpt" method="post"  align="center">
140        <input type="text" name="question" placeholder="继续问问题">
141        <input type="submit" id="search" value="查询">
142        </form>
143
144</body>
145</html>
146(base) [root@ecs-668b chat]#
147
148//守护进程避免程序挂掉
149(base) [root@ecs-668b chat]# cat demaon.sh
150#!/usr/bin/env bash
151
152while true;do
153process_number=`pgrep  python|wc -l`
154if [ $process_number -lt 1 ];then
155        echo process java is not running
156        cd /mnt/chat
157        python main.py >>out.log &
158        sleep 10
159fi
160echo check
161sleep 10
162done

我们来看下执行结果,发现问同一个问题时,使用中文问和英文问给出的结果是不同的,其对中文的分词理解感觉不够好(估计没有使用结巴分词这类中文分词分析)。

chinese word ask
chinese word ask

同样的问题,换成英文去问时,结果如下:

english-word-ask
english-word-ask

发现一个给出的结果是湖北,一个给出的是广东。(不知道他这个是根据常住人口还是实际归属人口返回的结果)。

三、总结

这里只使用了openai的一个模块下的某一个小的模型进行了测试,官方提供的模型如下:

Models Description
GPT-3 A set of models that can understand and generate natural language
Codex Limited beta A set of models that can understand and generate code, including translating natural language to code
Content filter A fine-tuned model that can detect whether text may be sensitive or unsafe

每个模型下面又对应了不同算法,想要了解每个的细节或进行测试,可以通过官方页面:https://platform.openai.com/docs/models/overview 获取更多信息。

对于一些应用示例也可以参考官方的功能示例页面:openai examples 进行查看。

最后:由于仅仅只是测试目的,当前ask.361way.com 测试完成后,已进行下架处理。需要体验的同学,也可以使用https://chatgpt.sbaliyun.com/ 站点进行测试,只不过界面有些不同,都是使用的官方API。