DeepSeek-R1-Distill-Qwen-1.5B实战教程:对接RAG系统扩展本地知识问答能力
DeepSeek-R1-Distill-Qwen-1.5B实战教程对接RAG系统扩展本地知识问答能力1. 项目概述DeepSeek-R1-Distill-Qwen-1.5B是一个超轻量级的智能对话模型融合了DeepSeek优秀的逻辑推理能力和Qwen成熟的模型架构。经过蒸馏优化后模型在保留核心能力的同时大幅降低了计算资源需求仅1.5B的参数规模使其完美适配低显存GPU和轻量计算环境。本教程将指导您如何将这个强大的本地对话模型与RAG检索增强生成系统对接构建一个能够访问和利用本地知识库的智能问答系统。通过这种组合您可以突破模型本身的知识限制让AI助手能够基于您的专属文档和数据提供精准回答。2. 环境准备与快速部署2.1 系统要求在开始之前请确保您的系统满足以下要求Python 3.8或更高版本至少8GB系统内存GPU显存至少4GB推荐或纯CPU运行磁盘空间至少10GB用于存储模型和知识库2.2 安装依赖包pip install torch transformers streamlit sentence-transformers faiss-cpu langchain如果您使用GPU加速请安装对应的CUDA版本pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install faiss-gpu2.3 模型下载与配置模型文件通常存储在本地路径/root/ds_1.5b如果您还没有模型文件可以通过以下方式获取from transformers import AutoTokenizer, AutoModelForCausalLM # 下载并加载模型 model_name DeepSeek-R1-Distill-Qwen-1.5B tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name) # 保存到本地路径 model.save_pretrained(/root/ds_1.5b) tokenizer.save_pretrained(/root/ds_1.5b)3. RAG系统基础概念3.1 什么是RAG系统RAGRetrieval-Augmented Generation即检索增强生成是一种将信息检索与文本生成相结合的技术。它通过以下步骤工作检索从知识库中查找与问题相关的文档片段增强将检索到的信息与原始问题结合生成基于增强后的上下文生成最终回答这种方法让模型能够访问外部知识源大大扩展了其知识范围和回答准确性。3.2 为什么需要RAG单纯依赖预训练模型存在以下限制知识截止日期固定无法获取最新信息无法访问私有或特定领域的知识可能产生事实性错误或幻觉RAG系统通过引入外部知识库有效解决了这些问题。4. 构建本地知识库4.1 准备知识文档首先收集您想要让模型能够访问的文档这些可以是公司内部文档产品说明书技术文档常见问题解答任何其他相关文本资料将文档保存为txt、pdf或docx格式并统一存放在一个目录中。4.2 文档处理与向量化使用sentence-transformers将文档转换为向量表示from sentence_transformers import SentenceTransformer import numpy as np # 加载嵌入模型 embed_model SentenceTransformer(all-MiniLM-L6-v2) # 读取和处理文档 def process_documents(doc_paths): documents [] for path in doc_paths: with open(path, r, encodingutf-8) as f: content f.read() # 按段落分割 paragraphs [p for p in content.split(\n\n) if len(p.strip()) 50] documents.extend(paragraphs) return documents # 生成向量数据库 def create_vector_db(documents, embed_model): embeddings embed_model.encode(documents) return documents, embeddings # 保存向量数据库 doc_paths [doc1.txt, doc2.txt, doc3.txt] # 替换为您的文档路径 documents process_documents(doc_paths) documents, embeddings create_vector_db(documents, embed_model) # 保存到文件 np.save(knowledge_vectors.npy, embeddings) with open(knowledge_texts.txt, w, encodingutf-8) as f: for doc in documents: f.write(doc \n---\n)4.3 建立检索系统使用FAISS构建高效的向量检索系统import faiss import numpy as np def setup_faiss_index(embeddings): dimension embeddings.shape[1] index faiss.IndexFlatL2(dimension) index.add(embeddings) return index # 加载之前保存的向量 embeddings np.load(knowledge_vectors.npy) index setup_faiss_index(embeddings) # 检索相关文档 def retrieve_documents(query, embed_model, index, documents, top_k3): query_embedding embed_model.encode([query]) distances, indices index.search(query_embedding, top_k) results [] for i in indices[0]: results.append(documents[i]) return results5. 对接RAG与对话模型5.1 构建RAG增强的问答流程现在我们将RAG系统与DeepSeek模型对接from transformers import AutoTokenizer, AutoModelForCausalLM import torch # 加载对话模型 tokenizer AutoTokenizer.from_pretrained(/root/ds_1.5b) model AutoModelForCausalLM.from_pretrained(/root/ds_1.5b) def rag_enhanced_qa(question, embed_model, faiss_index, knowledge_docs, top_k3): # 检索相关知识 relevant_docs retrieve_documents(question, embed_model, faiss_index, knowledge_docs, top_k) # 构建增强的提示 context \n.join(relevant_docs) prompt f基于以下参考信息请回答用户的问题。如果参考信息中没有相关答案请根据你的知识回答。 参考信息 {context} 问题{question} 请先思考再回答 # 生成回答 inputs tokenizer(prompt, return_tensorspt) with torch.no_grad(): outputs model.generate( inputs.input_ids, max_new_tokens1024, temperature0.6, top_p0.95, do_sampleTrue, pad_token_idtokenizer.eos_token_id ) response tokenizer.decode(outputs[0], skip_special_tokensTrue) # 提取新生成的部分 response response[len(prompt):].strip() return response, relevant_docs5.2 优化提示工程为了获得更好的效果我们可以优化提示模板def build_enhanced_prompt(question, context_docs): context \n.join([f[参考{i1}] {doc} for i, doc in enumerate(context_docs)]) prompt f你是一个专业的助手请基于提供的参考信息回答用户问题。遵循以下规则 1. 仔细分析每个参考信息与问题的相关性 2. 如果参考信息能完全回答问题直接基于参考信息回答 3. 如果参考信息部分相关结合参考信息和自身知识回答 4. 如果参考信息完全不相关仅使用自身知识回答 5. 保持回答准确、简洁、有帮助 参考信息 {context} 用户问题{question} 请逐步思考然后给出最终答案 return prompt6. 完整系统集成6.1 创建Streamlit交互界面现在我们将所有组件集成到Streamlit界面中import streamlit as st import numpy as np import faiss from sentence_transformers import SentenceTransformer from transformers import AutoTokenizer, AutoModelForCausalLM import torch # 初始化session state if messages not in st.session_state: st.session_state.messages [] if knowledge_loaded not in st.session_state: st.session_state.knowledge_loaded False # 侧边栏配置 st.sidebar.title(配置选项) top_k st.sidebar.slider(检索文档数量, 1, 5, 3) temperature st.sidebar.slider(生成温度, 0.1, 1.0, 0.6) # 加载资源 st.cache_resource def load_resources(): # 加载嵌入模型 embed_model SentenceTransformer(all-MiniLM-L6-v2) # 加载向量数据库 embeddings np.load(knowledge_vectors.npy) with open(knowledge_texts.txt, r, encodingutf-8) as f: documents f.read().split(\n---\n) # 创建FAISS索引 dimension embeddings.shape[1] index faiss.IndexFlatL2(dimension) index.add(embeddings) # 加载对话模型 tokenizer AutoTokenizer.from_pretrained(/root/ds_1.5b) model AutoModelForCausalLM.from_pretrained(/root/ds_1.5b) return embed_model, index, documents, tokenizer, model # 主界面 st.title(DeepSeek-R1 RAG 智能问答系统) # 显示聊天记录 for message in st.session_state.messages: with st.chat_message(message[role]): st.markdown(message[content]) if sources in message: with st.expander(查看参考来源): for i, source in enumerate(message[sources]): st.write(f来源 {i1}: {source[:200]}...) # 用户输入 if prompt : st.chat_input(请输入您的问题...): # 添加用户消息 st.session_state.messages.append({role: user, content: prompt}) with st.chat_message(user): st.markdown(prompt) # 加载资源如果尚未加载 if not st.session_state.knowledge_loaded: with st.spinner(正在加载知识库和模型...): embed_model, index, documents, tokenizer, model load_resources() st.session_state.update({ embed_model: embed_model, index: index, documents: documents, tokenizer: tokenizer, model: model, knowledge_loaded: True }) # 生成回答 with st.chat_message(assistant): with st.spinner(正在检索和生成回答...): # 检索相关文档 query_embedding st.session_state.embed_model.encode([prompt]) distances, indices st.session_state.index.search(query_embedding, top_k) relevant_docs [] for i in indices[0]: relevant_docs.append(st.session_state.documents[i]) # 构建提示 context \n.join([f[参考{i1}] {doc} for i, doc in enumerate(relevant_docs)]) enhanced_prompt f基于以下参考信息回答用户问题。如果参考信息不相关请基于自身知识回答。 参考信息 {context} 问题{prompt} 请先思考再回答 # 生成回答 inputs st.session_state.tokenizer(enhanced_prompt, return_tensorspt) with torch.no_grad(): outputs st.session_state.model.generate( inputs.input_ids, max_new_tokens1024, temperaturetemperature, top_p0.95, do_sampleTrue, pad_token_idst.session_state.tokenizer.eos_token_id ) response st.session_state.tokenizer.decode(outputs[0], skip_special_tokensTrue) response response[len(enhanced_prompt):].strip() # 显示回答和来源 st.markdown(response) with st.expander(查看参考来源): for i, doc in enumerate(relevant_docs): st.write(f来源 {i1}: {doc[:200]}...) # 保存到历史 st.session_state.messages.append({ role: assistant, content: response, sources: relevant_docs }) # 清空对话按钮 if st.sidebar.button(清空对话历史): st.session_state.messages [] st.rerun()6.2 系统优化建议为了获得更好的性能体验可以考虑以下优化措施内存优化# 使用更轻量的嵌入模型 embed_model SentenceTransformer(all-MiniLM-L6-v2) # 模型量化加载 model AutoModelForCausalLM.from_pretrained( /root/ds_1.5b, torch_dtypetorch.float16, device_mapauto )检索优化# 使用更高效的索引 index faiss.IndexIVFFlat(faiss.IndexFlatL2(dimension), dimension, 100) index.train(embeddings) index.add(embeddings)7. 实际应用案例7.1 企业内部知识问答假设您有一家科技公司可以将以下文档纳入知识库产品开发文档客户常见问题技术白皮书市场研究报告员工可以直接向系统提问如我们产品X的主要技术特点是什么系统会从内部文档中检索相关信息并生成准确回答。7.2 学术研究助手研究人员可以将论文库、实验数据、研究方法文档导入系统然后询问关于神经网络优化方法的最新研究进展有哪些系统会从学术文献中提取相关信息。7.3 客户支持系统将产品手册、故障排除指南、客户案例等文档纳入系统客户支持团队可以快速获取准确信息提高服务效率。8. 总结通过本教程您已经学会了如何将DeepSeek-R1-Distill-Qwen-1.5B模型与RAG系统对接构建一个强大的本地知识问答系统。这种组合方案具有以下优势知识实时性可以随时更新知识库保持信息的最新性领域特异性能够针对特定领域或企业需求进行定制数据安全性所有处理和问答都在本地完成保障数据隐私成本效益利用轻量级模型实现高质量问答降低计算成本可解释性可以查看回答所依据的参考来源增强可信度实际部署时建议根据具体需求调整检索策略、提示模板和生成参数以获得最佳效果。这种架构不仅适用于文本问答还可以扩展到多模态检索、代码检索等多种场景。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻

