DeepSeek-R1-Distill-Qwen-1.5B快速上手:如何导出对话历史为Markdown并保留思考结构
DeepSeek-R1-Distill-Qwen-1.5B快速上手:如何导出对话历史为Markdown并保留思考结构
1. 项目简介:你的本地智能对话助手
如果你正在寻找一个能在自己电脑上运行的智能对话助手,既要有不错的逻辑推理能力,又不需要昂贵的显卡,那么DeepSeek-R1-Distill-Qwen-1.5B可能就是你要找的答案。
这个项目基于一个特别设计的轻量级模型——DeepSeek-R1-Distill-Qwen-1.5B。简单来说,它结合了DeepSeek模型强大的推理能力和Qwen模型成熟的技术架构,然后通过一种叫做"蒸馏"的技术,把原本需要大量计算资源的大模型,压缩成了一个只有15亿参数的小巧版本。
15亿参数是什么概念?这意味着它可以在普通的笔记本电脑上运行,甚至不需要独立显卡也能工作。对于大多数用户来说,这大大降低了使用门槛。
整个项目用Streamlit构建了一个网页界面,你不需要懂任何命令行操作,打开浏览器就能像使用ChatGPT一样和它对话。更重要的是,所有的对话都在你的本地电脑上处理,你的问题、模型的回答,都不会上传到任何云端服务器,完全保护了你的隐私。
2. 为什么需要导出对话历史?
2.1 保存有价值的对话内容
当你和这个本地助手进行深入对话时,可能会产生很多有价值的内容。比如:
- 学习笔记:你向它请教某个技术概念,它给出了详细的解释和例子
- 代码解决方案:你让它帮忙写一段代码,它提供了完整的实现和注释
- 问题分析:你提出一个复杂问题,它展示了完整的思考过程
- 创意内容:你让它生成一些文案、故事或其他创意内容
这些内容如果只是留在网页界面里,关闭浏览器就没了,多可惜。导出保存下来,以后随时可以查阅、整理、分享。
2.2 保留独特的思考结构
这个模型有一个很特别的功能:它会展示自己的思考过程。当你问它一个问题时,它不会直接给出答案,而是先展示自己是怎么想的,然后再给出最终回答。
比如你问:"Python里列表和元组有什么区别?"
模型可能会这样回答:
<think> 用户问的是Python中列表和元组的区别。我需要从几个方面来比较: 1. 可变性:列表是可变的,元组是不可变的 2. 语法:列表用方括号[],元组用圆括号() 3. 性能:元组通常比列表更快 4. 使用场景:列表用于需要修改的数据,元组用于固定数据 我应该用表格的形式来展示这些区别,这样更清晰。 </think> 列表和元组都是Python中常用的数据结构,主要区别如下: | 特性 | 列表 | 元组 | |------|------|------| | 可变性 | 可变,可以修改元素 | 不可变,创建后不能修改 | | 语法 | 使用方括号 [] | 使用圆括号 () | | 性能 | 相对较慢 | 相对较快 | | 使用场景 | 需要频繁修改的数据 | 固定不变的数据,如坐标、配置 | | 内存占用 | 较大 | 较小 |这种"先思考,再回答"的结构特别有价值,因为它不仅告诉你答案,还告诉你得到答案的思路。导出对话时保留这个结构,对你学习思考方法很有帮助。
2.3 方便整理和分享
导出的Markdown文件可以用任何文本编辑器打开,也可以导入到笔记软件里。你可以:
- 把相关的对话整理成学习资料
- 把解决问题的过程分享给同事或同学
- 建立自己的知识库,随时查阅
- 在不同设备间同步这些对话记录
3. 快速部署:10分钟搭建本地对话环境
3.1 环境准备
首先确保你的电脑满足基本要求:
- 操作系统:Windows 10/11,macOS,或者Linux都可以
- 内存:至少8GB RAM(16GB更好)
- 存储空间:需要约3GB的可用空间存放模型文件
- Python版本:Python 3.8或更高版本
如果你没有安装Python,可以去Python官网下载安装。建议选择Python 3.8以上的版本。
3.2 安装必要的软件包
打开命令行工具(Windows上是命令提示符或PowerShell,macOS和Linux上是终端),输入以下命令安装需要的软件:
pip install torch streamlit transformers这三个包的作用分别是:
torch:PyTorch深度学习框架,用来运行模型streamlit:创建网页界面的工具transformers:Hugging Face的模型库,用来加载和使用模型
安装过程可能需要几分钟时间,取决于你的网络速度。
3.3 下载项目代码
你需要获取这个对话助手的代码。通常代码会放在GitHub这样的代码托管平台上。你可以用git命令下载,或者直接下载ZIP文件。
如果使用git,在命令行中输入:
git clone https://github.com/用户名/项目名.git cd 项目名如果下载ZIP文件,解压后进入项目文件夹。
3.4 运行对话助手
在项目文件夹里,你会看到一个Python文件,通常叫做app.py或者chat.py。在命令行中运行:
streamlit run app.py第一次运行时会下载模型文件,这可能需要一些时间,因为模型文件大约有3GB大小。下载完成后,你会看到类似这样的信息:
You can now view your Streamlit app in your browser. Local URL: http://localhost:8501 Network URL: http://192.168.1.100:8501打开浏览器,访问http://localhost:8501,就能看到对话界面了。
4. 基础使用:开始你的第一次对话
4.1 界面介绍
打开网页后,你会看到一个简洁的聊天界面:
- 左侧侧边栏:有一些设置选项和功能按钮
- 中间主区域:显示对话历史,你的问题在右侧,模型的回答在左侧
- 底部输入框:在这里输入你的问题,按回车发送
界面设计得很直观,和你用过的其他聊天工具很像,不需要特别学习就能上手。
4.2 问第一个问题
在输入框里,你可以问各种类型的问题。比如:
- 学习问题:"解释一下什么是神经网络"
- 编程问题:"用Python写一个计算斐波那契数列的函数"
- 逻辑问题:"如果A说B在说谎,B说C在说谎,C说A和B都在说谎,谁在说真话?"
- 创意问题:"写一个关于人工智能的短故事"
输入问题后按回车,模型就会开始思考并回答。第一次回答可能需要几秒钟时间,因为模型需要加载到内存中。
4.3 理解模型的回答
注意看模型的回答,它会分成两个部分:
- 思考过程:放在
<think>标签里,用灰色背景显示 - 最终答案:思考过程之后的内容,用正常样式显示
这种结构让你能看到模型是怎么一步步推理的,对于学习复杂问题的解决方法特别有帮助。
4.4 继续对话
你可以基于模型的回答继续提问,形成多轮对话。比如:
你问:"Python里怎么读取CSV文件?" 模型回答后,你可以接着问:"那如果CSV文件很大,内存不够怎么办?"
模型会记住之前的对话内容,给出连贯的回答。
5. 导出对话历史为Markdown
5.1 为什么用Markdown格式?
Markdown是一种轻量级的标记语言,有这几个优点:
- 通用性强:几乎所有的文本编辑器都支持
- 可读性好:纯文本格式,人类可以直接阅读
- 转换方便:可以轻松转换为HTML、PDF等其他格式
- 平台无关:在Windows、macOS、Linux上都能正常显示
最重要的是,Markdown能很好地保留文本的结构,比如标题、列表、代码块等,正好适合保存结构化的对话内容。
5.2 手动导出方法
虽然当前的对话助手界面没有直接的"导出"按钮,但你可以手动保存对话内容。方法很简单:
- 选中对话内容:在网页界面中,用鼠标选中你想要保存的对话内容
- 复制到剪贴板:按Ctrl+C(Windows/Linux)或Cmd+C(macOS)复制
- 粘贴到文本编辑器:打开任何文本编辑器(如记事本、VS Code、Sublime Text等)
- 保存为Markdown文件:将文件保存为
.md后缀,比如对话记录.md
不过这种方法有个问题:思考过程(<think>标签里的内容)和回答内容是混在一起的,没有很好的区分。
5.3 改进的导出方法
我们可以写一个简单的Python脚本来更好地导出对话。在项目文件夹里创建一个新文件export_chat.py:
import re from datetime import datetime def format_chat_to_markdown(messages): """将对话消息格式化为Markdown""" markdown_content = "# 对话记录\n\n" markdown_content += f"导出时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" for i, msg in enumerate(messages, 1): if msg["role"] == "user": markdown_content += f"## 第{i//2 + 1}轮:用户提问\n\n" markdown_content += f"{msg['content']}\n\n" elif msg["role"] == "assistant": markdown_content += f"## 第{i//2}轮:助手回答\n\n" # 提取思考过程 think_match = re.search(r'<think>(.*?)</think>', msg['content'], re.DOTALL) if think_match: think_content = think_match.group(1).strip() markdown_content += "### 思考过程\n\n" markdown_content += f"{think_content}\n\n" # 提取回答部分(去掉思考标签) answer_content = re.sub(r'<think>.*?</think>', '', msg['content'], flags=re.DOTALL).strip() if answer_content: markdown_content += "### 最终回答\n\n" markdown_content += f"{answer_content}\n\n" else: markdown_content += f"{msg['content']}\n\n" markdown_content += "---\n\n" return markdown_content # 示例:假设这是从对话界面获取的消息列表 example_messages = [ { "role": "user", "content": "Python里列表和元组有什么区别?" }, { "role": "assistant", "content": """<think> 用户问的是Python中列表和元组的区别。我需要从几个方面来比较: 1. 可变性:列表是可变的,元组是不可变的 2. 语法:列表用方括号[],元组用圆括号() 3. 性能:元组通常比列表更快 4. 使用场景:列表用于需要修改的数据,元组用于固定数据 我应该用表格的形式来展示这些区别,这样更清晰。 </think> 列表和元组都是Python中常用的数据结构,主要区别如下: | 特性 | 列表 | 元组 | |------|------|------| | 可变性 | 可变,可以修改元素 | 不可变,创建后不能修改 | | 语法 | 使用方括号 [] | 使用圆括号 () | | 性能 | 相对较慢 | 相对较快 | | 使用场景 | 需要频繁修改的数据 | 固定不变的数据,如坐标、配置 | | 内存占用 | 较大 | 较小 | 简单来说,需要修改数据时用列表,不需要修改时用元组。""" } ] # 生成Markdown markdown = format_chat_to_markdown(example_messages) # 保存到文件 with open("chat_export.md", "w", encoding="utf-8") as f: f.write(markdown) print("对话已导出到 chat_export.md")这个脚本做了几件事:
- 自动提取思考过程和回答内容
- 用不同的标题层级区分用户问题和助手回答
- 单独展示思考过程,方便学习
- 添加时间戳,记录导出时间
5.4 集成到对话界面
如果你想让导出功能更方便,可以修改原来的对话助手代码,添加一个导出按钮。在Streamlit应用中添加:
import streamlit as st import re from datetime import datetime # ... 原有的代码 ... # 在侧边栏添加导出按钮 with st.sidebar: if st.button("导出对话为Markdown"): if st.session_state.messages: markdown_content = format_chat_to_markdown(st.session_state.messages) # 提供下载 st.download_button( label="下载Markdown文件", data=markdown_content, file_name=f"chat_export_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md", mime="text/markdown" ) else: st.warning("还没有对话内容可以导出")这样就在侧边栏添加了一个导出按钮,点击后可以直接下载Markdown文件。
6. 高级技巧:优化导出的对话记录
6.1 添加代码高亮
如果对话中包含代码,你可以在Markdown中使用代码块并指定语言,这样在支持语法高亮的编辑器中会更好看:
def format_code_blocks(content): """自动检测并格式化代码块""" # 检测Python代码 python_patterns = ['def ', 'import ', 'print(', 'for ', 'if '] if any(pattern in content for pattern in python_patterns): return f"```python\n{content}\n```" # 检测其他语言... return f"```\n{content}\n```"6.2 提取关键信息
你可以让导出的文件包含一些元信息,方便整理:
def add_metadata(messages, markdown_content): """添加元数据到Markdown文件""" metadata = "---\n" metadata += f"对话轮数:{len(messages)//2}\n" metadata += f"总字数:{sum(len(m['content']) for m in messages)}\n" # 提取对话主题(从第一个问题中提取关键词) if messages: first_question = messages[0]['content'] # 简单的关键词提取逻辑 keywords = extract_keywords(first_question) metadata += f"主要话题:{', '.join(keywords)}\n" metadata += "---\n\n" return metadata + markdown_content6.3 批量导出和管理
如果你有多个对话会话,可以创建一个管理系统:
import os import json from pathlib import Path class ChatExporter: def __init__(self, export_dir="chat_exports"): self.export_dir = Path(export_dir) self.export_dir.mkdir(exist_ok=True) def export_chat(self, messages, title=None): """导出单次对话""" if not title: title = f"对话_{datetime.now().strftime('%Y%m%d_%H%M%S')}" markdown_content = format_chat_to_markdown(messages) # 保存Markdown md_file = self.export_dir / f"{title}.md" md_file.write_text(markdown_content, encoding="utf-8") # 同时保存原始数据(JSON格式) json_file = self.export_dir / f"{title}.json" with open(json_file, "w", encoding="utf-8") as f: json.dump(messages, f, ensure_ascii=False, indent=2) return str(md_file) def list_exports(self): """列出所有导出的对话""" return list(self.export_dir.glob("*.md"))6.4 自动整理和分类
你可以根据对话内容自动分类:
def categorize_chat(messages): """根据对话内容自动分类""" content = " ".join([m["content"] for m in messages]) categories = { "编程": ["python", "代码", "函数", "编程", "算法"], "学习": ["解释", "概念", "学习", "理解", "原理"], "创意": ["故事", "创意", "写作", "生成", "想象"], "逻辑": ["推理", "逻辑", "问题", "解决", "分析"], "日常": ["你好", "天气", "建议", "聊天", "日常"] } scores = {} for category, keywords in categories.items(): score = sum(content.lower().count(keyword) for keyword in keywords) if score > 0: scores[category] = score if scores: return max(scores.items(), key=lambda x: x[1])[0] return "其他"7. 实际应用场景
7.1 学习笔记整理
假设你在学习Python,问了一系列问题:
- "解释一下装饰器的作用"
- "生成器函数和普通函数有什么区别?"
- "怎么用多线程提高程序性能?"
导出这些对话后,你就有了一个完整的学习笔记。每个问题都有模型的思考过程和详细回答,比普通的笔记更有价值。
7.2 问题解决记录
在工作中遇到技术问题,你可以:
- 向模型描述问题
- 根据模型的建议尝试解决
- 反馈结果,继续优化
- 导出完整的解决过程
这样你就有了一个完整的问题解决记录,下次遇到类似问题可以直接参考。
7.3 创意写作助手
如果你在写小说、文章或文案:
- 让模型帮你生成创意点子
- 讨论故事发展
- 修改和完善内容
- 导出整个创作过程
导出的Markdown文件可以直接作为创作草稿,思考过程还能帮你理清创作思路。
7.4 代码开发日志
在开发程序时:
- 让模型解释复杂的概念
- 生成示例代码
- 讨论架构设计
- 解决遇到的bug
导出这些对话,就是一个完整的开发日志,记录了你的思考过程和解决方案。
8. 总结
8.1 核心价值回顾
DeepSeek-R1-Distill-Qwen-1.5B本地对话助手给你提供了一个完全私有的AI对话环境。最大的特点是它能展示思考过程,这不仅是给你答案,更是教你思考方法。
导出对话历史为Markdown文件,让你能够:
- 永久保存有价值的对话内容
- 保留思考结构,方便学习和回顾
- 整理归类,建立个人知识库
- 随时查阅,不受网络限制
- 安全私密,所有数据都在本地
8.2 使用建议
根据我的使用经验,给你几个建议:
- 定期导出:重要的对话及时导出保存,避免丢失
- 分类整理:按主题建立不同的文件夹,比如"Python学习"、"工作问题"、"创意写作"等
- 添加标签:在导出的文件中添加关键词标签,方便搜索
- 分享交流:把有价值的对话分享给需要的人,但注意不要包含敏感信息
- 结合笔记软件:把Markdown文件导入到Obsidian、Notion等笔记软件中,建立知识网络
8.3 下一步探索
掌握了基础的使用和导出方法后,你还可以尝试:
- 自定义界面:修改Streamlit代码,让界面更符合你的使用习惯
- 添加功能:比如对话搜索、标签管理、自动摘要等
- 集成其他工具:把导出的对话自动同步到云笔记或Git仓库
- 批量处理:如果你有很多历史对话,可以写脚本批量导出和整理
最重要的是开始使用并形成习惯。每次有重要的对话,花一分钟时间导出保存,长期积累下来,你就会拥有一个非常有价值的个人知识库。
这个本地对话助手就像你的私人学习伙伴,随时待命,随时解答问题。而通过导出功能,你可以把每一次有价值的对话都变成永久的学习资料。现在就开始你的第一段对话吧,记得导出保存哦!
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
