开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(一)

一、前言

    使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。

    FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,FastAPI 还提供了容器化部署能力,开发者可以轻松打包 AI 模型为 Docker 镜像,实现跨环境的部署和扩展。

    总之,使用 FastAPI 可以大大提高 AI 应用程序的开发效率和用户体验,为 AI 模型的部署和交互提供全方位的支持。


二、术语

2.1.FastAPI

    FastAPI 是一个用于构建 API 的现代、快速(高性能)的 Python Web 框架。它是基于标准 Python 类型注释的 ASGI (Asynchronous Server Gateway Interface) 框架。

FastAPI 具有以下主要特点:

  1. 快速: FastAPI 使用 ASGI 服务器和 Starlette 框架,在性能测试中表现出色。它可以与 Uvicorn 一起使用,提供非常高的性能。

  2. 简单: FastAPI 利用 Python 类型注释,使 API 定义变得简单且直观。开发人员只需要定义输入和输出模型,FastAPI 会自动生成 API 文档。

  3. 现代: FastAPI 支持 OpenAPI 标准,可以自动生成 API 文档和交互式文档。它还支持 JSON Schema 和数据验证。

  4. 全功能: FastAPI 提供了路由、依赖注入、数据验证、安全性、测试等功能,是一个功能齐全的 Web 框架。

  5. 可扩展: FastAPI 被设计为可扩展的。开发人员可以轻松地集成其他库和组件,如数据库、身份验证等。

2.2.WebSocket

    是一种计算机通信协议,它提供了在单个 TCP 连接上进行全双工通信的机制。它是 HTML5 一个重要的组成部分。

WebSocket 协议主要有以下特点:

  1. 全双工通信:WebSocket 允许客户端和服务器之间进行双向实时通信,即数据可以同时在两个方向上流动。这与传统的 HTTP 请求-响应模型不同,HTTP 中数据只能单向流动。

  2. 持久性连接:WebSocket 连接是一种持久性的连接,一旦建立就会一直保持,直到客户端或服务器主动关闭连接。这与 HTTP 的连接是短暂的不同。

  3. 低开销:相比 HTTP 请求-响应模型,WebSocket 在建立连接时需要较少的数据交换,因此网络开销较小。

  4. 实时性:由于 WebSocket 连接是持久性的,且数据可以双向流动,因此 WebSocket 非常适用于需要实时、低延迟数据交互的应用场景,如聊天应用、实时游戏、股票行情等。

2.3.FlaskAPI vs Flask

FastAPI 和 Flask 都是 Python 中非常流行的 Web 框架,但它们有一些重要的区别:

  1. 性能:FastAPI 基于 ASGI 服务器,采用异步编程模型,在处理大量并发请求时表现更出色。据测试,FastAPI 的性能比 Flask 高出 3-4 倍。

  2. 路由和 API 声明:FastAPI 采用声明式 API 设计,开发者只需定义输入输出模型,FastAPI 就能自动生成路由和文档。而 Flask 需要手动定义路由和处理函数。

  3. 数据校验:FastAPI 内置了强大的数据校验功能,可以自动校验输入参数的正确性。Flask 则需要自行实现参数校验。

  4. 自动生成文档:FastAPI 可以自动生成可交互的 API 文档,而 Flask 需要依赖第三方库如 Swagger 来生成文档。

  5. 部署和扩展:FastAPI 支持容器化部署,可以方便地打包为 Docker 镜像。Flask 则需要依赖其他工具来实现容器化。

  6. 异步支持:FastAPI 原生支持异步编程,可以轻松地集成基于异步的第三方库。而 Flask 需要依赖第三方库如 Flask-Socketio 来实现异步功能。

  7. 学习曲线:FastAPI 的声明式 API 设计使得初学者上手较为容易。而 Flask 需要开发者具有更多的 Web 开发经验。

2.4.Uvicorn

    是一个非常高效和易用的 ASGI(Asynchronous Server Gateway Interface)服务器,主要用于运行基于ASGI协议的Python Web框架,例如FastAPI。

Uvicorn 的特点:

  1. 高性能: 使用 Rust 编写的 httptools 库作为其核心HTTP解析器,以及 uvloop 高性能的事件循环,使其具有非常出色的性能表现。

  2. 易用性: 提供了简单的命令行接口,可以轻松地启动和运行基于ASGI协议的应用程序。

  3. 兼容性: 支持 ASGI 2.0 和 3.0 协议,可以运行各种基于ASGI的 Python Web 框架,如 FastAPI、Starlette 等。

  4. 多平台支持: 可以在 Windows、macOS 和 Linux 等多个平台上运行。

  5. 灵活性: 提供了丰富的配置选项,可以根据需要进行定制和扩展。


三、前置条件

3.1. 创建虚拟环境&安装依赖

conda create -n fastapi_test python=3.10
conda activate fastapi_test
pip install fastapi websockets uvicorn

四、技术实现

