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()
相关推荐
HDU-Dade26 分钟前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
警醒与鞭策33 分钟前
Codex桌面版与Claude桌面版使用设置
android·unity·ai·性能优化
在所不辞兄1 小时前
【零基础学智能仿真-63】ABACUS作业工具与MCP接口
人工智能·深度学习·神经网络·机器学习·智能仿真
楚山之石1 小时前
【Medical Image Analysis】深度学习医学图像合成综述:伪CT、合成MRI与合成PET的架构、性能与临床边界
图像处理·人工智能·学习·mr·mri
blackappleD1 小时前
百度 Unlimited OCR 2 拆解:SR-SWA 如何让百页文档的 KV 缓存不再涨
人工智能·llm
数字新视界1 小时前
国产动环数据库在智能机房环境监控中的应用与优势分析
大数据·人工智能·数据中心·机房管理·模块化机房
holly就是我1 小时前
AI 编程助手为什么跑偏?用开源 ccglass 看清 Prompt、工具调用和 Token 消耗
人工智能·后端
雨中飘荡的记忆2 小时前
额度又见底了?这个开源项目,给 AI 编程助手接上 61 家"加油站"
人工智能
天远Date Lab2 小时前
零信任架构实战:基于天远企业年报信息核验构建自动化商业保理财务与社保穿透评估网关
人工智能·架构·自动化
EnCi Zheng2 小时前
后端怎么把AI接口稳定安全低成本接进业务:超时重试、密钥隔离与成本熔断清单
人工智能·后端·安全·架构·api