OpenAI 实战进阶教程 - 第四节: 结合 Web 服务:构建 Flask API 网关

目标
  • 学习将 OpenAI 接入 Web 应用,构建交互式 API 网关
  • 理解 Flask 框架的基本用法
  • 实现 GPT 模型的 API 集成并返回结果

内容与实操

一、环境准备
  • 安装必要依赖:
    打开终端或命令行,执行以下命令安装 Flask 和 OpenAI SDK:

    pip install flask openai
    
  • 获取 OpenAI API 密钥:
    登录 OpenAI 平台 创建 API 密钥。


二、创建基础 Flask 项目
1. 创建项目结构
├── app.py              # Flask 入口文件  
├── requirements.txt     # 项目依赖  
└── README.md            # 项目说明文档
2. 编写基础 Flask 代码

app.py 中编写以下代码,支持不同类型的 API 功能:

from flask import Flask, request, jsonify
import openai# 初始化 Flask 应用
app = Flask(__name__)# 设置 OpenAI API 密钥
openai.api_key = "your-api-key"# 定义 API 路由:生成摘要
@app.route("/gpt-summary", methods=["POST"])
def generate_summary():data = request.jsonuser_text = data.get("text", "")if not user_text:return jsonify({"error": "未提供有效的输入文本"}), 400response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=[{"role": "user", "content": f"请对以下文本生成摘要:{user_text}"}],max_tokens=150)summary = response["choices"][0]["message"]["content"]return jsonify({"summary": summary})# 定义 API 路由:自动写作
@app.route("/gpt-writing", methods=["POST"])
def generate_text():data = request.jsontopic = data.get("topic", "")if not topic:return jsonify({"error": "未提供主题"}), 400prompt = f"写一篇关于{topic}的中文文章。"response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=[{"role": "user", "content": prompt}],max_tokens=300)generated_text = response["choices"][0]["message"]["content"]return jsonify({"generated_text": generated_text})# 定义 API 路由:代码生成
@app.route("/gpt-code", methods=["POST"])
def generate_code():data = request.jsontask_description = data.get("task", "")if not task_description:return jsonify({"error": "未提供任务描述"}), 400prompt = f"编写一个 Python 函数来完成以下任务:{task_description}"response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=[{"role": "user", "content": prompt}],max_tokens=150)generated_code = response["choices"][0]["message"]["content"]return jsonify({"generated_code": generated_code})if __name__ == "__main__":app.run(port=5000)
3. 代码说明
  • gpt-summary: 接收用户文本,生成摘要。
  • gpt-writing: 根据给定主题自动生成中文文章内容。
  • gpt-code: 根据描述生成 Python 代码片段。

三、运行与测试
1. 启动 Flask 服务
python app.py

启动成功后,终端输出:

* Running on http://127.0.0.1:5000
2. 使用 Postman 测试
  • 请求方法:POST
  • 请求 URL:
    • http://127.0.0.1:5000/gpt-summary
    • http://127.0.0.1:5000/gpt-writing
    • http://127.0.0.1:5000/gpt-code
  • 示例请求体
  1. 文本摘要

    {"text": "人工智能正在迅速改变我们的生活方式和工作模式。越来越多的行业开始采用智能化方案。"
    }
    
  2. 文章生成

    {"topic": "人工智能的未来发展趋势"
    }
    
  3. 代码生成

    {"task": "读取一个文件,统计包含关键字 '错误' 的行数"
    }
    
3. 使用 curl 测试
curl -X POST http://127.0.0.1:5000/gpt-summary \
-H "Content-Type: application/json" \
-d '{"text": "人工智能技术正在重新定义行业标准。"}'
4. 预期输出

文本摘要

{"summary": "人工智能技术正在改变行业标准。"
}

文章生成

{"generated_text": "人工智能(AI)在过去几年中取得了飞速发展,未来其应用场景将更加广泛……"
}

代码生成

{"generated_code": "def count_error_lines(file_path):\n    count = 0\n    with open(file_path, 'r') as file:\n        for line in file:\n            if '错误' in line:\n                count += 1\n    return count"
}

