本地化大语言模型ChatGLM,纯前端技术玩转大模型

如果你不喜欢广告,请收藏我的网站,下次在网站中搜索
用真金白银赞赏有价值的内容,请通过文末二维码打赏

作为前端开发,想要介入大模型应用开发,必须有一个大模型可以作为底层驱动,但是openAI的chatGPT需要付费,且网络影响因素大,本地部署大模型就成了开发阶段的必然选择。作为架构中的关键一环,我们需要一个本地化的大语言模型来支持“完全本地化”。目前市面上的大模型非常多,但对于我们而言,必须满足开源、免费、支持中文这三个硬性条件,另外还要考虑性能、token量、智能程度等。开源是为了本地化部署,像openai的闭源模型,直接pass。国外有几个性能和智能程度都很好的开源模型,但是不支持中文比较遗憾。最终选定了chatglm作为我们的目标。本文将详细讲解我开发的chatglmjs,这个让前端开发者可以快速接入本地化大模型的库。

什么是ChatGLM?

ChatGLM是有清华和智普合作研发的一款大语言模型,目前是开源免费可商用(需获得许可)的状态,支持中英双语,在中文领域属于第一批次的开源模型。

和ChatGPT一样,都是基于对话形式的大语言模型,虽然GLM与GPT不同,但是在最终表现形式,ChatGLM和ChatGPT是一致的应用形态,都是对话模式下的LLM。预训练语言模型大体可以分为三种:自回归(GPT系列)、自编码(BERT系列)、编码-解码(T5、BART)。GLM是一个通用的预训练语言模型,它在NLU(自然语言理解)、conditional(条件文本生成) and unconditional generation(非条件文本生成)上都有着不错的表现。通俗的讲,区别于上述三种预训练方案,GLM采用“完形填空”的方案来训练模型。

虽然总体上,目前的最新版ChatGLM3能力还不如ChatGPT,但是在通用智能方面已经有非常不俗的表现,可以作为我们开发的底层智能驱动。

另外,与其他开源模型相比,ChatGLM还有一个特点,对机器的要求不高,其量化版本甚至被某些网友移植到安卓手机上运行,可见未来有可能在手机上大面积应用该模型。

如何本地化LLM?

ChatGLM官方提供的是python的demo和微调代码,怎么才能在我们的nodejs环境中跑它的模型呢?一种方案是用fastapi起一个python的服务提供接口,node端像普通调第三方接口一样调用它,但是这样就违背了我“纯前端技术”的目标,况且python的环境并不好搭,我折腾了很久才跑起了它的demo。还有没有其他方案呢?

我们来分析一下,其实对于运行大模型用来预测而言,它的代码分为3个部分:模型文件本身、transformer运行时代码、用来提供对外标准接口的代码。其中,模型文件本身都是一样的,从huggingface上下载。官方提供的python demo其实主要是实现了运行时,可以加载模型文件和transform,并完成预测。接口代码则是赠送品,只用来作为demo的可交互界面。

对于我们而言,最难搞定的就是,如何在nodejs下有一个可以加载、执行模型文件的运行时。

灵光一闪下,我看到社区有一个chatglm.cpp的项目,结合nodejs可以支持c/c++ addon,瞬间就来了灵感。chatglm.cpp这个项目用c++实现了transformer运行时,除了支持chatglm外,还支持百川和其他几个模型。我们把它的c++代码提炼出来,稍作调整,编译成可以在nodejs环境下运行的addon文件,直接在js里面reuqire即可。这样一来,我们就可以nodejs本地运行大模型啦。此外,它需要把原始的模型文件转化为自己的.bin文件,通过这部转化,原始模型文件由分散的文件列表,变成一个独立的.bin文件,这样更方便我们实现模型文件的迁移和分享。

经过一个周末的折腾之后,我完成了这个部分的整理,并发布了chatglmjs这个包,你可以方便使用它:

import { chat } from 'chatglmjs';

chat({
  model_bin_path,
  prompt: '你好',
  onmessage(msg) {
    process.stdout.write(msg);
  },
});

安装chatglmjs时,它会自己编译自己,因此需要你的电脑有完整的可以编译c++的环境,mac上有对应版本的xcode,linux则是较高版本的g++,windows上有最新的vs即可。

需要注意的是,由于node的限制,我们在后续使用langchain时会用到tensorflow的cpu版本,而不同电脑上的显卡驱动环境也不确定,因此,在构建chatglmjs时,我默认是让模型在cpu上运行的,虽然性能差,但是部署方便。

Chatglm.cpp把模型文件转化为.bin文件的操作需要按照它的文档进行,此时又要用到python,去搭python的环境也很麻烦,所以,你可以直接用别人已经转化好的.bin文件。下载之后,把它的路径传给model_bin_path即可。

如何在前端开发大模型应用?

有了chatglmjs之后,我们就有了在自己电脑上运行大模型的基础,接下来,我们要做的就是利用它进行更高层面的应用开发。对于chatglmjs而言,它只提供了一个对话接口,大模型的所有能力都是基于对话来提供的,因此prompt的设计至关重要,除了prompt之后,想要搭建起一个类似chatgpt那样的聊天窗口,我们还要设计聊天历史等状态数据,以及流式交互的接口等等。大体上,我认为我们需要一层一层的按照如下架构来完成开发:

大体上想要获得一个应用,要考虑5层设计,从下到上分别是:存储层、平台层、框架层、业务层、应用层。当然,我这里做的还是比较草率,在真正设计架构时,还要根据实际业务考虑更多东西。在框架层,我推荐LangChain,因为它有js版本,提供了非常丰富的组件,我们利用这些组件来把一些核心的东西搭建出来,而不要自己去从零开始写。

当然,我们在编写代码时,还应该注意,AI是我们的好帮手,我们可以大胆的尝试让AI帮助我们完成这个架构的实现。

结语

本文简单介绍了前端开发者应该如何参与到大模型的开发中,其中核心的部分是实现了chatglmjs,可以帮助开发者们在本地使用大模型作为开发时的依赖,从而更好的验证自己的想法。相信大模型应用开发会很快成为我们开发业界的讨论重点,我们不妨从现在开始尝试,从安装chatglmjs开始体验这一神奇的新时代。

2024-01-23 377

为价值买单,打赏一杯咖啡

本文价值3.77RMB