使用Gradio构建AI前端 - RAG的QA模块

使用Gradio构建AI前端 - RAG的QA模块

摘要

本文将基于Gradio的Interface,继续构建RAG系统的QA前端页面,对比上一篇对召回测试前端页面的构建,来对比在Gradio下,Blocks和Interface的两种区别。

Gradio Interface简介

Gradio 是一个用于快速创建机器学习和数据科学演示界面的Python库,允许开发者通过简单代码将函数转换为交互式Web应用,无需前端开发经验。gr.Interface 是 Gradio 提供的一种快速创建界面的方式,适用于简单的输入输出场景,采用"函数驱动"模式,直接将函数与输入输出组件绑定。

核心特点:

  • 结构简单,适合快速原型开发
  • 输入输出组件按固定布局排列
  • 基于函数映射,直接将输入传递给函数并展示输出

综上汇总,主要的特点就是简单,快。

Interface 与 Blocks 的区别

特性InterfaceBlocks
复杂度简单,适合快速搭建灵活,适合复杂界面
布局控制自动布局,结构固定完全自定义布局
交互逻辑基于单一函数映射支持多函数、事件触发
适用场景简单输入输出场景复杂交互、多步骤流程

相对来说,Interface的构建方式比Blocks要更简单,代码量更少。
通过下面的代码,可以看到跟Blocks有明显的区别。

代码示例:

/* by 01130.hk - online tools website : 01130.hk/zh/formatphp.html */
# 创建Gradio Interface
iface = gr.Interface(
    fn=run_qa,  # 核心处理函数
    inputs=[    # 输入组件列表
        gr.Textbox(
            label="问题",
            placeholder="请输入您的问题...",
            lines=3,
            info="例如: '哪些节假日应该安排休假?' 或 '什么是未成年?'"
        ),
        gr.Slider(
            label="Top-K检索数量",
            minimum=1,
            maximum=10,
            value=5,
            step=1,
            info="设置返回的最相似文档数量"
        )
    ],
    outputs=gr.Markdown(  # 输出组件
        label="回答结果"
    ),
    title="🤖 RAG问答系统",
    description="基于LangChain和Gradio构建的RAG问答系统,使用向量数据库进行知识检索",
    examples=[  # 示例问题
        ["哪些节假日应该安排休假?", 5],
        ["什么是未成年?", 3],
        ["足球比赛的基本规则是什么?", 4]
    ],
    theme=gr.themes.Soft(),
    allow_flagging="never"  # 禁用标记功能
)

下面是构建界面的样子:
img

通过以上代码,可以看到在gr.Interface里,首先指定捆绑的是哪一个function,然后在inputs和outputs,依次创建对应的前端组件,并且对应function里的输入参数和返回值。
这段代码调用项目里已经封装好的LC_RAG_03_QA.py里的方法。

关键区别点:

对比上一篇,这里汇总了Interface方式和Blocks两种方式的区别。

  1. 布局控制

    • Interface:自动排列输入输出,无需手动控制布局
    • Blocks:通过 gr.Row()gr.Column() 等手动控制组件布局
  2. 事件处理

    • Interface:自动关联输入输出和处理函数
    • Blocks:需要显式通过 .click() 等方法绑定事件
  3. 灵活性

    • Interface:适合简单场景,代码量少
    • Blocks:适合复杂界面,支持条件显示、多步骤交互等高级功能
  4. 结构组织

    • Interface:通过参数配置界面元素
    • Blocks:使用上下文管理器(with 语句)组织界面结构

在本案例中,使用 gr.Interface 代码更简洁高效。如果需要更复杂的交互(如多步骤处理、条件显示组件等),则应选择 gr.Blocks
所以如果是对模型功能的评估,建议选择gr.Interface,如果是做原型设计,建议选择gr.Blocks。

本文项目代码可以在以下仓库里找到:
https://github.com/microsoftbi/Langchain_DEMO/tree/main/RAG
此篇对应的代码是:LC_RAG_07c_Gradio.py

这里再补充一个快速的方法,就是借助AI开发工具,比如TRAE,以下是我用的提示词,仅供参考:

