LLM应用开发与落地:使用gradio十分钟搭建聊天UI
一、背景
如果你是做LLM应用开发的,特别是做后端开发,你一定会遇到怎么快速写一个聊天UI界面来调试prompt或agent的问题。这时候的你可能在苦恼中,毕竟react.js, next.js, css, html也不是每个人都那么熟练,对吧?即使你是做前端开发的,你也可以尝试一下Gradio,哪天有人给你提了一个调试界面的需求,原本要半天的工作现在只需要十分钟了,多余的时机用来学习或享受生活,多美(或者,你让后端自己用Gradio搞一个,嘿嘿)。
类似于Gradio这种低代码快速搭建web ui的方案中,比较成熟还有 Streamlit、Chainlit和dash 等。这些方案都可以快速实现 ChatGPT/Claude 类似的聊天机器人或者文档机器人,感兴趣的可以看看,找适合自己的。我个人喜欢简单直接,所以选择了Gradio。
二、Gradio介绍
我认为Gradio 是现有几个低代码web UI框架当中最简单和容易上手的一个。无论是从安装部署,还是学习使用,对新人都非常友好。Gradio 自己的价值宣传也是强调易用性,旨在让非技术用户也能与复杂模型进行交互。是的,它可不是只适用于LLM的,其他方面感兴趣的大家可以进一步去研究,我这里只聊创建用于测试和验证 LLM 应用的聊天界面。
Gradio安装起来非常简单,只需要执行:
pip install gradio
我们可以看看官网给出的hello world 例子:
import gradio as gr
def greet(name):return "Hello " + name + "!"
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()
把上边代码保存到 gradio_hello.py 文件中,然后执行以下命令:
python gradio_hello.py
如果一切正常,没有报错的话,你打开 http://localhost:7860 可以看到以下界面:

如果你在输入框输入“前行的七哥”,你会看到输出框的输出如下:

代码中greet(name)函数的输入参数name会捕获到输入框的输入,greet(name)函数的输出会填充到输出框,就是这么简单。
三、使用Gradio搭建聊天界面
只需要以下3,4行代码就可以实现聊天界面(别看下边挺多行的,都是注释)。
import random
import gradio as gr
"""
用户输入后的回调函数 random_response
参数:
message: 用户此次输入的消息
history: 历史聊天记录,比如 [["use input 1", "assistant output 1"],["user input 2", "assistant output 2"]]
返回值:输出的内容
"""
def random_response(message, history):return random.choice(["Yes", "No"])gr.ChatInterface(random_response).launch()
生成出来的界面如下:

当然,你也可以自己通过基础组件自定义聊天界面,比如:
import gradio as gr
import random
import time
with gr.Blocks() as demo:chatbot = gr.Chatbot() # 对话框msg = gr.Textbox() # 输入文本框clear = gr.ClearButton([msg, chatbot]) # 清除按钮
"""用户输入后的回调函数 respond参数message: 用户此次输入的消息history: 历史聊天记录,比如 [["use input 1", "assistant output 1"],["user input 2", "assistant output 2"]]返回值:第一个:设置输入框的值,输入后需要重新清空,所以返回空字符串,第二个:最新的聊天记录"""def respond(message, chat_history):bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"])chat_history.append((message, bot_message))time.sleep(2)return "", chat_history
# 绑定输入框内的回车键的响应函数msg.submit(respond, [msg, chatbot], [msg, chatbot])
demo.launch()
生成的界面如下:

