本文将介绍如何使用ollama实现对开源大模型的本地化部署,让每个有技术能力的企业都可以“套壳”大模型,在各自的专业领域内“遥遥领先“。在本案例中我将使用两个开源的软件:
ollama:是一个轻量级可扩展的框架,它可以轻易地帮你管理本地的众多开源大模型,并支持众多的开源大模型,包括llama 2 、gemma、codegemma、Mistral等,并允许用户自定义和创建自己的模型。
open-webui:是一个开源的Web界面,用于同各种大语言模型进行交互,并可以同ollama所管理的大语言模型进行快速集成。它提供了一个用户界面,允许用户输入prompt指令,并获得所选择模型生成的响应,由于本地化部署,其返回的结果和人工反馈又可以做为人工标注的数据,对开源大模型进行微调和强化学习用的训练数据。
本文主要介绍如下内容:
安装ollama
选择并安装大模型
安装Open-WebUI
测试大语言模型效果
大语言模型优化
安装Ollama
首先,打开Ollama的官方网站(https://ollama.com/download),如下图所示,选择自己操作系统版本即可:
下载完成之后,双击安装,安装完成之后会在Mac上看到如下的图标,代表安装完成:
选择并安装大模型
在Ollama的官方网站有一个Models菜单,如下图所示:
点击即可看到Ollama所支持的所有大模型列表,这里的下拉列表有很多,读者可以自行研究:
在本例的部署中,我选择了两个7000万左右参数的大模型:
Gemma:7b - 7b,代表7000万参数,是google大模型Gemini的开源版本,一个通用领域的大模型
CodeGemma:7b,是google出品的专注于代码编写的大模型,同样7000万参数。
我所使用的电脑为14寸MacBook Pro,配置如下图所示:
在此配置下,经亲测,两个7000万参数的大模型在不进行微调和强化学习的情况下,都运行流畅。如果想试验更好的模型,可以选择13b或70b的版本,当然占用的内存和GPU资源也会更高,13b约1.4亿参数,最少内存要求为16G,但是在运行时基本很难忍受返回结果的速度,约1-2分钟会写一个单词出来。
我们以CodeGemma为例,来介绍其部署指令,从上图点击“Codegemma“进入该大模型的详细介绍页面,如下图所示:
点击红框的按钮,即可复制指令,直接在命令提示符下运行即可,如下图所示,即会开始下载大模型并自动化完成部署:
安装完成之后,会马上有一个基于命令行的交互界面,可以输入prompt指令,并获得返回结果,如下图所示:
安装成功!!!
安装Open-WebUI
安装Open- WebUI之前请先安装Docker,如果不了解Docker的请自行上网查询,本文将不再缀述Docker的安装和部署。
安装完Docker之后,我们将继续安装Open-WebUI,进入Open-WebUI的官网(https://docs.openwebui.com/getting-started/),开始安装,如下图所示:
如果将Ollama和OpenWebUI要部署在同一台主机上,请选择红框中的指令,如果是不同的主机请选择红框下方的内容:
同一主机部署
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
不同主机部署:这里要指明OLLAMA_BASE_URL参数,根据实际情况进行调整即可
docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=https://example.com -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
-
安装完成之后运行http://localhost:3000,即可进入如下界面,首次运行需要注册:
安装成功!!!
测试大语言模型效果
第一个示例 - Gemma:
从交流的结果来看,7b模型的Gemman已经成功识别你的交流意图了,只是模型内部存放的知识有误,竟然认为ChatGPT是Google开发的。
第二个示例 - Gemma:
第二个示例我上传了一个参与某客户的调研,给出的结果不是重点内容,但是说的内容也没有错,表现一般。
第三个示例 - CodeGemma:
我们希望写一段代码展示特斯拉最近5年的股票数据,及其趋势,代码一次性测试通过,看来这个写代码的微调版本效果还是不错的。
下图为CodeGemma生成的代码:
下图为复制之后,直接运行的结果,一次性运行通过:
第四个示例 - 访问网络内容
无法通过互联网访问外部数据。
效果总结:
在对7000万参数的大型模型进行测试后,我们发现它已经具备了识别人类指令并进行推理的基本能力。但是,由于模型规模和联网能力的限制,其回答问题的内容可能会出错。我相信经过模型微调等优化,一定能够获得更好的效果。
现在它就像是一个九年义务教育的合格毕业生,剩下的就是接受更专业领域的教育,以便能够在某个专业领域工作。
下一步 :优化大模型
优化大模型主要包括如下图所示的4种方法:
prompt 方法
指令优化方法在不调整模型参数的情况下,用于优化大型模型的结果。这种方法特别适用于如chatGPT这类大型语言模型,因为它们已经储存了大量的知识信息,并能通过外部工具与互联网数据交互,所以你需要的知识基本上都能得到满意的回答。
然而,对于我目前在本地部署的7000万参数的大型模型,由于其训练过的知识范围非常有限,无论如何优化指令,都难以取得好的效果。
因此,在后续优化针对本地部署的这些模型时,将不会进行指令优化。
知识库
知识库的优化方法(严格意义上不算优化,而是一种外挂,就像玩流时开一个外挂一样)是在一个已经具有基本认知能力的通用大模型的基础上,增加专业领域的知识库。在接收到用户的指令并正确识别意图后,优先到本地关联的知识库中获取匹配的知识信息。然后通过大模型的推理能力,处理后返回给用户。
这是一种在专业领域(如运维、医疗等)中非常快速的使用方法。
微调
这是一种有监督的学习方法。通过使用人为标注的可靠数据,对特定领域(如医疗、法律、运维)的数据集进行模型微调。这样做是希望模型能更好地理解和处理这些领域的语言特征。在特定领域的数据集上进行微调可以有助于提升模型的表现。
强化学习
这是一种结合人机交互中从人类反馈中学习的方法,如聊天机器人、智能问答系统中针对每次返回的结果人类都可以反馈好的或坏的,这些反馈的数据可以使模型更好地理解人类指令,生成更自然、更符合人类期望的回答,从而提升用户体验。如下图所示,为人类的反馈:
下一次发表内容将专注在运维领域知识库的构建,并通过大模型使用该知识库。