LangChain调用本地模型 | 豆包MarsCode AI刷题

159 阅读5分钟

LangChain调用本地模型 | 豆包MarsCode AI刷题

LangChain调用本地模型

环境准备

Windows 10

Visual Studio Code

Anaconda

Visual Studio Code 安装

vscode 官网

Visual Studio Code - Code Editing. Redefined

下载完vscode后安装 python 插件

image.png

Anaconda 安装

下载 Anaconda

可以在官网下载,也可以在镜像站下载

www.anaconda.com/

mirrors.tuna.tsinghua.edu.cn/anaconda/ar…

下载的时候记得勾选添加到环境变量,方便在终端直接使用 conda 指令

下载完后尝试在终端使用 conda 指令

conda --version

我直接使用vscode的内置终端进行演示 image.png

虚拟环境配置

因为我的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

image.png

输入指令后输入 y

image.png

输入指令切换到我们刚刚创建的虚拟环境

conda activate LangChainEnv

安装LangChain

pip install langchain

安装 transformers

pip install transformers         

安装 torch

pip install torch

针对pip下载缓慢,我这里进行了换源的配置,使用清华源进行下载,具体如何换源可以参考网络上的其他教程

模型下载

国内开源的模型平台我目前在使用的是魔搭

modelscope.cn/home

有需要的模型可以在里面搜索下载

我打算在本地用LangChain调用Qwen2.5-0.5B-Instruct模型,0.5B指的是参数量的大小,参数量越小,模型推理速度就越快,但是理解能力肯定不如那些参数量大的模型。

选用0.5B小参数量的模型,主要是因为我使用本机进行部署,个人电脑的性能比较有限,如果需要部署参数量更大的模型,需要性能更强的机器,也可以使用云服务器部署。

目前我在本机演示

打开魔搭平台如下: image.png

进入Qwen2.5-0.5B-Instruct的模型下载的界面 image.png

这里建议使用刚刚activate的conda虚拟环境,pip一个modelscope,建议使用modelscope工具进行模型的下载,如果使用git的话看不到下载的进度条

pip install modelscope

image.png

输入以下指令进行模型的下载,--local_dir可以指定下载的路径,建议新建一个文件夹再下载,模型文件会直接下载到指定的--local_dir路径里

modelscope download --model Qwen/Qwen2.5-0.5B-Instruct --local_dir ./qwen2.5-0.5B 

image.png

下载的过程大概是这样

使用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中编写代码 image.png

选择python的解释器,刚刚创建好的conda虚拟环境 image.png

创建.vscode文件夹,在里面创建launch.json文件 image.png

点击Python调试程序 image.png

调试配置选择Python文件 image.png

直接回到代码文件,F5运行 image.png

生成的结果如下 image.png

总结

本文通过自定义LLM调用了本地qwen模型,完成了从环境配置,模型下载,以及自定义LLM类的方式,调用了Qwen2.5-0.5B-Instruct生成对话的全部流程。对于其他的模型也可以使用类似的方式实现部署应用。