当前位置: 首页 > article >正文

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

文章目录

  • 前言
  • 一、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. 环境搭建

主要就是安装这个包。

pip install streamlit

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

链接: RAG

2. 初始化模型

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

#模型下载
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就是给系统的,当一开始启动后,系统就先发出来一个消息,主动问候人类.

三、代码展示

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就行了,正常启动后,它给出了访问地址

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


http://www.kler.cn/a/543329.html

相关文章:

  • 【Elasticsearch】文本分析Text analysis概述
  • 在Mac arm架构终端中运行 corepack enable yarn 命令,安装yarn
  • LVS作业
  • 机器学习10-卷积和卷积核3
  • 基于java手机销售网站设计和实现(LW+源码+讲解)
  • docker使用dockerfile打包镜像(docker如何打包)
  • ArcGIS基础知识之ArcMap基础设置——ArcMap选项:常规选项卡设置及作用
  • 计算机毕业设计SpringBoot校园二手交易小程序 校园二手交易平台(websocket消息推送+云存储+双端+数据统计)(源码+文档+运行视频+讲解视频)
  • 2024主流Web框架横向对比:Gin、Laravel、ThinkPHP、Spring Boot及更多框架的选型指南
  • 二、数据类型、运算符
  • 使用DeepSeek R1打造私有化AI助手
  • 安科瑞光伏发电防逆流解决方案——守护电网安全,提升能源效率
  • 激光工控机在精密制造中的应用与优势
  • JAVA/RUST/C#/Kotlin 各语言语法糖及特性对比表
  • 【JavaScript】异步编程汇总
  • Lua语言的安全开发
  • 一文讲清springboot所有注解
  • 小蓝相机启动阶段trace学习笔记
  • 每日一题——括号生成
  • Selenium:网页frame与多窗口处理
  • 【大模型】阿里云百炼平台对接DeepSeek-R1大模型使用详解
  • Linux命名管道与共享内存
  • Linux之kernel(1)系统基础理论(2)
  • 51单片机俄罗斯方块整行消除函数
  • 数字人技术之LatentSync Win11本地部署
  • FPGA视频缩放转GTY光口传输,基于Aurora 8b/10b编解码架构,提供3套工程源码和技术支持