详细介绍:小杰-大模型(twelve)——大模型部署与应用——gradipo-实现UI界面

news/2025/12/5 19:34:40/文章来源:https://www.cnblogs.com/yangykaifa/p/19313531

对话机器人gradio

gradio 介绍

Gradio 是一个简单易用的 Python 库,能够帮助开发者快速搭建用户友好的 Web 应用,特别适合用于机器学习模型的展示。本课程将使用 Gradio 来搭建一个可以与 FastAPI 后端交互的对话机器人。

Gradio 组件讲解

首先介绍 Gradio 的核心组件,包括:

  • Gradio Blocks:用于组织界面布局的容器。
  • Slider:用于调整生成参数,如 temperature 和 top_p。
  • Textbox:用户输入对话的地方。
  • Button:发送用户输入或清空历史记录。
  • Chatbot:用于显示对话历史的组件。

安装gradio

pip install gradio==5.25.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

导入依赖库

import gradio as gr
import requests

定义后端 API 的 URL

backend_url = "http://127.0.0.1:6606/chat"

定义与后端交互的函数

  • prompt:用户的输入。
  • sys_prompt:系统提示语(可用于引导模型行为)。
  • history:保存对话历史记录的变量。
  • temperature:用于控制生成的多样性,数值越高,生成的文本越随机。
  • top_p:用于控制采样的多样性。
  • max_tokens:最大生成文本的长度。
  • stream:是否启用流式输出。
def chat_with_backend(prompt, sys_prompt, history, history_len, temperature, top_p, max_tokens, stream):# 构建请求数据data = {"query": prompt,"sys_prompt": sys_prompt,"history_len": history_len,"history": history,"temperature": temperature,"top_p": top_p,"max_tokens": max_tokens,}# 发送请求到 FastAPI 后端try:response = requests.post(backend_url, json=data, stream=True)if response.status_code == 200:chunks = ""if stream:for chunk in response.iter_content(chunk_size=None, decode_unicode=True):if chunk:chunks += chunkchat_history_display = [(entry["role"], entry["content"]) for entry in history]chat_history_display.append(("user", prompt))chat_history_display.append(("assistant", chunks))# # 体验流式输出# sleep(0.1)yield chat_history_display, gr.update(value='')else:for chunk in response.iter_content(chunk_size=None, decode_unicode=True):chunks += chunkchat_history_display = [(entry["role"], entry["content"]) for entry in history]chat_history_display.append(("user", prompt))chat_history_display.append(("assistant", chunks))yield chat_history_display, gr.update(value='')history.append({"role": "user", "content": prompt})history.append({"role": "assistant", "content": chunks})else:return "请求失败,请检查后台服务器是否正常运行。"except Exception as e:return f"发生错误:{e}"

清空对话历史

此函数用于清空当前的对话历史记录。

def clear_history(history):history.clear()return "", ""

autodl vllm方式

使用 Gradio 搭建前端界面

gr.Blocks()表示页面的容器,gr.Row()表示一行,两个gr.Row()表示分成了两行,在第二行
使用gr.Column分成了两列,scale用来控制两列的占比。第二列中又被分为两行,第一行显示聊天记录(聊天窗)
,第二行用来显示输入框等组件。clear_button和submit_button分别是两个按钮组件,用于清空历史和发送。
点击clear_button将运行clear_history函数,输入参数是history,输出是chatbot, prompt(清空聊天窗和输入框),
点击submit_button将运行chat_with_backend函数,输入参数是prompt, sys_prompt, history, history_len, temperature, top_p, max_tokens, stream,
输出是chatbot, prompt(更新聊天窗,清空输入框)。
history = gr.State([])记录对话状态。