四、挂载到fastapi实现的后端
如果你的后端是基于fastapi实现的,你希望把Gradio接入到你的项目中,那也非常方便,核心代码如下:
app = FastAPI()
chat_ui = gr.ChatInterface(agent_framework_run)
app = gr.mount_gradio_app(app, chat_ui, path="/gradio_chat")
加入以上代码后,你跟之前一样启动你的fastapi后端,然后访问 http://you.domain.name/gradio_chat ,你就可以看到一个聊天机器人界面。
如果你需要多个不同的聊天界面调试不同的功能,你只需要再增加一个ui和响应函数就行,比如:
app = FastAPI()
chat_ui = gr.ChatInterface(agent_framework_run)
app = gr.mount_gradio_app(app, chat_ui, path="/gradio_chat")
tool_ui = gr.ChatInterface(agent_recommend_tool)
app = gr.mount_gradio_app(app, io, path="/gradio_tool")
访问 http://you.domain.name/gradio_tool 就可以看到新增的工具界面 tool_ui。
五、总结
Gradio是我认为这么多低代码web UI 中最简单的一个,上手非常容易,用来展示和验证应用远远足够了。我目前也是用Gradio验证智能客服机器人的一些功能。学新东西建议都从最简单的入手,不满足再去研究更复杂的。循序渐进地学习更容易持续,也会更有成就感。
Gradio 官网的文档和教程都非常清晰和易懂,还有一个在线的编辑器给你快速体验效果。如果有需要,强烈建议尝试一下。
Gradio官网地址:https://www.gradio.app/
我目前正在开发一款基于自研的LLM agent framework 的智能客服产品,它具有私有知识问答,意图引导、信息收集、情绪安抚、内部系统融合、LUI与GUI 融合、数据孤岛打通、人工接管、数据分析与洞察、异常监控等功能。
欢迎对prompt编写、LLM应用开发与落地、智能客服产品等等感兴趣的朋友加我微信,一起交流,共同前行。
下边是我最近写的用来调 agent framework 的界面代码,供大家参考:
from fastapi import FastAPI, Request
import uvicorn
from datetime import datetime, time, date
import gradio as gr
from agent import agent_framework, agent_main
CUSTOM_PATH = "/agent_bot"
app = FastAPI()
with gr.Blocks() as chat_ui:chatbot = gr.Chatbot(show_label=False, height=600, avatar_images=["https://hong.greatdk.com/_next/image?url=%2Fself.jpg&w=1920&q=75", "https://hong.greatdk.com/_next/image?url=%2Fnpc.jpg&w=1920&q=75"])with gr.Row() as input_row:msg_textbox = gr.Textbox(show_label=False, scale=15)submit_btn = gr.Button(value="发送", scale=1)
clear_btn = gr.ClearButton([msg_textbox, chatbot],value="清除会话")
def respond(message, chat_history):print(f"message:{message}, strpped:{message.strip()}")print(f"history:{chat_history}")if len(message.strip()) <= 0 :print(f"message is empty, ignore the message")return "", chat_historyinit_agent = agent_main.AgentMain()af = agent_framework.AgentFramework(init_agent=init_agent)bot_message = af.run(message.strip(), chat_history)chat_history.append((message.strip(), bot_message))return "", chat_history
msg_textbox.submit(respond, [msg_textbox, chatbot], [msg_textbox, chatbot]) # 在输入框按回车也进行发送submit_btn.click(respond, [msg_textbox, chatbot], [msg_textbox, chatbot]) # 绑定按钮点击函数app = gr.mount_gradio_app(app, chat_ui, path=CUSTOM_PATH)
@app.get("/")
def root():return {"message": "hello world!!!"}
相关文章:
LLM应用开发与落地:使用gradio十分钟搭建聊天UI
一、背景 如果你是做LLM应用开发的,特别是做后端开发,你一定会遇到怎么快速写一个聊天UI界面来调试prompt或agent的问题。这时候的你可能在苦恼中,毕竟react.js, next.js, css, html也不是每个人都那么熟练,对吧?即使…...
智慧城市:打造低碳未来,引领城市数字化转型新篇章
在“万物皆可数字化”的新时代浪潮下,智慧城市作为未来城市发展的先锋方向,正在以前所未有的速度和规模重塑我们的城市面貌。 智慧城市不仅是一个技术革新的标志,更是城市治理、民生服务等领域全面升级的重要引擎。 一、智慧城市的多元应用领…...
ChatGPT之制作短视频
引言 今天带来了如何使用 ChatGPT和剪映来制作简单的短视频教程,在这其中 ChatGPT的作用主要是帮我们生成文案,剪映的功能就是根据文案自动生成视频,并配上一些图片、动画、字幕和解说。 ChatGPT生成文案 首先,我们需要使用提示…...
k8s学习(RKE+k8s+rancher2.x)成长系列之简配版环境搭建(二)
三、简配版集群,适用于demo环境 1.集群架构设计 主机名角色配置(核数,内存,磁盘)MasterRKE,controlplane,etcd,worker,rancher-master2C 8G 40GSlaver1controlplane,worker,rancher-master2C 8G 40GSlaver2controlplane,worker,rancher-mas…...
智能优化算法 | Matlab实现合作优化算法(CSA)(内含完整源码)
文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 智能优化算法 | Matlab实现合作优化算法(CSA)(内含完整源码) 源码设计 clear clc close SearchAgents_no=30; % Number of search agents Max_iteration=1000;...
mysql如何备份某些库的某些表
MySQL备份数据库 mysql如何备份某些库的某些表 要备份某个库里的部分表,该如何操作? 例如:要备份db01库里的20张表,表很多又不想备份整个库 或者要备份多个库里的不同表,又如何操作? 例如:备份…...
C++类和对象入门(三)
顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 前言 在c中,类型分为两类,一类是内置类型,另一类是自定义类型。 1.内置类型…...
【0255】揭晓pg内核中MyBackendId的分配机制(后端进程Id,BackendId)(一)
文章目录 1. 前言2. MyBackendId分配机制2.1 全局变量MyBackendId2.2 共享缓存无效内存段(shared inval buffer)2.2.1 shmInvalBuffer缓冲区2.2.2 shmInvalBuffer初始化1. 前言 MyBackendId的数据类型是BackendId(backendid.h src/include/storage),它表示“当前活动的后…...
Python爬虫requests库详解
使用 requests 上一节中,我们了解了 urllib 的基本用法,但是其中确实有不方便的地方,比如处理网页验证和 Cookies 时,需要写 Opener 和 Handler 来处理。为了更加方便地实现这些操作,就有了更为强大的库 requests&…...
【漏洞复现】EPON上行A8-C政企网关信息泄露漏洞
Nx01 产品简介 EPON上行A8-C政企网关是一款终端产品,提供企业网络解决方案。 Nx02 漏洞描述 EPON上行A8-C政企网关敏感信息泄露漏洞,攻击者通过敏感信息泄露获取管理员密码。 Nx03 产品主页 fofa-query: "ZXECS" && title"Web…...
发送get请求并且发送请求头(header),java实现
发送get请求时,发送请求头(Header)中的内容 方便第二次调用其他url时传递参数,例如userCode或者租户编码 调用方式 Autowired private HttpServletRequest request;先注入HttpServletRequestpublic xxx xxx(){String url &quo…...
介绍docker
一:介绍docker: Docker 并没有单独的图形界面,它主要通过命令行来进行管理和操作 1、 docker ps:显示正在运行的容器。 docker images:显示本地的镜像。 docker run:创建并启动一个新容器。 docker stop&a…...
Web课程学习笔记--CSS盒模型
CSS 盒模型 盒模型 网页设计中常听的属性名:内容(content)、填充(padding)、边框(border)、边界(margin), CSS盒子模式都具备这些属性。 这些属性我们可以把它转移到我们日常生活中的盒子(箱子)上来理解,日常生活中所…...
中学一级教师是什么职称等级
在教育的世界里,每一个角色都肩负着不可或缺的使命。其中,中学一级教师这一职称,就如同武侠小说里的“隐藏高手”,不显山不露水,却拥有着举重若轻的实力。 中学一级教师究竟是个怎样的职称等级呢?今天&…...
2024年2月CCF-全国精英算法大赛题目
第一次参加这种比赛,虽然是c类赛事,但是是ccf主办的,难度还是有点的,主要是前面签到题主要是思想,后面的题目难度太高,身为力扣只刷了一百多道题目的我解决不了,这几道我只做了B,C题,E题超时了&…...
arm 汇编积累
C语言函数与汇编对应关系 一、MOV 系列指令 1、指令格式 MOV{条件}{S} 目的寄存器,源操作数 2、含义解析: (1):mov 指令传送数据 案例: MOV R0,R1 ; R0 R1; MOV PC,R14 ;PC R14; MOV R0,R…...
SpringBoot整理-安全(Spring Security)
在 Spring Boot 应用中实现安全性通常涉及到集成 Spring Security 框架。Spring Security 是一个功能强大且高度可定制的认证和访问控制框架,非常适合用于保护 Spring Boot 应用。 核心特性 认证: 认证是确认某个实体的身份,Spring Security 支持多种认证机制,如表单登录、L…...
【技能树学习】Git入门——练习题解析
前言 本篇文章给出了Git入门技能树中部分的练习题解析,包括分支管理,Git标签,在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交,git tag -d只能删除本地标签,Mac系统的终端可以…...
Springboot+vue的企业财务管理系统(有报告)。Javaee项目,springboot vue前后端分离项目
演示视频: Springbootvue的企业财务管理系统(有报告)。Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的企业财务管理系统,采用M(model&…...
手撕spring bean的加载过程
这里我们采用手撕源码的方式,开始探索spring boot源码中最有意思的部分-bean的生命周期,也可以通过其中的原理理解很多面试以及工作中偶发遇到的问题。 springboot基于约定大于配置的思想对spring进行优化,使得这个框架变得更加轻量化&#…...
FunASR Docker部署避坑大全:从SSL证书报错到热词不生效,一次解决所有常见问题
FunASR Docker实战排障指南:从证书配置到热词优化的深度解决方案 当你第一次尝试在Docker环境中部署FunASR语音识别服务时,那些看似简单的命令行参数背后可能藏着无数个"坑"。本文不会重复官方文档的基础操作,而是聚焦于五个最具代…...
STM32F103红外小车避坑指南:从Proteus仿真失败到实物调试成功
STM32F103红外小车避坑指南:从Proteus仿真失败到实物调试成功 第一次尝试用STM32F103做红外循迹小车时,我花了整整三天时间在Proteus里调试仿真,结果连最基本的电机转动都实现不了。直到把电路搬到实物上,才发现仿真环境里那些看似…...
Axure 9.0 原生组件:绘制折线图
引言在原型设计中,数据可视化是传递核心信息的关键手段,而折线图凭借 “清晰展示数据趋势” 的优势,广泛应用于销售波动、用户增长、指标变化等场景。Axure 9.0 作为主流原型工具,虽未内置现成折线图组件,但通过「形状…...
抖音批量下载终极指南:3分钟掌握高效无水印下载技巧
抖音批量下载终极指南:3分钟掌握高效无水印下载技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...
告别手动操作!Open-AutoGLM让iPhone听懂人话,自动执行指令
告别手动操作!Open-AutoGLM让iPhone听懂人话,自动执行指令 1. 引言 你是否厌倦了每天重复点击手机屏幕的操作?是否希望手机能像真人助理一样理解你的需求并自动完成任务?今天我要介绍的Open-AutoGLM正是这样一个革命性的AI手机智…...
卷积计算常见误区解析:为什么你的结果和理论值对不上?
卷积计算常见误区解析:为什么你的结果和理论值对不上? 在图像处理和深度学习领域,卷积操作是基础中的基础。但令人惊讶的是,即使是经验丰富的开发者,在实际编码时也常常遇到计算结果与预期不符的情况。这就像做菜时严格…...
从Stable Diffusion到多模态大模型:图文交错数据如何让AI学会‘边想边画’?
图文交错数据:多模态大模型实现"边想边画"的关键突破 当Stable Diffusion以惊艳的画质震惊世界时,人们很快发现它存在一个根本局限——这个能画出精美图像的模型,却无法理解自己笔下的内容。与此同时,擅长理解图像的多模…...
现在不升级Polars 2.0清洗栈,你的ETL将在Q3面临300%延迟增长——基于AWS Graviton+Arrow 15.0实测基准报告
第一章:Polars 2.0清洗栈升级的必要性与Q3延迟危机预警Polars 2.0 的清洗栈重构并非功能叠加式演进,而是面向真实数据工程场景的范式重置。随着企业级ETL流水线中非结构化日志、嵌套JSON、时序传感器数据占比突破68%,旧版基于LazyFrame单通道…...
Pixel Couplet Gen效果展示:乙巳马年像素春联生成惊艳作品集
Pixel Couplet Gen效果展示:乙巳马年像素春联生成惊艳作品集 1. 项目概览 这是一款基于ModelScope大模型驱动的春联生成器。我们创新性地采用夸张的像素游戏风格(Retro Game UI),将传统元素与红白机美学融合,为用户生成独一无二的马年像素春…...
从零开始:用Chipyard和FireSim在云端FPGA上仿真你的第一个RISC-V SoC
从零开始:用Chipyard和FireSim在云端FPGA上仿真你的第一个RISC-V SoC 在数字时代,RISC-V架构以其开放性和灵活性正在重塑计算领域。对于渴望探索SoC设计的开发者而言,云端FPGA资源与开源工具链的结合,彻底打破了硬件开发的高门槛。…...
