【Flask+OpenAI】利用Flask+OpenAI Key实现GPT4-智能AI对话接口demo - 从0到1手把手全教程(附源码)

文章目录

    • 前言
    • 环境准备
      • 安装必要的库
    • 生成OpenAI API
    • 代码实现详解
      • 导入必要的模块
      • 创建Flask应用实例
      • 配置OpenAI API
      • 完整代码如下(demo源码)
        • 代码解析
      • 利用Postman调用接口
    • 了解更多AI内容
    • 结尾

前言

Flask作为一个轻量级的Python Web框架,凭借其简洁易用的特点,成为构建Web应用的理想选择。本文将通过一个具体的项目实例,全面讲解如何利用Flask与OpenAI API构建一个智能AI对话接口,适用于各种应用场景。
在这里插入图片描述

环境准备

以下是本教程中所需的基本环境和依赖:

  • 操作系统:Windows、macOS或Linux均可
  • 编程语言:Python 3.7及以上版本
  • 开发工具:推荐使用VS Code、PyCharm等现代化IDE
  • 依赖库
    • Flask
    • Flask-CORS
    • openai

安装必要的库

在激活的虚拟环境中,安装项目所需的库:

pip install Flask 
pip install Flask-CORS 
pip install openai

生成OpenAI API

要使用OpenAI的GPT模型,首先需要获取API。

目前我了解到的OpenAI API KEY获取有两种方法。这个我们之前写过,有兴趣的可以看看:【OpenAI】获取OpenAI API Key的两种方式全攻略:从入门到精通,再到详解教程-CSDN

  • OpenAI官网生成API Key

  • CodeMoss生成API Key

代码实现详解

下面我们将逐步解析如何在app.py中实现智能对话接口。

导入必要的模块

首先,导入构建应用所需的库:

from flask import Flask, Response, request
from flask_cors import CORS
import openai
  • Flask:核心框架,用于创建Web应用
  • Flask-CORS:处理跨域资源共享,允许前端进行跨域请求
  • openai:OpenAI的官方Python库,用于与GPT模型进行交互

创建Flask应用实例

接下来,创建Flask应用实例,并配置跨域请求:

app = Flask(__name__)
CORS(app, resources=r'/*')  # 允许所有来源的请求
  • Flask(__name__):创建一个Flask应用实例,__name__用于资源路径的定位
  • CORS(app, resources=r'/*'):配置CORS,允许所有路径的跨域请求,确保前端应用能够正常访问API

配置OpenAI API

为了调用OpenAI API,建议使用环境变量来存储API KEY(目前为了演示demo所以我都放在一起了)

如果你是从OpenAI获取的API,那么只需要用下面的方式添加KEY就可以:

openai.api_key = os.getenv("OPENAI_API_KEY")

如果不是从OpenAI官方获取的,是从其他地方获取的,那么就需要注意baseURL的配置。因为不同的框架baseURL都是不一样。所以你要确认路径的拼接。

例如:
在python的源码里面,baseURL是自动拼接了v1

在这里插入图片描述

所以我们在拼接的时候,也要注意咱们的baseURL是否自带v1,完整拼接如下:

api_key="",  # 替换为你的api_key
base_url="https://api.aihao123.cn/luomacode-api/open-api/v1"  # 替换为你获取的base_url,注意这里后面拼接了1个v1

完整代码如下(demo源码)

from flask import Flask, Response, request  # 导入Flask框架的相关模块
from flask_cors import CORS  # 导入CORS模块以处理跨域请求
from openai import OpenAI  # 导入OpenAI的API客户端

app = Flask(__name__)  # 创建Flask应用实例
CORS(app, resources=r'/*')  # 启用CORS,允许所有来源的请求

@app.route('/', methods=['GET', 'POST'])  # 定义根路由,支持GET和POST请求
def run():
    # 从请求中获取 JSON 数据中的 'content' 字段
    gpt_content = request.form.get('content')

    # 创建OpenAI客户端实例,使用API密钥和基础URL
    client = OpenAI(
        api_key="",  # 替换为你的API密钥
        base_url="https://api.aihao123.cn/luomacode-api/open-api/v1"  # 替换为你的base_url。注意:我这里是用CodeMoss生成的base_url,所以api_key也要用CodeMoss的
    )

    # 调用OpenAI的聊天补全接口,传入用户消息
    response = client.chat.completions.create(
        messages=[
            {'role': 'user', 'content': gpt_content},  # 用户发送的消息
        ],
        model='gpt-3.5-turbo',  # 使用的模型
        stream=True  # 启用流式响应
    )

    # 定义生成器函数,用于逐块返回响应内容
    def generate():
        for chunk in response:  # 遍历响应中的每个块
            yield chunk.choices[0].delta.content  # 逐块返回内容

    # 返回一个流式响应,内容类型为 'text/event-stream'
    return Response(generate(), content_type='text/event-stream')

