Streamlit快速构建大模型前端框架

ops/2025/2/13 11:20:45/

文章目录

  • 前言
  • 一、Streamlit 与 OpenWebUI 对比
    • 1. Streamlit
      • 1,优点:
      • 2,缺点:
    • 2. OpenWebUI
      • 1,优点:
      • 2,缺点:
    • 3. 结论
  • 二、使用步骤
    • 1. 环境搭建
    • 2. 初始化模型
    • 3. 读取数据
    • 4. 开启会话
    • 5. 配置系统信息
  • 三、代码展示
  • 四、运行结果
  • 五、总结


前言

Streamlit 是一个开源的 Python 库,专门用于快速构建和共享数据科学和机器学习应用。它允许开发者以极简的方式将 Python 脚本转换为交互式的 Web 应用,无需深入前端开发知识。

一、Streamlit 与 OpenWebUI 对比

1. Streamlit

1,优点:

简单易用:通过简洁的 API 快速将 Python 脚本转换为交互式 Web 应用。
强大的数据可视化:内置丰富的数据可视化组件,适合数据科学家和机器学习工程师。
快速原型开发:适合快速构建和迭代数据应用,修改代码后应用会自动刷新。
社区支持:拥有活跃的社区和丰富的示例。

2,缺点:

不适合复杂应用:不太适合构建具有复杂用户界面或需要频繁更新的大规模数据应用。
有限的 UI 组件:与 React 等前端框架相比,UI 组件较为有限。
状态管理复杂:对于需要复杂用户交互的应用,状态管理可能更具挑战性。
执行效率问题:每次输入更改时会重新运行整个应用程序代码,可能导致效率低下。

2. OpenWebUI

1,优点:

功能丰富:支持多种功能,如响应式设计、Markdown 和 LaTeX 支持、语音/视频通话、网页浏览等。
高度自定义:支持自定义模型、工具和函数,适合需要高度自定义的项目。
离线运行:支持完全离线运行,确保用户数据安全。
多模型支持:可以同时与多种语言模型交互,利用其独特优势。
RAG 集成:支持检索增强生成(RAG),能够将文档交互无缝集成到聊天体验中。

2,缺点:

部署要求高:本地部署对服务器性能和空间要求较高(如剩余内存 > 2G,硬盘空间 > 10G)。
不适合复杂业务逻辑:虽然功能丰富,但在处理复杂业务逻辑时可能不如专业的前端框架
社区支持有限:相比 Streamlit,OpenWebUI 的社区支持和示例可能较少。

3. 结论

Streamlit 更适合数据科学家和机器学习工程师快速构建数据可视化和交互式分析应用。它简单易用,适合快速原型开发,但在处理复杂用户界面和业务逻辑时可能受限。
OpenWebUI 是一个功能丰富的前端框架,适合需要高度自定义和多种交互功能的项目,尤其是那些需要离线运行和多模型支持的应用。

二、使用步骤

1. 环境搭建

主要就是安装这个包。

python">pip install streamlit

被访问的,就是LlamaIndex的检索增强生成方式部署的大模型。
就是用本地数据库加大模型,以防止大模型的幻觉,给与正确的引导。
详细代码可以参考

链接: RAG

2. 初始化模型

可以去魔塔社区下载模型,然后初始化。

python">#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B')

3. 读取数据

使用SimpleDirectoryReader函数,可以读取本地各种格式数据,比如txt,pdf,word,md等等.

4. 开启会话

query_engine加载查询引擎

5. 配置系统信息

st.session_state.messages就是给系统的,当一开始启动后,系统就先发出来一个消息,主动问候人类.

三、代码展示

python">import streamlit as st
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLMst.set_page_config(page_title="llama_index_demo", page_icon="🦜🔗")
st.title("去他的鸟命!我命由我,不由天!是魔是仙,我自己决定!")# 初始化模型
@st.cache_resource
def init_models():embed_model = HuggingFaceEmbedding(model_name="/root/public/llm/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")Settings.embed_model = embed_modelllm = HuggingFaceLLM(model_name="/root/autodl-tmp/llm/deepseek-ai/DeepSeek-R1-Distill-Qwen-1___5B",tokenizer_name="/root/autodl-tmp/llm/deepseek-ai/DeepSeek-R1-Distill-Qwen-1___5B",model_kwargs={"trust_remote_code": True},tokenizer_kwargs={"trust_remote_code": True})Settings.llm = llmdocuments = SimpleDirectoryReader("/root/autodl-tmp/data").load_data()index = VectorStoreIndex.from_documents(documents)query_engine = index.as_query_engine()return query_engine# 检查是否需要初始化模型
if 'query_engine' not in st.session_state:st.session_state['query_engine'] = init_models()def greet2(question):response = st.session_state['query_engine'].query(question)return response# Store LLM generated responses
if "messages" not in st.session_state.keys():st.session_state.messages = [{"role": "assistant", "content": "你好,我是魔丸,有什么我可以帮助你的吗?"}]# Display or clear chat messages
for message in st.session_state.messages:with st.chat_message(message["role"]):st.write(message["content"])def clear_chat_history():st.session_state.messages = [{"role": "assistant", "content": "你好,我是魔丸,有什么我可以帮助你的吗?"}]st.sidebar.button('Clear Chat History', on_click=clear_chat_history)# Function for generating LLaMA2 response
def generate_llama_index_response(prompt_input):return greet2(prompt_input)# User-provided prompt
if prompt := st.chat_input():st.session_state.messages.append({"role": "user", "content": prompt})with st.chat_message("user"):st.write(prompt)# Gegenerate_llama_index_response last message is not from assistant
if st.session_state.messages[-1]["role"] != "assistant":with st.chat_message("assistant"):with  response = generate_llama_index_response(prompt)placeholder = st.empty()placeholder.markdown(response)message = {"role": "assistant", "content": response}st.session_state.messages.append(message)          

