当前位置: 首页 > article >正文

DeepSeek-R1-Distill-Qwen-1.5B入门必看:如何用streamlit.session_state管理多轮对话

DeepSeek-R1-Distill-Qwen-1.5B入门必看如何用streamlit.session_state管理多轮对话1. 项目简介DeepSeek-R1-Distill-Qwen-1.5B是一个超轻量级的智能对话模型专门为本地化部署设计。这个模型结合了DeepSeek优秀的逻辑推理能力和Qwen成熟的模型架构经过蒸馏优化后在保持核心能力的同时大幅降低了计算资源需求。1.5B的超轻量参数让这个模型完美适配低显存GPU环境甚至可以在普通的CPU环境下运行。项目使用Streamlit构建了简洁直观的聊天界面支持多轮对话、思维链推理并且能够自动格式化模型输出的思考过程。这个项目的最大特点是完全本地化运行所有数据处理都在本地完成不需要连接云端服务器既保证了数据隐私安全又提供了开箱即用的便捷体验。2. 为什么需要管理多轮对话在实际的对话场景中单轮问答往往无法满足需求。比如当你问什么是机器学习得到回答后接着问它有哪些应用模型需要记住之前的对话上下文才能给出准确的回答。这就是多轮对话管理的核心价值。如果没有良好的对话状态管理每次提问都会被视为独立的对话模型无法理解问题的上下文关联回答就会显得机械和不连贯。Streamlit的session_state提供了一个轻量级的解决方案让我们能够在Web应用中持久化存储对话历史确保模型始终基于完整的上下文生成回答。3. streamlit.session_state基础用法3.1 初始化对话历史在Streamlit应用中我们需要在session_state中初始化一个列表来存储对话历史import streamlit as st # 初始化对话历史 if messages not in st.session_state: st.session_state.messages []这段代码检查session_state中是否已经存在messages列表如果不存在就创建一个空列表。这样可以确保每次页面刷新时不会丢失之前的对话记录。3.2 添加新的消息当用户发送消息或者模型生成回复时我们需要将这些消息添加到对话历史中# 添加用户消息 user_input st.chat_input(请输入你的问题...) if user_input: st.session_state.messages.append({role: user, content: user_input}) # 添加模型回复 with st.spinner(思考中...): response generate_response(user_input) st.session_state.messages.append({role: assistant, content: response})每个消息都是一个字典包含role角色和content内容两个字段。role可以是user或assistant分别表示用户消息和模型回复。3.3 显示对话历史为了在界面上显示完整的对话历史我们需要遍历messages列表并渲染每条消息# 显示所有消息 for message in st.session_state.messages: with st.chat_message(message[role]): st.markdown(message[content])这样就能在界面上以聊天气泡的形式显示所有的对话历史新的消息会自动添加到对话末尾。4. 实现多轮对话的完整示例下面是一个完整的DeepSeek-R1-Distill-Qwen-1.5B多轮对话实现示例import streamlit as st from transformers import AutoTokenizer, AutoModelForCausalLM import torch # 初始化session_state if messages not in st.session_state: st.session_state.messages [] if model_loaded not in st.session_state: st.session_state.model_loaded False # 侧边栏清空按钮 with st.sidebar: if st.button( 清空对话): st.session_state.messages [] torch.cuda.empty_cache() if torch.cuda.is_available() else None st.rerun() # 加载模型使用缓存 st.cache_resource def load_model(): model_path /root/ds_1.5b tokenizer AutoTokenizer.from_pretrained(model_path) model AutoModelForCausalLM.from_pretrained( model_path, device_mapauto, torch_dtypeauto ) return tokenizer, model # 生成回复的函数 def generate_response(user_input): tokenizer, model load_model() # 构建完整的对话上下文 conversation [] for msg in st.session_state.messages: conversation.append({role: msg[role], content: msg[content]}) # 添加当前用户输入 conversation.append({role: user, content: user_input}) # 应用聊天模板 inputs tokenizer.apply_chat_template( conversation, add_generation_promptTrue, return_tensorspt ).to(model.device) # 生成回复 with torch.no_grad(): outputs model.generate( inputs, max_new_tokens2048, temperature0.6, top_p0.95, do_sampleTrue ) # 解码并处理回复 response tokenizer.decode(outputs[0][inputs.shape[1]:], skip_special_tokensTrue) return format_response(response) # 格式化回复内容 def format_response(text): # 处理思考过程标签 if |think| in text and |end| in text: think_start text.find(|think|) len(|think|) think_end text.find(|end|) think_content text[think_start:think_end].strip() answer_content text[think_end len(|end|):].strip() return f**思考过程**\n{think_content}\n\n**回答**\n{answer_content} return text # 主界面 st.title( DeepSeek-R1 智能对话助手) # 显示对话历史 for message in st.session_state.messages: with st.chat_message(message[role]): st.markdown(message[content]) # 用户输入 if prompt : st.chat_input(考考 DeepSeek R1...): # 添加用户消息 st.session_state.messages.append({role: user, content: prompt}) # 显示用户消息 with st.chat_message(user): st.markdown(prompt) # 生成并显示模型回复 with st.chat_message(assistant): with st.spinner(思考中...): response generate_response(prompt) st.markdown(response) # 添加模型回复到历史 st.session_state.messages.append({role: assistant, content: response})5. 关键技术点解析5.1 对话上下文构建多轮对话的核心在于正确构建对话上下文。我们使用apply_chat_template方法来自动处理对话格式conversation [] for msg in st.session_state.messages: conversation.append({role: msg[role], content: msg[content]}) inputs tokenizer.apply_chat_template( conversation, add_generation_promptTrue, return_tensorspt )这种方法确保了模型能够理解完整的对话历史包括之前的用户提问和模型回复。5.2 内存和显存管理为了避免内存泄漏和显存占用过多我们采用了以下策略# 清空对话时释放显存 if st.button( 清空对话): st.session_state.messages [] torch.cuda.empty_cache() if torch.cuda.is_available() else None # 推理时禁用梯度计算 with torch.no_grad(): outputs model.generate(...)5.3 响应格式化处理模型输出的思考过程标签需要被转换为更易读的格式def format_response(text): if |think| in text and |end| in text: think_content text.split(|think|)[1].split(|end|)[0] answer_content text.split(|end|)[1] return f**思考过程**\n{think_content}\n\n**回答**\n{answer_content} return text6. 常见问题与解决方案6.1 对话历史过长问题当对话轮次过多时可能会遇到模型上下文长度限制。解决方案是只保留最近几轮对话# 只保留最近10轮对话 if len(st.session_state.messages) 20: # 10轮对话用户和模型各10条 st.session_state.messages st.session_state.messages[-20:]6.2 模型加载优化使用Streamlit的缓存机制避免重复加载模型st.cache_resource def load_model(): # 模型加载代码 return tokenizer, model6.3 处理生成错误添加错误处理机制确保应用稳定性try: response generate_response(prompt) except Exception as e: response f抱歉生成回复时出现错误{str(e)}7. 总结通过streamlit.session_state管理多轮对话我们为DeepSeek-R1-Distill-Qwen-1.5B模型构建了一个完整的本地化对话系统。关键要点包括使用session_state持久化存储对话历史正确构建对话上下文确保模型理解完整对话优化内存和显存使用避免资源浪费格式化模型输出提升可读性添加错误处理和资源管理增强稳定性这种实现方式不仅适用于DeepSeek-R1模型也可以作为其他对话型AI项目的参考模板。通过合理的状态管理和优化策略即使是在资源受限的本地环境中也能提供流畅的多轮对话体验。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关文章:

