基于 self-llm 仓库把 InternLM2-7B-Chat 接入 LangChain:自定义 LLM 类的完整实战指南
2026/9/12 14:14:41 网站建设 项目流程

基于 self-llm 仓库把 InternLM2-7B-Chat 接入 LangChain:自定义 LLM 类的完整实战指南

【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调(全参数/Lora)、部署国内外开源大模型(LLM)/多模态大模型(MLLM)教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm

《开源大模型食用指南》(self-llm)仓库以"快速部署 + 快速微调 + 快速接入"为主线,提供了国内主流开源大模型的完整落地教程。本文聚焦 models/InternLM2/02-InternLM2-7B-chat langchain 接入.md 这篇教程,完整演示在 Linux 环境下如何把本地部署的 InternLM2-7B-Chat 封装为 LangChain 的自定义 LLM 类,并以完全一致的方式调用 LangChain 的标准接口。读完本文,你将掌握基于langchain.llms.base.LLM派生自定义模型类、重写_call函数、加载本地模型并完成单轮对话的完整链路,同时结合仓库内 LLM.py、creat_db.py、run_gradio.py 等真实源码,进一步理解该自定义类在知识库问答等复杂应用中的使用方式。

InternLM2 模型简介

InternLM2(书生·浦语第二代)开源了面向实用场景的 70 亿参数基础模型与对话模型(InternLM2-Chat-7B)。根据教程文档记载,该模型具备以下特点:

  • 有效支持 20 万字超长上下文:模型在 20 万字长输入中几乎完美地实现长文"大海捞针",在 LongBench 和 L-Eval 等长文任务中的表现达到开源模型中的领先水平,可通过 LMDeploy 尝试 20 万字超长上下文推理;
  • 综合性能全面提升:各能力维度相比上一代全面进步,在推理、数学、代码、对话体验、指令遵循和创意写作等方面提升尤为显著,综合性能达到同量级开源模型的领先水平;
  • 代码解释器与数据分析:在配合代码解释器(code-interpreter)的条件下,InternLM2-Chat-20B 在 GSM8K 和 MATH 上可以达到与 GPT-4 相仿的水平,并提供实用的数据分析能力;
  • 工具调用能力整体升级:基于更强的指令理解、工具筛选与结果反思能力,可更可靠地支持复杂智能体的搭建,支持对工具进行有效的多轮调用。

在接入 LangChain 前,建议先阅读仓库内同目录下的 FastAPI 部署教程 与 WebDemo 部署教程,熟悉模型加载与对话接口的底层行为,这有助于理解自定义 LLM 类中model.chat的调用约定。

环境准备

本教程在 AutoDL 平台上租赁一台RTX 3090 等 24G 显存的 GPU 机器,镜像选择PyTorch → 2.0.0 → 3.8(ubuntu20.04) → 11.8(CUDA 11.3 以上版本均可),如下图所示:

租用完成后,打开服务器的JupyterLab,并进入其中的终端开始环境配置、模型下载和代码运行。

pip 换源与依赖安装

国内网络环境下建议先为 pip 更换清华源加速下载,再安装依赖包:

# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install modelscope==1.11.0 pip install transformers==4.37.0 pip install sentencepiece==0.1.99 pip install accelerate==0.24.1 pip install transformers_stream_generator==0.0.4 pip install langchain pip install protobuf

其中各依赖的作用如下:

依赖包版本(教程锁定)作用
modelscope1.11.0国内模型仓库,用于下载 InternLM2 权重
transformers4.37.0模型加载与推理框架,提供AutoTokenizer/AutoModelForCausalLM
sentencepiece0.1.99InternLM2 分词器依赖的分词后端
accelerate0.24.1多设备/混合精度加载加速库
transformers_stream_generator0.0.4流式生成依赖(保持与同系列教程一致)
langchain最新版即可应用编排框架,提供LLM基类与各类 Chain
protobuf不锁定序列化协议库,模型 tokenizer 加载所需的间接依赖

