
基于 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.8CUDA 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 modelscope1.11.0 pip install transformers4.37.0 pip install sentencepiece0.1.99 pip install accelerate0.24.1 pip install transformers_stream_generator0.0.4 pip install langchain pip install protobuf其中各依赖的作用如下依赖包版本教程锁定作用modelscope1.11.0国内模型仓库用于下载 InternLM2 权重transformers4.37.0模型加载与推理框架提供AutoTokenizer/AutoModelForCausalLMsentencepiece0.1.99InternLM2 分词器依赖的分词后端accelerate0.24.1多设备/混合精度加载加速库transformers_stream_generator0.0.4流式生成依赖保持与同系列教程一致langchain最新版即可应用编排框架提供LLM基类与各类 Chainprotobuf不锁定序列化协议库模型 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, revisionmaster)模型大小约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_codeTrue) self.model AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtypetorch.float16, trust_remote_codeTrue).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_dtypetorch.float16将模型以半精度载入显存24G 显存可承载 7B 半精度模型并通过trust_remote_codeTrue信任模型仓库随附的自定义建模代码InternLM2 属于自定义架构必须开启该参数。_call函数LLM 类的核心调用入口_call函数是 LLM 类的核心函数LangChain 会调用该函数来调用 LLM。在该函数中我们调用已实例化模型的chat方法传入history[]表示单轮对话从而实现对模型的调用并返回调用结果。该方法对 LangChain 的LLMChain、RetrievalQA等组件完全透明——上层只需传入 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_codeTrue) self.model AutoModelForCausalLM.from_pretrained(model_path, trust_remote_codeTrue).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_dtypetorch.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, retrievervectordb.as_retriever(), return_source_documentsTrue, chain_type_kwargs{prompt: QA_CHAIN_PROMPT})而 creat_db.py 则负责把文档切块RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap150)、向量化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(你是谁)运行流程与预期输出实例化InternLM2_LLM时终端打印正在从本地加载模型...此时模型权重被读入显存首次加载耗时较长属正常现象加载完成后打印完成本地模型的加载调用llm(你是谁)触发_call函数经model.chat(tokenizer, prompt, history[])生成回答例如返回一段自我介绍文本。若想验证封装的通用性可以将自定义 LLM 直接传入 LangChain 的PromptTemplateLLMChain体验与官方 LLM 完全一致的调用方式——这正是无需考虑底层模型调用不一致的体现。进阶提示与注意事项参数命名笔误说明教程构造函数形参为mode_name_or_path应为model_name_or_path仓库源码中对应的实现为model_path。实际使用时请保持函数签名与内部引用一致避免 NameError。trust_remote_codeTrue不可省略InternLM2 使用自定义模型代码加载 tokenizer 与模型时必须开启该参数否则会报错。显存与精度7B 模型以 fp16/bf16 加载约需 14GB 显存配合 24G 显存机器如 RTX 3090可顺畅运行如显存紧张可参考同目录 Xtuner Qlora 微调教程 中的量化思路。首次运行耗时模型加载与model.chat首次调用均需较长时间后续调用才会进入稳定延迟区间这是本地部署大模型的正常现象。多轮对话_call中固定传入history[]如需多轮对话可扩展_call接收历史记录并透传给model.chat或借助 LangChain 的对话记忆组件在外部维护history。版本兼容性教程锁定transformers4.37.0、modelscope1.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),仅供参考