import  gradio as gr
import  requests
# 定义后台的fastapi的URL
backend_url = "http://127.0.0.1:6067/chat"
def chat_with_backend(prompt, history, sys_prompt, history_len, temperature, top_p, max_tokens, stream):# history:["role": "user", "metadata":{'title':None},"content":"xxxx"],去掉metadata字段history_none_meatdata = [{"role": h.get("role"), "content": h.get("content")} for h in history]# 构建请求的数据data = {"query": prompt,"sys_prompt": sys_prompt,"history": history_none_meatdata,"history_len": history_len,"temperature": temperature,"top_p": top_p,"max_tokens": max_tokens}response = requests.post(backend_url, json=data, stream=True)if response.status_code == 200:chunks = ""if stream:for chunk in response.iter_content(chunk_size=None, decode_unicode=True):chunks += chunkyield chunkselse:for chunk in response.iter_content(chunk_size=None, decode_unicode=True):chunks += chunkyield chunks
# 使用gr.Blocks创建一个块,并设置可以填充高度和宽度
with gr.Blocks(fill_width=True,fill_height=True) as demo:# 创建一个标签页with gr.Tab(" 聊天机器人"):#添加标题gr.Markdown("##  聊天机器人")# 创建一个行布局with gr.Row():# 创一个左侧的列布局with gr.Column(scale=1,variant="panel") as sidebar_left:sys_prompt=gr.Textbox(label="系统提示词", value="You are a helpful assistant")history_len=gr.Slider(minimum=1,maximum=10,value=1, label="保留历史对话的数量")temperature=gr.Slider(minimum=0.01, maximum=2.0, value=0.5, step=0.01, label="temperature")top_p = gr.Slider(minimum=0.01, maximum=1.0, value=0.5, step=0.01, label="top_p")max_tokens = gr.Slider(minimum=512, maximum=4096, value=1024, step=8, label="max_tokens")stream = gr.Checkbox(label="stream", value=True)#创建右侧的布局,设置比例为20with gr.Column(scale=10) as main:# 创建聊天机器人的聊天界面,高度为500pxchatbot=gr.Chatbot(type="messages",height=500)# 创建chatinterface, 用于处理聊天的逻辑gr.ChatInterface(fn=chat_with_backend,type='messages',chatbot=chatbot,additional_inputs=[sys_prompt,history_len,temperature,top_p,max_tokens,stream])
demo.launch()

启动聊天

FastAPI端

from fastapi import FastAPI, Body
# pip install opeai==1.93.0
from openai import AsyncOpenAI
from typing import List
from fastapi.responses import StreamingResponse
# 初始化FastAPI应用
app = FastAPI()
# 初始化openai的客户端
api_key = "EMPTY"
base_url = "http://127.0.0.1:10222/v1"
aclient = AsyncOpenAI(api_key=api_key, base_url=base_url)
# 初始化对话列表
messages = []
# 定义路由,实现接口对接
@app.post("/chat")
async def chat(query: str = Body(..., description="用户输入"),sys_prompt: str = Body("你是一个有用的助手。", description="系统提示词"),history: List = Body([], description="历史对话"),history_len: int = Body(1, description="保留历史对话的轮数"),temperature: float = Body(0.5, description="LLM采样温度"),top_p: float = Body(0.5, description="LLM采样概率"),max_tokens: int = Body(None, description="LLM最大token数量")
):global messages# 控制历史记录长度if history_len > 0:history = history[-2 * history_len:]# 清空消息列表messages.clear()messages.append({"role": "system", "content": sys_prompt})# 在message中添加历史记录messages.extend(history)# 在message中添加用户的promptmessages.append({"role": "user", "content": query})# 发送请求response = await aclient.chat.completions.create(model="Qwen2___5-0___5B-Instruct",messages=messages,max_tokens=max_tokens,temperature=temperature,top_p=top_p,stream=True)# 响应流式输出并返回async def generate_response():async for chunk in response:chunk_msg = chunk.choices[0].delta.contentif chunk_msg:yield chunk_msg# 流式的响应fastapi的客户端return StreamingResponse(generate_response(), media_type="text/plain")
if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=6066, log_level="info")

启动vllm

python -m vllm.entrypoints.openai.api_server --port 10222 --model /root/models/Qwen/Qwen2___5-0___5B-Instruct --served-model-name Qwen2___5-0___5B-Instruct

启动fastapi

python chatbot_fastapi.py

启动webui

python chatbot_gradio.py

本地的

前端程序+fastapi+ollama大模型

前端界面程序

