第一章 LangChain本地化环境搭建


一、机器环境及LLM环境

笔者的机器环境是纯国产操作系统Deepin社区免费版V20.9。要想玩转大语言模型LLM必须搭建深度学习环境。主流的都是使用Python加上深度学习框架。深度学习框架有很多,最先火起来的是TensorFlow,但是这几年PyTorch特别受欢迎,不论学术界还是工业界都受追捧。国产的还有百度飞桨PaddlePaddle,华为的MindSpore等。这些深度学习框架基本都是开源的,用哪个看读者喜好。

说一下笔者的选择:

硬件:UNC X15准系统笔记本,GPU为英伟达3070,8GB显存。

软件:操作系统是Deepin V20.9;显卡驱动最新;CUDA Toolkit 安装了cuda11.8;Python 3.8.5;PyTorch安装了2.0版;开发IDE选择了微软的VisualCode,安装了笔记本插件,支持.ipynb格式,这种格式适合教学和实验、调试程序,非常方便。调试通过了再粘贴到.py里面。VisualCode兼容各种格式,使用方便,不用换来换去。关键还免费,笔者整个生态都是开源免费。

(注:这里环境的搭建请搭建先参照网上基于Ubuntu系统的相关文章,后面笔者有时间也会整理出文章来。)

二、部署本地LLM:ChatGLM2-6B

ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:

更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。

更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练。对于更长的上下文,我们发布了 ChatGLM2-6B-32K 模型。LongBench 的测评结果表明,在等量级的开源模型中,ChatGLM2-6B-32K 有着较为明显的竞争优势。

更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。

更开放的协议:ChatGLM2-6B 权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用

到github上克隆最新版ChatGLM2-6B。

git clone https://github.com/THUDM/ChatGLM2-6B.git

然后安装必须的支持包:

pip install -r requirements.txt

按照README说明到huggingface上下载预训练模型,根据机器配置下载合适版本。笔者只有8GB显存,下载的是chatglm2-6b-int4量化版。

修改web_demo2.py中关于加载模型的代码。

@st.cache_resource

def get_model():

    tokenizer = AutoTokenizer.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True)

    model = AutoModel.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True).cuda()

其中"./chatglm2-6b-int4"是笔者的模型路径,就放到了ChatGLM2-6B下面。修改成你下载下来的预训练模型路径即可。然后敲如下命令测试:

streamlit run web_demo.py

这个web演示是用streamlit写的。我们要使用LangChain调用,所以要使用ChatGLM2的api。修改根目录下api.py加载模型代码:

if __name__ == '__main__':

    tokenizer = AutoTokenizer.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True)

    model = AutoModel.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True).cuda()

确保"./chatglm2-6b-int4"替换成你下载的预训练模型路径。启动api服务:

Python api.py

输出如下:

INFO: Started server process [16048]

INFO:    Waiting for application startup.

INFO:    Application startup complete.

INFO:    Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

表明服务地址为本机,端口为8000。访问http://127.0.0.1:8000即可。

三、安装LangChain

LangChain在GitHub上开源,可以下载源代码。也可以直接安装:

pip install LangChain

四、定制LangChain的LLM类

定义一个LLM类继承自langchain.llms.base.LLM,用于调用ChatGLM2的api。代码如下:

from langchain.llms.base import LLM

from typing import List, Optional

import requests

import json

LLM_MODEL='http://127.0.0.1:8000'

class ChatGLM2(LLM):

    max_token: int = 10000

    temperature: float = 0.1

    top_p = 0.9

    history_len:int=100

    #history = []

    def __init__(self):

        super().__init__()

    @property

    def _llm_type(self) -> str:

        return "http"


    def _call(self, prompt: str, stop: Optional[List[str]] = None):

        headers = {'Content-Type': 'application/json'}

        #history+=stop

        data=json.dumps({

            'prompt':prompt,

            'temperature':self.temperature,

            'stop':stop,

            'max_length':self.max_token

            })

        response = requests.post(LLM_MODEL,headers=headers,data=data)

        if response.status_code!=200:

            return "查询结果错误",[['查询结果错误','error']]

        resp = response.json()

        response=resp['response']


        return response

五、测试并开启新征程

下面我们写一段代码,测试一下我们的LLM类是否好用。

llm=ChatGLM2() #用前面自定义的LLM类声明并初始化一个实例

print(llm("你好")) #开始对话

如果你看到下面输出:

你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。

恭喜你成功了。从此可以不用申请openai 的key也可以学习langchain了,我们将一起学习全部开源的大语言模型应用开发实用技术。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 解;令ab-b+a=k,则ab=k-(a-b). (a-b)²=a²+b²-2ab=9-2[k-(a-b)] =9...
    笑对余生_阅读 251评论 1 19
  • disneyPixarCartoon_v10 紫边问题有待研究 (SFW:2),HDR,UHD,8K,best q...
    大法师的输出阅读 183评论 0 0
  • 随着ChatGPT的迅速出圈,加速了大模型时代的变革。对于以Transformer、MOE结构为代表的大模型来说,...
    吃果冻不吐果冻皮阅读 752评论 0 2
  • 刀郎新歌《颠倒歌》中用到的那些成语 歌词: 把一只鳖扔进黄色的便盆它会自觉高贵 骑一头驴参加宫廷的舞会它能自比王妃...
    吟啸斋主阅读 74评论 0 0
  • 辛普森案 课程分享46 这是通识选修课《社会科学与数学》第五讲《法学与数学》的第一节《罪行判定与概率》中的案例3。...
    彭求实阅读 161评论 0 1