一、GLM-4发布与在线大模型技术路线
北京时间2024年1月16日,智谱AI正式推出GLM-4新一代基座大模型,整体性能相比GLM3全面提升60%,根据实际测试,GLM-4在以中文为主的应用场景中实际性能逼近GPT-4的95%,在一些中文对齐的测试中,甚至超过GPT-4表现,毕竟GPT-4-turbo模型。此外,GLM-4支持128K对话上下文,并且支持更强的多模态功能、支持更快推理速度,更多并发,大大降低推理成本;同时GLM-4增强了智能体(Agent)能力。
而和此前ChatGLM3模型所不同的是,GLM-4不再采用开源模式,而是采用了OpenAI和Google大模型的在线大模型模式,即模型无需本地部署,而是通过联网的方式调用智谱算力中心的模型进行推理或微调,用户通过API-KEY进行身份验证,同时根据实际使用模型不同、以及不同的Token数量进行计费。
GLM-4的公布不仅代表着智谱AI整体朝向在线大模型技术路线转型,而且还代表着智谱AI将力求打造一整套在线大模型技术解决方案,在这其中GLM-4模型只是其中一个模型。
而实际上,智谱AI的速度比预计的更加迅速。在GLM-4发布的同时,智谱AI大模型MaaS开放平台也同步上线,其完成度之高几乎可以和OpenAI Platform一教高下。
二、GLM-4账户注册与API获
在了解了GLM-4模型生态之后,接下来我们尝试进行智谱AI账户注册,并获取GLM-4模型API-Key,然后在本地进行模型调用。围绕GLM-4的账户注册和API获取流程,和OpenAI账户注册和GPT模型API获取流程非常类似,只不过在没有网络门槛限制的情况下,这一流程会非常便捷稳定。
2.1 注册
首先登录智谱AI大模型MaaS开放平台,点击左上方注册按钮,在注册页面输入手机号并进行验证,即可完成注册:
2.2 GLM模型API-KEY创建与维护
所谓API-KEY,本质上就是一个字符串,用于进行在线模型调用时的身份验证。GLM模型的API-KEY获取流程如下,首先还是登录个人中心(控制台),点击查看API KEY:
首次查看API-KEY会发现目前已经有了一个系统默认的API KEY,这里我们直接点击复制,就能复制当前API KEY字符串。这里需要注意的是,尽管我们经常都需要输入API KEY,但出于保密性考虑,“请不要与他人共享您您的 API Keys,避免将其暴露在浏览器和其他客户端代码中。”并且根据说明,智谱AI还有自动保密措施:“为了保护您帐户的安全,我们还可能会自动更换我们发现已公开泄露的密钥信息。”
-
设置API KEY环境变量
以Mac电脑为例:为当前用户永久设置环境变量,可以编辑 ~/.bash_profile,open -e ~/.bash_profile # 对于 base
使用export命令设置环境变量。假设你的API密钥是YOUR_API_KEY,你可以这样设置:
export GLM_API_KEY="YOUR_API_KEY"
之后在终端中运行以下命令使更改生效
source ~/.bash_profile # 对于 bash
你可以通过打印环境变量的值来验证API密钥是否已正确设置:
echo $GLM_API_KEY
-
直接使用key进行调用
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="de6601*****BUYnFZEcRdtaS")
response = client.chat.completions.create(
model="glm-4", # 填写需要调用的模型名称
messages=[
{"role": "user", "content": "你好"}
],
)
print(response.choices[0].message)
content='你好👋!我是人工智能助手智谱清言,可以叫我小智🤖,很高兴见到你,欢迎问我任何问题。' role='assistant' tool_calls=None
这个个代码的格式与Open AI几乎是一样的
三、chat.completions.create函数参数详解
3.1 chat.completions.create函数参数解释
在通过SDK调用模型的时候,chat.completions.create函数中的参数设置会直接决定最终模型运行模式、以及模型运行结果。因此在基础模型学习阶段,我们需要围绕chat.completions.create函数进行完整的参数解释。
- chat.completions.create函数必选参数
整体来看,GLM模型参数和GPT模型参数高度类似,并且通过观察不难发现,chat.completions.create函数有两个必选参数,其一是model
,代表的含义是当前调用的模型。目前可选的模型有两个,其一是GLM-3-Turbo、其二则是GLM-4;第二个参数则是messages
,代表传输到模型内部的消息队列。messages参数是一个基本构成元素为字典的列表,其内每个字典都代表一条独立的消息,每个字典都包含两个键值(Key-value)对,其中第一个Key都是字符串role(角色)表示某条消息的作者,第二个key为content(内容)表示消息具体内容。更多关于message的参数设置方法稍后介绍,总的来看,这里的messages就可以简单理解为输入给模型的信息队列,而模型接收到message之后也会输出对应的回答信息,当然也是以message形式呈现:
CompletionMessage(content=‘你好👋!我是人工智能助手智谱清言,可以叫我小智🤖,很高兴见到你,欢迎问我任何问题。’, role=‘assistant’, tool_calls=None)
- chat.completions.create函数全参数解释
参数名称 | 类型 | 是否必填 | 参数解释 |
---|---|---|---|
model | String | 是 | 所要调用的模型编码 |
messages | List | 是 | 调用语言模型时,将当前对话信息列表作为提示输入给模型, 按照 {"role": "user", "content": "你好"} 的json 数组形式进行传参; 可能的消息类型包括 System message、User message、Assistant message 和 Tool message。 |
request_id | String | 否 | 由用户端传参,需保证唯一性;用于区分每次请求的唯一标识,用户端不传时平台会默认生成。 |
do_sample | Boolean | 否 | do_sample 为 true 时启用采样策略,do_sample 为 false 时采样策略 temperature、top_p 将不生效 |
stream | Boolean | 否 | 使用同步调用时,此参数应当设置为 Fasle 或者省略。表示模型生成完所有内容后一次性返回所有内容。如果设置为 True,模型将通过标准 Event Stream ,逐块返回模型生成内容。Event Stream 结束时会返回一条data: [DONE] 消息。 |
temperature | Float | 否 | 采样温度,控制输出的随机性,必须为正数取值范围是:(0.0,1.0],不能等于 0,默认值为 0.95,值越大,会使输出更随机,更具创造性;值越小,输出会更加稳定或确定建议您根据应用场景调整 top_p 或 temperature 参数,但不要同时调整两个参数 |
top_p | Float | 否 | 用温度取样的另一种方法,称为核取样 取值范围是:(0.0, 1.0) 开区间,不能等于 0 或 1,默认值为 0.7 模型考虑具有 top_p 概率质量tokens的结果 例如:0.1 意味着模型解码器只考虑从前 10% 的概率的候选集中取tokens 建议您根据应用场景调整 top_p 或 temperature 参数,但不要同时调整两个参数 |
max_tokens | Integer | 否 | 模型输出最大tokens |
stop | List | 否 | 模型在遇到stop所制定的字符时将停止生成,目前仅支持单个停止词,格式为["stop_word1"] |
tools | List | 否 | 可供模型调用的工具列表,tools字段会计算 tokens ,同样受到tokens长度的限制 |
type | String | 是 | 工具类型,目前支持function 、retrieval 、web_search |
function | Object | 是 | 仅当工具类型为function 时补充 |
retrieval | Object | 仅当工具类型为retrieval 时补充 | |
web_search | Object | 仅当工具类型为web_search 时补充,如果tools中存在类型retrieval,此时web_search不生效。 | |
tool_choice | String 或 Object | 否 | 用于控制模型是如何选择要调用的函数,仅当工具类型为function时补充。默认为auto,当前仅支持auto |
整体来看,GLM系列模型的参数结构并不如GPT系列模型复杂,在上述一系列参数中,temperature、tools
两个参数是需要重点关注,并且之后会经常用到的两个参数。其中tools参数会涉及模型功能方面调整,例如可以通过tools参数设置来选择是否开启联网、或者查阅在线知识库文档、或者开启Function calling功能等,该参数的使用方法我们将在后面进行介绍。这里我们重点解释temperature使用方法。
和所有大模型类似,temperature表示模型随机性,GLM模型的temperature取值设置在0-1之间,默认取值为0.95,并且数值越大模型输出结果的随机性就越强,不过需要注意的是,不同于GPT系列模型对temperature非常敏感,在实际使用GLM系列模型时会发现,GLM模型在很多问题上的回答都非常“稳定”,并不会非常大程度受到temperature影响:
response_t01 = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "user", "content": "请问什么是大语言模型?"}
],
temperature=0.1
)
display(Markdown(response_t01.choices[0].message.content))
大语言模型(Large Language Model,简称LLM)是一种基于深度学习技术的语言模型。这种模型通过对大量文本数据的学习,能够理解和生成自然语言。大语言模型旨在模拟人类对语言的理解和生成能力,使计算机能够像人类一样进行自然语言的处理和生成。
大语言模型的核心特点是规模大和结构复杂。它们通常拥有数十亿甚至更多的参数,并使用大量的神经网络层来学习语言中的模式和规律。通过这种方式,这些模型能够捕捉到语言中的语义、语法和上下文关系,从而生成准确且自然的回答。
大语言模型的应用范围广泛,不仅限于预测句子中的下一个单词,还能在多种自然语言处理任务中表现出色,如情感分析、命名实体识别、数学推理等。此外,随着技术的发展,大语言模型还能够支持多模态应用场景,如音频、图像和视频处理。
如今,大语言模型已成为自然语言处理领域的研究热点,并在智能客服、虚拟助手、内容创作、内容审核、机器翻译等多个实际场景中得到应用。代表性的大语言模型有GPT、PaLM2、Gemini和文心ERNIE等。
response_t02 = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "user", "content": "请问什么是大语言模型?"}
],
temperature=0.9
)
display(Markdown(response_t02.choices[0].message.content))
大语言模型(Large Language Model,简称LLM)是基于深度学习技术构建的人工智能模型。这种模型通过大规模的无监督学习或半监督学习,从大量文本数据中学习语言的统计特征和规律,进而具备理解和生成自然语言的能力。大语言模型通常包含数十亿甚至更多参数,能够捕捉语言中的语义、语法和上下文信息。
由于接受了海量的文本数据训练,这些模型不仅能够在诸如预测句子中下一个单词等简单任务上表现优异,还能在更为复杂的语言处理任务上,如文本生成、机器翻译、情感分析、命名实体识别等方面展现出强大的能力。此外,大语言模型还具备一定的世界知识记忆和推理能力,可以理解和生成包含常识性信息的文本。
随着技术的发展,大语言模型不仅限于处理纯文本信息,还能够扩展到多模态任务中,支持处理音频、图像、视频等多媒体数据,使得模型的应用场景更加广泛。如今,大语言模型已经成为自然语言处理(NLP)领域研究和应用的热点,并在智能客服、虚拟助手、内容创作、内容审核等方面展现出巨大的潜力和价值。
我们可以发现回答结果确实又些不同,但是也没有那么的明显,当然这个会跟具体的场景和问题有很大关系,可以根据实际情况来进行调整。
3.2 chat.completions.create函数响应结果解读
对于所有的借助chat.completions.create函数创建的结果来说,都是一个Completion对象:
response = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "user", "content": "你好?"}
],
temperature=0.9
)
response
Completion(model='glm-4', created=1711002934, choices=[CompletionChoice(index=0, finish_reason='stop', message=CompletionMessage(content='你好!有什么我可以帮助你的吗?', role='assistant', tool_calls=None))], request_id='8494923799476441549', id='8494923799476441549', usage=CompletionUsage(prompt_tokens=7, completion_tokens=10, total_tokens=17))
type(response)
zhipuai.types.chat.chat_completion.Completion
这个对象中会包含一次模型调用返回的全部结果,并且保存在choices属性中:
response.choices
[CompletionChoice(index=0, finish_reason='stop', message=CompletionMessage(content='你好!有什么我可以帮助你的吗?', role='assistant', tool_calls=None))]
choices本质上是一个list,当模型只返回了一个结果时,我们可以通过.choices[0]所以获得模型唯一的结果:
response.choices[0]
CompletionChoice(index=0, finish_reason='stop', message=CompletionMessage(content='你好!有什么我可以帮助你的吗?', role='assistant', tool_calls=None))
response.choices[0].message
CompletionMessage(content='你好!有什么我可以帮助你的吗?', role='assistant', tool_calls=None)
response.choices[0].message.content
'你好!有什么我可以帮助你的吗?'
四、GLM多角色对话系统
4.1 GLM多角色对话系统解释
时至今日,多角色对话基本上已经成了顶尖大模型的标配。正是基于多角色对话这一基础技术架构,大模型才能非常灵活的实现各类对话需求,甚至多角色对话也是更高效的实现Function calling的基础,而后者则是整个Agent开发的基石。
那什么是多角色对话呢?简而言之就是将用户和大模型之间的“私聊”变为“群聊”,在用户和大模型这两个角色基础之上,进一步增加“系统”和“工具”这两个角色。尽管最终目的都是为了能完成大模型完成和用户的之间对话,但在对话过程中添加一些额外角色,确实能够更好的引导大模型完成对话。例如对话系统中增加的“系统”这一角色,可以为本次对话增加基本背景信息、对大模型进行角色身份设置等,相当于是设置本场对话的基本规则和信息;而对话系统中的“工具”这一角色,则相当于是大模型的拓展工具箱,当大模型无法回答当前问题的时候(例如用户希望查询当前即时天气),就可以向工具求助,而如果这个“工具”角色能够查到当前天气,则会“告诉”大模型当前天气情况,大模型在接收到了当前天气情况之后再告诉用户。如此一来,大模型便可以更加高效便捷的完成对话任务。
尽管多角色对话系统能够极大程度提高大模型的对话可用性,但并非所有模型都有能力进行多角色对话——往往只有推理能力较强的大模型才能够非常顺利的进行多角色对话。对于ChatGLM系列模型来说,也正是发布到了第三代,才正式引入多角色对话系统。而相比之下GPT系列模型,从ChatGPT(GPT-3.5)开始一直都是多角色对话模式。
而实际执行过程中,多角色对话的过程核心是依靠messages参数来实现的。
4.2 messages功能综述
总的来说,messages是一种用于描述ChatCompletion模型和用户之间通信信息的高级抽象,也是支撑多角色对话系统的关键,从表示形式上来说,一个messages是一个列表,包含多个字典,而每个字典都是一条消息,其中,一条消息由包含两个键值对(即每个字典都包含两个键值对),第一个键值对用于表示消息发送者,其中第一个Key为字符串’role’,Value为参与对话的角色名称,或者可以理解为本条消息的作者或消息发送人名称,第二个键值对表示具体消息内容,Key为字符串’content’,Value为具体的消息内容,用字符串表示。
response = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "user", "content": "请问什么是机器学习?"}
],
)
例如上述示例中的messages就总共包含一条信息,即一个一个名为user的角色发送了一条名为’请问什么是机器学习?'的消息:
同时,返回的message结果也是一个“字典”,并且也包含了信息的发送方和具体信息内容,不难看出,此时返回的message发送方是一个名为’assistant’的角色,而具体内容则是一段关于什么是机器学习的描述:
response.choices[0].message
CompletionMessage(content='机器学习是一门跨学科的研究领域,它赋予计算机系统从数据中学习并做出决策或预测的能力,无需进行显式编程。在机器学习中,计算机通过算法解析数据、从中学习、进而识别模式或趋势,最终能够对新的数据做出智能反应或预测。\n\n简而言之,机器学习可以看作是一种数据分析方法,它依赖概率论、统计学和算法理论等多个学科的知识。它的核心目的是让机器能够自动地从大量的数据中提取有用信息,并利用这些信息对未来的数据进行预测或决策。\n\n在机器学习的框架下,通常分为几个主要类型:\n\n1. 监督学习(Supervised Learning):通过输入数据和其对应的正确标签来训练模型,以便模型能够对新的数据进行准确预测。\n \n2. 无监督学习(Unsupervised Learning):在数据没有标签的情况下,寻找数据内部的隐藏结构和模式。\n\n3. 半监督学习(Semi-supervised Learning):结合了监督学习和无监督学习,部分数据有标签,而部分数据没有。\n\n4. 强化学习(Reinforcement Learning):通过奖励和惩罚机制,让机器在与环境的互动中学习最佳行为策略。\n\n机器学习已经在许多领域展现了其巨大的价值,如智能搜索、医疗诊断、无人驾驶等,并且随着技术的不断发展和进步,其应用范围还在持续扩大。', role='assistant', tool_calls=None)
由此不难看出,对话Chat模型的每个对话任务都是通过输入和输出message来完成的。
4.3 messages中的角色划分
-
user role和assistant role
在实际调用Chat模型进行对话时,messages中的role应该如何设置呢?从上述极简的对话示例中能够看出,一个最简单的对话就是我们扮演user(用户)这个角色(‘role’:‘user’),然后在content中输入我们的问题并等待模型回答。而模型在实际回答过程中,也会扮演一个名为assistant(助手)这个角色(‘role’:‘assistant’)进行回答,这里的user和assistant是具有明确含义的字符串,即如果一条信息的role是user,则表明这是用户向模型发送的聊天信息,相当于是Completion模型中的prompt,而如果一条信息的role是assistant,则表示这是当前模型围绕某条用户信息做出的回应,相当于是相当于是Completion模型中的text。需要注意的是,在messages参数中,我们是不能给自己或者模型自定义其他名称的。很明显,基于这样的一个定义的规则,最简单的Chat模型的调用方法就是在messages参数中设置一条role为user的参数,在content中输入聊天的内容,而模型则会根据这条用户输入给模型的消息进行回答,类似于此前我们向模型提问“请问什么是机器学习?”这种提问方式:
不过需要注意的是,尽管一个messages可以包含多条信息,但模型只会对于最后一条用户信息进行回答,也就是说,assistant消息和role消息是一一对应的,而且在一般情况下,assistant消息只会围绕messages参数中的最后一个role信息进行回答。
-
system role用于身份设定
不过,值得一提的是,user和assistant的这种提问方式尽管足够清晰,但往往形式上不够丰富,例如在实践中人们发现,给聊天机器人进行一个身份设置,其实是非常有效的引导模型创作我们想要的结果的方法,例如如果我们希望获得一个关于“什么是机器学习?”更加严谨且丰富的答案,我们可以以“假设你是一名资深的计算机系大学教授”为模型进行身份设置,例如我们可以以如下方式向模型进行提问:response = client.chat.completions.create( model="glm-4", messages=[ {"role": "user", "content": "假设你是一名资深的计算机系大学教授,请帮我回答,什么是机器学习?"} ] ) response.choices[0].message.content '机器学习是计算机科学的一个分支,它专注于开发和应用算法让计算机系统能够利用数据进行自我学习和改进,而无需进行显式的编程。简而言之,机器学习使得计算机能够从经验中学习,并根据这些学习来执行特定任务。\n\n在技术层面,机器学习涉及构建和训练模型,这些模型可以从大量的样本数据中识别出模式和规律。一旦模型被训练并验证其效能,它就可以对新的、未见过的数据进行预测或决策。这个过程模拟了人类的 学习过程,即通过观察和经验积累知识。\n\n根据Tom M. Mitchell的定义,机器学习可以表述为:一个计算机程序如果能够在任务T的性能度量P上,通过经验E获得提升,则我们说这个程序从经验E中学习了。\n\n机器学习的方法多种多样,主要包括监督学习、无监督学习、半监督学习和强化学习。这些方法在众多领域有着广泛的应用,如数据挖掘、图像识别、自然语言处理、推荐系统、生物信息学和金融分析等。\n\n在科学研究中,机器学习不仅与计算机科学紧密相关,还与统计学、概率论、优化理论等数学分支有着深刻的联系。它是一个跨学科研究领域,不断推动着人工智能技术的前沿发展。'
不难看出,此时模型的回答就变得更加详细和严谨,更像一名“大学教授”的语气风格,也同时说明我们对模型进行的身份设定是切实有效的。
而在completion.create函数中,还有另外一种非常便捷的对模型进行身份设置的方法,即使用
system role
,即我们可以使用如下方式为模型进行“大学教授”身份设定:response = client.chat.completions.create( model="glm-4", messages=[ {"role": "system", "content": "你是一名资深的计算机系大学教授"}, {"role": "user", "content": "请问什么是机器学习?"} ] ) response.choices[0].message.content '机器学习是一门跨学科的计算机科学领域,主要研究如何让计算机从数据或经验中学习,并据此进行预测或决策。它结合了统计学、概率论、算法理论等多个学科的知识和方法,致力于通过算法和统计模型让计算机模拟人类学习的过程,发现数据中的模式、特征和规律,以此来完成特定任务。\n\n在机器学习中,数据被视为知识的源泉。不同于传统编程,在传统编程中,程序员需要明确地编写规则来处理数据;而在机器学习系统中,通过训练数据集,算法自动地“学习”如何执行特定任务。这种学习过程通常涉及以下几个步骤:\n\n1. 数据收集与预处理:收集相关的数据,并进行清洗、标准化、归一化等预处理操作,以便于后续分析。\n2. 特征提取:从原始数据中提取有助于模型理解和分析的特征。\n3. 模型训练:使用算法对训练数据进行学习,调整模型参数,以便模型能够捕捉数据中的规律。\n4. 模型评估与调整:通过测试数据集来评估模型的性能,并根据结果对模型进行调整优化。\n5. 部署与应用:将训练好的模型应用到实际问题中,进行预测或决策。\n\n机器学习根据学习过程中是否有标签数据可分为以下几类:\n\n- 监督学习:通过有标签的数据学习,即每个样本数据都有一个对应的输出标签,模型通过学习输入与输出之间的关系来进行预测。\n- 无监督学习:使用无标签的数据,模型尝试从数据本身中发现结构或模式,如聚类分析。\n- 半监督学习:结合了监督学习和无监督学习的方法,部分数据有标签,部分数据无标签。\n- 强化学习:通过不断的尝试和错误,与环境的交互来学习最佳策略。\n\n机器学习已经被广泛应用于图像识别、语音识别、自然语言处理、医疗诊断、智能推荐系统、无人驾驶汽车等众多领域,大大推动了相关技术的发展和智能化水平的提升。'
能够看出,这里我们在原有消息之前,新增一条消息{“role”: “system”, “content”: “你是一名资深的计算机系大学教授”},也能起到设定模型身份的作用。而这条消息的实际含义是,以system的身份发送一条消息,消息内容为“你是一名资深的计算机系大学教授”。这里的system就是messages参数的role可以选取的第三个字符串,意为该消息为一条系统消息。相比用户消息,系统消息有以下几点需要注意,其一是系统消息的实际作用是给整个对话系统进行背景设置,不同的背景设置会极大程度影响后续对话过程中模型的输出结果,例如如果系统设置为“你是一位资深医学专家”,那么接下来系统在进行回答医学领域相关问题时则会引用大量医学术语,而如果系统设置为“你是一位资深相声演员”,那么接下来系统进行的回答则会更加风趣幽默:
response = client.chat.completions.create( model="glm-4", messages=[ {"role": "system", "content": "你是一名资深的相声演员"}, {"role": "user", "content": "请问什么是机器学习?"} ] ) response.choices[0].message.content '机器学习,简单来说,就是一种数据分析方法。它让计算机能够模拟人类学习行为,通过分析大量的数据,从中找出规律,无需人为编写具体的处理步骤。这样,计算机就能在处理新的数据时,应用之前学到的规律来进行预测和决策。\n\n具体一点,机器学习利用概率论、统计学、算法理论等多个学科的知识,让计算机从经验中学习。这个过程通常包括数据的预处理、特征的提取、模型的训练以及评估和调整。\n\n举个例子,就像一个孩子学习认识不同的水果。一开始,孩子不知道什么是苹果、什么是香蕉,但是通过大人不断地指出并告诉孩子哪些是苹果、哪些是香蕉,孩子就慢慢学会了如何区分它们。在机器学习中,大量的数据就好比这些水果,计算机通过算法“看”这些数据,并从中“学习”如何区分不同的类型。\n\n机器学习根据数据是否有标签,可以分为监督学习、无监督学习、半监督学习和强化学习。监督学习就像是孩子在学习水果时,有大人的指导;无监督学习则像是孩子自己摸索,没有直接的指导;半监督学习则介于两者之间;而强化学习则是通过不断的试错,逐渐找到最优的解决方案。\n\n现在,机器学习已经被广泛应用于图像识别、语音识别、自然语言处理等多个领域,并且在不断地推动着科技的发展。'
需要注意的则是,当messages中只包含一条system消息时,GLM4模型会直接报错
还有,如果我们需要根据system系统信息对系统进行设置,然后再提问,那么先system消息再user消息的顺序就变得非常重要,例如还是上面的例子,还是希望以喜剧演员的身份介绍机器学习,但我们调换了system消息和user消息的顺序,那么会发现,system消息的作用就会失效,这点和GPT系列模型完全一样 -
借助system role设置聊天背景信息
除了可以借助system消息非常便捷的进行提示模板的设计之外,还有一个非常常见的system role的使用方法,就是借助system消息进行聊天背景信息的设定,很多时候我们可以在system消息中输入一段长文本,这段长文本将在聊天开始之前输入到系统中,而在之后的聊天中,即可让assistant围绕这个长文本进行回答,这是一种最简单的实现大语言模型围绕本地知识库进行问答的方法。
text = '小明,男,1973年7月15日出生于中国福建省厦门市。\
1991年毕业于厦门大学电子科学与技术系,继而于1998年在北京大学获得信息技术博士学位。\
毕业后的陈明在硅谷的一家著名科技公司工作了五年,专注于人工智能和机器学习的研发。'
response = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "system", "content": text},
{"role": "user", "content": '请问小明是那一年出生?'}
]
)
response.choices[0].message.content
'小明是1973年7月15日出生的。'
能够看出,这段背景背景信息能够被模型学习并以此进行特定问题的回答。这其实就是一种非常简单的围绕本地知识进行问答的实现形式,不过需要注意的是,system role输入的信息也算是输入给模型的信息,因此受限于大语言模型的最大输入信息长度,单独借助system role在ChatCompletion.create函数中输入背景信息并不能真正意义上实现高度定制化、超大规模文本的本地知识库问答。但是,如果围绕着超大规模本地文本知识库先进行基于滑动窗口的文本切分,以确保切分后的小文本段落满足Max tokens要求,并且配合Embedding过程进行user问题和短文本的实时匹配,再把每个user问题匹配的关联度最高的文本以system消息的形式输入到模型中,再进行回答,则可以非常高效并且准确的实现本地知识库问答。而在这个过程中,借助system role进行背景文字的输入就非常基本的技术手段。
4.4 进行多轮对话
除了上述通过内部参数修改来实现不同功能外,messages参数的另一个重要应用是借助append方法来高效实现多轮对话。不同于Completion模型需要将历史问答都拼接为一个字符串并输入到新的prompt中来实现历史消息的输入,对于Chat模型来说,我们只需要将模型返回的message消息+用户新的提问message拼接到模型的messages参数中,并再次向模型进行提问,即可非常便捷的实现多轮对话。
messages=[
{"role": "system", "content": text},
{"role": "user", "content": '请问陈明是那一年出生?'}
]
messages.append({"role": "assistant", "content": response.choices[0].message.content})
messages
[{'role': 'system',
'content': '小明,男,1973年7月15日出生于中国福建省厦门市。 1991年毕业于厦门大学电子科学与技术系,继而于1998年在北京大学获得信息技术博士学位。 毕业后的陈明在硅谷的一家著名科技公司工作了五年,专注于人工智能和机器学习的研发。'},
{'role': 'user', 'content': '请问小明是那一年出生?'},
{'role': 'assistant', 'content': '小明是1973年7月15日出生的。'}]
此时messages参数就包含了最开始的问题+问题答案。接下来我们在messages消息中添加下一个问题:messages.append({'role': 'user', 'content': '请问我刚才的问题是?'})
[{'role': 'system',
'content': '小明,男,1973年7月15日出生于中国福建省厦门市。 1991年毕业于厦门大学电子科学与技术系,继而于1998年在北京大学获得信息技术博士学位。 毕业后的陈明在硅谷的一家著名科技公司工作了五年,专注于人工智能和机器学习的研发。'},
{'role': 'user', 'content': '请问小明是那一年出生?'},
{'role': 'assistant', 'content': '小明是1973年7月15日出生的。'},
{'role': 'user', 'content': '请问我刚才的问题是?'}]
接下来再次调用模型,并输入messages作为参数,此时模型将同时结合此前的所有消息,并围绕最后一个user信息进行回答:
response = client.chat.completions.create(
model="glm-4",
messages=messages
)
response.choices[0].message.content
'你刚才的问题是:\n\n“请问小明是那一年出生?”\n\n\n这个问题是在询问小明的出生年份。根据你提供的信息,小明的出生年份是1973年。'
对于messages中可选的role来说,除了ueser、assistant、system之外,还有一个function role,用于表示某条消息为某函数的调用指令,function role是OpenAI 0613更新中提供的新的role选项,用于Chat模型调用外部定义函数或者工具API时使用。相关用法我们会在下一部分内容中进行介绍。