DeepSeek-R1-Distill-Qwen-1.5B入门必看:如何用streamlit.session_state管理多轮对话

DeepSeek-R1-Distill-Qwen-1.5B入门必看:如何用streamlit.session_state管理多轮对话 1. 项目简介 DeepSeek-R1-Distill-Qwen-1.5B是一个超轻量级的智能对话模型,专门为本地化部署设计。这个模型结合了DeepSeek优秀的逻辑推理能力和Qwen成熟的模型架构…...

kustomize 最佳实践(kustomization)

转载知乎-记录https://zhuanlan.zhihu.com/p/92153378 配置说明 https://cloud.tencent.com/developer/article/1760334?policyId1003 kustomize优质实践 - 实践细致 - 配置说明全面 https://desistdaydream.github.io/docs/10.%E4%BA%91%E5%8E%9F%E7%94%9F/%E4%BA%91%E5%8E…...

android-design-template代码结构详解:从DummyContent到ArticleListFragment的数据流

android-design-template代码结构详解:从DummyContent到ArticleListFragment的数据流 【免费下载链接】android-design-template This is a State of the Art Android Material Design template. You can use this project as a template for upcoming App projects…...

PP-DocLayoutV3部署教程:Gradio authentication启用用户访问控制实践

PP-DocLayoutV3部署教程:Gradio authentication启用用户访问控制实践 1. 引言:为什么需要访问控制? 当你把PP-DocLayoutV3文档布局分析服务部署到服务器后,可能会遇到一个实际问题:任何人都能访问你的服务。这不仅仅…...

如何快速搭建白卷(White-Jotter)项目:从零开始的前后端分离实战教程

