如何本地部署服务调用chatGPT?虽迟但到。。。最近太忙了。
今天手把手教你如何使用gradio搭建服务调用chatGPT接口。
1. python调用chatGPT接口
1.1 申请openai key
首先,准备好V**和google邮箱账号,申请一个openai key。
https://www.cnblogs.com/klchang/p/17352911.html
(没有V**可以用腾讯云,地区选中国香港~)
1.2 python调用接口
conda环境下,pip install openai。
通过第一步有了key,就可以直接使用chatGPT了~
直接上代码:
代码语言:javascript复制import openai
openai.api_key = '第一步申请到的key'
# MODEL_NAME = "gpt-4"
MODEL_NAME = "gpt-3.5-turbo"
def test_openai_api(question):
rsp = openai.ChatCompletion.create(
model = MODEL_NAME,
messages=[
{"role": "system", "content": "你是一个资深算法工程师"},
{"role": "user", "content": quesiton}
]
)
print(rsp)
# 返回内容
print(rsp.get("choices")[0]["message"]["content"])
# 回答总token数
print(rsp.get("usage")["total_tokens"])
question = "用python实现卷积操作,输入256的三通道,卷积核是3*3,输出通道64"
test_openai_api(question)
看看结果:
rsp:
代码语言:javascript复制{
"id": "chatcmpl-81XW6ARspF4vIMcCh5fEWMmhZbMrS",
"object": "chat.completion",
"created": 1695377858,
"model": "gpt-3.5-turbo-0613",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "返回的答案,太长****"},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 54,
"completion_tokens": 427,
"total_tokens": 481
}
}
rsp.get("choices")[0]["message"]["content"]
代码语言:javascript复制确定卷积操作的具体实现需求后,可以使用Python的numpy库来实现。以下是一个简单的示例:
```python
import numpy as np
def conv2d(input, kernel):
input_height, input_width, input_channel = input.shape
kernel_height, kernel_width, kernel_channel, output_channel = kernel.shape
# 计算输出矩阵的大小
output_height = input_height - kernel_height 1
output_width = input_width - kernel_width 1
# 创建输出矩阵
output = np.zeros((output_height, output_width, output_channel))
# 遍历每个输出位置
for i in range(output_height):
for j in range(output_width):
# 计算当前位置的卷积结果
for k in range(output_channel):
for m in range(kernel_height):
for n in range(kernel_width):
for c in range(input_channel):
output[i, j, k] = input[i m, j n, c] * kernel[m, n, c, k]
return output
# 生成输入矩阵和卷积核
input_shape = (256, 256, 3)
kernel_shape = (3, 3, 3, 64)
input = np.random.rand(*input_shape)
kernel = np.random.rand(*kernel_shape)
# 进行卷积操作
output = conv2d(input, kernel)
print(output.shape) # 输出应该为 (254, 254, 64)
```
请注意,上述代码是一个简单的示例,可能不适用于大规模的图像处理任务。在实际生产环境中,您可能需要依赖高性能计算库,如TensorFlow或PyTorch,来实现更高效的卷积操作。
rsp.get("usage")["total_tokens"]
代码语言:javascript复制481
为什么要关注token呢?因为openai按token收费的~
按以上接口可以完成一次对话,但是由于没有保存历史信息,多轮对话就失效了~所以想支持多轮对话,我们就需要对 openai.ChatCompletion.create接口里的messages变量进行修改,把历史对话信息补充进去。
代码语言:javascript复制 def get_response(self, question):
# 用户的问题加入到message
self.messages.append({"role": "user", "content": question})
# 问chatgpt问题的答案
rsp = openai.ChatCompletion.create(
model=self.model,
messages=self.messages,
)
answer = rsp.get("choices")[0]["message"]["content"]
# 得到的答案加入message,多轮对话的历史信息
self.messages.append({"role": "assistant", "content": answer})
return answer
但是我们总不能每次都再命令行里和chatgpt对话吧?按之前思路,我会启动一个flask服务,加载一个前端的对话页面,调用chatgpt接口。
但是时代变了,现在太多AI算法可视化部署的工具了。。。
2. gradio介绍和使用
对于AI算法可视化部署比较常见的框架有gradio,streamit, dash。
2.1 AI应用demo框架对比
详细对比参考https://zhuanlan.zhihu.com/p/611828558
2.2 gradio实例
本文主要介绍我认为上手难度最低的gradio,当然他的扩展性也比较低。如果你的需求就是一个简单的对话框,gradio是最佳选择。
我们先使用gradio,搭建一个最简单的服务。
代码语言:javascript复制#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@Time : 2023/09/21 15:06:38
@Author : zoyxiong
@File : gradio_demo.py
@Desc : gradio示例
'''
import gradio as gr
def capitalize_text(input_text):
# 简单接口,输入转大写
return input_text.upper()
# 输入可选组件:text, textbox, number, checkbox, dropdown, radio, image, audio, file
# 输出可选组件:text, textbox, label, image, audio, file, keyvalues, json
iface = gr.Interface(fn=capitalize_text, inputs="textbox", outputs="text")
iface.launch()
代码语言:javascript复制pip install gradio
python gradio_demo.py
浏览器打开http://127.0.0.1:7860/(默认端口7869)
三行代码搭建服务!是不是很简单!!!
3. gradio遇到chatGPT
我们了解了如果使用python调用chatGPT;也了解了怎么搭建一个算法服务。
现在就可以直接使用gradio搭建服务调用chatGPT了,在自己的服务里你就可以加入自己想要的操作了(注意隐私和数据安全!!!)
先准备一个chatGPTBot,话不多说,都在代码中:
代码语言:javascript复制#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@Time : 2023/09/22 17:43:35
@Author : zoeyxiong
@File : chatgpt_bot.py
@Desc : 调用chatGPT类
'''
import os
import json
import openai
default_model = "gpt-3.5-turbo"
class ChatGPT:
def __init__(self, model ,init_system={"role": "system", "content": "你是一个AI助手"}, save_message=False, ):
self.messages = []
self.init_system = init_system
self.model = model
self.messages.append(init_system)
# 开启此项,须告知用户
self.save_message = save_message
self.filename="./user_messages.json"
def ask_gpt(self):
rsp = openai.ChatCompletion.create(
model=self.model,
messages=self.messages
)
return rsp.get("choices")[0]["message"]["content"]
def get_response(self, question):
""" 调用openai接口, 获取回答
"""
# 用户的问题加入到message
self.messages.append({"role": "user", "content": question})
# 问chatgpt问题的答案
rsp = openai.ChatCompletion.create(
model=self.model,
messages=self.messages,
)
answer = rsp.get("choices")[0]["message"]["content"]
# 得到的答案加入message,多轮对话的历史信息
self.messages.append({"role": "assistant", "content": answer})
return answer
def clean_history(self):
""" 清空历史信息
"""
self.messages.clear()
self.messages.append(self.init_system)
然后使用gradio接入chatgptbot
代码语言:javascript复制#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@Time : 2023/09/22 17:43:37
@Author : zoeyxiong
@File : gradio_chatgpt_v2.py
@Desc : 使用gradio调用chatgpt
'''
import openai
import gradio as gr
from chatgpt_bot import ChatGPT
from utils import get_api_key
openai.api_key = get_api_key()
MODEL_NAME = 'gpt-3.5-turbo'
# 自定义system
INIT_MSG = {"role": "system", "content": "你是一个资深算法工程师."}
# 设置端口号,默认7560,遇冲突可自定义
SERVER_PORT = 7560
# 调用gpt的bot
chatgpt = ChatGPT(MODEL_NAME, INIT_MSG)
def predict(input, chatbot):
""" 调用openai接口,获取答案
"""
chatbot.append((input, ""))
# 找chatgpt要答案
response = chatgpt.get_response(input)
chatbot[-1] = (input, response)
return chatbot
def reset_user_input():
return gr.update(value='')
def reset_state():
chatgpt.clean_history()
return []
def main():
with gr.Blocks() as demo:
gr.HTML("""<h1 align="center">{}</h1>""".format(MODEL_NAME))
# gradio的chatbot
chatbot = gr.Chatbot()
with gr.Row():
with gr.Column(scale=4):
with gr.Column(scale=50):
user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=10).style(
container=False)
with gr.Column(min_width=32, scale=1):
submitBtn = gr.Button("Submit", variant="primary")
with gr.Column(scale=1):
emptyBtn = gr.Button("Clear History")
# 提交问题
submitBtn.click(predict, [user_input, chatbot],
[chatbot], show_progress=True)
submitBtn.click(reset_user_input, [], [user_input])
# 清空历史对话
emptyBtn.click(reset_state, outputs=[chatbot], show_progress=True)
demo.queue().launch(share=False, inbrowser=True, server_port=SERVER_PORT)
if __name__ == '__main__':
main()
咱们本地python一把,看看效果
4. 上云
如果只是自己用,在本地部署就要了~如果是想给大家提供方便,可以部署到腾讯云服务器~
代码语言:javascript复制# 创建环境
conda create -n gradio_gpt python=3.10
conda activate gradio_gpt
# 安装库
pip install openai
pip install gradio
# 执行代码
nohup python gradio_chatgpt.py > myout.file 2>&1 &
# 打开浏览器
http://ip:7560/
参考:
https://xie.infoq.cn/article/e3e937eab6233c772a0c4b3ad
https://github.com/THUDM/ChatGLM2-6B
我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表