4.1. 构建简易WebSocket服务端

from fastapi import FastAPI, WebSocket
import uvicornapp = FastAPI()@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()while True:data = await websocket.receive_text()await websocket.send_text(f"Message text was: {data}")if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0',port=7777)

调用结果:


五、测试

5.1. 使用Fastapi测试

  在上面服务端代码的基础上,增加html代码

from fastapi import FastAPI, WebSocket
from fastapi.responses import HTMLResponse
import uvicornapp = FastAPI()
html = """
<!DOCTYPE html>
<html><head><title>Chat</title></head><body><h1>WebSocket Chat</h1><form action="" onsubmit="sendMessage(event)"><input type="text" id="messageText" autocomplete="off"/><button>Send</button></form><ul id='messages'></ul><script>var ws = new WebSocket("ws://localhost:7777/ws");ws.onmessage = function(event) {var messages = document.getElementById('messages')var message = document.createElement('li')var content = document.createTextNode(event.data)message.appendChild(content)messages.appendChild(message)};function sendMessage(event) {var input = document.getElementById("messageText")ws.send(input.value)input.value = ''event.preventDefault()}</script></body>
</html>
"""@app.get("/")
async def get():return HTMLResponse(html)@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()while True:data = await websocket.receive_text()await websocket.send_text(f"Message text was: {data}")if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0',port=7777)

调用结果:

服务端输出:

浏览器输出:

5.2. 使用在线客户端测试

网址:WebSocket在线测试工具

调用结果:

5.3. 使用html页面测试

页面代码:

<!DOCTYPE html>
<html><head><title>Chat</title></head><body><h1>WebSocket Chat</h1><form action="" onsubmit="sendMessage(event)"><input type="text" id="messageText" autocomplete="off"/><button>Send</button></form><ul id='messages'></ul><script>var ws = new WebSocket("ws://localhost:7777/ws");ws.onmessage = function(event) {var messages = document.getElementById('messages')var message = document.createElement('li')var content = document.createTextNode(event.data)message.appendChild(content)messages.appendChild(message)};function sendMessage(event) {var input = document.getElementById("messageText")ws.send(input.value)input.value = ''event.preventDefault()}</script></body>
</html>

调用结果:

5.4. 使用postman测试

PS:

各位老铁,千万不要认为上述Demo很简单,万丈高楼平地起,任何复杂的功能都是通过简单的开始逐步演化而来。后面我们将把模型推理集成到上述的示例中。

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

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

相关文章

Python 生成Md文件带超链 和 PDF文件 带分页显示内容

software.md # -*- coding: utf-8 -*- import os f open("software.md", "w", encoding"utf-8") f.write(内部测试版2024 MD版\n) for root, dirs, files in os.walk(path): dax os.path.basename(root)if dax "":print("空白…

从 ClickHouse 到 Apache Doris:快成物流的数智化货运应用实践

导读&#xff1a;随着快成物流的大宗商品产业链的不断发展&#xff0c;货运轨迹规划和实时数据分析的需求日益迫切&#xff0c;为了保障数据报表更新、用户画像圈选与物流轨迹实时更新等大数据核心系统性能&#xff0c;快成物流引入 Apache Doris 实时数仓升级了大数据算法平台…

这才叫必备软件推荐 你不能不知道的mac软件 Mac上有什么实用的必备软件 Mac常用必备软件推荐 一些好用的Mac软件

Mac OS是一个类Unix系统&#xff0c;内置终端Shell&#xff0c;这使得它天生就适合为程序员、开发者、设计者所用。不得不说苹果对用户体验的追求已经到了极致。遂开本篇&#xff0c;由于应用众多&#xff0c;一锅炖不下&#xff0c;故打算做一个系列。 下面为大家一一介绍一些…

基于物品的协同过滤算法

预估用过户对候选物品的兴趣 计算物品相似度 召回通道 快速做召回条件

Unity2D - 状态机(State Machine)详解

1. 状态机概述 在角色的生成中&#xff0c;由于事件的不同&#xff0c;动作的不同&#xff0c;角色会处于不同的状态中。例如对战冒险游戏&#xff0c;面临Boss的攻击&#xff0c;角色会受到例如中毒&#xff0c;恐惧等Debuff效果&#xff0c;若单纯的在一个脚本中使用if等语句…

绝地求生PUBG怎么领取补偿G币 补偿G币什么时候到账

绝地求生这款大逃杀射击游戏相信大家都不陌生&#xff0c;在之前的新版本NewJeans联动中&#xff0c;由于一些官方设定的错误&#xff0c;导致在开典藏箱的时候出现了一些问题&#xff0c;官方也推出了相应的补偿措施&#xff0c;比如退还G币&#xff0c;回收典藏箱子开出来的东…

Linux之Uboot简介和移植

uboot简介 uboot 的全称是 Universal Boot Loader&#xff0c;uboot 是一个遵循 GPL 协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。 也就是说&#xff0c;可以在没有系统的情况…

