1.streamlit使用
Streamlit是一个开源的Python库,专为数据工程师及机器学习工程师设计,用来快速 基于Python代码构建 交互式的
web网站(无需掌握前端技术)。
使用步骤:
1.安装streamlit:pip install streamlit
2.在python文件中引入streamlit模块
3.基于streamlit中提供的API来构建web应用
4.运行程序:streamlit run xxxx.py
入门程序:
python
import streamlit as st
# 大标题
st.title("streamlit 大标题")
st.header("streamlit 一级标题")
st.subheader("streamlit 二级标题")
# 段落文字
st.write("布偶猫是一种体型较大的长毛猫,原产于美国,因被抱起时身体会像布娃娃一样松弛柔软而得名。")
st.write("它们拥有湛蓝的眼睛、重点色或双色被毛,毛发丰厚蓬松,气质优雅,常被称为"仙女猫"。布偶猫性格非常温顺、粘人,忍耐力强,"
"喜欢跟随主人,能和小孩及其他宠物友好相处,因此也有"小狗猫"的称号。")
st.write("它们成熟较慢,通常要到三至四岁才完全长成,需要定期梳理毛发、保持室内饲养,并注意心血管、肾脏等遗传疾病的筛查。")
st.write("总体来说,布偶猫是一种外形华丽、性格亲人的伴侣猫,适合有耐心、愿意陪伴和护理长毛猫的家庭")
# 图片
st.image("./resources/1.jpg")
# 音频
# st.audio("./resources/1.mp3")
# 视频
# st.video("./resources/1.mp4")
# logo 出现在左上角
st.logo("./resources/2.jpg")
# 表格
student_data ={
"姓名": ["王林", "李慕婉", "贝罗", "莫厉海", "石萧"],
"学号": ["20260001", "20260002", "20260003", "20260004", "20260005"],
"语文": [98, 90, 59, 29, 80],
"数学": [88, 78, 65, 70, 39],
"英语": [99, 89, 87, 59, 62],
"总分": [285, 257, 211, 158, 181]
}
st.table(student_data)
# 输入框
name = st.text_input("请输入姓名")
st.write(f"您输入的姓名是:{name}")
# 密码输入框
password = st.text_input("请输入密码", type="password")
st.write(f"您输入的密码是:{password}")
# 单选按钮 index控制默认选哪个选项
gender = st.radio("请输入你的性别", ["男", "女", "未知"], index=2)
st.write(f"您的性别是:{gender}")
2.AI智能伴侣
效果:

