大模型
# 简单介绍
什么是大模型呢?
机器学习、深度学习"神经网络"、大模型"参数超级多".. 三者, 机器学习包含深度学习,深度学习包含大模型.
■ 基本概念
- LLM(Large Language Model)是指具有"大量参数"和"复杂结构"的"机器学习模型"!
这些模型可以应用于处理大规模的数据和复杂的问题. "“大模型”中的“大”是指模型的参数量非常大(百亿千亿级别)."
- 在上述大模型LLM介绍中提及到的"复杂结构"指的是GPT(Generative Pre-Trained Transformer)形式的架构.
被称为预训练生成式的Transformer架构(多种技术融合架构).
如果将其映射到数学上,通俗的理解,就像是我们听到过的数学建模.比如:
一位老师想计算班级100位同学的期末总成绩,根据学校本学期的要求,考试成绩占总成绩的70%,平成成绩占总成绩的30%.
那么老师们只需要找到其中的运算规律就可以指定一个通用的模型来快速计算每一个学生的总成绩.
总成绩y = (考试成绩x1 * 0.7) + (平时成绩x2 * 0.3),其中该方程式就是模型的算法,而0.7和0.3这个权重占比就是模型的参数!!
2
3
4
5
6
7
8
9
■ 大模型的两大分支
◎ 在线大模型
- 优势: 部署在云端,使用的技术门槛和硬件门槛更低.
- 劣势: 数据安全、长期使用的费用、无法根据自身特定的应用场景进行定制,只能微调
◎ 开源大模型
- 优势: 可定制化的调试和训练
- 劣势: 部署繁琐,有很多坑、硬件配置要求高 (一般会在linux服务器上搞!)
2
3
4
5
6
■ 应用AI大模型的方法
AI大模型虽然功能强大,但在垂直行业应用中存在一些突出的问题:
如缺乏特定行业领域的专有知识,尤其是深度知识、私有知识、保密知识等;输出内容很难精确控制;常常会出现幻觉(一本正经地胡说八道)等.
为解决这些问题,有三种在垂直行业中应用AI大模型的方法:
1. 重新训练
喂行业数据,重新训练AI模型.
2. 微调
在已有的通用模型基础上,喂行业数据,再次训练!
3. 知识库检索
当AI大模型无法提供准确答案或输出时,可以利用行业知识建立知识库模型.
充分融合AI大模型的通用知识和知识库的专有知识,使得大模型可以提供更有针对性的输出.
2
3
4
5
6
7
8
9
10
# GLM-4模型
官方网址:
https://open.bigmodel.cn/
2024年1月16日, 智谱AI正式推出GLM-4新一代大模型. 根据实际测试, GLM-4在以中文为主的应用场景中实际性能逼近GPT-4的95%. GLM-4不再采用开源模式, 而是采用了OpenAI在线大模型模式.
即模型无需本地部署, 而是通过联网的方式调用智谱算力中心的模型进行推理或微调.
# 小试牛刀
先看一个简单使用!
step1: 去智库AI官网注册账户, 拿到api_key, 注册就有100w的token值, 期限一个月!
step2: pip install zhipuai -i https://pypi.tuna.tsinghua.edu.cn/simple
step3: 开始编码!
from zhipuai import ZhipuAI
# - 通常,我们会将api_key放到系统的环境变量中,通过os模块读取其值,避免api_key暴露在程序中!
api_key = "0fd6488e4313141ee784ef08873e1c99.wj6qwpbslEhMUdEw"
client = ZhipuAI(api_key=api_key) # 创建一个客户端对象: 用于与线上大模型进行通信
response = client.chat.completions.create(
model='glm-4',
messages=[
{'role': 'user', 'content': '你好'}
]
)
"""
model='glm-4'
created=1713672432
choices=[
CompletionChoice(
index=0,
finish_reason='stop',
message=CompletionMessage(
content='你好👋!我是人工智能助手智谱清言,可以叫我小智🤖,很高兴见到你,欢迎问我任何问题。',
role='assistant', # -- 注意到没!回复的角色是'assistant'
tool_calls=None
)
)
]
request_id='8581414407789021515'
id='8581414407789021515'
usage=CompletionUsage(prompt_tokens=6, completion_tokens=32, total_tokens=38)
"""
print(response)
"""
你好👋!我是人工智能助手智谱清言,可以叫我小智🤖,很高兴见到你,欢迎问我任何问题。
"""
# - 接口返回的是字符串!像字符串中的/n等字符这里我们print时自动换行了..
# 也可pip安装使用相应的模块将接口返回的字符串转换成markdown等格式输出!!
print(response.choices[0].message.content)
# - 模型是否调用了外部工具, ★外部工具是用来扩展模型能力的!!很重要!
print(response.choices[0].message.tool_calls)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Message参数设置
三个角色: user、system、assistant
Message参数的大小最多128k,几万字的样子.Hhh
# system角色
两个方面的功能: 模版提示 + 聊天背景信息的设定
■ system角色 -- 模版提示/条件预设
PS: 若message中只有角色system是不行的, 像下面这样写是会报错的!!
client = ZhipuAI(api_key=api_key)
response = client.chat.completions.create(
model='glm-4',
messages=[
{'role':'system','content':'你是一名资深的植物学家'},
]
)
2
3
4
5
6
7
■ system角色 -- 进行聊天背景信息的设定
text = """
张三,男,1990年10月25日出生于中国台湾省高雄市.
2013年毕业于北京工业大学的信息工程专业, 由于在校表现良好,毕业后被中科院信息技术部破格录取.
"""
response = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "system", "content": text},
{"role": "user", "content": '请问张三毕业后去哪了?'}
]
)
print(response.choices[0].message.content)
2
3
4
5
6
7
8
9
10
11
12
# assistant角色
借助append方法来高效实现多轮对话 + 利用assistant角色来实现上下文的记忆
from zhipuai import ZhipuAI
api_key = "0fd6488e4313141ee784ef08873e1c99.wj6qwpbslEhMUdEw"
client = ZhipuAI(api_key=api_key)
def char_with_model():
default_text = """
张三, 男, 1990年10月25日出生于中国台湾省高雄市.
2013年毕业于北京工业大学的信息工程专业, 由于在校表现良好, 毕业后被中科院信息技术部破格录取.
"""
text = input("请输入您的聊天背景设定 >>: ") or default_text
messages = [
{'role': 'system', 'content': text},
]
while True:
user_input = input("请输入您的问题! (输入'Q'以结束对话) >>: ")
if user_input == "Q":
break
messages.append({'role': 'user', 'content': user_input})
response = client.chat.completions.create(
model='glm-4',
messages=messages,
)
answer = response.choices[0].message.content
print(f"模型回答: {answer}")
messages.append({"role": "assistant", "content": answer})
if __name__ == '__main__':
char_with_model()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
效果如下: (上下文的记忆还是有点人工智障
# 文件分析
举一反三, 可以读取一个文件赋值给text参数,代入上面的char_with_model函数, 提问题让大模型对其进行分析
with open('./透视表-篮球赛.csv', 'r', encoding='utf-8') as fp:
md_content = fp.read()
text = f"请注意,这是一组用户数据分析的数据集,请你好好阅读,数据集如下:'+{md_content}"
"""
对手,胜负,主客场,命中,投篮数,投篮命中率,3分命中率,篮板,助攻,得分
勇士,胜,客,10,23,0.435,0.444,6,11,27
国王,胜,客,8,21,0.381,0.286,3,9,27
小牛,胜,主,10,19,0.526,0.462,3,7,29
... ... ...
"""
# -- 你可以试着问它以下问题:
- 数据集一共有多少行?
- 所有的对手的客场平均得分是多少?
- 根据整体数据来分析,实力最强和实力最差的分别是哪些对手?
Ps:说实话,我实践了,对照大模型给的答案看数据集进行验证,回答的不咋准确!!(¯﹃¯)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Q: 为啥对大模型的测试结果, 目前看来, 不尽人意?
A: 不是大模型不行, 而是我们要 引导它, 让它对数据集有个充分的认识.. 提示大模型的涌现能力. 手段 - 提示工程、微调等.
大模型的 涌现 能力是指: 当大模型在没有针对特定任务进行训练的情况下, 仍然能够在合理的提示下处理各种任务的能力!!
# 特征工程
三个核心技术.
大模型"涌现能力"/推理 其实并不稳定, 在不修改模型本身参数(微调)的情况下, 模型涌现能力极度依赖对模型使用时的提示过程.
即对同样一个模型, 不同的提示方法将获得质量完全不同的结果!!
误解: 很多⼈以为的提示⼯程技术就是在向模型进行提问时简简单单的添加相关的提示词. 没有那么简单!!
特征工程的三个核心技术.: 1> 提示词模板设计. 2> 提示示例设计. 3> 提示流程设计
# 提示工程方法介绍
此处介绍了三种方法
■ Zero-shot与Few-shot提示法
messages=[
{"role": "user", "content": Q1},
{"role": "assistant", "content": A1},
{"role": "user", "content": Q2},
{"role": "assistant", "content": A2},
{"role": "user", "content": Q3},
{"role": "assistant", "content": A3},
{"role": "user", "content": Q4},
]
★ 前面一个或多个QA提供给大模型作为回答一个问题的参考!!
■ COT思考链提示法
★ 最为简单的思维链的实现方法是在提示词尾部追加一句“Let’s think step by step”
messages=[
{"role": "system", "content": "请一步步思考并解决问题"},
{"role": "user", "content": Q1}
]
messages=[
{"role": "system", "content": "请一步步进行推理并得出结论"},
{"role": "user", "content": Q1}
]
■ Few-shot-CoT提示法
通过通过编写思维链样本作为提示词,让模型学会思维链的推导方式,从而更好的完成推导任务.
few_shot_CoT = """
Q:"罗杰有五个网球, 他又买了两盒网球, 每盒有3个网球,请问他现在总共有多少个网球?"
A:"罗杰一开始有五个网球, 又购买了两盒网球, 每盒3个, 共购买了6个网球, 因此现在总共由5+6=11个网球. 因此答案是11."
Q:"食堂总共有23个苹果, 如果他们用掉20个苹果, 然后又买了6个苹果, 请问现在食堂总共有多少个苹果?"
A:"食堂最初有23个苹果, 用掉20个, 然后又买了6个, 总共有23-20+6=9个苹果,答案是9."
Q:"杂耍者可以杂耍16个球. 其中一半的球是高尔夫球,其中一半的高尔夫球是蓝色的. 请问总共有多少个蓝色高尔夫球?"
A:"总共有16个球,其中一半是高尔夫球,也就是8个,其中一半是蓝色的,也就是4个,答案是4个."
"""
response = client.chat.completions.create(
model="glm-3-turbo",
messages=[
{"role": "system", "content": few_shot_CoT},
{"role": "user", "content": 'Q:'+Q4}
]
)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# "函数字典"的机制
"函数字典" 的机制用于向大模型进行详细的外部函数的描述.
敲黑板: 字符串作为大模型数据交互格式 , 其中json格式的字符串应用的比较广
函数字典长这个样子:
def list_op(alist):
"""
操作列表函数,该函数定义了一种对列表元素进行特殊的计算过程
:param alist: 必要参数,表示带入计算的列表对象
:return: 操作列表函数计算后的结果,返回结果为表示为列表对象类型
"""
for item in alist:
if item % 7 == 0:
item %= 3
else:
item %= 5
return alist
# -- 函数字典
# 若满足JSON Schema格式要求.那么就是JSON Schema.
# 它由对个固定的键值对组成,包括:type、properties、required等主要的key. 长下面这样:
func_desc = {
"name": "list_op",
"description": "用于执行操作列表函数,定义了一种对列表元素进行特殊的计算过程",
"parameters": {
"type": "object",
"properties": {
"alist": {
"type": "array",
"description": "执行操作列表算法的数据源",
},
"required": ["alist"],
},
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
将函数给大模型, 大模型自动生成该函数的函数字典 实现过程
# -- 天气查询函数
def get_weather(loc):
"""
查询即时天气函数
:param loc: 必要参数,字符串类型,用于表示查询天气的具体城市名称
注意,中国的城市需要用对应城市的英文名称代替,例如如果需要查询北京市天气,则loc参数需要输入'Beijing'
:return: 返回结果查询天气后的结果,并且使用字符串形式进行表示,其中包含了全部重要的天气信息
"""
url = "查询天气的网络接口"
params = {
"city": loc, # 查询的城市名称
}
ret_json = 'xxxxxx' # 模拟网络请求返回查询结果
return ret_json # 返回查询结果
import json
def auto_function_desc(function):
function_name = function.__name__
system_prompt = '以下是某的函数说明:%s' % function_description
user_prompt = """
根据这个函数的函数说明,请帮我创建一个JSON格式的字典,这个字典有如下5点要求,请你仔细阅读,并且务必遵从所有要求:
1.字典总共有三个键值对;
2.第一个键值对的Key是字符串name, value是该函数的名字:%s, 也是字符串;
3.第二个键值对的Key是字符串description, value是该函数的函数的功能说明,也是字符串.
4.第三个键值对的Key是字符串parameters, value是一个JSON Schema对象,用于说明该函数的参数输入规范.
5.输出结果必须是一个JSON格式的字典,并且一定不要任何前后修饰语句,务必参按照如下格式进行输出:
'%s' % (function_name,'{key:value}')
"""
response = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
]
)
ret = response.choices[0].message.content
return json.loads(ret)
if __name__ == '__main__':
char_with_model(get_weather)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43