DeepSeek-R1-Distill-Qwen-1.5B实战教程:如何扩展支持文件上传与内容问答
1. 项目概述
DeepSeek-R1-Distill-Qwen-1.5B是一个基于Streamlit框架构建的本地化智能对话系统,核心模型采用了魔塔平台下载量领先的轻量级蒸馏模型。这个1.5B参数的模型完美平衡了推理能力与计算效率,特别适合在资源有限的环境下部署。
项目最初仅支持纯文本对话,本文将详细介绍如何为其扩展文件上传与内容问答功能,让这个轻量级助手具备处理文档内容的能力。
2. 环境准备与快速部署
2.1 基础环境要求
确保你的系统满足以下条件:
- Python 3.8+
- PyTorch 2.0+
- CUDA 11.7+(如需GPU加速)
- 至少8GB内存
- 4GB以上显存(GPU环境)
2.2 一键安装依赖
pip install streamlit transformers python-dotx pypdf2 sentencepiece2.3 模型快速加载
在项目根目录创建model_loader.py,添加以下代码:
from transformers import AutoModelForCausalLM, AutoTokenizer import torch def load_model(): model_path = "/root/ds_1.5b" tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForCausalLM.from_pretrained( model_path, device_map="auto", torch_dtype="auto" ) return model, tokenizer3. 文件上传功能实现
3.1 支持的文件类型
我们扩展支持以下常见文档格式:
- PDF (.pdf)
- Word (.docx)
- 纯文本 (.txt)
- Markdown (.md)
3.2 Streamlit文件上传组件
在main.py中添加文件上传界面:
import streamlit as st from file_processor import process_uploaded_file uploaded_file = st.file_uploader( "上传文档(PDF/Word/TXT)", type=["pdf", "docx", "txt", "md"] ) if uploaded_file: text_content = process_uploaded_file(uploaded_file) st.session_state['document_content'] = text_content3.3 文件内容解析
创建file_processor.py处理上传文件:
from PyPDF2 import PdfReader from docx import Document def process_uploaded_file(file): content = "" if file.type == "application/pdf": reader = PdfReader(file) for page in reader.pages: content += page.extract_text() elif file.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document": doc = Document(file) content = "\n".join([para.text for para in doc.paragraphs]) else: # txt/md content = file.getvalue().decode("utf-8") return content4. 文档内容问答功能
4.1 问答系统架构
我们采用"检索+生成"的混合架构:
- 文档解析:提取文本内容并分块
- 向量存储:使用轻量级FAISS索引
- 语义检索:找到相关文本片段
- 生成回答:基于检索内容生成最终回答
4.2 实现代码
创建qa_system.py:
from sentence_transformers import SentenceTransformer import faiss import numpy as np class DocumentQA: def __init__(self): self.encoder = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') self.index = None self.chunks = [] def build_index(self, text): self.chunks = self._split_text(text) embeddings = self.encoder.encode(self.chunks) self.index = faiss.IndexFlatL2(embeddings.shape[1]) self.index.add(embeddings) def query(self, question, k=3): query_embed = self.encoder.encode([question]) _, indices = self.index.search(query_embed, k) return [self.chunks[i] for i in indices[0]] def _split_text(self, text, chunk_size=500): words = text.split() return [' '.join(words[i:i+chunk_size]) for i in range(0, len(words), chunk_size)]4.3 集成到对话系统
修改主程序集成问答功能:
from qa_system import DocumentQA if 'document_content' in st.session_state: if 'qa' not in st.session_state: st.session_state.qa = DocumentQA() st.session_state.qa.build_index(st.session_state.document_content) user_input = st.chat_input("基于文档提问...") if user_input: relevant_chunks = st.session_state.qa.query(user_input) context = "\n".join(relevant_chunks) prompt = f"根据以下上下文回答问题:\n{context}\n\n问题:{user_input}" with st.spinner("思考中..."): response = generate_response(prompt) # 使用原有生成函数 st.write(response)5. 功能优化与实用技巧
5.1 性能优化建议
- 预加载模型:在应用启动时预加载问答模型
@st.cache_resource def load_qa_model(): return SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')- 分块策略优化:按段落而非固定字数分块
def _split_text(self, text): paragraphs = [p for p in text.split('\n') if p.strip()] return paragraphs5.2 用户体验增强
- 添加文档预览功能:
if 'document_content' in st.session_state: with st.expander("文档预览"): st.text(st.session_state.document_content[:1000] + "...")- 实现多文档管理:
if st.button("清除当前文档"): if 'document_content' in st.session_state: del st.session_state.document_content if 'qa' in st.session_state: del st.session_state.qa6. 总结与下一步
通过本教程,我们为DeepSeek-R1-Distill-Qwen-1.5B对话系统添加了实用的文件处理能力。现在这个轻量级模型可以:
- 解析上传的PDF、Word等文档
- 建立高效的语义检索索引
- 基于文档内容生成准确回答
- 保持原有的优秀对话体验
下一步改进方向:
- 支持更多文件格式(如PPT、Excel)
- 添加文档摘要生成功能
- 实现多文档联合问答
- 优化长文档处理性能
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。