系列文章
- AI大语言模型LLM学习-入门篇
- AI大语言模型LLM学习-Token及流式响应
前言
在上一篇博文中,我们调用了在线大模型API,并用 Python 写了一个控制台流式对话客户端,基本能愉快的与大模型对话聊天了。但控制台总归太技术化,我们希望能有个类似 ChatGPT 那样的 Web 聊天对话界面。为了实现这一目标,计划采用两篇博文进行实现,本篇为后端WebAPI的搭建流程,下一篇将介绍使用vue3实现前端界面的编写。
一、python的web开发框架
python的web开发框架很多,这里只简单介绍了三款在国内比较流行的开发框架。本博文及后续博文根据各自框架的特点,选择了入手简单的轻量级Flask作为web开发框架。
1.Django 框架
优 点:是一个高层次 Python Web 开发框架,特点是开发快速、代码较少、可扩展性强。Django 采用 MTV(Model、Template、View)模型组织资源,框架功能丰富,模板扩展选择最多。对于专业人员来说,Django 是当之无愧的 Python 排名第一的 Web 开发框架。
缺 点:包括一些轻量级应用不需要的功能模块,不如 Flask 轻便。过度封装很多类和方法,直接使用比较简单,但改动起来比较困难。相比于 C,C++ 性能,Djang 性能偏低。模板实现了代码和样式完全分离,不允许模板里出现 Python 代码,灵活度不够。另外学习曲线也相对陡峭。
2.Flask
优 点:Flask 是一个 Python Web 开发的微框架,严格来说,它仅提供 Web 服务器支持,不提供全栈开发支持。然而,Flask 非常轻量、非常简单,基于它搭建 Web 系统都以分钟来计时,特别适合小微原型系统的开发。花少时间、产生可用系统,是非常划算的选择。
缺 点:对于大型网站开发,需要设计路由映射的规则,否则导致代码混乱。对新手来说,容易使用低质量的代码创建 “不良的 web 应用程序”。
3.FastAPI
优 点:FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 3.6+ 构建 API。非常高的性能,与 NodeJS 和 Go 相当(感谢 Starlette 和 Pydantic)。可用的最快的 Python 框架之一。减少大约 40% 的人为(开发人员)引发的错误。简短,简单,直观,健壮。
缺 点:本身不带模板语法,需要安装模板语法
二、flask的使用介绍
1.依赖安装
pip install flask
2.一个简单webAPI接口
代码如下:
# 导入flask类from flask import Flask
# 初始化
app = Flask(__name__)# 使用route()装饰器来告诉Flask触发函数的URL。@app.route('/')defindex():return'Hello World!'if __name__ =="__main__":# 调用run方法,设定端口号,启动服务
app.run(port=2024, host="0.0.0.0", debug=True)
运行代码:
使用浏览器访问:
3.基于LLM搭建的WebAPI接口
# 导入flask类from flask import Flask ,request
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
api_key ="api_key(平台注册获得)"# 初始化
app = Flask(__name__)# 将大模型的调用封装成方法defcall(question):
model ="qwen2-72b-instruct"
llm = ChatOpenAI(
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key=api_key,
model=model,
streaming=True,)
prompt_template = ChatPromptTemplate.from_messages([("system","你是一个很出色的历史老师,给我讲讲历史人物的故事吧。"),("user","{input}")])# 使用|操作符将prompt_template和llm连接在一起,创建一个chain对象。
chain = prompt_template | llm
for token in chain.stream({"input": question}):
data = token.content
# web模型的流式输出yield data
# 定义请求路径为/chat,访问方法为post,本方法要求请求格式为[email protected]('/chat', methods=['post'])defchat():
data = request.json
# 接收用户输入的问题
question =""if(data["question"]):
question = data["question"]print(question)return call(question)if __name__ =="__main__":# 调用run方法,设定端口号,启动服务
app.run(port=2024, host="0.0.0.0", debug=True)
使用postman工具进行测试:
思考:你敢确定是流式输出吗?上证据,注意动图中鼠标指向的地方,你可以尝试下非流式输出是不是一步到位,更为生动的证据需要后续配合前端页面的搭建及接口调用
服务部署
1.window环境的部署
1)简单粗暴:cmd黑窗口
python web.py
2)优雅高大:封装成服务
本文不做过多介绍,可参考我的好兄弟大佬超的博文中有关【WinSW】的使用介绍:
Windows部署Jar包的三种方式
2.linux环境的部署
1)简单粗暴:nohup后台运行
nohup python web.py > web.log &
2)优雅高大:封装成服务
本文不做过多介绍,后续有空整理一篇linux环境下的服务封装方法。
版权归原作者 程序员老司机 所有, 如有侵权,请联系我们删除。