使用Postman调用接口示例图


小结

本节通过实际示例讲解了如何使用 Flask 构建一个支持多功能的 API 网关,将 OpenAI 强大的生成能力接入到 Web 服务中。通过这些示例,开发者可以为不同业务场景快速创建交互式服务。


练习题

  1. 功能扩展
    • 添加新的路由 gpt-translate,实现中英文互译功能。
      示例提示语:将 "This is a test" 翻译为中文。
  2. 性能优化
    • 设置最大请求次数或缓存策略,以应对高并发请求。
  3. 异常处理
    • 为网络超时、API请求失败等情况添加详细的错误提示。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出:旋转变位编码(RoPE)在现代大语言模型中的应用

在现代大语言模型(LLMs)中,位置编码是一个至关重要的组件。无论是 Meta 的 LLaMA 还是 Google 的 PaLM,这些模型都依赖于位置编码来捕捉序列中元素的顺序信息。而旋转变位编码(RoPE) 作为一种创新的位置编码…

MATLAB中matches函数用法

目录 语法 说明 示例 匹配文本 使用模式匹配十六进制数 匹配多个字符串 忽略大小写 matches函数的功能是确定模式是否与字符串匹配。 语法 TF matches(str,pat) TF matches(str,pat,IgnoreCasetrue) 说明 TF matches(str,pat) 会在指定模式与 str 有匹配时返回 1…

【信息系统项目管理师】第20章:高级项目管理 详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 20.1 项目集管理20.2 项目组合管理20.3 组织级项目管理20.4 量化项目管理20.5 项目管理实践模型本章是将第三版的第20章、第21章、第18章、第25章、第2章的PRINCE2进行了合并,包括项目集管理、项目组合管理、组…

个人笔记---关于详解threadlocal 上下文环境存储的最佳数据类型

个人原因很久没有写代码,对于一些基础的数据类型有一些忘记,可以根据gpt和我当时的问答进行复习 关于拦截器,由于在请求的到达controller处理器之前,拦截器(当然过滤器也可以实现,我感觉都差不多)就把上下文设置在了线程副本中,那么这个请求到处理器的这些代码进行查询出来的上…

vue3 的 onScopeDispose 是什么作用

onScopeDispose 是 Vue 3 中用于管理响应式副作用的一个重要 API,主要用于在当前活跃的 effect 作用域上注册一个处理回调函数。当这个作用域停止时,所注册的回调函数会被调用。这种机制使得开发者能够有效地清理和管理资源,尤其是在组合式函…

DeepSeek 部署过程中的问题

文章目录 DeepSeek 部署过程中的问题一、部署扩展:docker 部署 DS1.1 部署1.2 可视化 二、问题三、GPU 设置3.1 ollama GPU 的支持情况3.2 更新 GPU 驱动3.3 安装 cuda3.4 下载 cuDNN3.5 配置环境变量 四、测试 DeepSeek 部署过程中的问题 Windows 中 利用 ollama 来…

医疗信息分析与知识图谱系统设计方案

医疗信息分析与知识图谱系统设计方案 0. 系统需求 0.1 项目背景 本系统旨在通过整合医疗机构现有的信息系统数据,结合向量数据库、图数据库和开源AI模型,实现医疗数据的深度分析、疾病预测和医疗知识图谱构建,为医疗决策提供智能化支持。 …

QImage与AVFrame互转

未验证,仅供参考,此方法感觉不是很好 先是AVFrame转QImage #pragma execution_character_set("utf-8")static int decode_write_frame(AVCodecContext *avctx, AVFrame *frame, int *frame_count, AVPacket *pkt, int last) {int len, got_f…

基础算法——二维前缀和

二维前缀和 我们先前已经了解了前缀和思想,二维前缀和感觉上就是一维前缀和的进阶,下面 ,我们剖析一下两种前缀和。 一维前缀和 一维前缀和的核心就是这两个公式,二维前缀和也差不多的嘞 下面我们来推理一下二维前缀和 已知&a…

