文章

本地中文大语言模型搭建和对比

GGUF

GGUF说明:

GGUF

GGUF和GGML的区别:

GGUF和GGML的区别

中文大语言模型准备

阿里官方给出的通义千问和其他几个大模型的性能对比:

image-20240330210808410

阿里通义千问

image-20240330162618513

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

结果演示:

image-20240331142230802

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()`.

结果演示:

image-20240331144009254

模型能力简单对比

个人参考部分

  • 参加对比的模型qwen-7BBaichuan2-7BChatGLM3-6BChatGPT-3.5,其中ChatGPT 3.5在参数体量超过其他模型,仅作为一组对比,从更广度的对比上来看下各个模型的能力;

  • 工具:qwen-7BBaichuan2-7B 使用AnythingLLM UI + Ollama; ChatGLM3-6B 使用Gradio UI访问本地量化文件;ChatGPT-3.5 使用浏览器直接访问;

  • 测试维度题:分别包括

    1. 实体提取 Extraction

    2. 文本总结 Summarizing

    3. 推断 Inferring

    4. 逻辑推理 Logical reasoning

    5. 翻译 Transforming

    6. 扩大补充 Extanding

    7. SQL生成 SQL

    8. 生成代码展示分析图表

  • 只截取首次答案:大模型对于同一个问题的每次结果输出会出现不太一样,比如连续问十次可能会有一次出现完全不同的结果,所以为了整个测试更加公平,只取第一次输出;

本人机器环境:

image-20240330120907157

实体提取

Prompt:

请帮我分析一下这段话”张三今年30岁,生活在四川成都,截止2024年3月31日,他就职于一家叫 Eric AI 的公司,他喜欢阅读书籍,打篮球。“

如果包含人名,请帮我列出“人名:xxx”;如果包含地点,请帮我列出“地点:xxx”;如果包含时间,请帮我列出”时间:xxxx年xx月“;,如果包含公司或机构,请帮我列出”机构:xxx“,如果包含其他实体,请帮我列出”实体:xxx“。

结果对比:

image-20240331145917107

  • 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 如何生成响应。

结果对比:

image-20240331150249388

  • qwen-7b(1):还行

  • baichuan2-7b:(0):RAG翻译错误,且超过30个字

  • chatgpt 3.5(1):不错

  • chatglm3-6b(0.8):语句不怎么通顺

逻辑推理

Prompt:

树上有9只鸟,猎人开枪打死一只,树上还剩多少只鸟?

结果对比:

image-20240331150458925

  • 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.”

结果对比:

image-20240331152606246

  • 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 美元左右。 所以它看起来还不错,但如果你看一下底座,刀片锁定到位的部分看起来不像几年前的以前版本那么好,我对它非常温和(例如,我首先在搅拌机中压碎非常坚硬的物品,如豆子、冰、大米等,然后在搅拌机中将它们粉碎成我想要的份量,然后切换到搅打刀片以获得更细的面粉,并在制作冰沙时首先使用十字切割刀片,如果我需要更细/更少的果肉,则使用平刀片)。 制作冰沙时的特别提示,将水果和蔬菜切碎并冷冻(如果使用菠菜 - 稍微炖软菠菜,然后冷冻直至准备使用 - 如果制作果汁冰糕,请使用中小型食品加工机) 如果你打算用这种方式,你可以避免在制作冰沙时添加太多的冰(如果有的话)。 大约一年后,电机发出奇怪的声音。 我打电话给客服,但保修已经过期了,所以我不得不再买一个。 '''

评论情绪:负面

结果对比:

image-20240331151446144

  • 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“的所有订单数据。

结果对比:

image-20240331152136376

  • 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制作一个可查看趋势的柱状图表,注意月份等标签请使用中文且计量单位使用"万元"。

结果对比:

以下中文乱码不用管,本地环境配置问题。

image-20240331152805915

  • 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月自研产品销售数据的趋势。

总结

qwen-7b

baichuan2-7b

chatglm3-6b

chatgpt 3.5

实体提取

0.5

0.8

0.5

1

文本总结

1

0

0.8

1

逻辑推理

1

0.8

0

1

翻译

0.5

0.2

0.8

1

扩大补偿

1

0.8

1

0.5

生成SQL

0

1

1

0

生成代码

0

0

0.8

1

Summary

4

3.6

4.9

5.5

除了chatgpt 3.5 外,就属 chatglm3-6b 表现最好了,而且这里是使用 4-bit 量化后的模型,如果使用更高的参数和和量化值,效果会跟好。

References

https://github.com/ollama/ollama/blob/main/docs/modelfile.md

https://huggingface.co/models

https://github.com/li-plus/chatglm.cpp

License:  CC BY 4.0