[大模型]TransNormerLLM-7B 接入 LangChain 搭建知识库助手

TransNormerLLM-7B 接入 LangChain 搭建知识库助手

环境准备

在 autodl 平台中租赁一个 3090/4090 等 24G 显存的显卡机器,如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8

在这里插入图片描述

接下来打开刚刚租用服务器的 JupyterLab,并且打开其中的终端开始环境配置、模型下载和运行 demo。

pip 换源加速下载并安装依赖包

# 升级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.11.0
pip install "transformers>=4.37.0" accelerate tiktoken einops scipy transformers_stream_generator==0.0.4 peft deepspeed
pip install -U huggingface_hub
pip install triton==2.0.0
pip install einops
pip install langchain

模型下载

使用 modelscope 中的 snapshot_download 函数下载模型,第一个参数为模型名称,参数 cache_dir 为模型的下载路径。

在 /root/autodl-tmp 路径下新建 model_download.py 文件并在其中输入以下内容,粘贴代码后记得保存文件,如下图所示。并运行 python /root/autodl-tmp/model_download.py 执行下载,模型大小为 14 GB,下载模型大概需要 2 分钟。


import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
import os
model_dir = snapshot_download('OpenNLPLab/TransNormerLLM-7B', cache_dir='/root/autodl-tmp', revision='master')

代码准备

为便捷构建 LLM 应用,我们需要基于本地部署的 TransNormerLLM-7B,自定义一个 LLM 类,将 TransNormerLLM-7B 接入到 LangChain 框架中。完成自定义 LLM 类之后,可以以完全一致的方式调用 LangChain 的接口,而无需考虑底层模型调用的不一致。

基于本地部署的 TransNormerLLM-7B 自定义 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, LlamaTokenizerFast
import torch

class TransNormer_LLM(LLM):
    # 基于本地 TransNormer 自定义 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, trust_remote_code=True, use_fast=False)
        self.model = AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtype=torch.bfloat16, trust_remote_code=True, device_map="auto")
        self.model.generation_config = GenerationConfig.from_pretrained(mode_name_or_path)
        print("完成本地模型的加载")
        
    def _call(self, prompt : str, stop: Optional[List[str]] = None,
                run_manager: Optional[CallbackManagerForLLMRun] = None,
                **kwargs: Any):

        messages = [{"role": "user", "content": prompt }]
        input_ids = self.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
        model_inputs = self.tokenizer([input_ids], return_tensors="pt").to('cuda')
        generated_ids = self.model.generate(model_inputs.input_ids,max_new_tokens=512)
        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_tokens=True)[0]
        
        return response
    @property
    def _llm_type(self) -> str:
        return "TransNormer_LLM"

在上述类定义中,我们分别重写了构造函数和 _call 函数:对于构造函数,我们在对象实例化的一开始加载本地部署的 TransNormer 模型,从而避免每一次调用都需要重新加载模型带来的时间过长;_call 函数是 LLM 类的核心函数,LangChain 会调用该函数来调用 LLM,在该函数中,我们调用已实例化模型的 chat 方法,从而实现对模型的调用并返回调用结果。

在整体项目中,我们将上述代码封装为 LLM.py,后续将直接从该文件中引入自定义的 LLM 类。

调用

然后就可以像使用任何其他的langchain大模型功能一样使用了。

from LLM import TransNormer_LLM #!注意此代码需要和 LLM.py在同路径下,如果是写在Jupyter 中则不需要库导入
llm = TransNormer_LLM(mode_name_or_path = "/root/autodl-tmp/OpenNLPLab/TransNormerLLM-7B")
llm("你是谁")

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/556712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单实用的备忘录小工具 记事提醒备忘效果超好

在这个信息爆炸的时代,我们每个人都需要处理大量的信息和任务。有时候,繁忙的生活和工作会让我们感到压力山大。幸运的是,现在有很多简单实用的软件工具,像得力的小助手一样,帮助我们整理思绪,提高效率&…

Redis系列1:深刻理解高性能Redis的本质

1 背景 分布式系统绕不开的核心之一的就是数据缓存,有了缓存的支撑,系统的整体吞吐量会有很大的提升。通过使用缓存,我们把频繁查询的数据由磁盘调度到缓存中,保证数据的高效率读写。 当然,除了在内存内运行还远远不够…

Docker 和 Podman的区别

文章目录 Docker 和 Podman的区别安装架构和特权要求运行容器方面安全性(root的权限)镜像管理方面命令方面Docker常用命令Podman常用命令 Docker 和 Podman的区别 安装 Docker安装:官方文档 Podman安装:官方文档 架构和特权要求 Docker使用client-se…

11、电科院FTU检测标准学习笔记-越限及告警上送功能

作者简介: 本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验 在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验 ———————————————————…

git 快问快答

我在实习的时候,是用本地开发,然后 push 到 GitHub 上,之后再从 Linux 服务器上拉 GitHub 代码,然后就可以了。一般程序是在 Linux 服务器上执行的,我当时使用过用 Linux 提供的命令来进行简单的性能排查。 在面试的时…

