前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >保姆级教程:使用gradio搭建服务调用chatGPT接口

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

原创
作者头像
languageX
修改2023-09-26 09:16:12
3.3K0
修改2023-09-26 09:16:12
举报

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. python调用chatGPT接口
    • 1.1 申请openai key
      • 1.2 python调用接口
      • 2. gradio介绍和使用
        • 2.1 AI应用demo框架对比
          • 2.2 gradio实例
          • 3. gradio遇到chatGPT
          • 4. 上云
          相关产品与服务
          云服务器
          云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档