保姆级教程:使用gradio搭建服务调用chatGPT接口

2023-09-26 09:16:12 浏览数 (1)

如何本地部署服务调用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腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

0 人点赞