ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

将 Llama3.1-8B-Instruct 接入 LangChain:基于 self-llm 仓库自定义 LLM 类的完整实战指南

将 Llama3.1-8B-Instruct 接入 LangChain:基于 self-llm 仓库自定义 LLM 类的完整实战指南 将 Llama3.1-8B-Instruct 接入 LangChain基于 self-llm 仓库自定义 LLM 类的完整实战指南【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llm本指南以《开源大模型食用指南》datawhalechina/self-llm仓库中的 02-Llama3_1-8B-Instruct langchain接入.md 为骨架完整讲解如何在 LinuxUbuntu 22.04 CUDA 12.1环境中将本地部署的 Meta-Llama-3.1-8B-Instruct 封装为 LangChain 自定义LLM类并接入框架。读完本文你将掌握模型下载、环境配置、LLM抽象类原理以及如何让本地大模型以统一的接口被 LangChain 生态Chain、Agent、记忆等组件直接调用。一、方案概览为什么要把 Llama3.1 封装成自定义 LLM 类LangChain 是构建 LLM 应用的流行编排框架它围绕模型调用抽象出一套统一接口。要接入一个不在 LangChain 内置模型列表中的本地模型最通用的做法是继承langchain.llms.base.LLM基类自定义一个LLM子类并重写两个关键成员构造函数__init__在对象实例化时一次性加载本地模型与分词器避免每次调用都重新加载模型_call函数这是LLM类的核心回调LangChain在内部调用模型时会执行它函数内调用已实例化模型的generate方法并返回生成结果。完成自定义后本地Llama3.1就能以和其他任何 LangChain 大模型完全一致的方式被调用调用方无需关心底层实现差异。二、环境准备与依赖安装本文基于如下基础环境与仓库中 Llama3.1 系列教程保持一致ubuntu 22.04 python 3.12 cuda 12.1 pytorch 2.3.0默认读者已安装好上述 PytorchCUDA环境若尚未安装请先自行完成安装。2.1 pip 换源并安装依赖包在终端中依次执行以下命令先升级 pip、配置清华 PyPI 源以加速下载再安装核心依赖# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install modelscope1.16.1 pip install langchain0.2.3 pip install transformers4.43.2 pip install accelerate0.32.1各依赖包在本教程中的职责与版本说明依赖包版本作用modelscope1.16.1从 ModelScope 模型库下载 Llama3.1 权重langchain0.2.3提供LLM基类、回调管理器等框架能力transformers4.43.2加载 Llama 模型与分词器、执行对话模板与生成accelerate0.32.1配合device_mapauto实现多设备自动加载考虑到部分同学配置环境可能会遇到一些问题项目在 AutoDL 平台准备了 LLaMA3.1 环境镜像可直接基于该镜像创建 AutoDL 实例免去重复装环境的步骤。三、使用 ModelScope 下载 Llama3.1-8B-Instruct 模型项目统一使用modelscope中的snapshot_download函数下载模型第一个参数是模型名称cache_dir指定模型下载路径revision指定分支版本。新建model_download.py文件输入以下内容并保存import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir snapshot_download(LLM-Research/Meta-Llama-3.1-8B-Instruct, cache_dir/root/autodl-tmp, revisionmaster)然后在终端执行python model_download.py模型大小为 16 GB下载约需 12 分钟受网络环境影响。注意记得修改cache_dir为你的模型下载路径哦补充说明模型下载除 ModelScope 外项目还提供了 Hugging Face、HF 镜像、git-lfs、Openxlab 等多种方式详见 models/General-Setting/03-模型下载.md其中cache_dir建议使用绝对路径。四、理解 LangChain 的 LLM 抽象继承与重写的本质LangChain 的langchain.llms.base.LLM是所有大语言模型封装的基类。它内部通过模板方法模式组织调用流程对外暴露的__call__/invoke入口会负责处理缓存、回调callbacks、重试等横切逻辑而真正与模型交互的生成文本步骤则委托给子类必须实现的_call方法。因此接入一个新模型只需继承LLM重写_call(self, prompt, stop, run_manager, **kwargs)通过property提供_llm_type标识。其中run_manager类型CallbackManagerForLLMRun用于在生成过程中触发 LangChain 的回调事件本地推理场景通常直接透传即可。仓库中多个模型目录如 Qwen 的 LLM.py、Atom、InternLM 等都采用了完全相同的继承 重写模式只是_call内部的模型调用方式不同如调用model.chat或手工拼接 prompt。而本文接入的 Llama3.1 属于纯 CausalLM 模型采用apply_chat_templategenerate的方式与仓库中 01-Llama3_1-8B-Instruct FastApi 部署调用.md 的 API 服务生成逻辑完全一致。五、编写自定义 LLaMA3_1_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 import torch class LLaMA3_1_LLM(LLM): # 基于本地 llama3.1 自定义 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.tokenizer.pad_token self.tokenizer.eos_token print(完成本地模型的加载) def _call(self, prompt : str, stop: Optional[List[str]] None, run_manager: Optional[CallbackManagerForLLMRun] None, **kwargs: Any): messages [ {role: system, content: You are a helpful assistant.}, {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(self.model.device) generated_ids self.model.generate(model_inputs.input_ids,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 LLaMA3_1_LLM5.1 构造函数一次性加载模型AutoTokenizer.from_pretrained(mode_name_or_path, use_fastFalse)加载分词器use_fastFalse使用慢速经典分词器与 Llama3.1 的 tokenizer 兼容性更稳妥AutoModelForCausalLM.from_pretrained(..., torch_dtypetorch.bfloat16, device_mapauto)以 bfloat16 精度加载因果语言模型device_mapauto由 accelerate 自动将权重分布到可用 GPU/CPU 上self.tokenizer.pad_token self.tokenizer.eos_token将 pad_token 设置为 eos_token。Llama3.1 的 tokenizer 默认没有 pad_token若不设置batch_decode阶段可能出现 attention mask 警告或生成行为异常运行日志中会提示Setting pad_token_id to eos_token_id:128009 for open-end generation。5.2 _call 函数核心生成链路_call内部的关键调用链如下构造messages对话列表system user 两条消息tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue)按 Llama3.1 官方的 Chat 模板|begin_of_text||start_header_id|system|end_header_id|...渲染完整提示词add_generation_promptTrue会在末尾追加 assistant 起始标记引导模型生成回答tokenizer([input_ids], return_tensorspt).to(self.model.device)将提示词编码为张量并移到模型所在设备model.generate(model_inputs.input_ids, max_new_tokens512)调用生成max_new_tokens512限制本次生成最多 512 个新 token裁剪掉输入部分output_ids[len(input_ids):]仅保留新生成的 tokentokenizer.batch_decode(generated_ids, skip_special_tokensTrue)解码为纯文本回答skip_special_tokensTrue剔除|eot_id|等特殊标记。从源码结构看这套调用链与仓库中 FastAPI 部署api.py和 Streamlit WebDemochatBot.py中的生成逻辑完全同源只是封装形态不同——分别是 HTTP 服务、Web 界面和 LangChain 接口。5.3 _llm_type 属性返回字符串LLaMA3_1_LLM用于标识该 LLM 实例的类型LangChain 内部如序列化、缓存 key 计算会使用该值。六、调用自定义 LLM 类验证将上述代码封装为LLM.py后就可以像使用 LangChain 内置大模型一样直接使用它。新建测试脚本from LLM import LLaMA3_1_LLM llm LLaMA3_1_LLM(mode_name_or_path /root/autodl-tmp/LLM-Research/Meta-Llama-3___1-8B-Instruct) print(llm(你好呀))注意记得修改模型路径为你的路径哦ModelScope 下载的目录中模型名中的.会被替换为___因此实际路径形如/root/autodl-tmp/LLM-Research/Meta-Llama-3___1-8B-Instruct与 01-Llama3_1-8B-Instruct FastApi 部署调用.md 中的model_name_or_path一致。运行后终端会依次输出正在从本地加载模型...checkpoint 分片加载进度Loading checkpoint shards: 100% 4/4可能的 pad token 提示属正常现象代码中已设置pad_token eos_token完成本地模型的加载最终打印模型回答。调用llm(你好呀)实际走的是LLM基类的__call__→ 子类_call的完整链路说明自定义类已成功被 LangChain 接管。由于模型已在构造函数中加载后续每次调用都无需重新加载权重响应速度显著优于每次调用即加载的朴素实现。七、接入之后的扩展LangChain 生态的完整复用一旦LLaMA3_1_LLM可用就能无缝嵌入 LangChain 的各类高阶组件PromptTemplate 与 Chain用模板组织提示词通过LLMChain串联模板 → 模型 → 输出解析记忆Memory对话历史由 LangChain 管理_call只需处理单轮 prompt工具调用与 Agent将llm作为推理引擎交给 Agent 编排工具知识库检索RetrievalQA结合向量库构建 RAG 应用——仓库中 ChatGLM 知识库助手、Qwen 知识库助手 等示例展示了这种自定义 LLM 类 文档加载 向量检索 QA 链的完整形态其LLM.py模式与本文完全一致可直接替换为LLaMA3_1_LLM使用。此外若需要以 OpenAI 兼容 API 的方式对外提供服务可参考同目录下的 05-Llama3_1-8B-Instruct o1-like 推理链实现.md通过 vLLM 启动 OpenAI API Server再用openai客户端以chat.completions协议调用可进一步构建带长推理链的应用。八、常见问题与排查建议模型路径不对确保mode_name_or_path指向snapshot_download返回的实际目录ModelScope 会将.转写为___请核对真实路径显存不足8B 模型以 bfloat16 加载约需 16 GB 显存若显存较小可改用device_mapauto让 accelerate 分载到 CPU或改用 4bit/8bit 量化加载可参考仓库中 Qwen 低精度微调/部署文档中的量化思路生成出现 pad/attention 警告确认已执行self.tokenizer.pad_token self.tokenizer.eos_tokenlangchain 版本差异本文基于langchain0.2.3新版0.3中from langchain.llms.base import LLM仍可用但若迁移到langchain-community请同步调整导入路径生成质量不佳可适当调整_call中generate的采样参数如temperature、top_p、repetition_penalty仓库 03-Llama3_1-8B-Instruct WebDemo部署.md 中的chatBot.py提供了同源的可对照实现。九、小结本文完整复现并深化了 02-Llama3_1-8B-Instruct langchain接入.md 的全部实操内容从 Ubuntu 22.04 环境准备、依赖安装、ModelScope 模型下载到自定义LLaMA3_1_LLM类的继承与重写原理、apply_chat_templategenerate生成链路剖析再到调用验证与 LangChain 生态扩展。通过这层薄薄的封装本地 Llama3.1 就拥有了与 LangChain 生态无缝协作的标准接口为后续构建 RAG 知识库助手、Agent 等上层应用奠定了坚实基础。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表