文章目录
- 前言
- 一、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框架搭建起来.