本地中文大语言模型搭建和对比
GGUF
GGUF说明:
GGUF和GGML的区别:
中文大语言模型准备
阿里官方给出的通义千问和其他几个大模型的性能对比:
阿里通义千问
Ollama 直接下载阿里巴巴Qwen-7B模型:
ollama pull qwen:7b
查看Modelfile:
ollama show --modelfile qwen:7b
# Modelfile generated by "ollama show"
# To build a new Modelfile based on this one, replace the FROM line with:
# FROM qwen:7b
FROM /Users/eric/.ollama/models/blobs/sha256-87f26aae09c7f052de93ff98a2282f05822cc6de4af1a2a159c5bd1acbd10ec4
TEMPLATE """{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>{{ end }}<|im_start|>user
{{ .Prompt }}<|im_end|>
<|im_start|>assistant
"""
PARAMETER stop "<|im_start|>"
PARAMETER stop "<|im_end|>"
百川
通过 Hugging Face
下载Baichuan2-7B gguf 文件到本地。新建文件 baichuan2-7b-modelfile.txt
:
FROM ./baichuan2-7b-chat.Q5_K_S.gguf
# set prompt template
TEMPLATE """[INST] <<SYS>>{{ .System }}<</SYS>>
{{ .Prompt }} [/INST]
"""
# set parameters
PARAMETER stop "[INST]"
PARAMETER stop "[/INST]"
PARAMETER stop "<<SYS>>"
PARAMETER stop "<</SYS>>"
# set system message
SYSTEM """
You are a helpful assistant.
"""
创建本地模型:
ollama create baichuan2:7b -f baichuan2-7b-modelfile.txt
智谱AI
ChatGlM3-6B 因为 ChatGLM 模型架构的关系,目前还不支持 GGUF 格式。本地运行fp16直接内存不足,无法运行或者卡爆,将使用GGML量化文件运行。
量化 ChatGLM3-6B
以下是参考 chatglm.cpp
github 官网。
下载基础文件:
git clone https://huggingface.co/THUDM/chatglm3-6b
git clone --recursive https://github.com/li-plus/chatglm.cpp.git
安装依赖:
python3 -m pip install -U pip
python3 -m pip install torch tabulate tqdm transformers accelerate sentencepiece
使用q4_0
这个量化类型来进行量化,从原来 12G 量化后为原模型大小的 1/4 为3.27G,大大降低了模型的容量。
python3 chatglm.cpp/chatglm_cpp/convert.py -i chatglm3-6b -t q4_0 -o chatglm-ggml.bin
构建:
cd chatglm.cpp
# macos安装cmake,其他平台搜索一下安装方法
brew install cmake
cmake -B build && cmake --build build -j --config Release
# 拷贝ggml文件到chatglm.cpp目录
cp ../chatglm-ggml.bin ./
./build/bin/main -m chatglm-ggml.bin -p 你好
# 你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。
运行
1) 终端交互式:
./build/bin/main -m chatglm-ggml.bin -i
结果演示:
2)python运行:
# pip install -U chatglm-cpp
import chatglm_cpp
pipeline = chatglm_cpp.Pipeline("chatglm.cpp/chatglm-ggml.bin")
result = pipeline.chat([chatglm_cpp.ChatMessage(role="user", content="你好")])
print(result)
结果演示:
## python文件不要放在chatglm.cpp目录
$ cd ..
$ python3 test.py
ChatMessage(role="assistant", content="你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。", tool_calls=[])
3)Gradio web运行:
$ python3 chatglm.cpp/examples/web_demo.py -m chatglm.cpp/chatglm-ggml.bin
Running on local URL: http://127.0.0.1:7860
To create a public link, set `share=True` in `launch()`.
结果演示:
模型能力简单对比
个人参考部分
参加对比的模型:
qwen-7B
、Baichuan2-7B
、ChatGLM3-6B
和ChatGPT-3.5
,其中ChatGPT 3.5在参数体量超过其他模型,仅作为一组对比,从更广度的对比上来看下各个模型的能力;工具:
qwen-7B
和Baichuan2-7B
使用AnythingLLM UI + Ollama;ChatGLM3-6B
使用Gradio UI访问本地量化文件;ChatGPT-3.5
使用浏览器直接访问;测试维度题:分别包括
实体提取 Extraction
文本总结 Summarizing
推断 Inferring
逻辑推理 Logical reasoning
翻译 Transforming
扩大补充 Extanding
SQL生成 SQL
生成代码展示分析图表
只截取首次答案:大模型对于同一个问题的每次结果输出会出现不太一样,比如连续问十次可能会有一次出现完全不同的结果,所以为了整个测试更加公平,只取第一次输出;
本人机器环境:
实体提取
Prompt:
请帮我分析一下这段话”张三今年30岁,生活在四川成都,截止2024年3月31日,他就职于一家叫 Eric AI 的公司,他喜欢阅读书籍,打篮球。“
如果包含人名,请帮我列出“人名:xxx”;如果包含地点,请帮我列出“地点:xxx”;如果包含时间,请帮我列出”时间:xxxx年xx月“;,如果包含公司或机构,请帮我列出”机构:xxx“,如果包含其他实体,请帮我列出”实体:xxx“。
结果对比:
qwen-7b(0.5):没有识别出其他实体
baichuan2-7b:(0.8):出现一些干扰词,回答不够简洁
chatgpt 3.5(1):全部识别
chatglm3-6b(0.5):没有识别出其他实体
文本总结
Prompt:
请帮我将分析一下文字的含义,然后使用不超过30个字进行归纳:
LLM 是一项关键的人工智能(AI)技术,为智能聊天机器人和其他自然语言处理(NLP)应用程序提供支持。目标是通过交叉引用权威知识来源,创建能够在各种环境中回答用户问题的机器人。不幸的是,LLM 技术的本质在 LLM 响应中引入了不可预测性。此外,LLM 训练数据是静态的,并引入了其所掌握知识的截止日期。
LLM 面临的已知挑战包括:
在没有答案的情况下提供虚假信息。
当用户需要特定的当前响应时,提供过时或通用的信息。
从非权威来源创建响应。
由于术语混淆,不同的培训来源使用相同的术语来谈论不同的事情,因此会产生不准确的响应。
您可以将大型语言模型看作是一个过于热情的新员工,他拒绝随时了解时事,但总是会绝对自信地回答每一个问题。不幸的是,这种态度会对用户的信任产生负面影响,这是您不希望聊天机器人效仿的!
RAG 是解决其中一些挑战的一种方法。它会重定向 LLM,从权威的、预先确定的知识来源中检索相关信息。组织可以更好地控制生成的文本输出,并且用户可以深入了解 LLM 如何生成响应。
结果对比:
qwen-7b(1):还行
baichuan2-7b:(0):RAG翻译错误,且超过30个字
chatgpt 3.5(1):不错
chatglm3-6b(0.8):语句不怎么通顺
逻辑推理
Prompt:
树上有9只鸟,猎人开枪打死一只,树上还剩多少只鸟?
结果对比:
qwen-7b(1):正确
baichuan2-7b:(0.8):“取决于鸟的反应和逃逸情况” 貌似。。。
chatgpt 3.5(1):正确
chatglm3-6b(0):错误
翻译
Prompt:
你是一位专业翻译人员,请将以下英文内容翻译成中文: ”LangChain enables building application that connect external sources of data and computation to LLMs. In this quickstart, we will walk through a few different ways of doing that. We will start with a simple LLM chain, which just relies on information in the prompt template to respond. Next, we will build a retrieval chain, which fetches data from a separate database and passes that into the prompt template. We will then add in chat history, to create a conversation retrieval chain. This allows you to interact in a chat manner with this LLM, so it remembers previous questions. Finally, we will build an agent - which utilizes an LLM to determine whether or not it needs to fetch data to answer questions. We will cover these at a high level, but there are lot of details to all of these! We will link to relevant docs.”
结果对比:
qwen-7b(0.5):还行,部分语句不太顺,如:分离的数据库?
baichuan2-7b:(0.2):大致翻译了,但输出了一些不必要的语句(第一句)和翻译错误(LLMC链)
chatgpt 3.5(1):不错
chatglm3-6b(0.8):不错
扩大补充
Prompt:
您是客户服务AI助手。您的任务是向尊贵的客户发送电子邮件回复。
以下面以 ''' 分隔的是客户发来的电子邮件,请生成回复以感谢客户的评论。
如果情绪是积极的或中立的,感谢他们的评论。如果情绪是负面的,请道歉并建议他们可以联系客户服务。
确保使用评论中的具体细节。用简洁和专业的语气写。
将电子邮件签名为 “AI客户代理”。
客户评论: '''
在 11 月份仍然以 49 美元左右的价格季节性销售 17 件套系统,大约有一半的折扣,但由于某种原因(称之为价格欺诈),在 12 月的第二周左右,价格全部上涨到大约 同一系统的价格在 70-89 美元之间。 11 件系统的价格也较之前的 29 美元上涨了约 10 美元左右。 所以它看起来还不错,但如果你看一下底座,刀片锁定到位的部分看起来不像几年前的以前版本那么好,我对它非常温和(例如,我首先在搅拌机中压碎非常坚硬的物品,如豆子、冰、大米等,然后在搅拌机中将它们粉碎成我想要的份量,然后切换到搅打刀片以获得更细的面粉,并在制作冰沙时首先使用十字切割刀片,如果我需要更细/更少的果肉,则使用平刀片)。 制作冰沙时的特别提示,将水果和蔬菜切碎并冷冻(如果使用菠菜 - 稍微炖软菠菜,然后冷冻直至准备使用 - 如果制作果汁冰糕,请使用中小型食品加工机) 如果你打算用这种方式,你可以避免在制作冰沙时添加太多的冰(如果有的话)。 大约一年后,电机发出奇怪的声音。 我打电话给客服,但保修已经过期了,所以我不得不再买一个。 '''
评论情绪:负面
结果对比:
qwen-7b(1):不错,回复格式良好,提到了两个细节(电机问题和保修过期)
baichuan2-7b:(0.8):还行提到了价格波动和电机问题,但email格式差一点
chatgpt 3.5(0.5):整体文本没啥问题,但是没有提及客户评论中的细节
chatglm3-6b(1):不错,回复格式良好,提及客户评论细节
生成SQL
Prompt:
已知有两个mysql表,一个是代表销售人员的表:Persons,另一个是代表订单的表:Orders。具体的表定义如下: 表Persons: CREATE TABLE Persons (PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255), PRIMARY KEY (PersonID) ); 表Orders: CREATE TABLE Orders (O_Id int NOT NULL, OrderNo int NOT NULL, P_Id int, PRIMARY KEY (O_Id), FOREIGN KEY (P_Id) REFERENCES Persons(PersonID) ); 请帮我生成一个SQL语句,查询销售人员”Zhang san“的所有订单数据。
结果对比:
qwen-7b(0):表名识别错误,如Persion;LastName没有写表名;where语句没有识别FirstName和LastName
baichuan2-7b:(1):正确
chatgpt 3.5(0):where语句没有识别FirstName和LastName
chatglm3-6b(1):正确
生成代码展示分析图表
Prompt:
某公司2021年3月至7月(含)的自研产品销售数据依次为118万元、671万元、446万元、902万元和1011万元,请帮我用python的pyplot制作一个可查看趋势的柱状图表,注意月份等标签请使用中文且计量单位使用"万元"。
结果对比:
以下中文乱码不用管,本地环境配置问题。
qwen-7b(0):代码不可运行,出现简单的错误,但是快速微调后,也能运行
baichuan2-7b:(0):月份错误
chatgpt 3.5(1):都满足
chatglm3-6b(0.8):月份标签使用了英文
具体的输出:
Qwen-7B:
以下是qwen-7b的输出,12行 plt.ylabel 有语法问题需要调整
首先,确保已经安装了matplotlib
库。如果没有,可以通过以下命令安装:
pip install matplotlib
接下来,根据提供的数据创建柱状图。这里假设你的数据存储在一个列表中,每个元素代表一个月份的销售额。以下是具体的代码示例:
import matplotlib.pyplot as plt
# 数据(每个月的销售额)
sales_data = [118, 671, 446, 902, 1011]
# 月份标签
months_labels = ['三月', '四月', '五月', '六月', '七月']
# 创建柱状图
plt.bar(months_labels, sales_data, align='center')
plt.xlabel('月份')
plt.ylabel('销售额(万元)》)
plt.title('2021年3月至7月产品销售趋势}')
plt.show()
这段代码会创建一个柱状图,其中x轴表示月份,y轴表示销售额。每个月的销售额数据将以列表的形式提供。
Baichuan2-7B
代码可以直接运行,但是月份不对,应该是3到7月
好的,我为您生成了柱子图展示这五个数据点:
import matplotlib.pyplot as plt
plt.bar(range(5), [118, 671, 446, 902, 1011])
plt.xticks(range(5), ['一月份', '三月份', '五月份', '七月份', '八月份'], fontsize='large')
plt.xlabel('月份')
plt.ylabel('销售数据(万元)')
plt.title('自研产品销售趋势柱状图')
plt.show()
这个图表展示了2021年3月至7月的五个时间段内,公司自研产品的销售数据。从图表中可以看出,销售数据逐月递增,从一月份的118万元增长到八月份的1011万元。希望这个图表对您有所帮助!如果您还有其他问题或者需要其他帮助,请随时告诉我哦!
ChatGLM3-6B:
代码可以直接运行,但是月份是英文
首先,需要确保已经安装了matplotlib和pandas库。如果没有安装,可以使用以下命令进行安装:
pip install matplotlib pandas
接下来,使用以下代码创建柱状图:
import matplotlib.pyplot as plt
import pandas as pd
# 数据
data = {'Month': ['Mar', 'Apr', 'May', 'Jun', 'Jul'],
'Sales': [118, 671, 446, 902, 1011]}
df = pd.DataFrame(data)
# 绘制柱状图
plt.bar(df['Month'], df['Sales'])
# 设置中文标签和标题
plt.xlabel('月份')
plt.ylabel('销售金额(万元)')
plt.title('2021年3月至7月自研产品销售数据')
# 显示图表
plt.show()
这段代码首先导入matplotlib.pyplot和pandas库,然后创建一个包含月份和销售金额的DataFrame。接下来,使用plt.bar()
函数绘制柱状图,并使用plt.xlabel()
, plt.ylabel()
, 和 plt.title()
函数设置中文标签和标题。最后,使用plt.show()
函数显示图表。
ChatGPT 3.5:
chatgpt的回答不需要任何调整即可运行
你可以使用Python的Matplotlib库来制作柱状图。以下是一个示例代码,可以绘制出自研产品2021年3月至7月销售数据的柱状图:
import matplotlib.pyplot as plt
# 月份和销售数据
months = ['3月', '4月', '5月', '6月', '7月']
sales_data = [118, 671, 446, 902, 1011]
# 绘制柱状图
plt.figure(figsize=(10, 6))
plt.bar(months, sales_data, color='skyblue')
# 添加标签和标题
plt.xlabel('月份', fontsize=14)
plt.ylabel('销售额(万元)', fontsize=14)
plt.title('2021年3月至7月自研产品销售数据', fontsize=16)
# 显示柱状图
plt.show()
运行这段代码,你将得到一个柱状图,显示了2021年3月至7月自研产品销售数据的趋势。
总结
除了chatgpt 3.5
外,就属 chatglm3-6b
表现最好了,而且这里是使用 4-bit 量化后的模型,如果使用更高的参数和和量化值,效果会跟好。
References
https://github.com/ollama/ollama/blob/main/docs/modelfile.md