说明:上述版本号为教程文档锁定的实测版本,若与本仓库其他模型的教程混用环境(例如 InternLM 接入 LangChain 知识库助手),需注意各模型依赖的 transformers 版本差异。

模型下载

使用 modelscope 的snapshot_download函数下载模型,第一个参数为模型名称,参数cache_dir为模型的下载路径。

/root/autodl-tmp路径下新建model_download.py文件并输入以下内容,保存后运行python /root/autodl-tmp/model_download.py执行下载:

import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir = snapshot_download('Shanghai_AI_Laboratory/internlm2-chat-7b', cache_dir='/root/autodl-tmp', revision='master')

模型大小约14GB,在 AutoDL 平台内网环境下下载大约需要 2 分钟。下载完成后,模型权重会落在/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b目录,后续自定义 LLM 类即通过该本地路径加载模型。

自定义 LLM 类:把 InternLM2 接入 LangChain

为便捷构建 LLM 应用,需要基于本地部署的 InternLM2 模型自定义一个 LLM 类,将 InternLM2 接入 LangChain 框架。完成自定义后,可以以完全一致的方式调用 LangChain 的接口,无需考虑底层模型调用的不一致。

基于本地部署的 InternLM2 自定义 LLM 类并不复杂:只需从langchain.llms.base.LLM继承一个子类,并重写构造函数_call函数即可:

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 InternLM2_LLM(LLM): # 基于本地 InternLM2 自定义 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, trust_remote_code=True) self.model = AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtype=torch.float16, trust_remote_code=True).cuda() self.model = self.model.eval() print("完成本地模型的加载") def _call(self, prompt : str, stop: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any): response, history = self.model.chat(self.tokenizer, prompt, history=[]) return response @property def _llm_type(self) -> str: return "InternLM2_LLM"

构造函数:实例化时一次性加载模型

在上述类定义中,构造函数在对象实例化的一开始就加载本地部署的 InternLM2 模型,从而避免每一次调用都重新加载模型带来的时间开销。加载时使用torch_dtype=torch.float16将模型以半精度载入显存(24G 显存可承载 7B 半精度模型),并通过trust_remote_code=True信任模型仓库随附的自定义建模代码(InternLM2 属于自定义架构,必须开启该参数)。

_call函数:LLM 类的核心调用入口

_call函数是 LLM 类的核心函数,LangChain 会调用该函数来调用 LLM。在该函数中,我们调用已实例化模型的chat方法(传入history=[]表示单轮对话),从而实现对模型的调用并返回调用结果。该方法对 LangChain 的LLMChainRetrievalQA等组件完全透明——上层只需传入 prompt 字符串,即可获得模型生成的文本。

仓库源码印证

本仓库 models/InternLM/06-InternLM接入LangChain搭建知识库助手/LLM.py 中保存了一份功能等价的InternLM_LLM类实现(针对第一代 InternLM),其结构与教程代码完全同构,可作为对照阅读:

class InternLM_LLM(LLM): # 基于本地 InternLM 自定义 LLM 类 tokenizer : AutoTokenizer = None model: AutoModelForCausalLM = None def __init__(self, model_path :str): super().__init__() print("正在从本地加载模型...") self.tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) self.model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True).to(torch.bfloat16).cuda() self.model = self.model.eval() print("完成本地模型的加载") def _call(self, prompt : str, stop: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any): response, history = self.model.chat(self.tokenizer, prompt , history=[]) return response @property def _llm_type(self) -> str: return "InternLM"

对比可见两点差异:

  • 精度选择上,教程代码使用torch_dtype=torch.float16,仓库源码使用.to(torch.bfloat16),二者均可满足 7B 级模型在 24G 显存上的部署,实际选择取决于硬件的 bf16 支持情况;
  • _llm_type属性返回的字符串标识不同,它用于标识 LLM 类型,LangChain 内部会据此做类型判断与序列化。

