语言模型
response = get_completion("中国的首都是哪里?")
print(response)
对于一个句子,语言模型会 先使用分词器将其拆分为一个个 token ,而不是原始的单词。对于生僻词,可能会拆分为多个 token 。 这样可以大幅降低字典规模,提高模型训练和推断的效率。
TOKEN
# 为了更好展示效果,这里就没有翻译成中文的 Prompt
# 注意这里的字母翻转出现了错误,吴恩达老师正是通过这个例子来解释 token 的计算方式
response = get_completion("Take the letters in lollipop \
and reverse them")
print(response)
这时可以通过在字母间添加分隔,让每个字母成为一个token,以帮助模型准确理解词中的字母顺序。
response = get_completion("""Take the letters in \
l-o-l-l-i-p-o-p and reverse them""")
print(response)
因此,语言模型以 token 而非原词为单位进行建模,这一关键细节对分词器的选择及处理会产生重大影 响。开发者需要注意分词方式对语言理解的影响,以发挥语言模型最大潜力。
Helper function 辅助函数 (提问范式)
语言模型提供了专门的“提问格式”,可以更好地发挥其理解和回答问题的能力。本章将详细介绍这种格式 的使用方法。
这种提问格式区分了“系统消息”和“用户消息”两个部分。系统消息是我们向语言模型传达讯息的语句,用 户消息则是模拟用户的问题。
例如:
系统消息:你是一个能够回答各类问题的助手。
用户消息:太阳系有哪些行星?
通过这种提问格式,我们可以明确地角色扮演,让语言模型理解自己就是助手这个角色,需要回答问 题。这可以减少无效输出,帮助其生成针对性强的回复。本章将通过OpenAI提供的辅助函数,来演示如 何正确使用这种提问格式与语言模型交互。掌握这一技巧可以大幅提升我们与语言模型对话的效果,构 建更好的问答系统。
def get_completion_temperature_v3(messages,
model="gpt-3.5-turbo",
temperature=0,
max_tokens=500):
'''
封装一个支持更多参数的自定义访问 OpenAI GPT3.5 的函数
参数:
messages: 这是一个消息列表,每个消息都是一个字典,包含 role(角色)和 content(内容)。角
色可以是'system'、'user' 或 'assistant’,内容是角色的消息。
model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户可以选择 gpt-4
temperature: 这决定模型输出的随机程度,默认为0,表示输出将非常确定。增加温度会使输出更随
机。
max_tokens: 这决定模型输出的最大的 token 数。
'''
response = openai.chat.completions.create(
model=model,
messages=messages,
temperature=temperature, # 这决定模型输出的随机程度
max_tokens=max_tokens, # 这决定模型输出的最大的 token 数
)
return response.choices[0].message.content
messages = [
{'role':'system',
'content':'你是一个助理, 并以 Seuss 苏斯博士的风格作出回答。'},
{'role':'user',
'content':'就快乐的小鲸鱼为主题给我写一首短诗'},
]
response = get_completion_temperature_v3(messages, temperature=1)
print(response)
下面让我们再看一个例子:
# 长度控制
messages = [
{'role':'system',
'content':'你的所有答复只能是一句话'},
{'role':'user',
'content':'写一个关于快乐的小鲸鱼的故事'},
]
response = get_completion_temperature_v3(messages, temperature =1)
print(response)
将以上两个例子结合起来:
# 以上结合
messages = [
{'role':'system',
'content':'你是一个助理, 并以 Seuss 苏斯博士的风格作出回答,只回答一句话'},
{'role':'user',
'content':'写一个关于快乐的小鲸鱼的故事'},
]
response = get_completion_temperature_v3(messages, temperature =1)
print(response)
我们在下面定义了一个 get_completion_and_token_count 函数,它实现了调用 OpenAI 的 模型生成聊 天回复, 并返回生成的回复内容以及使用的 token 数量。
def get_completion_temperature_v4(messages,
model="gpt-3.5-turbo",
temperature=0,
max_tokens=500):
openai.api_key = "sk-FMJLv2FFa3ZnsrosNjgKcyRspXIcHFHbcAFiQAtffA5IZVCs"
openai.base_url = "https://api.chatanywhere.org/v1"
"""
使用 OpenAI 的 GPT-3 模型生成聊天回复,并返回生成的回复内容以及使用的 token 数量。
参数:
messages: 聊天消息列表。
model: 使用的模型名称。默认为"gpt-3.5-turbo"。
temperature: 控制生成回复的随机性。值越大,生成的回复越随机。默认为 0。
max_tokens: 生成回复的最大 token 数量。默认为 500。
返回:
content: 生成的回复内容。
token_dict: 包含'prompt_tokens'、'completion_tokens'和'total_tokens'的字典,分别
表示提示的 token 数量、生成的回复的 token 数量和总的 token 数量。
"""
response = openai.chat.completions.create(
model=model,
messages=messages,
temperature=temperature,
max_tokens=max_tokens,
)
content = response.choices[0].message.content
token_dict = {
'prompt_tokens':response.usage.prompt_tokens,
'completion_tokens':response.usage.completion_tokens,
'total_tokens':response.usage.total_tokens,
}
return content, token_dict
messages = [
{'role':'system',
'content':'你是一个助理, 并以 Seuss 苏斯博士的风格作出回答。'},
{'role':'user',
'content':'就快乐的小鲸鱼为主题给我写一首短诗'},
]
response, token_dict = get_completion_temperature_v4(messages)
print(response)
打印 token 字典看一下使用的 token 数量,我们可以看到
在AI应用开发领域,Prompt技术的出现无疑是一场革命性的变革。然而,这种变革的重要性并未得到广 泛的认知和重视。传统的监督机器学习工作流程中,构建一个能够分类餐厅评论为正面或负面的分类 器,需要耗费大量的时间和资源。