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 生态。
一、整体思路:为什么要把模型"接入"LangChain
Baichuan2-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.0
- Python 版本:3.8(ubuntu20.04)
- CUDA 版本:11.8(11.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 modelscope==1.9.5 pip install transformers==4.35.2 pip install streamlit==1.24.0 pip install sentencepiece==0.1.99 pip install accelerate==0.24.1 pip install langchain==0.0.292各依赖在链路中的职责如下:
| 依赖包 | 版本 | 作用 |
|---|---|---|
modelscope | 1.9.5 | 从 ModelScope 模型库下载 Baichuan2 权重 |
transformers | 4.35.2 | 加载AutoTokenizer/AutoModelForCausalLM,执行模型推理 |
sentencepiece | 0.1.99 | Baichuan2 使用的分词器底层依赖 |
accelerate | 0.24.1 | 支撑device_map="auto"自动设备分配,配合显存管理 |
langchain | 0.0.292 | 提供LLM基类与检索问答链等应用编排能力 |
streamlit | 1.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', revision='v1.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目录下;revision='v1.0.4'指定模型版本快照,保证与教程使用的权重一致。
模型下载耗时约 10~20 分钟。下载完成后,后续代码中的model_path一律指向该本地目录。
五、核心实现:自定义 LLM 类接入 LangChain
5.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_code=True) self.model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True,torch_dtype=torch.bfloat16, device_map="auto") 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_LLM"5.2 源码级解析:三个关键点的设计意图
(1)类变量声明tokenizer与model。在类体中先用类型注解声明两个类属性,明确该 LLM 类内部持有分词器与因果语言模型两个核心对象,这是自定义 LLM 类的标准骨架。本仓库中 InternLM 自定义 LLM 实现 采用了完全一致的结构,可作为横向参照。
(2)构造函数:一次性加载,避免反复 IO。__init__在对象实例化时即通过AutoTokenizer.from_pretrained与AutoModelForCausalLM.from_pretrained完成权重加载:
trust_remote_code=True:Baichuan2 的建模代码以远程代码形式随权重分发,必须开启;torch_dtype=torch.bfloat16:以 bfloat16 精度加载,7B 模型在 24G 显存上可顺畅推理;device_map="auto":由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.py(Web 界面)。
迁移到 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_size=500、重叠chunk_overlap=150)+HuggingFaceEmbeddings词向量模型 +Chroma向量库,检索问答链仍由RetrievalQA.from_chain_type(llm, retriever=vectordb.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', revision='v1.0.4')执行python /root/autodl-tmp/download.py,约 15GB,耗时 10~20 分钟。
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),仅供参考