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

文章目录


前言

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 HuggingFaceLLM

st.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_model

    llm = 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 = llm

    documents = 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.py

Collecting usage statistics. To deactivate, set browser.gatherUsageStats to false.

  You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8509
  Network URL: http://172.17.0.8:8502
  External URL: http://116.136.52.251:8502

直接复制local地址到浏览器里就行了

我们继续问使用本地喂给大模型的数据

可以看到,大模型并没有出现幻觉,而是我们提供的数据库里找到最匹配答案返回出来.

如果将自有数据与大模型相结合,并且不用微调去训练,可以通过RAG实现,下面2链接说如何去用这个框架部署垂直领域知识库。

链接: LlamaIndex1

链接: LlamaIndex2

五、总结

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

相关推荐
算法工程师y3 分钟前
Matlab图像处理基础入门 - 亮度/对比度调整实战
图像处理·人工智能·算法·matlab
Jackson@ML19 分钟前
Django开发入门 – 4.创建Django app
python·django·sqlite
预测模型的开发与应用研究38 分钟前
我用AI做数据分析之四种堆叠聚合模型的比较
人工智能·数据挖掘·数据分析
虾球xz41 分钟前
游戏引擎学习第95天
人工智能·学习·游戏引擎
赛博曹操42 分钟前
CondaValueError: Malformed version string ‘~‘: invalid character(s)
人工智能·python·bug
CS创新实验室1 小时前
《机器学习数学基础》补充资料:柯西—施瓦茨不等式以及相关证明
人工智能·机器学习·概率论
@心都1 小时前
机器学习数学基础:23.二次型及其标准形
人工智能·机器学习
IT古董1 小时前
【漫话机器学习系列】090.条件概率(Conditional Probability)
人工智能·机器学习·概率论
vⅤ_Leon1 小时前
Machine Learning:General Guide
人工智能·机器学习
深度之眼1 小时前
因果机器学习(CausalML)前沿创新思路
人工智能·深度学习·机器学习·因果推断