绝区零国际服怎么下载 绝区零国际服下载教程

绝区零即将上线&#xff0c;每位玩家都能在这里开启全新的时空冒险之旅&#xff0c;主要玩法分为以剧情和副本为主的核心玩法、以刷材料为主的养成副本&#xff0c;以及日常任务为主&#xff0c;在以往的手游中&#xff0c;玩家进入某项玩法只需要从游戏界面调取菜单即可&#…

如何用简单的html,css,js写出一个带有背景层的删除弹出框

虽然每次项目都是主要写后端&#xff0c;但是有时候前端的样式太丑了&#xff0c;也有点看不下去。弹出框是项目中用的比较多的&#xff0c;比如删除&#xff0c;修改或者添加什么的&#xff0c;都需要一个弹出框。 所以这里简单记录一下&#xff0c;应该如何实现。实现效果如…

软考《信息系统运行管理员》-2.3信息系统运维的外包

2.3信息系统运维的外包 信息系统运维外包的概念/模式 也称为信息系统代维。是指信息系统使用单位将全部或一部分的信息系统维护服务工作&#xff0c;按照规定的维护服务要求&#xff0c;外包委托给专业公司管理。 完全外包运维模式部分外包模式 信息系统运维外包的好处 有利…

offer150-16:数值的整数次方

题目描述:实现函数double Power(double base,int exponent),求base 的exponent次方。不得使用库函数&#xff0c;同时不需要考虑大数问题。 分析&#xff0c;题目要求实现库函数pow(),由于不需要考虑大数问题&#xff0c;不必担心溢出&#xff0c;那么就需要对输入的各种情况进…

预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来

预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来 目录 预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来 2.运行环境为Matlab2023b及以上&#xff1b; 3…

路径跟踪算法---Stanley Method实现

文章目录 前言一、Stanley原理介绍二、主要代码实现三、效果 前言 Stanley Controller也是基于几何追踪的轨迹跟踪控制器&#xff0c;和Pure Pursuit不同的是&#xff0c;其基于前轮中心点为参考点进行控制&#xff0c;没有预瞄距离&#xff0c;以前轮中心点与最近参考轨迹点进…

天诚长租公寓智能门锁管理解决方案

人才是区域创新发展的第一资源&#xff0c;如何解决人才的住房问题&#xff0c;让人才“流进来”、“留下来”、“融进来”&#xff0c;就需要优先安排优质人才公寓、人才优租房和公共租赁住房房源&#xff0c;并为青年人才群体提供智能化、信息化的租住体验及通行服务。 一、…

四、(1)网络爬虫入门及准备工作(爬虫及数据可视化)

四、&#xff08;1&#xff09;网络爬虫入门及准备工作&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;网络爬虫入门1.1 百度指数1.2 天眼查1.3 爬虫原理1.4 搜索引擎原理 2&#xff0c;准备工作2.1 分析爬取页面2.2 爬虫拿到的不仅是网页还是网页的源代码2.3 爬虫就是…

app单页下载页源码带管理后台

新版带后台管理APP应用下载页,自动识别安卓苹果下载页&#xff0c;带管理后台&#xff0c;内置带3套App下载模板带中文模板/英文模板随时切换。 app单页下载页源码带管理后台

告别PS修图,设计师都在用的AI抠图工具

引言 大家好&#xff01;如果你是美工或设计师&#xff0c;肯定深知Photoshop修图的繁琐和耗时。现在有一款超方便的工具&#xff0c;让你摆脱这些问题——千鹿设计助手。它不仅是个抠图工具&#xff0c;还能通过先进的AI技术&#xff0c;让抠图变得简单快速&#xff0c;让你专…

[Leetcode 128][Medium] 最长连续序列

目录 题目描述 整体思路 具体代码 题目描述 原题链接 整体思路 首先看到找连续升序排序的最长序列长度&#xff0c;想到对数组进行排序预处理。但是排序算法时间复杂度需要O(nlogn)&#xff0c;题目要求时间复杂度为O(n)。因此不能进行排序与处理 接着想到数据结构哈希表&a…

为什么网上商店需要翻译成其他语言

网上商店不仅仅是一个可以买到商品的网站。它是一个完整的电子商务平台&#xff0c;为来自世界各地的用户提供购买所需物品的机会。但是&#xff0c;为了让这些用户舒适地使用网站&#xff0c;需要高质量的翻译和本地化。 本地化是指产品或服务适应特定文化或市场的过程。它包…

Nginx详解-安装配置等

目录 一、引言 1.1 代理问题 1.2 负载均衡问题 1.3 资源优化 1.4 Nginx处理 二、Nginx概述 三、Nginx的安装 3.1 安装Nginx 3.2 Nginx的配置文件 四、Nginx的反向代理【重点】 4.1 正向代理和反向代理介绍 4.2 基于Nginx实现反向代理 4.3 关于Nginx的location路径…