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框架搭建起来.

相关推荐
小诸葛IT课堂3 分钟前
PyTorch 生态概览:为什么选择动态计算图框架?
人工智能·pytorch·python
杜子腾dd5 分钟前
16.使用读写包操作Excel文件:XlsxWriter 包
大数据·开发语言·python·excel·pandas
带娃的IT创业者7 分钟前
Flask应用调试模式下外网访问的技巧
后端·python·flask
雅菲奥朗15 分钟前
4大观点直面呈现|直播回顾-DeepSeek时代的AI算力管理
人工智能·ai算力·deepseek
print('name')21 分钟前
将景区天气数据存储到Excel文件中
开发语言·数据结构·python·pycharm·excel·visual studio code
程序员JerrySUN27 分钟前
深入解析 TensorFlow 兼容性问题及构建输出文件结构*
人工智能·tensorflow·neo4j
ruokkk35 分钟前
搭建一个声纹识别系统
人工智能
kula77537 分钟前
Trae,国产首款AI编程IDE初体验
人工智能
moonless022238 分钟前
【AI】MercuryCoder与LLaDA? 自回归模型与扩散模型的碰撞,谁才是未来的LLM答案?
人工智能·llm
吾名招财1 小时前
pytorch快速入门——手写数字分类GPU加速
人工智能·pytorch·分类