前言
在大模型应用开发的浪潮中,将强大的大语言模型与灵活的开发框架相结合,能为开发者开启无限可能。本文将详细阐述如何基于DeepSeek-R1-Distill-Qwen大模型与LangChain框架进行本地大模型应用开发,从基础环境搭建到实际应用演示,为你提供全面且深入的指导。无论你是想探索大模型应用开发的新手,还是寻求优化现有项目的资深开发者,都能在本文中找到有价值的内容。
一、环境配置要求
为了高效部署 DeepSeek-R1-Distill-Qwen,推荐使用 Ubuntu 22.04 LTS 操作系统、Python 3.12 环境、CUDA 12.1 与 PyTorch 2.3.0,并配备至少 24GB 显存的 NVIDIA GPU,以确保模型推理的高性能和稳定性。
二、安装相关依赖
# 升级pip并配置清华镜像源
python -m pip install --upgrade pip
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 安装依赖包(指定版本)
pip install transformers==4.48.2 \
huggingface-hub==0.28.1 \
accelerate==1.3.0 \
modelscope==1.22.3 \
langchain==0.3.17
首先,将pip升级到最新版本,这样可以获取pip的最新功能和特性,确保后续依赖包的安装过程更加稳定和高效。接着,将pip源配置为清华大学的镜像源https://pypi.tuna.tsinghua.edu.cn/simple
,清华大学的镜像源拥有丰富的资源和快速的下载速度,能够大大缩短依赖包的下载时间。
三、下载模型文件
from modelscope import snapshot_download
# 下载预训练模型并指定缓存路径
model_dir = snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-7B', cache_dir='/root/autodl-tmp', revision='master')
在代码中使用modelscope
库的snapshot_download
函数来下载模型。model_id
指定为deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
,这是模型在ModelScope平台上的唯一标识符。cache_dir
参数指定模型的缓存路径,这里设置为/root/autodl-tmp
,用户可以根据自己的实际需求进行修改。revision
参数指定模型的版本,master
表示使用最新版本。在下载模型时,要确保网络连接稳定,路径设置正确,否则可能会导致下载失败。
执行上述命令后,模型将开始下载并存储到指定的路径。下载过程可能需要一些时间,具体取决于网络速度和模型大小。在下载完成后,模型就可以用于后续的应用开发了。
四、LangChain自定义LLM类实现
创建LLM.py
文件实现模型接入:
from langchain.llms.base import LLM
from typing import Any, List, Optional
from langchain.callbacks.manager import CallbackManagerForLLMRun
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
import torch
class DeepSeek_R1_Distill_Qwen_LLM(LLM):
# 基于本地 DeepSeek_R1_Distill_Qwen 自定义 LLM 类
tokenizer: AutoTokenizer = None
model: AutoModelForCausalLM = None
def __init__(self, mode_name_or_path :str):
super().__init__()
print("正在从本地加载模型...")
self.tokenizer = AutoTokenizer.from_pretrained(mode_name_or_path, use_fast=False)
self.model = AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtype=torch.bfloat16, device_map="auto")
self.model.generation_config = GenerationConfig.from_pretrained(mode_name_or_path)
print("完成本地模型的加载")
def _call(self, prompt : str, stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any):
messages = [{"role": "user", "content": prompt }]
input_ids = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
model_inputs = self.tokenizer([input_ids], return_tensors="pt").to('cuda')
generated_ids = self.model.generate(model_inputs.input_ids, attention_mask=model_inputs['attention_mask'], max_new_tokens=8192) # 思考需要输出更多的Token数,设为8K
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = self.tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
return response
@property
def _llm_type(self) -> str:
return "DeepSeek_R1_Distill_Qwen_LLM"
在LLM.py
文件中,定义了一个自定义的DeepSeek_R1_Distill_Qwen_LLM
类,它继承自langchain.llms.base
中的LLM
类。在__init__
方法中,初始化了模型的分词器和模型本体,设置了模型的数据类型为torch.bfloat16
,并自动分配设备。_call
方法则实现了模型的推理过程,接收用户的提示词,经过一系列处理后,返回模型生成的回答。_llm_type
属性则返回模型的类型,用于标识自定义的模型。
五、应用实例演示
1. LLM体验测试
from LLM import DeepSeek_R1_Distill_Qwen_LLM
llm = DeepSeek_R1_Distill_Qwen_LLM(mode_name_or_path = "/root/autodl-tmp/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B")
response = llm("你是谁?")
response
代码执行如下:
2. 内容分割测试
将模型的回答解析为思考过程和最终回答
import re
text = '''您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。
</think>
您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。'''
# pattern = re.compile(r'<think>(.*?)</think>(.*)', re.DOTALL)
pattern = re.compile(r'(.*?)</think>(.*)', re.DOTALL)
match = pattern.search(text)
if match:
print("匹配成功!")
print("捕获组1:", match.group(1)) # <think>...</think>之间的内容
print("捕获组2:", match.group(2)) # </think>之后的内容
else:
print("匹配失败!")
测试如下:
3. 封装split_text方法
接下来,我们通过split_text方法将模型的回答解析为思考过程和最终回答,分别进行打印展示。
import re
# 文本分割函数
def split_text(text):
#pattern = re.compile(r'<think>(.*?)</think>(.*)', re.DOTALL) # 定义正则表达式模式
pattern = re.compile(r'(.*?)</think>(.*)', re.DOTALL)
match = pattern.search(text) # 匹配 <think>思考过程</think>回答
if match: # 如果匹配到思考过程
think_content = match.group(1).strip() # 获取思考过程
answer_content = match.group(2).strip() # 获取回答
else:
think_content = "" # 如果没有匹配到思考过程,则设置为空字符串
answer_content = text.strip() # 直接返回回答
return think_content, answer_content
response = llm("你是谁?")
think, answer = split_text(response)
print(f"{'-'*20} 思考过程 {'-'*20}")
print(think)
print(f"\n{'-'*20} 最终回答 {'-'*20}")
print(answer)
打印结果如下:
-------------------- 思考过程 --------------------
您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。
-------------------- 最终回答 --------------------
您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。
4. 深度思考提问
response = llm("我有6个苹果,吃了1个,送给了你2个,掉3个还剩多少个?")
think, answer = split_text(response)
print(f"{'-'*20} 思考过程 {'-'*20}")
print(think)
print(f"\n{'-'*20} 最终回答 {'-'*20}")
print(answer)
打印结果如下:
-------------------- 思考过程 --------------------
首先,我有6个苹果。
我吃掉了1个苹果,剩下5个。
然后,我送了你2个苹果,剩下3个。
接着,苹果掉了3个,所以剩下的苹果数量减少了3个。
最后,我剩下0个苹果。
-------------------- 最终回答 --------------------
**解答:**
1. **初始苹果数量:**
\[
6 \text{个}
\]
2. **吃掉1个苹果:**
\[
6 - 1 = 5 \text{个}
\]
3. **送给对方2个苹果:**
\[
5 - 2 = 3 \text{个}
\]
4. **苹果掉落地掉3个:**
\[
3 - 3 = 0 \text{个}
\]
**最终剩下的苹果数量:**
\[
\boxed{0}
\]
六、常见问题
1. 路径配置问题
需确保cache_dir
和mode_name_or_path
参数指向正确的本地路径。路径配置错误可能导致模型无法正确下载或加载,从而使应用无法正常运行。在设置路径时,要仔细检查路径的准确性,包括目录结构和文件名的拼写。
2. CUDA内存不足
可尝试降低max_new_tokens
参数值或使用低精度模式。当模型在推理过程中出现CUDA内存不足的情况时,说明当前的参数设置超出了GPU的内存承受能力。降低max_new_tokens
参数值可以减少模型生成的文本长度,从而降低内存需求。使用低精度模式,如torch.bfloat16
,可以在一定程度上减少内存占用,提高模型的运行效率。
3. 环境依赖冲突
建议使用我们提供的预配置镜像环境。环境依赖冲突是开发过程中常见的问题,不同库之间的版本兼容性可能会导致各种错误。使用预配置的镜像环境可以避免这些问题,因为镜像环境已经经过测试和优化,确保了各个依赖库之间的兼容性。
结语
本文完整地实现了DeepSeek-R1大模型的本地部署与LangChain框架的集成,为开发者提供了一个坚实的基础。在此基础上,开发者可以快速构建如RAG应用、智能助手等各种AI应用。在开发过程中,遇到问题不要气馁,多参考文档和社区资源,相信你一定能创造出令人惊艳的大模型应用。欢迎在评论区分享你的开发经验和遇到的问题,让我们一起交流进步!
如何学习AI大模型 ?
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。【保证100%免费】🆓
CSDN粉丝独家福利
这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】
读者福利: 👉👉CSDN大礼包:《最新AI大模型学习资源包》免费分享 👈👈
对于0基础小白入门:
如果你是零基础小白,想快速入门大模型是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
👉1.大模型入门学习思维导图👈
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)
👉2.AGI大模型配套视频👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。
👉3.大模型实际应用报告合集👈
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)
👉4.大模型落地应用案例PPT👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(全套教程文末领取哈)
👉5.大模型经典学习电子书👈
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)
👉6.大模型面试题&答案👈
截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习
CSDN粉丝独家福利
这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】
读者福利: 👉👉CSDN大礼包:《最新AI大模型学习资源包》免费分享 👈👈