LLM大语言模型(五):用streamlit开发LLM应用

目录

  • 背景
  • 准备工作
  • 切记
  • streamlit开发LLM demo
    • 开一个新页面
    • 初始化session
    • 先渲染历史消息
    • 接收用户输入
    • 模拟调用LLM
  • 参考

背景

Streamlit是一个开源Python库,可以轻松创建和共享用于机器学习数据科学的漂亮的自定义web应用程序,用户可以在几分钟内构建一个强大的数据App。

其最大的特色是直接用Python写前端页面。

对于数据分析场景,其强大的数据可视化能力和极方便简单的开发流程,极大的方便了demo展示、方案验证等工作。

随着ChatGPT的兴起,LLM方向变得炙手可热,Streamlit也顺势推出了支持LLM的新特性。

准备工作

安装

pip install streamlit

python版本支持3.8~3.12.

切记

页面的每次渲染,其实都是from top to down重新执行了一次后端的py文件。

记住这个,方便理解下文的例子。

streamlit开发LLM demo

开一个新页面

import streamlit as st
import random
import timest.title("来啦,老铁")

这一行生成一个新页面,且页面顶部的标题是大大的:来啦,老铁。
在这里插入图片描述

初始化session

# Initialize chat history
if "messages" not in st.session_state:st.session_state.messages = []st.session_state.messages.append({"role": "assistant", "content": "老铁,有什么需要帮忙的?"})

session_state是会话保持,你在页面上的各种操作,对会对应到后端的同一个session上。

要是新开了一个网页,即使是同一个用户,也会开启一个新的session,因为它并没有用户体系。

messages会存储对话的历史消息,对同一个session来讲,初始化只会执行一次。

在初始化的时候,助手会先发一条消息,跟用户打个招呼。

先渲染历史消息

for message in st.session_state.messages:with st.chat_message(message["role"]):st.markdown(message["content"]) 

st.chat_message 会返回一个message container,这个container可以放streamlit的任何元素。这里放的markdown元素,也就是消息的内容。

st.chat_message 的第一个参数是消息的作者,例如userassistant ,针对不同类型的作者,streamlit会显示内置的头像和风格,当然也可以自定义。

第一次渲染时,这里会把助手说的第一句话渲染出来。

接收用户输入

if prompt := st.chat_input("What is up?"):# Display user message in chat message containerwith st.chat_message("user"):st.markdown(prompt)# Add user message to chat historyst.session_state.messages.append({"role": "user", "content": prompt})

st.chat_input 会在页面展示一个输入框,用户可在里面输入对话内容。

后端收到用户的输入内容后,首先要在页面的历史消息里渲染出来,这一步st.chat_message会自动帮你做。

然后将用户输入再追加到session里的的历史消息中,后续要拿着整个对话历史去调LLM,或者页面重新渲染时展示所有的历史消息。

模拟调用LLM

# Accept user input
if prompt := st.chat_input("What is up?"):# Display user message in chat message containerwith st.chat_message("user"):st.markdown(prompt)# Add user message to chat historyst.session_state.messages.append({"role": "user", "content": prompt})# Display assistant response in chat message containerwith st.chat_message("assistant"):message_placeholder = st.empty()full_response = ""assistant_response = random.choice(["st.chat_input lets you display a chat input widget so the user can type in a message. The returned value is the user's input, which is None if the user hasn't sent a message yet. You can also pass in a default prompt to display in the input widget. Here's an example of how to use st.chat_input to display a chat input widget and show the user's input:",])# Simulate stream of response with milliseconds delayfor chunk in assistant_response.split():full_response += chunk + " "time.sleep(0.1)# Add a blinking cursor to simulate typingmessage_placeholder.markdown(full_response + "▌")message_placeholder.markdown(full_response)# Add assistant response to chat historyst.session_state.messages.append({"role": "assistant", "content": full_response})

上述demo并没有真正的去调用LLM,而是做了个效果模拟。

message_placeholder = st.empty() 创建了一个可变内容的对象,顾名思义,它的内容可以被修改,且修改完后会自动渲染到页面上。

上述demo会给出一个较长的回答。然后模拟LLM的效果,把回答渲染到页面上。

首先将回答split分词,每个split相当于LLM调用返回结果里的chunk。

每个chunk处理时,先sleep 0.1s,模拟LLM在generate,然后修改message_placeholder的内容,为了效果更逼真,每次渲染还在末尾加了指针符号。

最后将整个答案再渲染了一次。

最最后,把assistant的回答追加到session里的历史消息里。

视频演示:

llm_demo · Streamlit

效果图:
在这里插入图片描述

参考

LLM大语言模型(一):ChatGLM3-6B本地部署
LLM大语言模型(二):Streamlit 无需前端经验也能画web页面
LLM大语言模型(三):使用ChatGLM3-6B的函数调用功能前先学会Python的装饰器
LLM大语言模型(四):在ChatGLM3-6B中使用langchain

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/247401.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6.8.6 创建索引配置分词器、映射字段指定分词器、查询数据高亮显示分词结果(内置分词器、icu、ik、pinyin分词器)

文章目录 ES环境内置分词器,以simple分词器示例查询创建索引simple_news,修改分词器为simple插入模拟数据分词查询:返回通过分词查询到的结果、高亮分词分词匹配:写一次示例,其他分词和匹配思路基本一致第一步&#xf…

What is Rust? Why Rust?

why Rust? 目前,Rust 变得越来越流行。然而,仍然有很多人(和公司!)误解了 Rust 的主张价值是什么,甚至误解了它是什么。在本文中,我们将讨论 Rust 是什么以及为什么它是一种可以增强…