四、运行结果

只需要run就行了,正常启动后,它给出了访问地址

python">(llamaindex) root@autodl-container-565243b323-b324df38:~/autodl-tmp# streamlit run app.pyCollecting usage statistics. To deactivate, set browser.gatherUsageStats to false.You can now view your Streamlit app in your browser.Local URL: http://localhost:8509Network URL: http://172.17.0.8:8502External URL: http://116.136.52.251:8502

直接复制local地址到浏览器里就行了
我们继续问使用本地喂给大模型的数据
在这里插入图片描述
可以看到,大模型并没有出现幻觉,而是我们提供的数据库里找到最匹配答案返回出来.
在这里插入图片描述
如果将自有数据与大模型相结合,并且不用微调去训练,可以通过RAG实现,下面2链接说如何去用这个框架部署垂直领域知识库。
链接: LlamaIndex1
链接: LlamaIndex2

五、总结

Streamlit就是简单方便,在不需要非常复杂的前端页面情况下,该库就是理想选择,只需几行代码便将一个UI框架搭建起来.


http://www.ppmy.cn/ops/158027.html

相关文章

回归新系列——网络安全实操干货系列——Kali Linux新版本——Kali Purple实操指南——信息收集篇1——Nmap(其一)

前言 悲伤的故事~ 之前由于时间等种种原因,导致上一个信誓旦旦的系列自第六七个文章后再也没有发布了,不过!!! 回归之后的我,偶然发现Kali新出了一个版本——Kali Purple,虽然为时已晚,但还是想炒个冷饭的~ 介绍 Kali Purple在众多的同类集成工具包中来说,属于相对…

postman登录cookie设置

1.设置环境变量, 定义变量存放共享的登录信息 如Cookie 2.登录接口编码test脚本获取cookie信息 let jsessionidCookie pm.cookies.get("JSESSIONID");if (jsessionidCookie) {let cookie "JSESSIONID" jsessionidCookie "; Admin-Tok…

Three.js编辑器百度搜索 Top 1

开发历程 低代码的开发是非常曲折的,尤其是早期根本没有任何参考作品或者 相关的一些知识博客去引领我们去做,会经历多次的推到再到重头再来,又需要开发者有很高的知识储备,举步维艰。,目前 web 二维 在市场上已经非常…

微信小程序 - 模版语法

声明和绑定数据 小程序页面中使用的数据均需要在 Page() 方法的 data 对象中进行声明定义 在将数据声明好以后,需要在 WXML 中绑定数据,数据绑定最简单的方式是使用 Mustache 语法(双大括号)将变量包起来。 在 {{ }} 内部可以做…

林语堂 | 生活的智慧在于逐渐澄清滤除那些不重要的杂质,而保留最重要的部分

注:本文为 “断舍离,整理自己” 相关文章合辑。 最高级的断舍离,是整理自己 原创 高晓岚 帆书樊登讲书 2023 年 01 月 04 日 18:40 上海 作者 | 樊登读书・高晓岚 曾看过这样一句话: 大道至简,成就一个人的关键&…

OpenSSH 降级操作指南

OpenSSH 降级操作指南 问题背景 当两台 Ubuntu 服务器的 OpenSSH 版本不一致时(如一台是 8.2p1,另一台是 7.6p1),可能会导致 SSH 连接问题。在这种情况下,可以考虑将高版本服务器的 OpenSSH 降级到与低版本服务器相同…

单例模式和单例Bean

单例模式 定义:单例模式是一种软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。 实现方式 饿汉式:在类加载时就立即创建单例实例,线程安全,调用效率高,但可能会造成…

Spring Boot部署到服务器

使用 Spring Boot 部署到不同的服务器是一个常见的任务。Spring Boot 可以通过多种方式进行部署。下面给出一些常见的部署方法 1. 打包为可执行 JAR 包并部署 Spring Boot 支持将应用程序打包为一个独立的 JAR 文件,这样可以在不同的服务器上运行。 步骤&#xf…