在人工智能技术快速发展的今天,如何快速搭建一个专属于自己的 AI 应用成为了许多开发者关注的方向。Streamlit 作为一款专注于数据科学和机器学习的轻量级 Python Web 框架,能够让开发者在无需掌握复杂前端技术的情况下,仅用几行 Python 代码就构建出美观、互动的 Web 界面。

本文将带领大家基于 StreamlitDeepSeek API,从零开始搭建一个可以自定义昵称、性格,并具备会话记忆与流式输出能力的 AI 智能伴侣


一、 项目核心功能

本项目主要包含以下几个核心功能模块:

  1. 个性化设定(侧边栏):用户可以在侧边栏输入伴侣的“昵称”与“性格说明”,这些设定将作为 system_prompt 实时注入到大模型的对话上下文当中,从而让 AI 拥有符合设定的特定人设与说话风格。
  2. 会话记忆功能(Session State):由于 Streamlit 的运行机制是每次交互都会从头执行一遍脚本,因此我们利用 st.session_state 维护了一个历史对话列表,确保 AI 能够记住前文内容。
  3. 流式输出(Streaming):支持打字机式的流式文本输出,无需等待整句生成完毕即可边生成边阅读,提升交互体验。
  4. 简洁优雅的 UI 设计:利用 Streamlit 自带的 chat_messagechat_input 组件,快速搭建出媲美原生聊天软件的交互界面。

二、 系统架构与工作流程

项目的核心工作流如下图所示:

  1. 用户输入(昵称、性格及聊天信息)。
  2. 状态保存(信息存入 st.session_state.messages 确保记忆不丢失)。
  3. 构建上下文(将系统提示词与历史对话合并,作为请求体传递给大模型接口)。
  4. 流式响应(大模型生成结果流式返回,前端使用 st.empty() 实时刷新显示)。
  5. 保存响应(将 AI 返回的完整内容存入历史会话,等待下一次对话循环)。

三、 完整代码实现

请在本地新建一个名为 app.py 的 Python 文件,并将以下代码复制进去:

import streamlit as st
import os
from openai import OpenAI

# 设置页面布局与基本信息
st.set_page_config(
    page_title="AI智能伴侣",  # 浏览器标签页标题
    page_icon="💬",          # 标签页图标
    layout="wide",           # 页面布局:宽屏模式
    initial_sidebar_state="expanded",  # 默认展开侧边栏
    menu_items={}
)

# 页面大标题
st.title("AI智能伴侣")

# 系统提示词模板
system_prompt = "你是一名AI助理,你的名字叫%s,请温柔耐心的回答用户问题,伴侣性格:%s"

# 初始化聊天信息(会话记忆核心)
if "messages" not in st.session_state:
    st.session_state.messages = []

# 初始化昵称状态
if "nick_name" not in st.session_state:
    st.session_state.nick_name = "AI伴侣"

# 初始化性格状态
if "nature" not in st.session_state:
    st.session_state.nature = "温柔耐心"

# 展示历史聊天信息(保障刷新页面时历史对话不消失)
for message in st.session_state.messages:
    if message["role"] == "user":
        st.chat_message("user").write(message["content"])
    else:
        st.chat_message("assistant").write(message["content"])

# 创建与AI大模型交互的客户端对象(配置API密钥与Base URL)
client = OpenAI(
    api_key=os.environ.get('DEEPSEEK_API_KEY'),
    base_url="https://api.deepseek.com"
)

# 左侧侧边栏配置区
with st.sidebar:
    st.subheader("伴侣信息配置")
    
    # 昵称输入框
    nick_name = st.text_input("昵称", placeholder="请输入昵称,如:小爱")
    if nick_name:
        st.session_state.nick_name = nick_name
        
    # 性格输入框
    nature = st.text_area("性格设定", placeholder="请输入性格,如:傲娇、活泼、严谨")
    if nature:
        st.session_state.nature = nature


# 消息输入框
prompt = st.chat_input("请输入您要问的问题...")