LoRA微调实战:5步搞定LLM模型定制化(附代码示例)

LoRA微调实战:5步搞定LLM模型定制化(附代码示例)

LoRA微调实战:5步搞定LLM模型定制化(附代码示例) 最近和几个做AI应用的朋友聊天,大家普遍有个痛点:手里攥着动辄几十亿参数的“巨无霸”大模型,比如Llama或者ChatGLM,想让它干点自己业务上的活儿…

2026/7/5 12:39:52 阅读更多 →
Qwen3-ASR实测:高精度识别中英文,支持实时录音转文字

Qwen3-ASR实测:高精度识别中英文,支持实时录音转文字

Qwen3-ASR实测:高精度识别中英文,支持实时录音转文字 1. 为什么你需要一个真正好用的本地语音转文字工具? 你有没有过这样的经历: 会议刚结束,满桌笔记却漏记关键结论; 采访录音堆了十几条,手…

2026/5/17 4:52:34 阅读更多 →
OpenClaw本地部署避坑:nanobot常见Permission Denied与CUDA版本兼容问题

OpenClaw本地部署避坑:nanobot常见Permission Denied与CUDA版本兼容问题

OpenClaw本地部署避坑:nanobot常见Permission Denied与CUDA版本兼容问题 1. nanobot简介与核心优势 nanobot是一款受OpenClaw启发的超轻量级个人人工智能助手,仅需约4000行代码即可提供核心代理功能,比同类解决方案的430k多行代码精简99%。…