# 主程序入口
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=False, threaded=True)  # 启动Flask应用

代码解析
  1. 请求方法判断:根据请求的方法(GET或POST)执行不同的逻辑。
  2. 获取请求数据:对于POST请求,从JSON数据中提取content字段,作为用户输入的对话内容。
  3. 参数校验:确保用户提供了必要的content,否则返回400错误。

运行后我们会生成一个接口连接。默认情况下,运行后会是你的本地/局域网接口,你可以通过浏览器或Postman等工具进行测试。

在这里插入图片描述

利用Postman调用接口

在这里插入图片描述

教程到这里,就完整的结束了。快去试试吧!

了解更多AI内容

【OpenAI】(一)获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!!

【VScode】(二)VSCode中的智能AI-GPT编程利器,全面揭秘CodeMoss & ChatGPT中文版

【CodeMoss】(三)集成13个种AI模型(GPT4、o1等)、支持Open API调用、自定义助手、文件上传等强大功能,助您提升工作效率! >>> - CodeMoss & ChatGPT-AI中文版

结尾

希望本文对您有所帮助,祝您在技术探索的道路上不断前行,取得更多成就!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搭建springmvc项目

什么是springmvc MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 View视图 Controller控制层 springmvc框架是spring框架的一个分支。它是按照mvc架构思想设计的一款框架。 springmvc的主要作用: 接收浏览器的请求数据,对数据进行处理,…

Three.js相机Camera控件知识梳理

原文:https://juejin.cn/post/7231089453695238204?searchId20241217193043D32C9115C2057FE3AD64 1. 相机类型 Three.js 主要提供了两种类型的相机:正交相机(OrthographicCamera)和透视相机(PerspectiveCamera&…

为“行车大脑”降温:Simdroid-EC助力汽车ECU设计研发

ECU(Electronic Control Unit,电子控制单元)被誉为汽车的行车大脑,在工作时会产生大量的热量,而其散热存在以下难题:一是工作环境恶劣,ECU常处于高温环境中;二是ECU所处的空间较为狭…

改进系列(6):基于DenseNet网络添加TripletAttention注意力层实现的番茄病害图像分类

目录 1. DenseNet 介绍 2. TripletAttention 3. DenseNet TripletAttention 4. 番茄场景病害病虫识别 4.1 数据集情况 4.2 训练 4.3 训练结果 4.4 推理 1. DenseNet 介绍 DenseNet是一种深度学习架构,卷积神经网络(CNN)的一种变体&…

Ubuntu 20.04LTS 系统离线安装5.7.44mysql数据库