/* by 01130.hk - online tools website : 01130.hk/zh/formatphp.html */
在当前python文件中,编写一个QA的前端界面,前端框架使用Gradio,不要使用blocks的方式构建页面,直接使用interface的方式来构建,使用的方法,调用LC_RAG_03_QA.py里的answer_question方法。

虽然在我使用的过程中,代码无法一次通过,但基本上通过一次反馈就可以修补成功,从而省下了这部分代码的工作量。

以下是代码的全部内容,点击展开。 ``` Python import gradio as gr from LC_RAG_03_QA import answer_question

def run_qa(question, top_k=5):
"""运行QA并返回结果"""
try:
answer, sources = answer_question(
question=question,
top_k=top_k,
vectorstore_dir="./RAG/chroma_db",
embedding_model="text-embedding-v4"
)

    # 格式化结果
    result = f"# 🎯 答案\n\n{answer}\n"
    
    if sources:
        result += "\n# 📚 参考来源\n"
        for source in sources:
            result += f"- {source}\n"
    
    return result
except Exception as e:
    return f"❌ 错误: {str(e)}"

创建Gradio Interface

iface = gr.Interface(
fn=run_qa,
inputs=[
gr.Textbox(
label="问题",
placeholder="请输入您的问题...",
lines=3,
info="例如: '哪些节假日应该安排休假?' 或 '什么是未成年?'"
),
gr.Slider(
label="Top-K检索数量",
minimum=1,
maximum=10,
value=5,
step=1,
info="设置返回的最相似文档数量"
)
],
outputs=gr.Markdown(
label="回答结果"
),
title="🤖 RAG问答系统",
description="基于LangChain和Gradio构建的RAG问答系统,使用向量数据库进行知识检索",
examples=[
["哪些节假日应该安排休假?", 5],
["什么是未成年?", 3],
["足球比赛的基本规则是什么?", 4]
],
theme=gr.themes.Soft(),
allow_flagging="never"
)

启动应用

if name == "main":
iface.launch(
server_name="0.0.0.0",
server_port=7861,
share=False,
debug=False
)

 

---------------------------------------------------------------

aspnetxBI笔记系列索引:

使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能

一起玩转SQL Server 2012 下的分析服务

使用SQL Server分析服务定位目标用户

 

 

---------------------------------------------------------------

来自博客园的aspnetx宋卫东

 

 

标题基于Python的汽车之家网站舆情分析系统研究AI更换标题第1章引言阐述汽车之家网站舆情分析的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义说明汽车之家网站舆情分析对汽车行业及消费者的重要性。1.2国内外研究现状概述国内外在汽车舆情分析领域的研究进展与成果。1.3论文方法及创新点介绍本文采用的研究方法及相较于前人的创新之处。第2章相关理论总结和评述舆情分析、Python编程及网络爬虫相关理论。2.1舆情分析理论阐述舆情分析的基本概念、流程及关键技术。2.2Python编程基础介绍Python语言特点及其在数据分析中的应用。2.3网络爬虫技术说明网络爬虫的原理及在舆情数据收集中的应用。第3章系统设计详细描述基于Python的汽车之家网站舆情分析系统的设计方案。3.1系统架构设计给出系统的整体架构,包括数据收集、处理、分析及展示模块。3.2数据收集模块设计介绍如何利用网络爬虫技术收集汽车之家网站的舆情数据。3.3数据处理与分析模块设计阐述数据处理流程及舆情分析算法的选择与实现。第4章系统实现与测试介绍系统的实现过程及测试方法,确保系统稳定可靠。4.1系统实现环境列出系统实现所需的软件、硬件环境及开发工具。4.2系统实现过程详细描述系统各模块的实现步骤及代码实现细节。4.3系统测试方法介绍系统测试的方法、测试用例及测试结果分析。第5章研究结果与分析呈现系统运行结果,分析舆情数据,提出见解。5.1舆情数据可视化展示通过图表等形式展示舆情数据的分布、趋势等特征。5.2舆情分析结果解读对舆情分析结果进行解读,提出对汽车行业的见解。5.3对比方法分析将本系统与其他舆情分析系统进行对比,分析优劣。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括本文的主要研究成果及对汽车之家网站舆情分析的贡献。6.2展望指出系统存在的不足及未来改进方向,展望舆情
【磁场】扩展卡尔曼滤波器用于利用高斯过程回归进行磁场SLAM研究(Matlab代码实现)内容概要:本文介绍了利用扩展卡尔曼滤波器(EKF)结合高斯过程回归(GPR)进行磁场辅助的SLAM(同步定位与地图构建)研究,并提供了完整的Matlab代码实现。该方法通过高斯过程回归对磁场空间进行建模,有效捕捉磁场分布的非线性特征,同时利用扩展卡尔曼滤波器融合传感器数据,实现移动机器人在复杂环境中的精确定位与地图构建。研究重点在于提升室内等无GPS环境下定位系统的精度与鲁棒性,尤其适用于磁场特征明显的场景。文中详细阐述了算法原理、数学模型构建、状态估计流程及仿真实验设计。; 适合人群:具备一定Matlab编程基础,熟悉机器人感知、导航或状态估计相关理论的研究生、科研人员及从事SLAM算法开发的工程师。; 使用场景及目标:①应用于室内机器人、AGV等在缺乏GPS信号环境下的高精度定位与地图构建;②为磁场SLAM系统的设计与优化提供算法参考和技术验证平台;③帮助研究人员深入理解EKF与GPR在非线性系统中的融合机制及实际应用方法。; 阅读建议:建议读者结合Matlab代码逐模块分析算法实现细节,重点关注高斯过程回归的训练与预测过程以及EKF的状态更新逻辑,可通过替换实际磁场数据进行实验验证,进一步拓展至多源传感器融合场景。
<think>我们根据用户的问题,需要构建一个基于Gradio的DeepSeek模型可视化界面,并且集成经过RAG(通过AnythingLLM)优化的本地模型以支持对话功能。从引用[4]中可以看到一个类似的使用Gradio搭建RAG系统的例子,我们可以参考其结构。步骤:1.准备RAG处理后的本地模型:用户提到使用AnythingLLM进行RAG处理,但引用[4]中使用了Ollama和LangChain,因此我们可以假设用户将使用类似的工具链(如Ollama运行DeepSeek-R1模型,LangChain处理RAG)。2.构建Gradio界面:用于输入问题并展示模型回答。根据引用[4]的代码结构,我们可以这样设计:-使用LangChain的RetrievalQA链来处理用户的问题,该链结合了检索器和语言模型。-使用FAISS作为向量存储(引用[4]中使用FAISS,但AnythingLLM可能使用其他向量存储,这里需要兼容)。-使用OllamaEmbeddings和Ollama(用于运行本地模型)或者使用其他方式(如果AnythingLLM的RAG结果已经是一个服务,我们可以调用该服务)。由于用户提到“AnythingLLMRAG处理后的本地化模型”,我们需要明确AnythingLLM的输出是什么。根据AnythingLLM的文档,它提供了一个API端点,我们可以通过HTTP请求与RAG系统交互。但为了简单,我们假设用户希望像引用[4]一样在本地构建整个流程。如果用户已经通过AnythingLLM构建了知识库并生成了向量存储,那么AnythingLLM可能会提供一个API。然而,引用[4]中的方式是直接使用LangChain加载本地的FAISS向量存储,并构建RetrievalQA链。因此,我们分两种情况:1.使用AnythingLLM的API:我们可以通过HTTP请求将用户问题发送到AnythingLLM的API,然后获取回答。2.使用本地直接集成:将AnythingLLM生成的向量存储(如FAISS索引)直接加载到我们的程序中,然后使用LangChain的RetrievalQA链。由于问题描述没有明确,我们参考引用[4]的本地方式,因为其更直接且无需网络请求(避免跨服务问题)。但是,引用[4]使用的是Ollama来运行模型,而用户使用的是DeepSeek-R1模型,因此需要确保Ollama支持DeepSeek-R1(DeepSeek-R1模型在Ollama的模型库中名为`deepseek-r1:7b`,如引用[4]所示)。假设我们采用本地方式,步骤如下:1.加载向量存储:从AnythingLLM构建的向量存储路径加载(AnythingLLM默认使用什么向量存储?根据AnythingLLM文档,它使用Chroma或pgvector,但我们可以将其导出为FAISS格式,或者使用LangChain支持的对应向量存储加载器)。-注意:如果AnythingLLM使用的是Chroma,我们可以使用LangChain的Chroma加载器。2.初始化嵌入模型:可以使用与AnythingLLM构建索引相同的嵌入模型(如OllamaEmbeddings或HuggingFaceEmbeddings)。3.初始化DeepSeek-R1模型:通过Ollama(确保已经使用`ollamapulldeepseek-r1:7b`下载模型)。4.构建RetrievalQA链。5.用Gradio包装对话函数。考虑到用户希望用Gradio构建界面,我们可以直接使用Gradio的ChatInterface,因为它更适合对话式交互。根据以上分析,我们写出示例代码:注意:以下代码假设向量存储是使用OllamaEmbeddings(与引用[4]相同)构建的FAISS索引(存储目录为'db_faiss')。如果不是,需要相应调整。```pythonfromlangchain.embeddingsimportOllamaEmbeddingsfromlangchain.vectorstoresimportFAISSfromlangchain.llmsimportOllamafromlangchain.chainsimportRetrievalQAfromlangchain.promptsimportPromptTemplateimportgradioasgr#设置向量存储路径DB_FAISS_PATH='db_faiss'#假设AnythingLLM构建的向量存储在此目录(使用FAISS格式)#初始化嵌入模型embedding_model=OllamaEmbeddings(model="nomic-embed-text:latest")#加载向量存储(FAISS)vector_db=FAISS.load_local(DB_FAISS_PATH,embedding_model)#初始化DeepSeek-R1模型llm=Ollama(model="deepseek-r1:7b")#构建RetrievalQA链prompt_template="""请根据上下文内容回答问题,若根据上下文内容无法得到问题答案,请输出此问题在上下文中无法获得,不要思考其他知识给出回答:上下文:{context}问题:{question}回答:"""PROMPT=PromptTemplate(template=prompt_template,input_variables=["context","question"])qa=RetrievalQA.from_chain_type(llm=llm,chain_type="stuff",retriever=vector_db.as_retriever(),chain_type_kwargs={"prompt":PROMPT},return_source_documents=True)#定义对话函数(用于Gradio)defrag_chat(message,history):#注意:history是Gradio的ChatInterface传递的,但我们这里只使用当前消息result=qa({"query":message})returnresult['result']#创建Gradio界面(使用ChatInterface)gr.ChatInterface(fn=rag_chat,title="DeepSeek-R1RAGChat",description="与DeepSeek-R1模型的RAG增强对话",theme="soft",examples=["什么是MS-Swift框架?","DeepSeek-R1模型的特点是什么?"]).launch()```注意事项:1.该代码假设向量存储在'db_faiss'目录,且使用FAISS格式。如果AnythingLLM使用的是其他向量数据库(如Chroma),则需要更换加载方式。2.需要确保Ollama服务运行,并且已经下载了嵌入模型(`nomic-embed-text:latest`)和语言模型(`deepseek-r1:7b`)。可以通过`ollamapullnomic-embed-text`和`ollamapulldeepseek-r1:7b`来下载。3.如果用户使用的不是Ollama,而是通过其他方式运行模型(如直接使用transformers加载模型),则需要调整模型初始化方式。此外,用户要求集成经过AnythingLLMRAG优化的本地化模型。AnythingLLM是一个商业产品,它支持多种模型和向量数据库,但这里我们假设用户已经使用AnythingLLM生成了本地向量存储(FAISS格式),并且我们直接加载该向量存储。如果AnythingLLM生成的向量存储格式不是FAISS,我们可以通过AnythingLLM的导出功能或者使用AnythingLLM的API来查询。如果使用API,则需要修改上面的代码,将qa函数替换为对AnythingLLMAPI的调用。例如:```pythonimportrequests#假设AnythingLLM的API端点为http://localhost:3000/api/v1/chat,且API需要认证#具体请参考AnythingLLM的API文档defrag_chat(message,history):payload={"message":message}headers={"Authorization":"BearerAPI_KEY",#替换为实际的API密钥"Content-Type":"application/json"}response=requests.post("http://localhost:3000/api/v1/chat",json=payload,headers=headers)response_json=response.json()returnresponse_json.get('assistant_response','')```但为了简化,我们采用本地加载向量存储的方式。如果用户的问题未提供足够的详细信息(比如向量存储的类型和位置),则需要用户自行调整。最后,我们根据以上内容回答用户问题并生成相关问题。注意:用户之前的提问和回答历史不在本次上下文中,因此我们只根据当前内容生成相关问题。</think> ### 使用Gradio集成DeepSeek模型与AnythingLLM RAG的完整方案 根据您的需求,我将指导您通过Gradio构建可视化界面并集成经过RAG优化的DeepSeek模型。以下是分步实施方案: #### 核心架构设计 ```mermaid graph LR A[Gradio UI] --> B[提问输入] B --> C[AnythingLLM RAG引擎] C --> D[本地DeepSeek-R1模型] D --> E[生成答案] E --> A ``` #### 实施步骤 1. **环境准备**: ```python # 安装核心依赖 !pip install langchain gradio transformers faiss-cpu sentence-transformers ``` - 确保已部署DeepSeek-R1模型(本地或API访问) - 准备AnythingLLM生成的向量数据库 2. **核心代码实现**: ```python from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from langchain.chains import RetrievalQA from transformers import AutoTokenizer, AutoModelForCausalLM import gradio as gr # 初始化嵌入模型 embedder = HuggingFaceEmbeddings(model_name="nomic-embed-text-v1") # 加载AnythingLLM生成的向量数据库 vector_db = FAISS.load_local("anythingllm_vector_db", embedder) # 加载DeepSeek模型 (本地或API) tokenizer = AutoTokenizer.from_pretrained("deepseek-ai/deepseek-r1") model = AutoModelForCausalLM.from_pretrained("deepseek-ai/deepseek-r1") # 构建RAG管道 def rag_query(question): # 知识库检索 relevant_docs = vector_db.similarity_search(question, k=3) context = "\n".join([doc.page_content for doc in relevant_docs]) # 构建提示词 prompt = f""" 你是一个由RAG增强的AI助手,请严格使用知识库内容回答问题: 知识库上下文:\n{context}\n 用户提问:\n{question}\n 回答要求: 1. 只使用知识库内容回答问题 2. 如果知识库不包含答案,明确说明 3. 答案需简练准确 回答: """ # 模型推理 inputs = tokenizer(prompt, return_tensors="pt", max_length=2048, truncation=True) outputs = model.generate(**inputs, max_length=2048) response = tokenizer.decode(outputs[0], skip_special_tokens=True) return response.split("回答:")[-1].strip() # 创建Gradio界面 with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown("# DeepSeek-R1 RAG对话系统") with gr.Row(): chatbot = gr.Chatbot(height=500) with gr.Row(): msg = gr.Textbox(label="输入问题") clear = gr.ClearButton([msg, chatbot]) def respond(message, chat_history): bot_message = rag_query(message) chat_history.append((message, bot_message)) return "", chat_history msg.submit(respond, [msg, chatbot], [msg, chatbot]) demo.launch(server_port=7860) ``` #### 关键优化点 1. **上下文处理优化**: ```python # 改进的上下文提取 def extract_context(question, top_k=3, similarity_threshold=0.7): doc_info = vector_db.similarity_search_with_relevance_scores( question, k=top_k ) return "\n".join([ f"来源[{i+1}]: {doc.page_content}" for i, (doc, score) in enumerate(doc_info) if score > similarity_threshold ]) ``` 2. **对话记忆增强**: ```python # 添加对话记忆功能 from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) # 在prompt_template中加入历史对话 ``` 3. **流式输出支持**: ```python # 实现流式响应 (Gradio 3.38+) def rag_stream(question, history): # 检索上下文(略) partial_answer = "" for new_token in model.generate_stream(...): partial_answer += new_token yield partial_answer ``` #### 部署建议 1. **硬件要求**: - DeepSeek-R1 7B模型:≥16GB GPU显存 - 向量检索:≥4GB内存 2. **性能优化**: ```python # 模型量化加速 model = AutoModelForCausalLM.from_pretrained( "deepseek-ai/deepseek-r1", device_map="auto", load_in_4bit=True ) ``` 3. **安全增强**: ```python # 添加内容过滤 def safety_filter(response): blacklist = [...] return any(word in response for word in blacklist) ? "此问题无法回答" : response ``` ### 相关推荐问题 (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值