# 处理用户输入并与大模型交互
if prompt:
    # 1. 立即在界面上显示用户输入的内容
    st.chat_message("user").write(prompt)
    
    # 2. 保存用户输入的提示词到会话历史中
    st.session_state.messages.append({"role": "user", "content": prompt})

    # 3. 调用 AI 大模型(这里配置了 system 提示词与完整的历史对话)
    response = client.chat.completions.create(
        model="deepseek-chat", # 根据实际使用的模型名称修改
        messages=[
            {"role": "system", "content": system_prompt % (st.session_state.nick_name, st.session_state.nature)},
            *st.session_state.messages
        ],
        stream=True, # 开启流式传输
    )

    # 4. 创建一个空容器用于流式渲染大模型的回答
    response_message = st.empty()
    full_response = ""
    
    # 5. 流式解析并实时渲染输出
    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)

    # 6. 将最终大模型返回的完整结果保存到历史会话中,以便下一次交互使用
    st.session_state.messages.append({"role": "assistant", "content": full_response})

四、 核心技术点解析

1. st.session_state 会话状态管理

Streamlit 的页面每次触发事件(例如用户在对话框输入文本并敲击回车)时,整个 Python 脚本都会从头到尾重新运行一遍。这意味着所有的局部变量都会被重置。
为了避免对话记录在页面重新加载时丢失,我们使用了 st.session_state。在脚本开头,我们检查 messages 是否在 st.session_state 中,若不在则进行初始化。每次产生新对话时,将对话内容 append 进去。在加载页面时,通过一个 for 循环将历史记录全部渲染出来。

2. 流式响应(Streaming)处理

传统的 API 请求需要等待大模型把整句话生成完毕后一次性返回,在遇到长文本时会有明显的卡顿感。
在本项目中,我们通过 stream=True 开启了流式输出:

  • 使用 st.empty() 创建一个占位容器。
  • 循环遍历 response 迭代器,获取模型实时产出的每个 token。
  • 将增量内容拼接至 full_response 中,并用 response_message.chat_message("assistant").write(full_response) 实时刷新页面显示,从而实现了平滑、流畅的打字机交互效果。

3. 系统提示词(System Prompt)的动态注入

通过侧边栏的 st.text_inputst.text_area,用户可以动态修改伴侣的昵称和性格特点。程序将这些参数动态格式化到 system_prompt 字符串中,并在每次向 API 发送请求时,将其放置在对话列表的第一项。大模型以此为依据调整自身的对话人设。


五、 项目效果展示

1. 基本交互效果

在主页面下,可以直接与 AI 智能伴侣进行基础的问答互动。
在这里插入图片描述

2. 侧边栏与人设配置

通过侧边栏输入不同的昵称和性格特征,点击对话后,AI 的回复语气会随着您的设定发生改变。
在这里插入图片描述


六、 如何运行该项目?

1. 安装依赖库

在终端中执行以下命令,安装运行所需的 Python 第三方库:

pip install streamlit openai

2. 配置 API Key

在运行程序之前,您需要将您的 DeepSeek 密钥配置为系统环境变量(也可以直接在代码中将 API Key 替换为您的明文密钥,但从安全角度出发不推荐这么做)。

  • Linux / macOS:
    export DEEPSEEK_API_KEY="your-deepseek-api-key-here"
    
  • Windows (PowerShell):
    $env:DEEPSEEK_API_KEY="your-deepseek-api-key-here"
    

3. 启动应用

在终端切换到项目脚本所在的目录下,执行以下命令:

streamlit run app.py

运行成功后,终端会输出本地访问链接(通常为 http://localhost:8501),在浏览器中打开该链接即可开始使用您的 AI 智能伴侣


七、 总结

通过本项目,我们基于 Streamlit 框架快速完成了应用界面的搭建,并配合 OpenAI SDK 实现了与大模型的长对话交互。借助内置的会话状态管理,解决了单页应用的上下文连贯问题。

未来,该项目还可以在以下方向进行拓展:

  1. 支持更多模型选择:在侧边栏加入下拉菜单,让用户自由切换不同的 LLM 模型。
  2. 加入历史对话导出与清空按钮:方便用户一键重置对话或保存珍贵对话记录。
  3. 增加多模态支持:利用大模型的多模态接口,实现发送图片让 AI 伴侣进行解析和互动的功能。
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