使用Streamlit+Deepseek搭建AI大模型

实现代码

import streamlit as st
import os
from openai import OpenAI
from streamlit import sidebar
import datetime
import json

st.set_page_config(
    page_title="AI智能大模型",
    page_icon="🤖",
    # 页面布局
    layout="wide",
    #控制侧边栏状态
    initial_sidebar_state="expanded",
    menu_items={}
)

# 保存会话信息
def save_session():
    # 构建新的会话对象
    session_data = {
        "friend_name": st.session_state.friend_name,
        "friend_nature": st.session_state.friend_nature,
        "current_session": st.session_state.current_session,
        "messages": st.session_state.messages
    }

    print("保存会话信息:",st.session_state.current_session)

    if not os.path.exists("sessions"):
        os.mkdir("sessions")

    # 保存会话数据
    with open(f"sessions/{st.session_state.current_session}.json", "w", encoding="utf-8") as f:
        json.dump(session_data, f, ensure_ascii=False, indent=2)

# 加载所有的会话信息
def load_sessions():
    session_list = []

    # 加载sessions目录下的所有会话信息
    if os.path.exists("sessions"):
        file_list = os.listdir("sessions")
        for filename in file_list:
            if filename.endswith(".json"):
                session_list.append(filename[:-5])
    session_list.sort(reverse=True)
    return session_list

# 加载指定会话信息
def load_session(session_name):
    try:
        if os.path.exists(f"sessions/{session_name}.json"):
            print("session:"+session_name)
            # 读取会话数据
            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.friend_name = session_name["friend_name"]
                st.session_state.friend_nature = session_data["friend_nature"]
                st.session_state.current_session = session_name
    except Exception:
        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.current_session:
                st.session_state.messages = []
                st.session_state.current_session = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    except Exception:
        st.error("删除会话失败!")

# 大标题
st.title("AI智能大模型")

# 调用AI大模型
client = OpenAI(
    api_key=os.environ.get('DEEPSEEK_API_KEY'),
    base_url="https://api.deepseek.com")

# 系统提示词
system_prompt = ("你是%s,你是用户的真实朋友,请完全代入朋友角色"
                 "朋友性格:%s")

# 初始化聊天信息
if "messages" not in st.session_state:
    st.session_state.messages = []

if "friend_name" not in st.session_state:
    st.session_state.friend_name = "天天"

if "friend_nature" not in st.session_state:
    st.session_state.friend_nature = "活泼开朗热情的河北姑娘"

# 会话标识
if "current_session" not in st.session_state:
    now = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    st.session_state.current_session = now


st.text(f"会话名称:{st.session_state.current_session}")
# 展示聊天信息
for message in st.session_state.messages:
    st.chat_message(message["role"]).write(message["content"])


# 左侧侧边栏
with sidebar:
    # 会话信息管理
    st.subheader("AI控制面板")

    # 新建会话
    if st.button("新建会话",width="stretch",icon="🖋"):
        # 1、保存当前会话信息
        if st.session_state.current_session:
            save_session()

        # 2、创建新的会话
        if st.session_state.messages:
            st.session_state.messages = []
            st.session_state.current_session = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
            save_session()
            st.rerun()

    # 会话历史
    st.text("会话历史")
    session_list = load_sessions()
    for session in session_list:
        col1,col2 = st.columns([4,1])
        with col1:
            # 加载会话信息
            if st.button(session, width="stretch", icon="📄",key=f"load_{session}", type="primary" if session == st.session_state.current_session else "secondary"):
                st.session_state.current_session = session
                load_session(session)
                st.rerun()
        with col2:
            # 删除会话信息
            if st.button("",width="stretch",icon="❌",key=f"delete_{session}"):
                delete_session(session)
                st.rerun()


    # 分割线
    st.divider()


    st.subheader("朋友信息")
    friend_name = st.text_input("昵称",placeholder="请输入朋友的昵称",value=st.session_state.friend_name)
    if friend_name:
        st.session_state.friend_name = friend_name
    friend_nature = st.text_input("性格",placeholder="请输入朋友的性格",value=st.session_state.friend_nature)
    if friend_nature:
        st.session_state.friend_nature = friend_nature




# 消息输入框
prompt = st.chat_input("请输入您要问的问题")
if prompt:
    st.chat_message("user").write(prompt)
    print("调用AI大模型发送的提示词")
    # 保存用户输入的提示词
    st.session_state.messages.append({"role": "user", "content": prompt})

    # 调用AI模型,与其交互
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system_prompt%(st.session_state.friend_name, st.session_state.friend_nature)},
            # 会话记忆的实现
             *st.session_state.messages
        ],
        stream=True
    )

    # 流式输出的结果解析方式
    response_message = st.empty() # 创建一个空的组件,用于展示大模型返回的结果
    full_response = ""
    for chunk in response:
        if chunk.choices[0].delta.content is not None:
            content = chunk.choices[0].delta.content
            full_response += content
            response_message.chat_message("assistant").write(full_response)

    # 保存大模型返回的提示词
    st.session_state.messages.append({"role": "assistant", "content": full_response})

    # 保存会话信息
    save_session()

实现效果

image

image

左侧侧边栏可以设置AI的角色,灵活性较强

posted @ 2026-03-07 12:35  yesyes1  阅读(40)  评论(0)    收藏  举报