如何快速搭建白卷(White-Jotter)项目:从零开始的前后端分离实战教程 【免费下载链接】White-Jotter 白卷是一款使用 VueSpring Boot 开发的前后端分离项目,附带全套开发教程。(A simple CMS developed by Spring Boot and Vue.js with develo…...

xcodebuild.nvim测试功能完全指南:单元测试与UI测试一键运行

xcodebuild.nvim测试功能完全指南:单元测试与UI测试一键运行 【免费下载链接】xcodebuild.nvim Neovim plugin to Build, Run, and Test applications created with Xcode & Swift. 项目地址: https://gitcode.com/gh_mirrors/xc/xcodebuild.nvim xcodeb…...

云容笔谈实战案例:3步生成超高清国风人像,Z-Image Turbo加速详解

云容笔谈实战案例:3步生成超高清国风人像,Z-Image Turbo加速详解 1. 东方美学影像创作新体验 「云容笔谈」是一款专注于东方审美、集现代尖端算法与古典美学意境于一体的影像创作平台。基于Z-Image Turbo核心驱动,系统致力于将每一份转瞬即…...

深求·墨鉴(DeepSeek-OCR-2)实战教程:扫描教材→OCR→Anki记忆卡片批量生成

深求墨鉴(DeepSeek-OCR-2)实战教程:扫描教材→OCR→Anki记忆卡片批量生成 你是不是也有这样的困扰:厚厚的教材需要整理成记忆卡片,手动输入太费时间,拍照扫描又无法直接编辑?今天我要分享的这套…...

StructBERT-中文-通用-large效果展示:金融研报关键结论提取

StructBERT-中文-通用-large效果展示:金融研报关键结论提取 1. 引言:当AI遇上金融研报 想象一下,你是一位金融分析师,每天需要阅读几十份、上百页的行业研报。你的任务是从这些海量文字中,快速找出核心观点、关键数据…...

白卷(White-Jotter)用户手册:轻松掌握CMS后台管理操作技巧

白卷(White-Jotter)用户手册:轻松掌握CMS后台管理操作技巧 【免费下载链接】White-Jotter 白卷是一款使用 VueSpring Boot 开发的前后端分离项目,附带全套开发教程。(A simple CMS developed by Spring Boot and Vue.js with development tut…...

Qwen3-ASR-1.7B效果展示:带背景音乐的短视频语音分离识别成果

Qwen3-ASR-1.7B效果展示:带背景音乐的短视频语音分离识别成果 你有没有遇到过这种情况?刷到一个有趣的短视频,想看看评论区有没有人讨论视频里说了什么,结果发现视频本身没有字幕,而背景音乐又太响,根本听…...

白卷(White-Jotter)前端开发揭秘:Vue组件设计与交互逻辑实战

白卷(White-Jotter)前端开发揭秘:Vue组件设计与交互逻辑实战 【免费下载链接】White-Jotter 白卷是一款使用 VueSpring Boot 开发的前后端分离项目,附带全套开发教程。(A simple CMS developed by Spring Boot and Vue.js with development t…...

Vide与Meteor集成教程:打造响应式视频背景网站

Vide与Meteor集成教程:打造响应式视频背景网站 【免费下载链接】Vide No longer actively maintained. 项目地址: https://gitcode.com/gh_mirrors/vi/Vide Vide是一款轻量级jQuery插件,能够帮助开发者轻松实现视频背景效果,而Meteor作…...

Bidili Generator实际效果:在低显存(12GB)笔记本上流畅运行SDXL的调优方案

Bidili Generator实际效果:在低显存(12GB)笔记本上流畅运行SDXL的调优方案 1. 引言:当SDXL遇上笔记本,挑战与机遇并存 Stable Diffusion XL(SDXL)无疑是当前开源图像生成领域的明星&#xff0…...

Alva高级技巧:如何用条件组件实现复杂交互逻辑

Alva高级技巧:如何用条件组件实现复杂交互逻辑 【免费下载链接】alva Create living prototypes with code components. 项目地址: https://gitcode.com/gh_mirrors/al/alva Alva是一款强大的原型设计工具,它允许开发者使用代码组件创建动态交互原…...

Cnblogs-Theme-SimpleMemory代码高亮配置指南:3种方案任你选

Cnblogs-Theme-SimpleMemory代码高亮配置指南:3种方案任你选 【免费下载链接】Cnblogs-Theme-SimpleMemory 🍭 Cnblogs theme _ Basic theme : SimpleMemory 项目地址: https://gitcode.com/gh_mirrors/cn/Cnblogs-Theme-SimpleMemory Cnblogs-T…...

AST Types核心功能详解:Esprima兼容的抽象语法树类型系统

AST Types核心功能详解:Esprima兼容的抽象语法树类型系统 【免费下载链接】ast-types Esprima-compatible implementation of the Mozilla JS Parser API 项目地址: https://gitcode.com/gh_mirrors/as/ast-types AST Types是一个高效、模块化且与Esprima兼容…...

tv4源码解析:从架构设计到核心实现原理

tv4源码解析:从架构设计到核心实现原理 【免费下载链接】tv4 Tiny Validator for JSON Schema v4 项目地址: https://gitcode.com/gh_mirrors/tv/tv4 引言:探索JSON Schema验证的轻量级解决方案 tv4(Tiny Validator for JSON Schema …...

Volar.js Monaco编辑器集成指南:在浏览器中实现IDE级代码智能

Volar.js Monaco编辑器集成指南:在浏览器中实现IDE级代码智能 【免费下载链接】volar.js 🚧 项目地址: https://gitcode.com/gh_mirrors/vo/volar.js Volar.js是一款强大的代码工具,它能够为Monaco编辑器提供IDE级别的代码智能功能&am…...

Ambrose源码探秘:从EmbeddedNotifier到ScriptStatusServer的实现细节

Ambrose源码探秘:从EmbeddedNotifier到ScriptStatusServer的实现细节 【免费下载链接】ambrose A platform for visualization and real-time monitoring of data workflows 项目地址: https://gitcode.com/gh_mirrors/am/ambrose Ambrose是一个用于数据工作…...

BaseAI内存管理完全指南:让你的AI代理拥有持久记忆

BaseAI内存管理完全指南:让你的AI代理拥有持久记忆 【免费下载链接】BaseAI BaseAI — The Web AI Framework. The easiest way to build serverless autonomous AI agents with memory. Start building local-first, agentic pipes, tools, and memory. Deploy ser…...

claude-code-best-practice云原生开发:构建云原生应用的AI辅助策略

claude-code-best-practice云原生开发:构建云原生应用的AI辅助策略 【免费下载链接】claude-code-best-practice practice made claude perfect 项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-best-practice claude-code-best-practice是一…...

Raylib-cs完全指南:如何用C轻松开发跨平台游戏

Raylib-cs完全指南:如何用C#轻松开发跨平台游戏 【免费下载链接】Raylib-cs C# bindings for raylib, a simple and easy-to-use library to learn videogames programming 项目地址: https://gitcode.com/gh_mirrors/ra/Raylib-cs Raylib-cs是raylib库的C#绑…...

Jimeng LoRA效果展示:1girl+close up+masterpiece提示词下的极致细节呈现

Jimeng LoRA效果展示:1girlclose upmasterpiece提示词下的极致细节呈现 提示:本文所有展示效果均基于Jimeng LoRA模型生成,展示了在特定提示词组合下的图像质量表现 1. 项目概述:轻量化LoRA测试系统 Jimeng LoRA测试系统是一个专…...

ODrive vs 官方Google Drive客户端:开源方案的5大优势对比

ODrive vs 官方Google Drive客户端:开源方案的5大优势对比 【免费下载链接】ODrive Google Drive GUI for Windows / Mac / Linux 项目地址: https://gitcode.com/gh_mirrors/odri/ODrive ODrive作为一款开源的Google Drive GUI客户端,为Windows、…...

Gowebly 源码解析:核心组件的实现原理与设计思想

Gowebly 源码解析:核心组件的实现原理与设计思想 【免费下载链接】gowebly 🔥 A next-generation CLI tool for easily build amazing web applications with Go on the backend, using htmx & hyperscript and the most popular atomic/utility-fir…...

react - css modules的模块化方案

文章目录一、什么是 css modules二、如何在 Vite 中使用 css modules三、解决css modules调试时类名变掉的问题为什么类名会变?调试时的应对方案1. 配置保留可读类名(推荐开发环境)2. 使用 Source Map3. React DevTools 辅助最佳实践总结一、…...

RexUniNLU惊艳案例:电商‘这个手机能分期吗?月付多少?’双意图联合识别

RexUniNLU惊艳案例:电商这个手机能分期吗?月付多少?双意图联合识别 1. 案例背景与价值 在日常电商客服场景中,用户经常会提出包含多个意图的复合问题。比如"这个手机能分期吗?月付多少?"这样的…...

寻音捉影·侠客行AI办公提效:HR面试录音自动标记‘稳定性’‘薪资’关键词

寻音捉影侠客行AI办公提效:HR面试录音自动标记‘稳定性’‘薪资’关键词 想象一下这个场景:你是一位HR,刚刚结束了一场长达一小时的面试。候选人滔滔不绝,从项目经历聊到职业规划,信息量巨大。现在,你需要…...

计算机视觉opencv之读取图片灰度图区域选取视频播放提取颜色通道移除通道

计算机视觉的实现我们需要下载两个第三方库 win键r键,cmd打开命令行 pip install 库名 -i 镜像地址 (前面的文章中有第三方库 的下载,感兴趣的可以参考https://blog.csdn.net/2201_75573294/article/details/155455973?fromshareblogdeta…...