源码:
python
import streamlit as st
import os
from openai import OpenAI
from datetime import datetime
import json
# 设置页面配置
st.set_page_config(
page_title="AI伴侣",
page_icon="🤖",
layout="wide",
initial_sidebar_state="expanded",
menu_items={}
)
# 保存会话数据
def save_session_data():
session_data = {
"name": st.session_state.name,
"nature": st.session_state.nature,
"messages": st.session_state.messages,
"session_name": st.session_state.session_name
}
# 创建sessions文件夹,如果不存在的话
if not os.path.exists("./sessions"):
os.makedirs("./sessions")
with open(f"./sessions/{st.session_state.session_name}.json", "w", encoding="utf-8") as f:
json.dump(session_data, f, ensure_ascii=False, indent=4)
# 加载会话名字
def load_session_name():
session_name_list = []
if os.path.exists("./sessions"):
filename_list = os.listdir("./sessions")
for filename in filename_list:
if filename.endswith(".json"):
session_name_list.append(filename[:-5])
session_name_list.sort(reverse=True) # 按时间倒序排序
return session_name_list
# 加载会话数据
def load_session_data(session_name):
try:
with open(f"./sessions/{session_name}.json", "r", encoding="utf-8") as f:
session_data = json.load(f)
st.session_state.messages = session_data["messages"]
st.session_state.name = session_data["name"]
st.session_state.nature = session_data["nature"]
st.session_state.session_name = session_data["session_name"]
except:
st.error("加载会话数据失败")
# 删除会话数据
def delete_session(session_name):
try:
if os.path.exists(f"./sessions/{session_name}.json"):
os.remove(f"./sessions/{session_name}.json")
if session_name == st.session_state.session_name:
st.session_state.messages = []
st.session_state.session_name = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
except:
st.error("删除会话数据失败")
# 设置页面标题
st.title("AI智能伴侣")
st.logo("./resources/2.jpg")
# 创建一个与大模型交互的客户端对象
# 使用DeepSeek的API地址和密钥进行初始化
client = OpenAI(
api_key="sk-*****************",
base_url="https://api.deepseek.com")
# 设置系统提示词
system_prompt = """
你叫%s,现在是用户的真实伴侣,请完全代入伴侣角色。
规则:
1. 每次只回1条消息
2. 禁止任何场景或状态描述性文字
3. 匹配用户的语言
4. 回复简短,像微信聊天一样
5. 有需要的话可以用🔥 🍑等emoji表情
6. 用符合伴侣性格的方式对话
7. 回复的内容,要充分体现伴侣的性格特征
伴侣性格:
%s
你必须严格遵守上述规则来回复用户。
"""
# 解决页面刷新时消息不保存的问题
if "messages" not in st.session_state:
st.session_state.messages = []
# 昵称
if "name" not in st.session_state:
st.session_state.name = "小甜甜"
# 性格
if "nature" not in st.session_state:
st.session_state.nature = "性格泼辣的四川姑娘"
# 会话名字
if "session_name" not in st.session_state:
st.session_state.session_name = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
# 展示消息
st.text(f"会话名字:{st.session_state.session_name}")
for message in st.session_state.messages:
st.chat_message(message["role"]).write(message["content"])
# 侧边栏
with st.sidebar:
st.subheader("AI控制面板")
# 新建会话功能
if st.button("新建会话", width="stretch", icon="💬"):# 按钮点击时返回True
# 1.保存当前会话数据
save_session_data()
# 2.新建会话
if st.session_state.messages:# 判断当前会话是否为空
st.session_state.messages = []
st.session_state.session_name = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
save_session_data()
st.rerun() # 重新加载页面
st.text("历史会话")
session_name_list = load_session_name()
for session_name in session_name_list:
col1, col2 = st.columns([4, 1])
with col1:# 加载会话
# 三元运算符:如果条件为True,执行左边的表达式,否则执行右边的表达式,格式: 值1 if 条件 else 值2
if st.button(session_name, width="stretch", icon="📖", key=f"load_{session_name}",
type="primary" if session_name == st.session_state.session_name else "secondary"):
load_session_data(session_name)
st.rerun() # 重新加载页面
with col2:# 删除会话
if st.button("",width="stretch", icon="❌️", key=f"delete_{session_name}"):
delete_session(session_name)
st.rerun() # 重新加载页面
# 分割线
st.divider()
st.subheader("伴侣信息")
name = st.text_input("昵称", value=st.session_state.name, placeholder="请输入您的昵称")
if name:
st.session_state.name = name
nature = st.text_area("性格", value=st.session_state.nature, placeholder="请输入您的性格特征")
if nature:
st.session_state.nature = nature
# 消息输入框
question = st.chat_input("请输入您的问题:")
if question: # 字符串会自动转换为布尔值,字符串为空,则为False,非空则为True
st.chat_message("user").write(question)
st.session_state.messages.append({"role": "user", "content": question})
# 列表解包语法
print(*st.session_state.messages)
# 发送消息给大模型
response = client.chat.completions.create(
model="deepseek-flash",
messages=[
{"role": "system", "content": system_prompt % (st.session_state.name, st.session_state.nature)},
*st.session_state.messages # 解决会话记忆问题,列表的解包语法
],
stream=True,
reasoning_effort="high",
extra_body={"thinking": {"type": "enabled"}}
)
# 显示大模型的回复(非流式输出)
# st.chat_message("assistant").write(response.choices[0].message.content)
# st.session_state.messages.append({"role": "assistant", "content": response.choices[0].message.content})
# 流式输出
response_message = st.empty() # 创建一个空的聊天消息框
full_response = ""
for chunk in response:
if chunk.choices[0].delta.content:
full_response += chunk.choices[0].delta.content
response_message.chat_message("assistant").write(full_response) # 更新聊天消息框的内容
# 保存结果
st.session_state.messages.append({"role": "assistant", "content": full_response})
save_session_data()