详解爬虫基本知识及入门案列(爬取豆瓣电影《热辣滚烫》的短评 详细讲解代码实现)

目录 前言什么是爬虫? 爬虫与反爬虫基础知识 一、网页基础知识 二、网络传输协议 HTTP(HyperText Transfer Protocol)和HTTPS(HTTP Secure)请求过程的原理? 三、Session和Cookies Session Cookies Session与…

抖音小店流量差怎么办?做好这三大细节,就可以完美解决!

大家好,我是电商糖果 很多刚开店的朋友,遇到的第一个难题就是店铺流量差。 没有流量,也就不会出单,更别提起店了。 糖果做抖音小店四年多了,也开了很多家小店。 很多新店没有流量,其实主要原因是这三个…

在mysql函数中启动事物和行锁/悲观锁实现并发条件下获得唯一流水号

业务场景 我有一个业务需求:我有一个报卡表 report里面有一个登记号字段 fcardno、地区代码 faddrno和发病年份 fyear,登记号由**“4位地区代码”“00”“发病年份”“5位流水号”**组成,我要在每次插入一张报卡(每一行数据&#…

【MATLAB源码-第46期】基于matlab的OFDM系统多径数目对比,有无CP(循环前缀)对比,有无信道均衡对比。

操作环境: MATLAB 2022a 1、算法描述 OFDM(正交频分复用)是一种频域上的多载波调制技术,经常用于高速数据通信中。以下是关于多径数目、有无CP(循环前缀)以及有无信道均衡在OFDM系统中对误码率的影响&am…

自如电费均摊问题

3月份搬了次家,嫌麻烦租了自如,第一个月的电费账单出来了,由于我是中途搬进去的,于是乎就好奇他会如何计算均摊,这个月电费账单出来了,算了下发现了点东西。 先说结论:按照我的这个均摊的方式&a…

刻度清晰耐酸碱腐蚀PFA材质实验室用塑料量具特氟龙量筒量杯

PFA量筒为上下等粗的直筒状,特氟龙量杯是上大下小的圆台形,底座均有宽台设计,保证稳定性,两者均可在实验室中作为定量量取液体的量具,上沿一侧有弧嘴设计,便于流畅地倾倒液体。 规格参考:5ml、…

主线程捕获子线程异常

正常情况下使用多线程出现异常时,都是按照单个任务去处理异常,在线程间不需要通信的情况下,任务之间互不影响,主线程也不必知道子线程是否发成异常。 那么只需要处理子线程异常即可 Task.Run(() > {try{throw new Exception(&…

【Vision Pro应用】分享一个收集Apple Vision Pro 应用的网站

您是否也觉得 Vision Pro 应用程序商店经常一遍又一遍地展示相同的几个 VisionOS 应用程序?许多有趣、好玩的应用程序似乎消失得无影无踪,让人很难发现它们。为了帮助大家更轻松地探索和体验最新、最有趣的 Vision Pro 应用程序,这里分享一个网站https://www.findvisionapp.…

IDEA @Autowired不显示红线

IDEA 中,Autowired 显示红线一般情况是注入 Mapper 或者 Dao 时出现的,如下图: 这个报错是因为 Mapper 或者 Dao 上没有加 Repository 或者 Mapper,Autowired 注入时就判断为这不是一个 Bean。 不建议通过加上面两个注解的方式解…

Java面试八股之hashCode()和equals()方法的重要性

hashCode()和equals()方法的重要性 逻辑判断:equals()方法用于定义对象逻辑上的相等标准,即当两个对象在业务意义上被视为“相同”时,equals()应返回true。 哈希表支持:hashCode()返回一个整数哈希码,用于在哈希表&a…

【电路笔记】-数字逻辑门总结

数字逻辑门总结 文章目录 数字逻辑门总结1、概述2、逻辑门真值表3、总结 数字逻辑门有三种基本类型:与门、或门和非门。 1、概述 我们还看到,数字逻辑门具有与其相反或互补的形式,分别为“与非门”、“或非门”和“缓冲器”,并且…

AIGC的崛起:定义未来内容创作的新纪元

🌟文章目录 🌟AIGC简介🌟 AIGC的相关技术与特点🌟AIGC有哪些应用场景?🌟AIGC对其他行业影响🌟面临的挑战与问题🌟AIGC未来发展 🌟AIGC十大热门网站推荐: 文心…

常用的7个免费ChatGPT网站

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

2022天梯赛 L3_2 关于深度优先搜索和逆序对的题应该不会很难吧这件事 【树上逆序对计数】

传送门:https://pintia.cn/problem-sets/994805046380707840/exam/problems/1518582895035215872?type7&page1 思路 观察发现,逆序对可以分成两类: 节点 u u u 和 v v v 有明确的父子关系(不一定是直属的直连边&#xff…

今天给大家推荐36套404页面模板

404页面是网站必备的一个页面,它承载着用户体验与SEO优化的重任。当用户访问不存在的页面时,服务器会返回404错误代码,并显示404页面。一个好的404页面可以帮助用户快速找到所需信息,并提升网站的用户体验。 以下是一些演示下载资…