Streamlit的DeepSeek对话应用,提供简单、直观的AI交互体验

Streamlit的DeepSeek对话应用,提供简单、直观的AI交互体验

在这里插入图片描述

1. 项目概述

一个基于Streamlit的DeepSeek对话应用,提供简单、直观的AI交互体验。

2. 环境准备

2.1 安装依赖

pip install streamlit requests

3. 完整代码实现

import streamlit as st
import requests
import json
from typing import List, Dict

# 配置DeepSeek API
DEEPSEEK_API_URL = "https://api.siliconflow.cn/v1/chat/completions"

class DeepSeekChatApp:
    def __init__(self):
        # 初始化会话状态
        if 'messages' not in st.session_state:
            st.session_state.messages = []
        
        # API密钥配置
        self.api_key = st.secrets.get("DEEPSEEK_API_KEY", "your_api_key")

    def get_deepseek_response(self, messages: List[Dict], temperature: float = 0.7) -> str:
        """调用DeepSeek API获取响应"""
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {self.api_key}"
        }
        
        payload = {
            "model": "deepseek-ai/DeepSeek-V3",
            "messages": messages,
            "temperature": temperature,
            "max_tokens": 2048,
            "stream": True
        }
        
        try:
            response = requests.post(DEEPSEEK_API_URL, headers=headers, json=payload, stream=True)
            response.raise_for_status()
            
            full_response = ""
            for line in response.iter_lines():
                if line:
                    line = line.decode('utf-8')
                    if line.startswith('data: '):
                        if line == 'data: [DONE]':
                            break
                        try:
                            chunk = json.loads(line[6:])
                            if chunk['choices'][0]['delta'].get('content'):
                                content = chunk['choices'][0]['delta']['content']
                                full_response += content
                                yield content
                        except json.JSONDecodeError:
                            continue
            
        except requests.RequestException as e:
            st.error(f"API调用错误: {str(e)}")
            yield f"API调用错误: {str(e)}"

    def render_chat_interface(self):
        """渲染聊天界面"""
        st.title("🤖 DeepSeek AI 对话助手")
        
        # 侧边栏配置
        with st.sidebar:
            st.header("对话设置")
            temperature = st.slider("创造力", 0.0, 1.0, 0.7, step=0.1)
            system_prompt = st.text_area("系统角色设定", "你是一个友好、专业的AI助手")
        
        # 显示历史消息
        for message in st.session_state.messages:
            with st.chat_message(message["role"]):
                st.markdown(message["content"])
        
        # 用户输入
        if prompt := st.chat_input("输入您的问题"):
            # 添加用户消息
            st.session_state.messages.append({"role": "user", "content": prompt})
            
            # 显示用户消息
            with st.chat_message("user"):
                st.markdown(prompt)
            
            # 准备API消息列表
            messages = [
                {"role": "system", "content": system_prompt},
                *[{"role": m["role"], "content": m["content"]} for m in st.session_state.messages]
            ]
            
            # 显示AI响应
            with st.chat_message("assistant"):
                response_placeholder = st.empty()
                full_response = ""
                
                # 流式显示响应
                for chunk in self.get_deepseek_response(messages, temperature):
                    full_response += chunk
                    response_placeholder.markdown(full_response + "▌")
                
                response_placeholder.markdown(full_response)
            
            # 保存AI消息
            st.session_state.messages.append({"role": "assistant", "content": full_response})

def main():
    chat_app = DeepSeekChatApp()
    chat_app.render_chat_interface()

if __name__ == "__main__":
    main()

4. 应用特性

4.1 核心功能

  • 流式对话交互
  • 动态系统角色设定
  • 对话历史记录
  • 可调节AI创造力

4.2 技术亮点

  • 使用Streamlit构建界面
  • 流式API调用
  • 上下文管理
  • 错误处理机制

5. 运行方法

streamlit run deepseek_chat_app.py

6. 注意事项

  • 需要有效的DeepSeek API密钥
  • 建议在 st.secrets 中配置密钥
  • 遵守API使用条款

7. API Key 和 Secrets 管理

1. Streamlit Secrets 配置

1.1 创建 secrets.toml 文件

在项目根目录创建 .streamlit/secrets.toml 文件:

# DeepSeek API配置
DEEPSEEK_API_KEY = "your_api_key_here"
DEEPSEEK_API_URL = "https://api.siliconflow.cn/v1/chat/completions"
1.2 安全存储 API Key
  • 使用 .streamlit/secrets.toml 管理敏感信息
  • .streamlit/secrets.toml 添加到 .gitignore
  • 避免将 API Key 硬编码到代码中

2. 环境变量替代方案

2.1 设置环境变量
# Linux/Mac
export DEEPSEEK_API_KEY='your_api_key'