laravel框架项目对接小程序实战经验回顾

一.对接小程序总结 1.状态转换带来的问题,如下 问题原因:由于status 传参赋值层级较多,导致后续查询是数组但是传参是字符串, 解决方案:互斥的地方赋值为空数组,有状态冲突的地方unset掉不需要的参数 2参…

【数字电子技术课程设计】多功能数字电子钟的设计

目录 摘要 1 设计任务要求 2 设计方案及论证 2.1 任务分析 2.1.1 晶体振荡器电路 2.1.2 分频器电路 2.1.3 时间计数器电路 2.1.4 译码驱动电路 2.1.5 校时电路 2.1.6 整点报时/闹钟电路 2.2 方案比较 2.3 系统结构设计 2.4 具体电路设计 3 电路仿真测试及结…

华为产业链之车载激光雷达

一、智能汽车 NOA 加快普及,L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 (ADAS, Advanced driver-assistance system)分“感知层、决策层、执行层”三个层级,其中感知层是最重要的一环…

初探二分法

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 文章目录 推荐阅读题目解法一解法二 题目 题目:给定一个 n 个元素有序的&#xff0…

Windows 和 Anolis 通过 Docker 安装 Milvus 2.3.4

Windows 10 通过 Docker 安装 Milvus 2.3.4 一.Windows 安装 Docker二.Milvus 下载1.下载2.安装1.Windows 下安装(指定好Docker文件目录)2.Anolis下安装 三.数据库访问1.ATTU 客户端下载 一.Windows 安装 Docker Docker 下载 双击安装即可,安…

面经基础版案例(路由,请求渲染,传参,组件缓存)

文章目录 1.案例效果分析2.配置一级路由(首页,详情)3.配置二级路由4.导航高亮效果5.首页的请求渲染6.传参(查询参数 $ 动态路由)7.详情页渲染8.组件缓存kepp-alive9.总结 1.案例效果分析 2.配置一级路由(首…

IDEA开发使用 thymeleaf 模板$表达式报红波浪线解决方案

系列文章目录 文章目录 系列文章目录后端存值前端取值thymeleaf 后端存值 RequestMapping("/testModelAndView")//使用ModelAndView时返回的方法类型必须是ModelAndViewpublic ModelAndView testModelAndView() {//创建ModelAndView对象ModelAndView mav new Model…

借用GitHub将typora图片文件快速上传CSDN

前情概要 众所周知,程序员大佬们喜欢用typora软件写代码笔记,写了很多笔记想要放到CSDN上给其他大佬分享,但是在往csdn上搬运的时候,图片总是上传出错,一张一张搞有很麻烦,咋如何搞? 废话不多…

java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 解题思路 这道题可以理解为,只能保证块内有序的情况下&#xf…

ArcgisForJs快速入门

文章目录 0.引言1.前端代码编辑工具2.使用ArcgisForJs创建一个简单应用3.切片地图服务图层4.动态地图服务图层5.地图事件 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调用ArcGIS Server的REST API&#xff0c…

探索Viper-适用于GoLang的完整配置解决方案

前言 对于现代应用程序,尤其大中型的项目来说,在程序启动和运行时,往往需要传入许多参数来控制程序的行为,我们可以通过命令行参数,环境变量,配置文件等方式来将参数传递给程序。而Viper库为Golang语言开发…

Flink问题解决及性能调优-【Flink不同并行度引起sink2es报错问题】

最近需求,仅想提高sink2es的qps,所以仅调节了sink2es的并行度,但在调节不同算子并行度时遇到一些问题,找出问题的根本原因解决问题,并分析整理。 实例代码 --SET table.exec.state.ttl86400s; --24 hour,默认: 0 ms …

centos 7安装MySQl

本文参考借鉴:https://cloud.tencent.com/developer/article/2353312,非常赞! 为了避免权限不足的问题,建议切换至root用户进行安装 1.MySQL的清理与安装 查看是否存在MySQL服务 安装mysql之前,需要先看看要安装系…

基于springboot宠物领养系统

摘要 随着社会的不断发展和人们生活水平的提高,宠物在家庭中的地位逐渐上升,宠物领养成为一种流行的社会现象。为了更好地管理和促进宠物领养的过程,本文基于Spring Boot框架设计和实现了一套宠物领养系统。该系统以用户友好的界面为特点&…

选择合适的CRM管理系统,需要满足以下条件

随着数据时代的发展和企业业务的不断扩大,数据的比例开始增加,传统的数据计算方法不再适合现代企业。客户管理已成为企业最重要的组成部分之一,越来越多的企业开始关注客户管理。在crm管理系统上,企业希望通过crm管理系统&#xf…

第一节课,用户管理--后端初始化,项目调通。二次翻工

一、代码下载 网址: 用户管理第一节课,阿里生成代码包-CSDN博客 二、项目步骤,参考从 网址: 一、第一节课,用户管理--后端初始化,项目调通-CSDN博客 从这里开始跟随 (一)、跟随…

爬虫基础-前端基础

Html是骨骼、css是皮肤、js是肌肉,三者之间的关系可以简单理解为m(html)-v(css)-c(js) 浏览器的加载过程 构建dom树 子资源加载-加载外部的css、图片、js等外部资源 样式渲染-css执行 DOM树 ajax、json、xml AJAX 是一种在无需重新加载整个网页的情况下&#xf…

简述云原生基础定义及关键技术

云原生是什么 云原生是面向“云”而设计的应用,因此技术部分依赖于传统云计算的 3 层概念,基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。 例如,敏捷的不可变基础设施交付类似于 IaaS,用来提供计算网络存储等基础资源,这些资源是可编程且不可变的,直…