RAG 实战:基于 Gradio 构建本地文件上传与对话 UI 界面
本文介绍了如何使用 Python 的 Gradio 库为 RAG(检索增强生成)系统搭建 Web 用户界面。通过集成文件上传功能,用户可以本地加载文档,系统自动构建向量数据库并进行内容索引。随后,用户可通过聊天窗口输入问题,系统基于检索到的上下文调用大模型生成回答。教程涵盖了环境配置、Gradio 基础组件使用、RAG 后端逻辑对接以及完整的代码示例,旨在帮助开发者快速实现类似 ChatPDF 的知识库问答 Demo。

本文介绍了如何使用 Python 的 Gradio 库为 RAG(检索增强生成)系统搭建 Web 用户界面。通过集成文件上传功能,用户可以本地加载文档,系统自动构建向量数据库并进行内容索引。随后,用户可通过聊天窗口输入问题,系统基于检索到的上下文调用大模型生成回答。教程涵盖了环境配置、Gradio 基础组件使用、RAG 后端逻辑对接以及完整的代码示例,旨在帮助开发者快速实现类似 ChatPDF 的知识库问答 Demo。

在上一节中,我们实现了 RAG(检索增强生成)的基本流程,包括文档解析、向量化存储和检索。本节将在此基础上增加一个 Web 用户界面(UI),利用浏览器打开,实现上传本地文件、解析文档,并利用大模型实现与该文档的对话。这实际上是一个简化版的 ChatPDF 或企业知识库对话系统。
界面采用 Python 的 Gradio 库。该库在机器学习和大模型领域非常流行,运行后会启动一个本地 Web 服务器,并在默认浏览器中打开一个新页面,显示交互界面。其优势在于开发效率极高,适合快速原型验证。
在开始之前,请确保已安装以下依赖:
rag.py)安装 Gradio 命令如下(建议使用国内镜像源以提高速度):
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gradio
首先,我们需要一个能够接收用户上传文件的界面。即使不熟悉 Gradio,也可以通过简单的几行代码实现。
基本代码如下:
import gradio as gr
def upload_file(input_file):
# input_file 是上传的文件对象
return f"你上传的文件内容是:\n{input_file}"
gr.Interface(
fn=upload_file,
inputs="file",
outputs="text",
title="文件上传器",
description="请点击按钮上传文件。",
allow_flagging=False
).launch()
运行后,点击界面上的'选择文件'按钮,选择本地文件并提交,右侧输出框会显示文件路径信息。
接下来,我们将上传的文件处理逻辑与 RAG 系统结合。当用户上传图片时,我们需要调用 RAG 类的接口来创建向量数据库。
假设我们已经有一个封装好的 RAG_Bot 类,它包含 createVectorDB 方法用于初始化向量库,以及 chat 方法用于问答。
修改后的处理函数如下:
from rag import RAG_Bot
chat_bot = RAG_Bot()
def upload_file(input_file):
if input_file:
# 创建向量库,灌入数据
chat_bot.createVectorDB(input_file)
return f"文件已上传并建立索引:\n{input_file.name}"
return "未检测到文件"
注意:在实际项目中,createVectorDB 内部应包含文本提取、分块、嵌入和存储到向量数据库的全过程。
为了提供完整的对话体验,我们需要在同一个界面上添加一个文本输入框,用于发送查询。
定义处理函数,同时接收文件和聊天输入:
import gradio as gr
from rag import RAG_Bot
chat_bot = RAG_Bot()
def process_inputs(input_file, chat_input):
outputs = ["", ""]
# 处理文件上传
if input_file is not None:
chat_bot.createVectorDB(input_file)
outputs[0] = f"文件处理完成:\n{str(input_file)}"
# 处理聊天输入
if chat_input != "":
# 将聊天输入当作 query,进行对话
outputs[1] = chat_bot.chat(chat_input)
return tuple(outputs)
# 定义输入输出组件
inputs = [gr.File(), gr.Textbox(label="聊天输入")]
outputs = [gr.Textbox(label="文件状态"), gr.Textbox(label="对话结果")]
iface = gr.Interface(
fn=process_inputs,
inputs=inputs,
outputs=outputs,
title="RAG 知识库对话",
description="上传文档后,即可在此提问。",
allow_flagging=False
)
iface.launch()
运行上述脚本后,终端会显示访问地址(通常是 http://127.0.0.1:7860)。在浏览器中打开该地址即可看到界面。
常见调试问题:
server_port=8080 指定其他端口。stream_output=True 参数实现打字机效果,提升用户体验。gr.Files() 支持批量上传。launch()。通过本教程,我们成功将 RAG 后端与 Gradio 前端结合,实现了本地文件上传与智能对话的功能。虽然这是一个 Demo 版本,但它展示了 LLM 应用开发中前后端分离的基本模式。掌握 Gradio 可以快速验证想法,后续可根据需求迁移至 Streamlit 或 React 等更复杂的前端框架。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online