import  gradio as gr
import  requests
# 定义后台的fastapi的URL
backend_url = "http://127.0.0.1:6067/chat"
def chat_with_backend(prompt, history, sys_prompt, history_len, temperature, top_p, max_tokens, stream):# history:["role": "user", "metadata":{'title':None},"content":"xxxx"],去掉metadata字段history_none_meatdata = [{"role": h.get("role"), "content": h.get("content")} for h in history]# 构建请求的数据data = {"query": prompt,"sys_prompt": sys_prompt,"history": history_none_meatdata,"history_len": history_len,"temperature": temperature,"top_p": top_p,"max_tokens": max_tokens}response = requests.post(backend_url, json=data, stream=True)if response.status_code == 200:chunks = ""if stream:for chunk in response.iter_content(chunk_size=None, decode_unicode=True):chunks += chunkyield chunkselse:for chunk in response.iter_content(chunk_size=None, decode_unicode=True):chunks += chunkyield chunks
# 使用gr.Blocks创建一个块,并设置可以填充高度和宽度
with gr.Blocks(fill_width=True,fill_height=True) as demo:# 创建一个标签页with gr.Tab(" 聊天机器人"):#添加标题gr.Markdown("##  聊天机器人")# 创建一个行布局with gr.Row():# 创一个左侧的列布局with gr.Column(scale=1,variant="panel") as sidebar_left:sys_prompt=gr.Textbox(label="系统提示词", value="You are a helpful assistant")history_len=gr.Slider(minimum=1,maximum=10,value=1, label="保留历史对话的数量")temperature=gr.Slider(minimum=0.01, maximum=2.0, value=0.5, step=0.01, label="temperature")top_p = gr.Slider(minimum=0.01, maximum=1.0, value=0.5, step=0.01, label="top_p")max_tokens = gr.Slider(minimum=512, maximum=4096, value=1024, step=8, label="max_tokens")stream = gr.Checkbox(label="stream", value=True)#创建右侧的布局,设置比例为20with gr.Column(scale=10) as main:# 创建聊天机器人的聊天界面,高度为500pxchatbot=gr.Chatbot(type="messages",height=500)# 创建chatinterface, 用于处理聊天的逻辑gr.ChatInterface(fn=chat_with_backend,type='messages',chatbot=chatbot,additional_inputs=[sys_prompt,history_len,temperature,top_p,max_tokens,stream])
demo.launch()
fastapi+ollama大模型
from fastapi import FastAPI, Body
# pip install opeai==1.93.0
from openai import AsyncOpenAI
from typing import List
from fastapi.responses import StreamingResponse
# 初始化FastAPI应用
app = FastAPI()
# 初始化openai的客户端
api_key = "EMPTY"
base_url = "http://127.0.0.1:11434/v1"
aclient = AsyncOpenAI(api_key=api_key, base_url=base_url)
# 初始化对话列表
messages = []
# 定义路由,实现接口对接
@app.post("/chat")
async def chat(query: str = Body(..., description="用户输入"),sys_prompt: str = Body("你是一个有用的助手。", description="系统提示词"),history: List = Body([], description="历史对话"),history_len: int = Body(1, description="保留历史对话的轮数"),temperature: float = Body(0.5, description="LLM采样温度"),top_p: float = Body(0.5, description="LLM采样概率"),max_tokens: int = Body(None, description="LLM最大token数量")
):global messages# 控制历史记录长度if history_len > 0:history = history[-2 * history_len:]# 清空消息列表messages.clear()messages.append({"role": "system", "content": sys_prompt})# 在message中添加历史记录messages.extend(history)# 在message中添加用户的promptmessages.append({"role": "user", "content": query})# 发送请求response = await aclient.chat.completions.create(model="qwen2.5:0.5b",messages=messages,max_tokens=max_tokens,temperature=temperature,top_p=top_p,stream=True)# 响应流式输出并返回async def generate_response():async for chunk in response:chunk_msg = chunk.choices[0].delta.contentif chunk_msg:yield chunk_msg# 流式的响应fastapi的客户端return StreamingResponse(generate_response(), media_type="text/plain")
if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=6067, log_level="info")

ollama启动本地大模型

ollama serve

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

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

相关文章

2025年高倍率应急启动电源生产厂家推荐与联系指

在选择高倍率应急启动电源时,了解行业内的信誉厂家至关重要。本文将为您提供一系列重要的生产厂家推荐,并帮助您掌握选择供应商时的注意事项。通过关注厂家的专业背景、产品质量及客户口碑,您能更轻松地找到合适的高…

必看!2025年值得信赖的文创产品定制制造厂家推荐

在选择文创产品定制制造厂家时,了解各家厂商的特点与优势至关重要。许多客户会询问“文创产品定制工厂哪家好?”或者“纪念文创产品供货厂家哪家好?”。本文将介绍几家在市场上口碑良好的厂家,他们在质量、创意和服…

错过

我路过了花店,看到了一朵花,花很漂亮,我很喜欢。 可是,我拥有的并不能换取它,于是我就静静的欣赏它的美。 直到有一天,我攒了足够的钱,却发现,它已经被人买走了。 这就是你们所说的错过吧。本文来自博客园,作…

12.2

今天学servlet

12.3

今天还是servlet

使用pt-archiver实现MySQL内容归档与清理的完整实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:轻量级云原生体验:在OpenEuler 25.09上快速部署单节点K3s

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

16G内存云电脑免费使用两个月

