ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Baichuan2-7B-Chat 接入 LangChain 框架:自定义 LLM 类与多功能问答平台搭建指南

Baichuan2-7B-Chat 接入 LangChain 框架:自定义 LLM 类与多功能问答平台搭建指南 Baichuan2-7B-Chat 接入 LangChain 框架自定义 LLM 类与多功能问答平台搭建指南【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm导读本文是《开源大模型食用指南self-llm》项目中关于百川系列模型应用开发的核心教程完整演示了如何将本地部署的Baichuan2-7B-Chat以自定义LLM子类的方式接入LangChain框架并进一步给出借助Langchain-Chatchat一键搭建包含知识库管理、多模型切换等能力的企业级问答平台的部署方案。读完本文你将掌握从 AutoDL 环境准备、模型下载、LLM基类重写到检索问答链RAG落地的全链路技能能够将任意基于 HuggingFace 接口的本地开源模型平滑接入 LangChain 生态。一、整体思路为什么要把模型接入LangChainBaichuan2-7B-Chat本身是百川智能推出的开源大语言模型原生推理能力已经可用但如果我们想在其上构建知识库问答、Agent、多工具调用等复杂应用就需要一个能统一管理模型调用、提示词组装、检索增强、外部工具的应用框架。LangChain正是这样的框架而它的一切功能都围绕LLM抽象展开。LangChain 官方实现的是对OpenAI等云端 API 的封装并不内置对本地下载的 Baichuan2 权重的调用逻辑。因此本教程的核心工作就是基于本地部署的 Baichuan2-7B-chat自定义一个 LLM 类从langchain.llms.base的LLM基类继承一个子类重写构造函数与_call函数。完成之后就可以用与调用任何 LangChain 内置大模型完全一致的方式调用 Baichuan2而无需考虑底层模型接口的差异。关于知识库向量化、检索问答链与 Web Demo 的完整实现细节本仓库专门提供了 InternLM 接入 LangChain 搭建知识库助手 教程其流程对 Baichuan2 完全可复用只需替换自定义 LLM 类本文第六节会给出迁移要点。二、环境准备AutoDL 租用 24G 显存机器在 AutoDL 平台租用一台RTX 3090 等 24G 显存的显卡机器足以加载 7B 规模的 Chat 模型进行推理。镜像选择建议如下框架PyTorch框架版本2.0.0Python 版本3.8ubuntu20.04CUDA 版本11.811.3 以上版本均可租用完成后打开服务器的JupyterLab并在其中开启终端后续的环境配置、模型下载与运行演示都在该终端中完成。三、安装依赖固定版本保证兼容性在终端中依次执行以下命令升级 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.9.5 pip install transformers4.35.2 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install accelerate0.24.1 pip install langchain0.0.292各依赖在链路中的职责如下依赖包版本作用modelscope1.9.5从 ModelScope 模型库下载 Baichuan2 权重transformers4.35.2加载AutoTokenizer/AutoModelForCausalLM执行模型推理sentencepiece0.1.99Baichuan2 使用的分词器底层依赖accelerate0.24.1支撑device_mapauto自动设备分配配合显存管理langchain0.0.292提供LLM基类与检索问答链等应用编排能力streamlit1.24.0可选搭建 Web 聊天 Demo说明本仓库同系列文档如 Baichuan2 FastApi 部署、Baichuan WebDemo 部署在部署类场景还会额外安装fastapi、uvicorn、transformers_stream_generator、xformers等本文聚焦 LangChain 接入以上六件套已满足核心需求。四、模型下载使用 ModelScope 拉取权重Baichuan2-7B-Chat 权重约 15GB可通过 ModelScope 的snapshot_download函数下载。在/root/autodl-tmp路径下新建download.py文件写入以下内容并保存import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir snapshot_download(baichuan-inc/Baichuan2-7B-Chat,cache_dir/root/autodl-tmp, revisionv1.0.4)然后执行python /root/autodl-tmp/download.py参数说明第一个参数baichuan-inc/Baichuan2-7B-Chat为模型在 ModelScope 上的完整名称cache_dir/root/autodl-tmp指定模型的本地下载路径下载完成后权重位于/root/autodl-tmp/baichuan-inc/Baichuan2-7B-Chat目录下revisionv1.0.4指定模型版本快照保证与教程使用的权重一致。模型下载耗时约 1020 分钟。下载完成后后续代码中的model_path一律指向该本地目录。五、核心实现自定义 LLM 类接入 LangChain5.1 完整代码基于本地部署的 Baichuan2-7B-Chat 自定义 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 import torch class baichuan2_LLM(LLM): # 基于本地 Baichuan 自定义 LLM 类 tokenizer : AutoTokenizer None model: AutoModelForCausalLM None def __init__(self, model_path :str): # model_path: Baichuan-7B-chat模型路径 # 从本地初始化模型 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 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} ] response self.model.chat(self.tokenizer, messages) return response property def _llm_type(self) - str: return baichuan2_LLM5.2 源码级解析三个关键点的设计意图1类变量声明tokenizer与model。在类体中先用类型注解声明两个类属性明确该 LLM 类内部持有分词器与因果语言模型两个核心对象这是自定义 LLM 类的标准骨架。本仓库中 InternLM 自定义 LLM 实现 采用了完全一致的结构可作为横向参照。2构造函数一次性加载避免反复 IO。__init__在对象实例化时即通过AutoTokenizer.from_pretrained与AutoModelForCausalLM.from_pretrained完成权重加载trust_remote_codeTrueBaichuan2 的建模代码以远程代码形式随权重分发必须开启torch_dtypetorch.bfloat16以 bfloat16 精度加载7B 模型在 24G 显存上可顺畅推理device_mapauto由accelerate自动把各层分配到可用设备单卡 3090 时即整卡加载self.model.generation_config GenerationConfig.from_pretrained(model_path)加载权重自带的生成配置保证输出风格与官方一致。之所以把模型加载放进构造函数而不是_call是为了只在创建 LLM 对象时加载一次后续多次问答直接复用内存中的模型避免每次调用都重新加载权重带来的巨大耗时——这在构建 Web 应用时至关重要。3_call函数LangChain 的调用入口。_call是LLM基类的核心抽象方法LangChain 内部包括predict、__call__、各类 Chain最终都会调用它。本实现将用户prompt包装成{role: user, content: prompt}的对话消息格式再调用 Baichuan2 原生封装的model.chat(self.tokenizer, messages)完成推理并返回字符串响应。4_llm_type属性。返回该自定义 LLM 的唯一标识baichuan2_LLM供 LangChain 内部注册与标识使用。5.3 调用验证将上述代码保存后例如存为LLM.py即可像使用任何 LangChain 大模型一样使用它llm baichuan2_LLM(/root/autodl-tmp/baichuan-inc/Baichuan2-7B-Chat) llm(你是谁)从运行结果可以看到模型权重分片加载完成Loading checkpoint shards: 100%后即可正常进行多轮对话回答内容与直接使用 transformers 推理完全一致——这验证了自定义 LLM 类已成功接入 LangChain 调用链。5.4 进阶定制生成参数如果在_call中希望像 FastApi 部署那样精细化控制生成行为可以参考本仓库 Baichuan2 FastApi 部署教程 中的GenerationConfig参数设置在构造函数里追加g_config GenerationConfig.from_pretrained(model_path) g_config.temperature 0.3 # 温度越低输出越确定 g_config.top_p 0.85 # 核采样只考虑累积概率达 0.85 的高概率词 g_config.top_k 5 # top-k 截断只考虑概率最高的 5 个词 g_config.max_new_tokens 2048 # 单次生成的最大 token 数 self.model.generation_config g_config六、延伸基于 Baichuan2 的检索问答RAG应用接入 LangChain 后Baichuan2 就可以无缝参与RetrievalQA检索问答链。完整的语料加载 → 文本分块 → 向量化 → Chroma 向量库 → 检索问答链 → Gradio Web Demo实现位于 InternLM 接入 LangChain 搭建知识库助手配套可直接运行的脚本有 creat_db.py构建向量库与 run_gradio.pyWeb 界面。迁移到 Baichuan2 只需两步改动第一步将from LLM import InternLM_LLM替换为from LLM import baichuan2_LLM并把实例化参数改为本地 Baichuan2 路径llm baichuan2_LLM(model_path/root/autodl-tmp/baichuan-inc/Baichuan2-7B-Chat) llm.predict(你是谁)第二步保持其余逻辑不变——向量库构建仍然使用RecursiveCharacterTextSplitter分块chunk_size500、重叠chunk_overlap150HuggingFaceEmbeddings词向量模型 Chroma向量库检索问答链仍由RetrievalQA.from_chain_type(llm, retrievervectordb.as_retriever(), ...)构建Prompt 模板仍为包含{context}与{question}两个变量的问答模板。LangChain 会自动完成基于用户提问检索知识片段 → 拼接为带上下文的 Prompt → 交给自定义 LLM 作答的完整流程从而让 Baichuan2 获得基于私有知识库的问答能力。七、附加案例Langchain-Chatchat 快速搭建多功能问答平台除手工编排外还可以借助开源项目Langchain-Chatchat原 Langchain-ChatGLM以近乎零编码的方式快速搭建一个基于百川2的多功能问答平台开箱即用地获得多模型选择对话、知识库管理与文档问答等能力。7.1 创建实例与环境准备进入 Langchain-Chatchat 项目提供的 AutoDL 镜像页面创建实例同样选择3090 等 24G 显存的机器如第二节所述实例创建后即为一个带完整运行环境的 ChatGLM 基础镜像。7.2 下载百川2模型沿用第四节的方法通过 ModelScope 将 Baichuan2-7B-Chat 权重下载到本地import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir snapshot_download(baichuan-inc/Baichuan2-7B-Chat,cache_dir/root/autodl-tmp, revisionv1.0.4)执行python /root/autodl-tmp/download.py约 15GB耗时 1020 分钟。7.3 修改模型配置进入Langchain-Chatchat/configs/model_config.py文件修改配置以启用百川2模型在模型列表中选中/添加Baichuan2-7B-Chat该文件支持配置多种模型可按需开启将本地模型路径字段修改为刚下载的权重目录例如/root/autodl-tmp/baichuan-inc/Baichuan2-7B-Chat。7.4 启动服务打开新的终端进入项目目录并激活环境一键启动全部服务cd /root/Langchain-Chatchat/ conda activate /root/pyenv python startup.py -astartup.py -a中的-a表示启动所有服务API、Web UI、知识库索引等。启动完成后可使用 VS Code 的端口转发功能将服务端口转发到本地浏览器访问。7.5 使用效果启动后即可体验该平台的核心能力多模型选择对话界面上可切换已配置的各开源模型与百川2进行多轮对话知识库管理上传文档、构建向量索引并基于知识库进行带引用的检索问答其余如对话会话管理、Prompt 配置等功能可自行探索。八、总结本文围绕Baichuan2-7B-Chat 接入 LangChain这一主线给出了从环境准备、依赖安装、模型下载到自定义LLM子类、检索问答链迁移再到 Langchain-Chatchat 平台化部署的完整方案。核心收获有三点理解LLM基类抽象重写__init__一次性加载模型与_call定义推理逻辑即可让任意本地开源模型获得 LangChain 全生态的调用能力掌握参数调优入口GenerationConfig中的temperature、top_p、top_k、max_new_tokens是控制生成质量的关键旋钮获得两条落地路径轻量路径是自定义 LLM 类 RetrievalQA手工编排知识库助手重量路径是Langchain-Chatchat平台化部署多功能问答系统。更多同系列实践可继续阅读本仓库的 Baichuan2 FastApi 部署、Baichuan WebDemo 部署 与 Baichuan2 Lora 微调以及 Qwen、ChatGLM 等模型的同类接入教程以横向对比不同模型的接入差异。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表