DeepSeek-7B-chat 接入 LangChain:基于本地大模型自定义 LLM 类与 RAG 知识库实战

发布时间:2026/9/11 19:24:52
DeepSeek-7B-chat 接入 LangChain:基于本地大模型自定义 LLM 类与 RAG 知识库实战 DeepSeek-7B-chat 接入 LangChain基于本地大模型自定义 LLM 类与 RAG 知识库实战【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm导读本文基于《开源大模型食用指南》self-llm仓库中 models/DeepSeek/02-DeepSeek-7B-chat langchain.md 的完整实操内容展开讲解如何把本地部署的 DeepSeek-7B-chat 通过继承 LangChain 的LLM基类封装为自定义 LLM从而以统一的 LangChain 接口驱动国产开源大模型。读完本文你将掌握自定义 LLM 类的完整实现原理、调用方式并能将其无缝接入到检索问答RAG知识库与 Gradio Web Demo 的完整应用链路中。一、为什么要把 DeepSeek-7B-chat 接入 LangChainDeepSeek-7B-chat 是一个由 70 亿参数组成、在约 2 万亿 token 中英文数据集上从零训练的对话模型详见 models/DeepSeek/01-DeepSeek-7B-chat FastApi.md。直接调用模型时我们通常需要手写分词、构造 messages、调用generate、解码输出等一系列底层逻辑而 LangChain 为构建 LLM 应用提供了统一的抽象层包含文档加载、文本分割、向量化、检索、Prompt 模板、Chain 等丰富的组件。为便捷构建 LLM 应用我们需要基于本地部署的 DeepSeek-7B-chat自定义一个 LLM 类将 DeepSeek-7B-chat 接入到 LangChain 框架中。完成自定义 LLM 类之后可以以完全一致的方式调用 LangChain 的接口而无需考虑底层模型调用的不一致。换句话说只要自定义类实现了 LangChain 约定的接口上层代码如RetrievalQA、PromptTemplate、Agent 等就不需要感知底层模型是 InternLM、DeepSeek 还是其他模型。本文聚焦于 DeepSeek-7B-chat 与 LangChainLLM模块的对接关于向量数据库构建与 Gradio Web 界面的完整细节原文档指向仓库中的 models/InternLM/06-InternLM接入LangChain搭建知识库助手.md 模块本文将在最后部分结合该模块仓库源码给出可复用的扩展方案。二、环境准备安装 LangChain 依赖除了需要安装模型的运行依赖之外还需要安装 langchain 依赖。原文档明确要求固定版本pip install langchain0.0.292这里固定版本是有原因的LangChain 在 0.0.292 这个版本中langchain.llms.base.LLM、langchain.callbacks.manager.CallbackManagerForLLMRun等导入路径仍然可用与下文自定义类中的 import 语句一一对应。后续 LangChain 经历了多次 API 重构新版中部分导入路径已发生变化因此建议严格按本教程锁定的版本操作。模型的运行依赖在 01-DeepSeek-7B-chat FastApi.md 中有完整列表包括pip install modelscope1.9.5 pip install transformers4.35.2 pip install sentencepiece0.1.99 pip install accelerate0.24.1 pip install transformers_stream_generator0.0.4其中transformers、sentencepiece、accelerate负责模型加载与推理modelscope用于从 ModelScope 下载模型权重。三、模型下载与路径约定模型使用 ModelScope 的snapshot_download函数下载第一个参数为模型名称参数cache_dir为模型的下载路径import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer from modelscope import GenerationConfig model_dir snapshot_download(deepseek-ai/deepseek-llm-7b-chat, cache_dir/root/autodl-tmp, revisionmaster)模型下载完成后约定路径为/root/autodl-tmp/deepseek-ai/deepseek-llm-7b-chat后续所有代码均使用该路径加载模型与分词器。本文所有示例基于 AutoDL 平台的 309024G 显存等机器运行镜像选择 PyTorch 2.0.0、Python 3.8、CUDA 11.8 及以上版本即可。四、核心实现基于 LangChain 基类自定义 DeepSeek_LLM4.1 自定义 LLM 类的机制原理基于本地部署的 DeepSeek-7B-chat 自定义 LLM 类并不复杂我们只需从langchain.llms.base.LLM类继承一个子类并重写构造函数与_call函数即可构造函数__init__在对象实例化的一开始加载本地模型从而避免每一次调用都需要重新加载模型带来的时间开销_call函数这是 LLM 类的核心函数LangChain 会调用该函数来真正执行模型推理我们需要在其中实现输入 prompt → 模型生成 → 返回响应文本的完整逻辑_llm_type属性返回一个字符串标识用于区分 LLM 类型。4.2 DeepSeek_LLM 完整代码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_LLM(LLM): # 基于本地 DeepSeek 自定义 LLM 类 tokenizer : AutoTokenizer None model: AutoModelForCausalLM None def __init__(self, model_path :str): # model_path: DeepSeek 模型路径 # 从本地初始化模型 super().__init__() print(正在从本地加载模型...) self.tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) self.model AutoModelForCausalLM.from_pretrained(model_path, trust_remote_codeTrue,torch_dtypetorch.bfloat16, device_mapauto) self.model.generation_config GenerationConfig.from_pretrained(model_path) self.model.generation_config.pad_token_id self.model.generation_config.eos_token_id self.model self.model.eval() print(完成本地模型的加载) def _call(self, prompt : str, stop: Optional[List[str]] None, run_manager: Optional[CallbackManagerForLLMRun] None, **kwargs: Any): # 重写调用函数 messages [ {role: user, content: prompt} ] # 构建输入 input_tensor self.tokenizer.apply_chat_template(messages, add_generation_promptTrue, return_tensorspt) # 通过模型获得输出 outputs self.model.generate(input_tensor.to(self.model.device), max_new_tokens100) response self.tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokensTrue) return response property def _llm_type(self) - str: return DeepSeek_LLM4.3 逐段拆解实现细节模型加载阶段构造函数AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue)加载分词器。DeepSeek 使用了自定义模型代码因此需要开启trust_remote_codeTrueAutoModelForCausalLM.from_pretrained(..., torch_dtypetorch.bfloat16, device_mapauto)以 bfloat16 精度加载因果语言模型device_mapauto让框架自动分配设备GPU/CPU这也是 24G 显存可以运行 7B 模型的关键配置GenerationConfig.from_pretrained(model_path)加载随模型权重一起发布的生成配置如 temperature、top_p 等self.model.generation_config.pad_token_id self.model.generation_config.eos_token_id将 pad_token_id 设置为 eos_token_id。因为 DeepSeek 的分词器中 pad token 可能未显式定义若不设置批量/流式生成时可能因 pad token 缺失而报错self.model.eval()切换为评估模式关闭 dropout 等训练期行为。推理阶段_call 函数messages以 OpenAI 风格的对话消息列表组织输入apply_chat_template(messages, add_generation_promptTrue, return_tensorspt)将消息列表套用模型的对话模板追加生成提示符如begin▁of▁sentenceDelpher:之类的角色引导符并直接返回 PyTorch 张量model.generate(input_tensor.to(self.model.device), max_new_tokens100)在模型所在设备上进行生成max_new_tokens100控制新生成的 token 数量上限可根据需要调大tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokensTrue)解码时通过input_tensor.shape[1]切掉输入部分只保留新生成的 token并跳过特殊 token得到最终响应文本。值得注意的是_call的函数签名中保留了stop: Optional[List[str]]与run_manager: Optional[CallbackManagerForLLMRun]两个参数。前者用于指定停止词后者用于 LangChain 回调系统如日志、Token 用量统计它们是 LangChain 基类接口的一部分保持签名兼容可以确保自定义类能够被 LangChain 的各种 Chain 组件正常调用。4.4 与 InternLM 自定义类的对比仓库源码佐证仓库中 models/InternLM/06-InternLM接入LangChain搭建知识库助手/LLM.py 提供了同构的InternLM_LLM实现两者结构完全一致继承LLM、重写__init__与_call、实现_llm_type核心差异在于_call内部的推理方式InternLM 版调用self.model.chat(self.tokenizer, prompt, history[])由模型自带的高层chat接口管理对话模板DeepSeek 版显式使用apply_chat_templatemodel.generate更贴近 transformers 底层推理流程。这印证了完成自定义 LLM 类之后可以以完全一致的方式调用 LangChain 的接口而无需考虑底层模型调用的不一致这一设计目标不同模型只需在自己的_call里适配底层 API上层调用方完全无感。五、调用与验证将上述自定义类保存为脚本如deepseek_llm.py后即可像使用任何其他的 LangChain 大模型功能一样使用llm DeepSeek_LLM(/root/autodl-tmp/deepseek-ai/deepseek-llm-7b-chat) llm(你好)运行后终端首先打印正在从本地加载模型...随后显示Loading checkpoint shards: 100%的分片加载进度条模型分 2 个 shard 加载加载完成提示完成本地模型的加载紧接着调用llm(你好)模型返回你好有什么我可以帮助你的吗。除了直接llm(你好)调用LangChain 还提供了llm.predict(你是谁)等封装方法见 models/InternLM/06-InternLM接入LangChain搭建知识库助手.md 中的用法示例二者最终都会路由到我们重写的_call函数。六、进阶将 DeepSeek 接入 RAG 知识库助手原文档明确指出对接向量数据库和 Gradio 的部分参考 models/InternLM/06-InternLM接入LangChain搭建知识库助手.md 模块。由于自定义 LLM 类已经屏蔽了底层差异我们只需把该模块中基于 InternLM 的实现替换为DeepSeek_LLM即可构建基于 DeepSeek 的检索增强问答系统。下面结合该模块的仓库源码梳理完整链路。6.1 构建向量知识库参考 models/InternLM/06-InternLM接入LangChain搭建知识库助手/creat_db.py知识库构建分四步收集语料文件路径 → 加载并解析文本 → 分块 → 向量化并持久化。from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.vectorstores import Chroma from langchain.embeddings.huggingface import HuggingFaceEmbeddings # 对文本进行分块chunk_size500chunk_overlap150 text_splitter RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap150) split_docs text_splitter.split_documents(docs) # 加载开源词向量模型 embeddings HuggingFaceEmbeddings(model_name/root/autodl-tmp/embedding_model) # 构建并持久化向量数据库 persist_directory data_base/vector_db/chroma vectordb Chroma.from_documents( documentssplit_docs, embeddingembeddings, persist_directorypersist_directory ) vectordb.persist()其中的docs由UnstructuredMarkdownLoader/UnstructuredFileLoader加载.md/.txt文件得到语料来源为 OpenCompass、lmdeploy、Xtuner 等大模型工具仓库克隆到本地后的文档文件。依赖包包括pip install gradio4.4.0 pip install chromadb0.4.15 pip install sentence-transformers2.2.2 pip install unstructured0.10.30 pip install markdown3.3.76.2 用 DeepSeek 替换底层 LLM 构建检索问答链在 models/InternLM/06-InternLM接入LangChain搭建知识库助手.md 中构建检索问答链的完整流程为加载向量数据库 → 实例化自定义 LLM → 定义 Prompt 模板 → 构造RetrievalQAfrom langchain.vectorstores import Chroma from langchain.embeddings.huggingface import HuggingFaceEmbeddings from langchain.prompts import PromptTemplate from langchain.chains import RetrievalQA from deepseek_llm import DeepSeek_LLM # 仅需替换这里的导入 # 加载向量数据库 embeddings HuggingFaceEmbeddings(model_name/root/autodl-tmp/embedding_model) vectordb Chroma(persist_directorydata_base/vector_db/chroma, embedding_functionembeddings) # 实例化 DeepSeek 自定义 LLM替换原 InternLM_LLM llm DeepSeek_LLM(model_path/root/autodl-tmp/deepseek-ai/deepseek-llm-7b-chat) # Prompt 模板context 变量会在检索后被相关文档片段填充 template 使用以下上下文来回答最后的问题。如果你不知道答案就说你不知道不要试图编造答案。尽量使答案简明扼要。总是在回答的最后说谢谢你的提问。 {context} 问题: {question} 有用的回答: QA_CHAIN_PROMPT PromptTemplate(input_variables[context, question], templatetemplate) # 构建检索问答链 qa_chain RetrievalQA.from_chain_type( llm, retrievervectordb.as_retriever(), return_source_documentsTrue, chain_type_kwargs{prompt: QA_CHAIN_PROMPT} ) # 对比测试检索问答链 vs 纯 LLM result qa_chain({query: 什么是InternLM}) print(result[result]) result_2 llm(什么是InternLM) print(result_2)这里可以看到自定义 LLM 类的价值RetrievalQA的构造代码完全不需要改动唯一的变化是把InternLM_LLM(model_path...)换成DeepSeek_LLM(model_path...)LangChain会自动完成用户提问 → 语义检索 → 填充 Prompt → 交给 LLM 问答的全流程。6.3 部署 Gradio Web DemoWeb 界面部分可参考 models/InternLM/06-InternLM接入LangChain搭建知识库助手/run_gradio.py 的实现模式将加载问答链封装为load_chain()函数在 Gradio 启动第一时间调用并缓存 chain 对象避免重复加载模型再定义一个Model_center类负责存储 chain 并响应界面点击事件class Model_center(): def __init__(self): self.chain load_chain() # load_chain 内部实例化 DeepSeek_LLM def qa_chain_self_answer(self, question: str, chat_history: list []): if question None or len(question) 1: return , chat_history try: chat_history.append((question, self.chain({query: question})[result])) return , chat_history except Exception as e: return e, chat_history def clear_history(self): self.chain.clear_history()随后用gr.Blocks()创建聊天界面将Chat按钮的点击事件绑定到qa_chain_self_answer最后demo.launch()启动服务默认 7860 端口通过 AutoDL 端口映射到本地即可访问。七、常见问题与注意事项版本强约束本教程的代码基于langchain0.0.292其中langchain.llms.base.LLM、langchain.callbacks.manager.CallbackManagerForLLMRun、langchain.vectorstores、langchain.embeddings.huggingface、langchain.chains等导入路径在更新的 LangChain 版本中可能被重构或迁移如遇导入失败请先核对版本。显存与精度7B 模型以torch.bfloat16加载并配合device_mapauto24G 显存如 3090即可运行显存不足时可参考仓库中 models/DeepSeek/05-DeepSeek-7B-chat 4bits量化 Qlora 微调.md 的量化方案。pad_token_id 设置model.generation_config.pad_token_id model.generation_config.eos_token_id这行不能省略DeepSeek 分词器的 pad token 需要显式指定否则部分生成场景会报错。max_new_tokens 调节_call中固定为max_new_tokens100回答较长时可能被截断可根据实际场景调大更灵活的做法是接收kwargs中的参数并透传给generate。多轮对话支持本教程的自定义类当前仅将单条prompt包装为单轮 user 消息若需多轮对话可在_call中扩展接收历史消息列表并整体传入apply_chat_template参考 models/DeepSeek/03-DeepSeek-7B-chat WebDemo.md 中基于st.session_state.messages维护完整对话历史的做法。总结本文完整复现并深化了 models/DeepSeek/02-DeepSeek-7B-chat langchain.md 的核心内容通过继承langchain.llms.base.LLM、重写__init__与_call将本地 DeepSeek-7B-chat 封装为 LangChain 可统一调用的自定义 LLM并结合仓库中 InternLM 知识库模块的 LLM.py、creat_db.py、run_gradio.py 源码演示了如何将 DeepSeek 无缝替换进 RAG 检索问答链与 Gradio Web Demo。掌握了这套自定义 LLM 类模式任何本地部署的开源模型都能以统一接口接入 LangChain 生态快速构建知识库助手、Agent 等上层应用。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考