Qwen2.5-7B-Instruct 接入 LangChain:基于本地模型自定义 LLM 类的完整实战指南

发布时间:2026/9/12 16:25:56
Qwen2.5-7B-Instruct 接入 LangChain:基于本地模型自定义 LLM 类的完整实战指南 Qwen2.5-7B-Instruct 接入 LangChain基于本地模型自定义 LLM 类的完整实战指南【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm导读本篇指南基于《开源大模型食用指南》仓库中 Qwen2.5 系列教程完整演示如何将本地部署的 Qwen2.5-7B-Instruct 模型通过自定义LLM类接入 LangChain 框架。你将掌握从环境搭建、ModelScope 模型下载到继承langchain.llms.base.LLM重写构造器与_call方法、最终以统一接口调用模型的全流程为后续构建知识库问答、Agent 等应用打下基础。为什么需要将 Qwen2.5 接入 LangChainQwen2.5 是通义千问团队开源的最新系列模型相比 Qwen2 在知识储备MMLU 85、编程HumanEval 85与数学MATH 80能力上均有大幅提升支持最高 128K tokens 上下文并原生支持 29 种以上语言详见 models/Qwen2.5/readme.md。其中 Qwen2.5-7B-Instruct 是面向对话/指令场景的 7B 规模版本适合在单卡环境下本地部署与二次开发。LangChain 是构建 LLM 应用的框架提供了 Prompt 模板、检索链RetrievalQA、Agent、记忆等标准组件。但 LangChain 默认通过 OpenAI 等 API 协议与模型交互无法直接识别本地模型。本教程的思路是基于本地部署的 Qwen2.5 自定义一个LLM类将底层模型调用封装为 LangChain 统一接口之后即可像使用任何其他 LangChain 大模型功能一样使用本地模型无需考虑底层差异。环境准备本文基础环境如下---------------- ubuntu 22.04 python 3.12 cuda 12.1 pytorch 2.3.0 ----------------默认学习者已安装好以上 Pytorch(cuda) 环境如未安装请自行安装。pip 换源加速并安装依赖包# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install transformers4.44.2 pip install huggingface-hub0.25.0 pip install accelerate0.34.2 pip install modelscope1.18.0 pip install langchain0.3.0各依赖的作用依赖版本用途transformers4.44.2加载与运行 Qwen2.5 模型、分词器huggingface-hub0.25.0Hugging Face Hub 相关工具模型加载底层依赖accelerate0.34.2支持device_mapauto实现多设备自动切分加载modelscope1.18.0从 ModelScope 下载模型langchain0.3.0LLM 应用框架提供LLM基类与各类 Chain提示本教程使用的 langchain 为 0.3.0 版本其LLM基类位于langchain.llms.base由 langchain-core 提供下文代码均基于该版本编写。考虑到部分同学配置环境可能会遇到一些问题仓库作者在 AutoDL 平台准备了 Qwen2.5 的环境镜像直接创建 AutoDL 示例即可使用。模型下载使用modelscope中的snapshot_download函数下载模型第一个参数为模型名称参数cache_dir为模型的下载路径。新建model_download.py文件并在其中输入以下内容粘贴代码后记得保存文件然后运行python model_download.py执行下载模型大小为 16 GB下载模型大概需要 12 分钟。import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir snapshot_download(qwen/Qwen2.5-7B-Instruct, cache_dir/root/autodl-tmp, revisionmaster)注意记得修改cache_dir为你的模型下载路径。下载完成后模型会保存在/root/autodl-tmp/qwen/Qwen2.5-7B-Instruct目录下后续所有代码中的模型路径均指向该目录。若你已通过其他方式如 Hugging Face获取模型可跳过本步骤只需保证后续路径正确。自定义 LLM 类的设计原理为便捷构建 LLM 应用我们需要基于本地部署的 Qwen2.5 自定义一个LLM类将 Qwen2.5 接入 LangChain 框架。完成自定义LLM类之后可以以完全一致的方式调用 LangChain 的接口而无需考虑底层模型调用的不一致。LangChain 中所有模型封装都抽象自langchain.llms.base.LLM基类。子类只需实现两个核心部分即可被 LangChain 生态各类 Chain、Agent识别与调度构造函数__init__负责模型加载。我们在对象实例化的一开始加载本地部署的 Qwen2.5 模型从而避免每一次调用都需要重新加载模型带来的时间过长核心调用函数_callLLM类的核心函数LangChain 会调用该函数来调用 LLM。在该函数中我们调用已实例化模型的generate方法从而实现对模型的调用并返回调用结果属性_llm_type返回该 LLM 类的类型标识字符串用于标识与调试。这种继承基类 重写_call的模式在仓库中贯穿多个模型教程例如 models/ChatGLM/05-ChatGLM3-6B接入LangChain搭建知识库助手/LLM.py、models/Qwen/07-Qwen-7B-Chat 接入langchain搭建知识库助手/LLM.py 均采用同样的封装思路只是内部对话接口不同Qwen2.5 使用apply_chat_templategenerateQwen-7B-Chat 使用model.chat。这说明掌握该模式后可以轻松迁移到仓库中任意一个模型的 LangChain 接入场景。代码准备编写 LLM.py在当前路径新建一个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, LlamaTokenizerFast import torch class Qwen2_5_LLM(LLM): # 基于本地 Qwen2_5 自定义 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_fastFalse) self.model AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtypetorch.bfloat16, device_mapauto) 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, tokenizeFalse, add_generation_promptTrue) model_inputs self.tokenizer([input_ids], return_tensorspt).to(cuda) generated_ids self.model.generate(model_inputs.input_ids, attention_maskmodel_inputs[attention_mask], max_new_tokens512) 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_tokensTrue)[0] return response property def _llm_type(self) - str: return Qwen2_5_LLM关键代码逐段解析构造函数模型加载阶段AutoTokenizer.from_pretrained(mode_name_or_path, use_fastFalse)加载分词器。use_fastFalse使用经典慢速分词器避免部分场景下 fast tokenizer 与 Qwen2.5 的 chat template 处理差异AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtypetorch.bfloat16, device_mapauto)以 bfloat16 精度加载因果语言模型device_mapauto让 accelerate 自动将模型各层分配到可用设备多卡时可自动切分显存不足时可回落 CPUGenerationConfig.from_pretrained(mode_name_or_path)读取模型自带的生成配置如max_length、temperature、top_p等覆盖默认生成参数保证输出行为与模型官方一致。需要调整生成超参时可直接修改该配置对象。_call函数生成阶段将用户 prompt 组装为 OpenAI 风格的messages结构[{role: user, content: prompt }]apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue)按 Qwen2.5 的 chat template 将消息序列化为模型期望的输入文本并追加生成提示符generation prompt这是 Qwen2.5 这类新模型与早期模型model.chat()接口的关键差异分词并移动到 CUDAself.tokenizer([input_ids], return_tensorspt).to(cuda)self.model.generate(...)调用generate生成回答max_new_tokens512限制最多新增 512 个 tokenattention_mask显式传入以配合非连续的 input_ids截取新生成的部分去掉输入 prompt 对应的 tokenbatch_decode(..., skip_special_tokensTrue)解码为纯文本并返回首条结果。该封装与仓库中 models/Qwen2.5/01-Qwen2.5-7B-Instruct FastApi 部署调用.md 中 FastAPI 服务的生成逻辑完全一致同样的apply_chat_templategenerate 截断 batch_decode可以互为对照。在整体项目中我们将上述代码封装为LLM.py后续将直接从该文件中引入自定义的 LLM 类。调用测试然后就可以像使用任何其他的 LangChain 大模型功能一样使用了。注意记得修改模型路径为你的路径。from LLM import Qwen2_5_LLM llm Qwen2_5_LLM(mode_name_or_path /root/autodl-tmp/qwen/Qwen2.5-7B-Instruct) print(llm(你是谁))运行结果中可以看到模型加载日志正在从本地加载模型...、4 个 checkpoint shard 全部加载完成输出后模型成功回答了你是谁返回了我是 Qwen一个由阿里云开发的语言模型助手……的自我介绍。该截图同时展示了 LangChain 的弃用提示BaseLLM.__call__已在 langchain-core 0.1.7 中标记弃用将在 1.0 移除官方推荐使用invoke替代print(llm.invoke(你是谁)) # 推荐写法效果与 llm(你是谁) 一致由于Qwen2_5_LLM继承了LLM基类invoke、predict、stream等基类方法均自动可用上层业务代码无需任何改动。从单次对话到完整应用接入 LangChain Chain自定义 LLM 类的真正价值在于它能够无缝嵌入 LangChain 的各类 Chain 组件。仓库中 models/InternLM/06-InternLM接入LangChain搭建知识库助手/run_gradio.py 展示了与本文完全相同的封装模式InternLM_LLM(model_path...)如何被RetrievalQA.from_chain_type直接消费构建本地模型 向量库的知识库问答链from LLM import InternLM_LLM from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate from langchain.vectorstores import Chroma from langchain.embeddings.huggingface import HuggingFaceEmbeddings # 加载向量数据库 vectordb Chroma(persist_directorydata_base/vector_db/chroma, embedding_functionHuggingFaceEmbeddings(model_name/root/autodl-tmp/embedding_model)) # 使用自定义 LLM llm InternLM_LLM(model_path/root/autodl-tmp/model) # 定义问答 Prompt 模板 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}) print(qa_chain({query: 你的问题}))将上述代码中的InternLM_LLM替换为本文的Qwen2_5_LLM即可用 Qwen2.5 搭建完整的知识库问答系统。这正是自定义LLM类以完全一致的方式调用 LangChain 接口的含义无论是PromptTemplate、RetrievalQA、ConversationChain还是未来的 Agent 工具模型接入层对上层完全透明。常见问题与注意事项模型路径必须替换代码中的/root/autodl-tmp/qwen/Qwen2.5-7B-Instruct是示例路径务必替换为你实际下载模型的目录即snapshot_download中cache_dir指向的目录与模型名拼接结果。显存要求Qwen2.5-7B-Instruct 以 bfloat16 加载推理显存占用约 1516 GB建议使用显存 24 GB 及以上的单卡显存不足时可考虑配合 4bit/8bit 量化加载可参考仓库中 Qwen2 系列的低精度微调文档思路。use_fastFalse的作用Qwen2.5 依赖 chat template 正确构造输入慢速分词器能确保模板被完整应用若你遇到模板未生效或生成异常优先检查该参数。弃用警告处理如截图所示langchain-core 0.1.7 起BaseLLM.__call__被标记弃用推荐改用llm.invoke(prompt)两者返回结果一致。stop与run_manager参数_call签名中的stop停止词列表与run_manager回调管理为 LangChain 基类约定的标准入参本示例未使用但保留签名以兼容上游 Chain 的调用约定。总结本文完成了从零到一将 Qwen2.5-7B-Instruct 接入 LangChain 的全部步骤通过snapshot_download从 ModelScope 获取模型继承langchain.llms.base.LLM编写Qwen2_5_LLM类重写__init__完成一次加载、重写_call完成对话生成最后以统一接口完成调用。基于该封装你可以继续参考 models/Qwen2.5/06-Qwen2.5-7B-Instruct o1-like 推理链实现.md 等教程或结合仓库中知识库助手模块如 models/InternLM/06-InternLM接入LangChain搭建知识库助手构建更复杂的 LLM 应用。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询