LangChain调用本地模型 | 豆包MarsCode AI刷题
LangChain调用本地模型
环境准备
Windows 10
Visual Studio Code
Anaconda
Visual Studio Code 安装
vscode 官网
Visual Studio Code - Code Editing. Redefined
下载完vscode后安装 python 插件
Anaconda 安装
下载 Anaconda
可以在官网下载,也可以在镜像站下载
mirrors.tuna.tsinghua.edu.cn/anaconda/ar…
下载的时候记得勾选添加到环境变量,方便在终端直接使用 conda 指令
下载完后尝试在终端使用 conda 指令
conda --version
我直接使用vscode的内置终端进行演示
虚拟环境配置
因为我的vscode终端默认使用powershell,所以我需要在powershell中初始化conda
conda init powershell
初始化完后需要设置powershell限制策略,需要使用管理员模式启动powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
之后重启powershell应该就可以在powershell中切换虚拟环境了即 conda activate 指令
接下来我们需要安装LangChain相关的工具
我们需要新建一个虚拟环境
conda create -n LangChainEnv python=3.11
输入指令后输入 y
输入指令切换到我们刚刚创建的虚拟环境
conda activate LangChainEnv
安装LangChain
pip install langchain
安装 transformers
pip install transformers
安装 torch
pip install torch
针对pip下载缓慢,我这里进行了换源的配置,使用清华源进行下载,具体如何换源可以参考网络上的其他教程
模型下载
国内开源的模型平台我目前在使用的是魔搭
有需要的模型可以在里面搜索下载
我打算在本地用LangChain调用Qwen2.5-0.5B-Instruct模型,0.5B指的是参数量的大小,参数量越小,模型推理速度就越快,但是理解能力肯定不如那些参数量大的模型。
选用0.5B小参数量的模型,主要是因为我使用本机进行部署,个人电脑的性能比较有限,如果需要部署参数量更大的模型,需要性能更强的机器,也可以使用云服务器部署。
目前我在本机演示
打开魔搭平台如下:
进入Qwen2.5-0.5B-Instruct的模型下载的界面
这里建议使用刚刚activate的conda虚拟环境,pip一个modelscope,建议使用modelscope工具进行模型的下载,如果使用git的话看不到下载的进度条
pip install modelscope
输入以下指令进行模型的下载,--local_dir可以指定下载的路径,建议新建一个文件夹再下载,模型文件会直接下载到指定的--local_dir路径里
modelscope download --model Qwen/Qwen2.5-0.5B-Instruct --local_dir ./qwen2.5-0.5B
下载的过程大概是这样
使用LangChain调用本地模型
LangChain实战课中有相关的介绍
7 调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?
我们需要自定义一个LLM类
# 自定义的LLM类,继承自基础LLM类
class CustomLLM(LLM):
model_name = MODEL_NAME
# 该方法使用Llama库调用模型生成回复
def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
prompt_length = len(prompt) + 5
# 初始化Llama模型,指定模型路径和线程数
llm = Llama(model_path=MODEL_PATH+MODEL_NAME, n_threads=4)
# 使用Llama模型生成回复
response = llm(f"Q: {prompt} A: ", max_tokens=256)
# 从返回的回复中提取文本部分
output = response['choices'][0]['text'].replace('A: ', '').strip()
# 返回生成的回复,同时剔除了问题部分和额外字符
return output[prompt_length:]
# 返回模型的标识参数,这里只是返回模型的名称
@property
def _identifying_params(self) -> Mapping[str, Any]:
return {"name_of_model": self.model_name}
# 返回模型的类型,这里是"custom"
@property
def _llm_type(self) -> str:
return "custom"
其中需要用到的相关参数在下载的模型文件中有提到,比如模型名称,可以在模型中的README文件中查看
根据 Qwen2.5-0.5B-Instruct 的文档,我们可以对自定义的LLM类进行实现
其中模型路径就作为模型名称的参数传入
from typing import Optional, List, Mapping, Any
from transformers import AutoModelForCausalLM, AutoTokenizer
from langchain.llms.base import LLM
import os
# 模型的名称和路径常量
model_path = os.path.join(os.path.dirname(__file__), "./qwen2.5-0.5B/") # 模型路径
class CustomLLM(LLM):
tokenizer: AutoTokenizer = None
model: AutoModelForCausalLM = None
def __init__(self):
super().__init__() # 调用基类的构造函数
# 初始化模型和分词器,确保路径正确
self.model = AutoModelForCausalLM.from_pretrained(model_path)
self.tokenizer = AutoTokenizer.from_pretrained(model_path)
def _call(self, prompt: str, max_new_tokens: int = 512) -> str:
# 将prompt转换为模型输入
model_inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device)
# 生成回复
generated_ids = self.model.generate(**model_inputs, max_new_tokens=max_new_tokens)
# 解码生成的回复
response = self.tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
return response
# 返回模型的标识参数,这里只是返回模型的名称
@property
def _identifying_params(self) -> Mapping[str, Any]:
# 这里需要定义model_name,因为它被用作属性
model_name = 'qwen/Qwen2.5-0.5B-Instruct' # 模型名称
return {"name_of_model": model_name}
# 返回模型的类型,这里是"custom"
@property
def _llm_type(self) -> str:
return "custom"
if __name__ == "__main__":
# 初始化自定义LLM类
llm = CustomLLM()
# 使用自定义LLM生成一个回复
result = llm._call("简要地介绍以下大语言模型")
# 打印生成的回复
print(result)
在vscode中编写代码
选择python的解释器,刚刚创建好的conda虚拟环境
创建.vscode文件夹,在里面创建launch.json文件
点击Python调试程序
调试配置选择Python文件
直接回到代码文件,F5运行
生成的结果如下
总结
本文通过自定义LLM调用了本地qwen模型,完成了从环境配置,模型下载,以及自定义LLM类的方式,调用了Qwen2.5-0.5B-Instruct生成对话的全部流程。对于其他的模型也可以使用类似的方式实现部署应用。