两份代码在模式上是完全一致的:继承LLM→ 重写__init__加载模型 → 重写_call调用model.chat→ 用@property返回_llm_type。这正是 LangChain 自定义本地大模型的标准范式。

从自定义类到知识库应用

自定义 LLM 类的价值在于"一次封装、处处复用"。仓库内 run_gradio.py 展示了如何把自定义类接入RetrievalQA构建知识库问答链:

from LLM import InternLM_LLM from langchain.chains import RetrievalQA llm = InternLM_LLM(model_path = "/root/autodl-tmp/model") qa_chain = RetrievalQA.from_chain_type(llm, retriever=vectordb.as_retriever(), return_source_documents=True, chain_type_kwargs={"prompt": QA_CHAIN_PROMPT})

而 creat_db.py 则负责把文档切块(RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=150))、向量化(HuggingFaceEmbeddings)并持久化到 Chroma 向量库。也就是说,教程中的自定义 LLM 类正是这类"本地模型 + 本地知识库"应用的地基。

代码运行

在整体项目中,将上述自定义 LLM 类封装为LLM.py文件,后续直接从该文件引入自定义类。然后就可以像使用任何其他 LangChain 大模型功能一样使用了:

from LLM import InternLM2_LLM llm = InternLM2_LLM(mode_name_or_path = "/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b") llm("你是谁")

运行流程与预期输出:

  1. 实例化InternLM2_LLM时,终端打印正在从本地加载模型...,此时模型权重被读入显存(首次加载耗时较长属正常现象);
  2. 加载完成后打印完成本地模型的加载
  3. 调用llm("你是谁")触发_call函数,经model.chat(tokenizer, prompt, history=[])生成回答,例如返回一段自我介绍文本。

若想验证封装的通用性,可以将自定义 LLM 直接传入 LangChain 的PromptTemplate+LLMChain,体验与官方 LLM 完全一致的调用方式——这正是"无需考虑底层模型调用不一致"的体现。

进阶提示与注意事项

  • 参数命名笔误说明:教程构造函数形参为mode_name_or_path(应为model_name_or_path),仓库源码中对应的实现为model_path。实际使用时请保持函数签名与内部引用一致,避免 NameError。
  • trust_remote_code=True不可省略:InternLM2 使用自定义模型代码,加载 tokenizer 与模型时必须开启该参数,否则会报错。
  • 显存与精度:7B 模型以 fp16/bf16 加载约需 14GB 显存,配合 24G 显存机器(如 RTX 3090)可顺畅运行;如显存紧张,可参考同目录 Xtuner Qlora 微调教程 中的量化思路。
  • 首次运行耗时:模型加载与model.chat首次调用均需较长时间,后续调用才会进入稳定延迟区间,这是本地部署大模型的正常现象。
  • 多轮对话_call中固定传入history=[],如需多轮对话,可扩展_call接收历史记录并透传给model.chat,或借助 LangChain 的对话记忆组件在外部维护history
  • 版本兼容性:教程锁定transformers==4.37.0modelscope==1.11.0等版本,若与仓库其他教程(如 Qwen、ChatGLM 系列)混用环境,请注意版本冲突,必要时使用独立的 conda 虚拟环境。

总结

本文完整复现了 self-llm 仓库中 InternLM2 接入 LangChain 教程 的实战链路:从 AutoDL 环境准备、依赖安装、模型下载,到基于langchain.llms.base.LLM派生InternLM2_LLM自定义类,再到单轮对话验证。同时结合仓库内 LLM.py、creat_db.py、run_gradio.py 源码,说明了该封装范式在知识库问答场景中的延伸价值。掌握了"继承 LLM + 重写_call"这一范式,你就可以把任何本地部署的开源大模型(Qwen、ChatGLM、Baichuan 等,仓库各模型目录均有同构教程)快速接入 LangChain 生态,自由组合链式调用、检索增强与智能体等上层能力。

【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调(全参数/Lora)、部署国内外开源大模型(LLM)/多模态大模型(MLLM)教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询