如云电脑介绍系列,大家应该对云电脑能干什么有了一定了解。那么想有一台云电脑体验一下不间断服务的感受吗? 目前天翼云电脑通过如下方法,3分钟就可以领一台16G内存的高配电脑2个月。领取的电脑可以下载各平台上的软…

2025年迈腾更换轮胎推荐:十大轮胎品牌官方指南

2025年迈腾更换轮胎推荐:十大轮胎品牌官方指南在当前德系运动B级车市场中,随着2025年迈腾更换轮胎推荐需求的持续升温,越来越多的车主意识到,轮胎已不再是简单的耗材,而是决定车辆极限安全、动态质感与长期价值的…

PbootCMS 获取结果页面关键词和tags值

获取搜索关键词和 Tags 的方法获取搜索关键词适用场景:当用户通过搜索功能访问结果页面时,URL 地址中会带有 ?keyword=关键词 参数。 获取方式:{$get.keyword}示例:URL 示例:https://example.com/search?keywor…

java-pta-代码

java-pta-代码Posted on 2025-12-05 18:59 山河不入心呀 阅读(0) 评论(0) 收藏 举报1. 入门-第一个PTA上Java程序 本题目要求读入若干对整数a和b,然后输出它们的和。 输入格式: 在一行中给出一对整数a和b。 以下…

帝国cms升级时提示Table ***_enewsdtuserpage already exists

问题描述错误提示:Table ***_enewsdtuserpage already exists场景:在从 7.5 版本 升级到 8.0 版本 时出现该错误。 原因是数据库中已经存在 8.0 版本的表。问题原因历史遗留问题:用户之前可能安装过 8.0 测试版,但…

网站打开提示:”未检测到您服务器环境的 sqlite3 数据库扩展…“

错误描述: 网站打开时提示:未检测到您服务器环境的 sqlite3 数据库扩展,请检查您的环境!问题原因: PbootCMS 默认使用 SQLite 数据库,但服务器未启用 sqlite3 扩展。 解决方法:打开 PHP 配置文件 php.ini:路径…

chroot使用

说明 chroot一个arm环境在本地的服务器修改板子的文件很方便的。 使用 sudo chroot binary/ # 操作完成之后 退出 exit可以在debian的文件系统里面,apt其他的deb包的,制作镜像就会很方便的。 参考 https://roc-rk332…

帝国cms升级时提示Duplicate column name ecmsvpf

问题描述错误提示: Duplicate column name ecmsvpf场景:在从 7.5 版本 升级到 8.0 版本 时出现该错误。 原因是重复执行了升级程序 /e/update/upcheck.php,导致部分数据表已被更新至 8.0 表结构。问题原因重复执行升…

街头徒手健身1引体向上

想要为标准引体向上打基础,你可以在高单杠上先练三个核心动作:顶端悬停、离心下放和静态悬垂。顶端悬停 顶端悬停,指的是将身体悬停在引体向上的最高点,让下巴超过单杠。刚开始练习时,最好采用反手抓握的方式。你…

程序运行异常: Undefined constant"PAGE

程序运行异常: Undefined constant"PAGE,位: /www/wwwroot/*******/runtime/complle/8a9aa228409b7a00002e2743e8C7a.php,第287行 后台自定义表单,点击编辑字段的时候,出现整个问题了, 原因是由于php版本太高…

PBOOTCMS判断登录是否登录代码(PbootCMS登录状态判断优化方案)

在使用 {pboot:islogin} 判断用户是否登录时,发现即使本地 Cookie 已过期,{pboot:islogin} 的值仍可能为 1,导致判断不准确。 为解决此问题,可以通过检查用户的实际登录信息(如手机号)来判断登录状态是否有效。如…

2025年12月北京考公,北京考公机构最新榜,深耕公考十年 赋能青年成公——北京成公教育的教育践行之路

在青年职业发展选择愈发多元的当下,公考培训行业始终承担着为青年群体搭建职业成长桥梁的重要角色。北京成公教育咨询有限责任公司(以下简称“成公教育”)自2015年成立以来,以专业的教研实力、广泛的服务覆盖和坚定…

2025年PFA管源头厂家推荐:深耕氟塑领域 赋能高端制造——苏州江盛达以优质PFA管助力产业升级

在氟塑料管材应用日益广泛的当下,PFA管凭借优异的耐腐蚀性、耐高温性及超高纯度特性,成为高端制造领域不可或缺的关键材料。苏州江盛达自动化科技有限公司(以下简称“江盛达”)深耕该领域多年,以研发、生产、销售…