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

相关推荐
文心快码BaiduComate2 小时前
百度云与光本位签署战略合作:用AI Agent 重构芯片研发流程
前端·人工智能·架构
风象南3 小时前
Claude Code这个隐藏技能,让我告别PPT焦虑
人工智能·后端
曲幽3 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
Mintopia4 小时前
OpenClaw 对软件行业产生的影响
人工智能
陈广亮4 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬4 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia5 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区5 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两8 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
敏编程8 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python