Ubuntu 20.04LTS 系统离线安装5.7.44mysql数据库 环境下载 MySQL 5.7.44 包安装标题检查服务是否启动成功遇到的问题登陆&修改密码&远程访问 环境 操作系统:Ubuntu 20.04.4 LTS 数据库:MySQL 5.7.34 内核版本:x86_64(amd…

0基础学前端-----CSS DAY6

0基础学前端-----CSS DAY6 视频参考:B站Pink老师 今天是CSS学习的第六天,今天开始的笔记对应Pink老师课程中的CSS第三天的内容。 本节重点:CSS的三大特性以及CSS的盒子模型。 1.CSS的三大特性 CSS有三个重要特性:层叠性、继承性…

手写Redis分布式锁+RedisUtil二次封装

文章目录 1.手写Redis分布式锁1.RedisShareLockUtil2.使用方式 2.RedisUtil二次封装1.RedisUtil2.使用案例 1.手写Redis分布式锁 1.RedisShareLockUtil package com.sunxiansheng.redis.util;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springfra…

Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 预览

文章目录 一、简介二、下载 QtPdfium三、加载 QtPdfium 动态库四、Demo 使用 关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#x…

IO的入门

目录 1.IO概述1.1流的分类 2.字符流2.1 案例 1.IO概述 IO(Input/Output):输入和输出,指的是某个设备或环境进行数据的输入或者输出。例如:键盘的输入,再比如显示器就是输出设备,输出图像。 对于java来说输…

el-table表格嵌套子表格:展开所有内容;对当前展开行内容修改,当前行默认展开;

原文1 原文2 原文3 一、如果全部展开 default-expand-all"true" 二、设置有数据的行打开下拉 1、父table需要绑定两个属性expand-row-key和row-key <el-table:data"tableData":expand-row-keys"expends" //expends是数组&#xff0c;设置…

canal详解及demo

提示&#xff1a;如何保证Redis中的数据与数据库中的数据一致性&#xff1f;数据同步canal的介绍和demo、大型企业如何实现mysql到redis的同步&#xff1f;使用binlog实时更新redis缓存、canal的接入教程、win下canal的服务器端、canal客户端的创建、连接、测试教程、数据同步方…

平方根无迹卡尔曼滤波(SR-UKF)的MATLAB例程,使用三维非线性的系统

本MATLAB 代码实现了平方根无迹卡尔曼滤波&#xff08;SR-UKF&#xff09;算法&#xff0c;用于处理三维非线性状态估计问题 文章目录 运行结果代码概述代码 运行结果 三轴状态曲线对比&#xff1a; 三轴误差曲线对比&#xff1a; 误差统计特性输出&#xff08;命令行截图&…

汇编DOSBox 如何使文件可以运行

1.在vscode编写&#xff08;其他也可以&#xff09;如何在vscode中编写汇编语言并在终端进行调试(保姆级别&#xff09;_如何在vscode编译asm-CSDN博客 2.点击ML615中的DOS 2.1在命令行中输入命令 ml 文件名.asm ml 文件名.obj 2.2 将生成的exe文件移动到Assembly里面 这个文件…

QT多线程(三):基于条件等待的线程同步

在多线程的程序中&#xff0c;多个线程之间的同步问题实际上就是多个线程之间的协调问题。例如在以下例子中只有等 ThreadDAQ 写满一个缓冲区之后&#xff0c;ThreadShow 和ThreadSaveFile 才能读取缓冲区的数据。 int buffer[100]; QReadWriteLock Lock; //定义读写锁变量 v…

js 数组方法总结

在 JavaScript 中&#xff0c;数组有许多内置的方法&#xff0c;可以用于操作和处理数组。以下是一些常用的数组方法及其特点&#xff1a; 1. push() - 用途&#xff1a;向数组末尾添加一个或多个元素 - 改变原数组&#xff1a;是 - 返回值&#xff1a;返回数组的新长度 let ar…

MongoDB-副本集

一、什么是 MongoDB 副本集&#xff1f; 1.副本集的定义 MongoDB 的副本集&#xff08;Replica Set&#xff09;是一组 MongoDB 服务器实例&#xff0c;它们存储同一数据集的副本&#xff0c;确保数据的高可用性和可靠性。副本集中的每个节点都有相同的数据副本&#xff0c;但…

驱动开发-入门【1】

1.内核下载地址 Linux内核源码的官方网站为https://www.kernel.org/&#xff0c;可以在该网站下载最新的Linux内核源码。进入该网站之后如下图所示&#xff1a; 从上图可以看到多个版本的内核分支&#xff0c;分别为主线版本&#xff08;mainline&#xff09;、稳定版本&#…

数字电视标准与分类

数字电视相关内容是一个极其成熟且久远的领域&#xff0c;并不像其它的技术方面那么前沿。但是学习技术的另外一个方面也不就是可以维持咱们的好奇心以及认识生活中多个事务后面的技术本质。 近年来&#xff0c;电视领域发生了一系列的变化&#xff0c;电视数字化的进程明显加快…

【WRF安装】WRF编译错误总结1:HDF5库包安装

目录 1 HDF5库包安装有误&#xff1a;HDF5 not set in environment. Will configure WRF for use without.HDF5的重新编译 错误原因1&#xff1a;提示 overflow 错误1. 检查系统是否缺少依赖库或工具2. 检查和更新编译器版本3. 检查 ./configure 报错信息4. 检查系统环境变量5.…

51c嵌入式~单片机~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序&#xff0c;此时需要接触到IAP编程。 IAP即为In Application Programming&#xff0c;解释为在应用中编程&#xff0c;用户自己的…