2026/7/4 0:40:44 阅读更多 →

最新新闻

OpenCV形态学实战:从腐蚀膨胀到开闭运算,解锁图像处理核心技能

OpenCV形态学实战:从腐蚀膨胀到开闭运算,解锁图像处理核心技能

1. 形态学操作:图像处理的"外科手术刀"第一次接触OpenCV的形态学操作时,我正处理一批医学显微图像。那些粘连在一起的血细胞就像煮过头的饺子,完全分不清个数。导师当时说:"试试形态学操作吧,这是图像处…

2026/7/5 12:39:52 阅读更多 →
目标检测实战:从理论到实践攻克小目标与遮挡难题

目标检测实战:从理论到实践攻克小目标与遮挡难题

1. 小目标检测的挑战与核心问题小目标检测一直是计算机视觉领域的难点问题。在实际项目中,我们经常会遇到无人机航拍图像中的车辆、工厂流水线上的微小零件,或是监控摄像头中远距离的行人。这些目标在图像中往往只占据几十甚至几个像素,给检测…

2026/7/5 12:39:52 阅读更多 →
YOLOv8结合PointRend提升小目标分割精度实战

YOLOv8结合PointRend提升小目标分割精度实战

1. 项目概述:当YOLOv8遇上小目标分割难题在计算机视觉的实际工程应用中,小目标分割一直是个令人头疼的问题。想象一下在卫星图像中识别车辆、在工业质检中检测微小缺陷,或者在医学影像中分割细胞核——这些场景中的目标往往只占图像的几十甚至…