# Windows
set DEEPSEEK_API_KEY=your_api_key

3. 最佳实践

3.1 API Key 安全建议
  • 不要在公开仓库中存储 API Key
  • 使用环境变量或 secrets 管理
  • 定期更换 API Key
  • 限制 API Key 的权限和使用范围
3.2 权限控制
  • 仅授予必要的 API 权限
  • 监控 API 使用情况
  • 设置使用配额和限制

8. 体验DeepSeek

快来体验 DeepSeek:

<think>好的,我现在需要帮助用户了解如何使用Streamlit构建对话框并调用DeepSeek大模型实现流式输出。首先,我得确认自己对这两个技术点的理解是否正确。 Streamlit是一个用于快速构建数据应用的Python框架,特别适合机器学习模型的展示。用户提到“构建对话框”,可能指的是在网页应用中创建一个聊天界面,让用户输入信息,然后与模型交互。而DeepSeek大模型,我需要确认其API是否支持流式输出,比如类似OpenAI的逐字返回结果的方式。 接下来,我应该分步骤来设计解决方案。首先是搭建Streamlit的基本界面,包括输入框和显示区域。然后,集成DeepSeek的API,处理身份验证和请求发送。流式输出的部分可能需要使用Streamlit的特定功能,比如st.write_stream或者自定义生成器函数,来逐步显示模型返回的内容。 需要检查Streamlit是否支持异步请求,或者是否需要使用生成器来实现流式效果。另外,API调用的部分,可能需要查阅DeepSeek的文档,确认其流式传输的支持情况,比如是否有类似OpenAI的stream参数。 还有安全方面的问题,比如API密钥的管理,应该提醒用户使用Streamlit的secrets功能来存储密钥,避免硬编码在代码中。此外,错误处理也需要考虑,比如网络请求失败时的反馈。 可能遇到的挑战包括流式数据的正确处理,确保每接收到一个数据块就即时显示,而不会等到全部完成。此外,界面布局的美观性,比如聊天历史记录的显示,可能需要使用st.session_state来维护对话状态,确保每次交互后历史记录更新。 最后,测试整个流程,确保从用户输入到模型响应,再到流式输出的每个环节都正常工作。如果有问题,需要逐步排查,比如检查API响应结构,确认Streamlit的组件是否正确使用。</think>以下是使用Streamlit+DeepSeek构建流式对话应用的实现指南(分步骤说明): ```python import streamlit as st from deepseek_api import DeepSeek # 假设提供的SDK import os # 初始化配置 def init_config(): st.set_page_config(page_title="DeepSeek Chat") if "messages" not in st.session_state: st.session_state.messages = [] # 流式响应生成器 def stream_generator(prompt): api_key = os.getenv("DEEPSEEK_API_KEY") # 从环境变量读取密钥 client = DeepSeek(api_key=api_key) # 假设API支持流式模式 response_stream = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": prompt}], stream=True # 启用流式传输 ) for chunk in response_stream: if chunk.choices[0].delta.content: yield chunk.choices[0].delta.content # 界面布局 def main(): init_config() # 显示历史消息 for message in st.session_state.messages: with st.chat_message(message["role"]): st.markdown(message["content"]) # 用户输入处理 if prompt := st.chat_input("请输入您的问题"): # 添加用户消息 st.session_state.messages.append({"role": "user", "content": prompt}) with st.chat_message("user"): st.markdown(prompt) # 生成AI回复 with st.chat_message("assistant"): response = st.write_stream(stream_generator(prompt)) st.session_state.messages.append({"role": "assistant", "content": response}) if __name__ == "__main__": main() ``` 关键实现步骤说明: 1. **环境准备**: - 安装依赖:`pip install streamlit deepseek-sdk` - 设置API密钥:`export DEEPSEEK_API_KEY='your-api-key'` 2. **核心机制**: - **流式处理**:通过生成器函数逐块获取API响应 - **会话记忆**:使用`st.session_state`保持对话历史 - **即时渲染**:`st.write_stream()`实现逐字输出效果 3. **注意事项**: - 确保使用支持流式传输的API终端节点 - 需要处理网络中断等异常情况 - 可通过`st.spinner()`添加等待指示器 - 建议添加速率限制防止滥用 4. **扩展方向**: ```python # 添加功能示例: with st.sidebar: st.selectbox("模型版本", ["v1.0", "v2.0"]) st.slider("温度参数", 0.0, 1.0, 0.7) if st.button("清空历史"): st.session_state.messages = [] ``` 实际部署时需注意: 1. 通过`streamlit run app.py`启动服务 2. 生产环境建议添加身份验证 3. 可结合`st.cache_data`实现缓存优化 4. 需要处理API调用频率限制 请根据实际API文档调整参数设置,最新SDK使用方法建议参考官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老大白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值