PySPARK带多组参数和标签的SparkSQL批量数据导出到S3的程序

设计一个基于多个带标签SparkSQL模板作为配置文件和多组参数的PySPARK代码程序,实现根据不同的输入参数自动批量地将数据导出为Parquet、CSV和Excel文件到S3上,标签和多个参数(以“_”分割)为组成导出数据文件名,文件已…

如何安装LangChain软件包

前言 LangChain是一个强大的框架,用于构建使用大型语言模型(LLMs)的应用程序。它提供了一系列软件包和工具,帮助开发人员将LLMs集成到他们的工作流程中。然而,由于其模块化设计,LangChain生态系统可能会让…

每日Attention学习19——Convolutional Multi-Focal Attention

每日Attention学习19——Convolutional Multi-Focal Attention 模块出处 [ICLR 25 Submission] [link] UltraLightUNet: Rethinking U-shaped Network with Multi-kernel Lightweight Convolutions for Medical Image Segmentation 模块名称 Convolutional Multi-Focal Atte…

2. K8S集群架构及主机准备

本次集群部署主机分布K8S集群主机配置主机静态IP设置主机名解析ipvs管理工具安装及模块加载主机系统升级主机间免密登录配置主机基础配置完后最好做个快照备份 2台负载均衡器 Haproxy高可用keepalived3台k8s master节点5台工作节点(至少2及以上)本次集群部署主机分布 K8S集群主…

游戏引擎学习第89天

回顾 由于一直没有渲染器,终于决定开始动手做一个渲染器,虽然开始时并不确定该如何进行,但一旦开始做,发现这其实是正确的决定。因此,接下来可能会花一到两周的时间来编写渲染器,甚至可能更长时间&#xf…

nuxt3中使用useFetch请求刷新不返回数据或返回html结构问题解决-完整nuxt3useFetchtch请求封装

前言 如果使用nuxt3写项目,可以查看nuxt3实战:完整的 nuxt3 vue3 项目创建与useFetch请求封装,此篇内容有详细步骤 但在此篇内容中useFetch请求在页面有多个请求的情况下,或者放在客户端渲染情境下是失败的,所以在此篇…

链式结构二叉树(递归暴力美学)

文章目录 1. 链式结构二叉树1.1 二叉树创建 2. 前中后序遍历2.1 遍历规则2.2 代码实现图文理解 3. 结点个数以及高度等二叉树结点个数正确做法: 4. 层序遍历5. 判断是否完全二叉树 1. 链式结构二叉树 完成了顺序结构二叉树的代码实现,可以知道其底层结构…

JS:将JS对象格式化为php语法形式(完美支持无unicode编码匹配的正则)

/*** 格式化Object数据为php语法形式* param {*} obj 任意数据* param {String} spaceLen 缩略符长度:必须在2~65536之间,否则默认为2* return {String} 格式化后的PHP语法字符串*/ function formatToPhp(obj, spaceLen) {formatToPhp function (obj, s…

Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?

如果你曾搭建过Kubernetes集群,就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间,你要同时应对许多变动的因素。对于许多配置而言,使用二层(L2)网络就完全能满足需求。但边界网关协议(BGP)—— 支撑互联网运行的技术 —— 也逐渐出…

Linux提权--John碰撞密码提权

​John the Ripper​(简称 John)是一个常用的密码破解工具,可以通过暴力破解、字典攻击、规则攻击等方式,尝试猜解用户密码。密码的弱度是提权攻击中的一个重要因素,如果某个用户的密码非常简单或是默认密码&#xff0…

大数据学习之Spark分布式计算框架RDD、内核进阶

一.RDD 28.RDD_为什么需要RDD 29.RDD_定义 30.RDD_五大特性总述 31.RDD_五大特性1 32.RDD_五大特性2 33.RDD_五大特性3 34.RDD_五大特性4 35.RDD_五大特性5 36.RDD_五大特性总结 37.RDD_创建概述 38.RDD_并行化创建 演示代码: // 获取当前 RDD 的分区数 Since ( …