目录
1、语言模型
1.1、训练过程:
1..2、大型语言模型分类:
1.3、指令微调模型训练过程:
2、Tokens
3、Helper function辅助函数 (提问范式)
4、计算token数量
1、语言模型
大语言模型(LLM)是通过预测下一个词的监督学习方式进行训练的。具体来说,
1.1、训练过程:
1)首先准备一个包含数百亿甚至更多词的大规模文本数据集。
2)从这些文本中提取句子或句子片段作为模型输入。模型会根据当前输入 Context 预测下一个词的概率分布。
3)通过不断比较模型预测和实际的下一个词,并更新模型参数最小化两者差异,语言模型逐步掌握了语言的规律,学会了预测下一个词。
这种以预测下一个词为训练目标的方法使得语言模型获得强大的语言生成能力。
1..2、大型语言模型分类:
1)基础语言模型(Base LLM)通过反复预测下一个词来训练的方式进行训练,没有明确的目标导向。可能给出与问题无关的回答。
例如,给它一个 Prompt ,比如”中国的首都是哪里?“,很可能它数据中有一段互联网上关于中国的测验问题列表。这时,它可能会用“中国最大的城市是什么?中国的人口是多少?”等等来回答这个问题。
2)指令微调的语言模型(Instruction Tuned LLM)则进行了专门的训练,以便更好地理解问题并给出符合指令的回答。
例如,对“中国的首都是哪里?”这个问题,经过微调的语言模型很可能直接回答“中国的首都是北京”,而不是生硬地列出一系列相关问题。
指令微调使语言模型更加适合任务导向的对话应用。它可以生成遵循指令的语义准确的回复,而非自由联想。
1.3、指令微调模型训练过程:
1)在大规模文本数据集上进行无监督预训练,获得基础语言模型。需要大量数据集
2)使用包含指令及对应回复示例的小数据集对基础模型进行有监督 fine-tune,这让模型逐步学会遵循指令生成输出
3)为了提高语言模型输出的质量,常见的方法是让人类对许多不同输出进行评级,例如是否有用、是否真实、是否无害等。
4)增加生成高评级输出的概率。这通常使用基于人类反馈的强化学习(RLHF)技术来实现。
import openai
openai.api_key = "EMPTY"
openai.api_base = "http://192.168.1.1:20000/v1"
def get_completion(messages, model="chatglm3-6b", temperature=0.7):
completion = openai.ChatCompletion.create(
model=model,
messages=[{"role": "user", "content": messages}],
temperature=temperature
)
# print(str(response.choices[0].message))
return completion.choices[0].message.content
response = get_completion("中国的首都是哪里?")
print(response)
2、Tokens
LLM 实际上并不是重复预测下一个单词,而是重复预测下一个 token 。
对于一个句子,语言模型会先使用分词器将其拆分为一个个 token ,而不是原始的单词。
对于生僻词,可能会拆分为多个 token 。这样可以大幅降低字典规模,提高模型训练和推断效率。
对于 "Learning new things is fun!" 这句话,每个单词都被转换为一个 token ,
对于较少使用的单词,如 "Prompting as powerful developer tool",单词 "prompting" 会被拆分为三个 token,即"prom"、"pt"和"ing"。
# 设置温度系数=0,确保每次生成一致
response = get_completion("Take the letters in lollipop \
and reverse them", temperature=0)
print(response)
实际"lollipop" 反过来应该是 "popillol"。
分词方式也会对语言模型的理解能力产生影响
。
当您要求颠倒 "lollipop" 的字母时,由于分词器(tokenizer) 将 "lollipop" 分解为三个 token,即 "l"、"oll"、"ipop"
3、Helper function辅助函数 (提问范式)
提问格式区分了“系统消息”和“用户消息”两个部分。
通过设置助手角色,减少无效输出,帮助其生成针对性强的回复。
import openai
openai.api_key = "EMPTY"
openai.api_base = "http://192.168.1.1:20000/v1"
def get_completion(messages, model="chatglm3-6b", temperature=0.7,max_tokens=500):
completion = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature,
max_tokens=max_tokens ,
)
# print(str(response.choices[0].message))
return completion.choices[0].message.content
# 由于我的模型在返回结果中出现了英文、繁体中文,所以添加了额外提示词内容
messages = [
{'role':'system',
'content':'你是一个助理, 并以 Seuss 苏斯博士的风格作出回答。回答结果中不要出现英文,仅使用简体中文'},
{'role':'user',
'content':'就快乐的小鲸鱼为主题给我写一首短诗'},
]
response = get_completion(messages, temperature=1)
print(response)
# 长度控制
messages = [
{'role':'system',
'content':'你的所有答复只能是一句话'},
{'role':'user',
'content':'写一个关于快乐的小鲸鱼的故事'},
]
response = get_completion(messages, temperature =1)
print(response)
小鲸鱼快乐地在水中游,因为它喜欢这份自由和轻松的感觉。
messages = [
{'role':'system',
'content':'你是一个助理, 并以 Seuss 苏斯博士的风格作出回答,只回答一句话'},
{'role':'user',
'content':'写一个关于快乐的小鲸鱼的故事'},
]
response = get_completion(messages, temperature =1)
print(response)
快乐的小鲸鱼每天在海底漫游,与朋友们玩耍,享受着美好的生活。
4、计算token数量
import openai
openai.api_key = "EMPTY"
openai.api_base = "http://192.168.20.113:20000/v1"
def get_completion(messages, model="chatglm3-6b", temperature=0.7,max_tokens=500):
completion = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature,
max_tokens=max_tokens ,
)
content = completion.choices[0].message.content
tokens = {
'提示词prompt_tokens': completion['usage']['prompt_tokens'],
'生成回复completion_tokens': completion['usage']['completion_tokens'],
'总total_tokens': completion['usage']['total_tokens'],
}
return content, tokens
# 长度控制
messages = [
{'role':'system',
'content':'你是一个助理, 并以 Seuss 苏斯博士的风格作出回答。'},
{'role':'user',
'content':'就快乐的小鲸鱼为主题给我写一首短诗'},
]
response,token_dict = get_completion(messages, temperature =1)
print(response,'\n', token_dict)
{'提示词prompt_tokens': 35, '生成回复completion_tokens': 133, '总total_tokens': 168}