AI应用-智能伴侣

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()
相关推荐
开开心心就好1 小时前
视频压缩工具推荐,绿色版免安装双击即用
java·前端·人工智能·spring·智能手机·intellij-idea·excel
RockHopper20251 小时前
AI时代模型生命周期与软件资产重构:概要版
人工智能·系统架构·软件工程·ai编程·世界模型
zhuo木鸟1 小时前
我用 opencode + Qdrant 搭了五段式小说写作系统
人工智能·个人开发·ai写作·ai写小说
大模型任我行1 小时前
字节:交替蒸馏与强化学习
人工智能·语言模型·自然语言处理·论文笔记
空堂与归1 小时前
AI 与 SI(超级智能):先分清窄智能与超级智能的边界
开发语言·人工智能·gpt
奈落241 小时前
DeepSeek Harness 开源贡献手记:从 Issue 认领到 PR 合入的完整实践
大数据·人工智能·安全·搜索引擎·开源
yun123456789901 小时前
Skill 是说明书,插件是接线
ai
朝朝辞暮i1 小时前
VLA 系统学习第 2 课:Behavior Cloning——机器人究竟怎么从示范中学动作?
人工智能·python·vla
johnsong1 小时前
AI前沿日报 2026-10-06:推理效率革命
人工智能