2026/7/5 12:37:52 阅读更多 →
模特ai图如何高效生成?多平台快速制作技巧分享

模特ai图如何高效生成?多平台快速制作技巧分享

在电商行业,模特ai图的高效生成已成为商品展示的核心环节。随着AI技术的发展,各类平台助力模特图自动化处理,让从业者效率显著提升。 本文将系统介绍多款相关平台的主要功能与适配优势,帮助你深入了解模特ai图制作的实际场景与选…

2026/7/5 12:35:51 阅读更多 →
AI推理服务Invalid Argument错误:构建健壮数据校验与预处理流水线

AI推理服务Invalid Argument错误:构建健壮数据校验与预处理流水线

1. 项目概述:从一次深夜告警说起凌晨两点,手机突然震动,监控告警提示线上AI推理服务大面积报错,错误信息赫然是“Invalid Argument”。相信不少负责模型部署和线上服务的同行都经历过这种心跳加速的时刻。这个错误看似简单&#x…

2026/7/5 12:33:50 阅读更多 →
Carsim中构建多车道动态交通流与智能车辆交互场景

Carsim中构建多车道动态交通流与智能车辆交互场景

1. Carsim多车道动态交通流搭建基础在智能驾驶算法开发过程中,真实还原多车道交通环境是验证ADAS功能的关键。Carsim作为行业标准的车辆动力学仿真平台,其ADAS模块提供了高度灵活的交通场景构建能力。我最近在测试ACC自适应巡航功能时,就遇到…

2026/7/5 12:33:50 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