AI 文摘

GLM4介绍





作者: AINLP 来源: AINLP

GLM-4

2024年1月16日,智谱AI正式推出GLM-4新一代基座大模型,整体性能相比ChatGLM3全面提升60%,根据实际测试,GLM-4在以中文为主的应用场景中实际性能逼近GPT-4的95%,在一些中文对齐的测试中,甚至超过GPT-4-turbo。

此外,GLM-4支持128K对话上下文,并且支持更强的多模态功能、支持更快推理速度,更多并发,大大降低推理成本;

同时GLM-4增强了智能体 (Agent )能力。

和此前ChatGLM3模型所不同的是,GLM-4不再采用开源模式,而是采用了OpenAI和Google大模型的在线大模型模式 ,即模型无需本地部署,而是通过联网的方式调用智谱算力中心的模型进行推理或微调,用户通过API-KEY进行身份验证,同时根据实际使用模型不同、以及不同的Token数量进行计费。

具体可以访问 智谱AI大模型MaaS开放平台

包含了完整详细的GLM在线系列模型调用方法、API手册、说明文档、以及对标OpenAI Playground的在 线调用模型实验环境。

GLM模型生态

  • 文本生成模型

    • GLM-4 对标GPT-4

    • GLM-3-Turbo 对标GPT-3.5

  • 强化角色扮演的文本生成模型(CharGLM-3)

  • 多模态图像创建模型(CogView-3) 对标DALL·E-3模型

  • Embedding-2模型 对标OpenAI的text-Embedding-ada-2模型

从ChatGLM3开始,GLM系列模型已经支持 Function calling功能

将来,智谱AI还将进一步开放GLM-4v多模态大模型,用于进行图像识别,对标GPT-4v;以及计划将发布GLM-4-Assistant API,用于更高效率进行Agent开发,对标OpenAI Assistant API。

知识库

和OpenAI File system类似,智谱AI也为其在线大模型技术生态设置了在线知识库搭建功能。所谓在线知识库,指的是用户可以将一些本地文档存在智谱AI的云端,用于随时将这些知识库文档输入大模型,或作为微调数据带入在线微调流程:

在实际使用大模型时,若要调用在线知识库中文档进行读取,我们只需要在调用模型API时设置Retrevial功能即可。此时大模型即会根据外部文档进行回答

用法 在智谱开放平台创建知识库后后得到知识库 ID,调用接口时传入知识库ID,将自动对文档进行分块、索引和存储嵌入,并通过向量搜索来检索相关内容来回答用户查询。

from zhipuai import ZhipuAI  
client = ZhipuAI(api_key="") # 请填写您自己的APIKey  
response = client.chat.completions.create(  
    model="glm-4",  # 填写需要调用的模型名称  
    messages=[  
        {"role": "user", "content": "你好!你叫什么名字"},  
    ],  
    tools=[  
            {  
                "type": "retrieval",  
                "retrieval": {  
                    "knowledge_id": "your knowledge id",  
                    "prompt_template":"从文档\n  
                    """\n  
                    {{knowledge}}\n  
                    """\n  
                    中找问题\n  
                    """\n  
                    {{question}}\n  
                    """\n  
                    的答案,找到答案就仅使用文档语句回答,找不到答案就用自身知识回答并告诉用户该信息不是来自文档。\n  
  
                    不要复述问题,直接开始回答。"  
                }  
            }  
            ],  
    stream=True,  
)  
for chunk in response:  
    print(chunk.choices[0].delta)  

需要注意的是,模型内部实现的Retrevial功能并不是长文本问答,既输入的内容不能超过模型最大上下文限制 ,因此模型内部的 Retrevial基本可以理解为将一个文档输入为system message,然后引导模型基于system message进行回答。不过未来即将上线的GLM-4 Assistant API将会和OpenAI Assistant API一样,支持大范围长文档的自动检索和问答。可以说目前知识库 系统也是为未来GLM-4 Assistant API做准备。

online finetuning

对于“闭源”的在线大模型来说,由于并未在本地进行安装部署,所以微调这一功能只能在模型云端完成。

微调数据格式:

{"messages": [{"role": "system", "content": "你是一位乐于助人,知识渊博的全能AI助手。"},{"role": "user", "content": "请介绍一下AlphaGo的基本原理。"}, {"role": "assistant", "content": "AlphaGo利用深度神经网络与树搜索算法相结合,通过对弈数据进行训练,逐步提升游戏水平,能够对围棋局面进行判断并选择最佳落子位置。"}]}  
{"messages": [{"role": "system", "content": "你是一位乐于助人,知识渊博的全能AI助手。"},{"role": "user", "content": "请列举一些健康饮食的重要原则。"}, {"role": "assistant", "content": "健康饮食的重要原则包括:膳食应营养均衡,合理摄入各种营养素;多吃新鲜蔬果,适量饮水;少吃糖、油、盐,忌吃过量快餐;养成规律生活作息习惯,适量运动。"}]}  
{"messages": [{"role": "system", "content": "你是一位乐于助人,知识渊博的全能AI助手。"},{"role": "user", "content": "请给出一些改善睡眠质量的建议。"}, {"role": "assistant", "content": "改善睡眠质量的建议包括:保证睡眠时间,避免睡眠不足;睡前放松身心,远离刺激;养成规律作息时间,不要频繁熬夜;适量运动,但不要运动过度;睡前可以喝一杯热牛奶等温和饮料。"}]}  

创建微调任务:

调用微调后的模型:

from zhipuai import ZhipuAI  
client = ZhipuAI(api_key="")  
response = client.chat.completions.create(  
    model="chatglm3-6b-1001",  # 填写需要调用的模型名称  
    messages=[  
        {"role": "system", "content": "你是一个人工智能助手,你叫叫chatGLM"},  
        {"role": "user", "content": "你好!你叫什么名字"},  
    ],  
    stream=True,  
)  
for chunk in response:  
    print(chunk.choices[0].delta)  

除了上面介绍的两个能力retrieval和finetuning,文档中还有function calling的介绍,感兴趣的可以查看https://open.bigmodel.cn/dev/howuse/functioncall

同时还提供了prompt工程的内容https://open.bigmodel.cn/dev/howuse/prompt

GLM-4实战

  1. 登录https://open.bigmodel.cn/ 账户注册与API-KEY获取

  2. 建议新创建一个虚拟环境,安装zhipuai

conda create -n py3.9 python==3.9  
conda activate py3.9  
pip install zhipuai  
  1. demo调用
from zhipuai import ZhipuAI  
client = ZhipuAI(api_key="your api key")  
response = client.chat.completions.create(  
    model="glm-4",  
    messages=[{"role": "user", "content": "你好,帮我写一个年会开幕词 30字以内"}],  
)  
print(response.choices[0].message)  

以上调用方式为基于SDK的调用,另外还支持基于HTTP调用

SDK是一组工具,库,文档和代码示例,只在帮助开发者更容易更高效低使用特定的API,在基于SDK的API调用中,不需要从新开始编写用于与API通信的代码,可以直接利用SDK中的预写函数和方法

在SDK调用过程中,又可以细分为同步调用、异步调用与SSE调用三种不同的调用方法。

  • 同步调用,指的是我们发起请求,等待朋多器响应后方可进行下一步动作,并且服务器响应也是一次性获得全部结果。

    client.chat.completions.create

  • 异步调用,则指的是当发起请求后,服务器会先直接响应当前任务ID,此时无论任务是否已经完成,用户都可以直接进行接下来的动作,而当服务器完成任务时,用户可以通过任务ID查看到服务器响应结果;

    client.chat.asyncCompletions.create

  • SSE调用,则是指流式传输,此时服务器不再是一次性返回全部内容,而是逐个字符(或者词语)进行返回。

    # 需要额外参数stream=True
    client.chat.completions.create(
      stream=True,
    )

    #接收情况
    for chunk in response_stream:
      print(chunk.choices[0].delta)

模型参数介绍

  1. chat.completions.create函数参数

  • model,代表的含义是当前调用的模型。目前可选的模型有GLM-3-Turbo、GLM-4;

  • messages,代表传输到模型内部的消息队列 。messages参数是一个基本构成元素为字典的列表,其内每个字典都代表一条独立的消息,每个字典都包含两个键值(Key-value)对,其中第一个Key都是字符串role(角色)表示某条消息的作者,第二个key为content (内容)表示消息具体内容。

  • 实际使用中发现,对于glm4和glm3模型temperature调整为1和0.1效果差异并不大,但是对于GPT类型模型调整该参数在-2 和 2 之间会有明显差异;

2.chat.completions.create函数响应结果

# response content  
Completion(model='glm-4', created=1705575284, choices=[CompletionChoice(index=0, finish_reason='stop', message=CompletionMessage(content='你好👋!我是人工智能助手智谱清言,可以叫我小智🤖,很高兴见到你,欢迎问我任何问题。', role='assistant', tool_calls=None))], request_id='8311643113837941476', id='8311643113837941476', usage=CompletionUsage(prompt_tokens=6, completion_tokens=32, total_tokens=38))  

因此通过如下可以直接获取返回的信息

response.choices[0].message.content  

Message参数设置方法

多角色对话系统:将用户和大模型之间的“私聊”变为“群聊”,在用户user 和大模型assistant 这两个角色基础之上,进一步增加 “系统”和“工具”这两个角色。最终目的都是为了能完成大模型和用户的之间对话。

  • 例如对话系统中增加的“系统”这一角色,可以为本次对话增加基本背景信息、对大模型进行角色身份设置等,相当于是设置本场对话的基本规则和信息;

  • 而对话系统中的“工具”这一角色,则相当于是大模型的拓展工具箱,当大模型无法回答当前问题的时候(例如用户希望查询当前即时天气),就可以向工具求助,而如果这个“工具”角色能够查到当前天气,则会“告诉”大模型当前天气情况,大模型在接收到了当前天气情况之后再告诉用户。

messages是一种用于描述ChatCompletion模型和用户之间通信信息的高级抽象 ,也是支撑多角色对话系统的关键,从表示形式上来说,一个messages是一个列表,包含多个字典,而每个字典都是一条消息 ,其中,一条消息包含一个键值对(即每个字典都包含两个键值对),第一个键值对用于表示消息发送者,其中第一个Key为字符串’role’,Value为参与对话的角色名称,或者可以理解为本条消息的作者或消息发送人名称,第二个键值对表示具体消息内容,Key为字符串’content’,Value为具体的消息内容,用字符串表示。

上面的例子中,如果一条信息的role是user,则表明这是用户向模型发送的聊天信息,相当于是Completion模型中的prompt ,而如果一条信息的role是assistant,则表示这是当前模型围绕某条用户信息做出的回应,相当于是相当于是Completion模型中的text。

注意:

  • 在messages参数中,我们是不能给自己或者模型自定义其他名称的。

  • 尽管一个messages可以包含多条信息,但模型只会对于最后一条用户信息进行回答,

比如下面的例子中,只会回答最后一个问题

messages=[  
{"role": "user", "content": "请问什么是机器学习?"},  
{"role": "user", "content": "请问什么是决策树算法?"}  
]  

那么如何通过message实现多角色对话呢?

  • 最简单的方案是直接将角色背景信息假如user的contant,比如

    messages=[
    {“role”: “user”, “content”: “假设你是一名资深的计算机系大学教授,请帮我回答,什么是机器学习?”}
    ]

  • 另一种方案是采用system角色,如下:

system role 用于身份设定

GLM4推荐的方案是使用system role

client = ZhipuAI(api_key=api_key)   
response = client.chat.completions.create(  
    model="glm-4",    
    messages=[  
    {"role": "system", "content": "你是一名资深的计算机系大学教授"},  
    {"role": "user", "content": "请问什么是机器学习?"}  
  ]  
)  

注意:

  1. 通过system_message进行身份设置对于GLM4模型效果较好,而对于GLM3模型来说效果非常不稳定:

  2. 注意,当messages中只包含一条system消息时,GLM4模型会直接报错 :

messages=[  
{"role": "system", "content": "你是一名资深的喜剧演员"}, ]  

  1. 如果需要根据system系统信息对系统进行设置,然后再提问,那么先system消息再user消息的顺序 就变得非常重要

例如还是上面的例子,我们调换了system消息和user消息的顺序,那么会发现,system消息的作用就会失效,这点和GPT系列模型完全一样:

messages=[  
{"role": "user", "content": "请问什么是机器学习?"},   
{"role": "system", "content": "你是一名资深的喜剧演员"}  
]  

system messages设置聊天背景信息

system消息除了非常便捷的进行提示模板的设计之外,还可以进行聊天背景信息的设定;

在system消息中输入一段长文本,这段长文本将在聊天开始之前输入到系统中,而在之后的聊天中,即可让assistant围绕这个长文本进行回答,这是一种最简单的实现大语言模型围绕本地知识库进行问答的方法

这里我们在system消息中输入一段关于虚拟人物“陈明”的个人简介,而在之后的提问中,user和assistant将可以自由的围绕这段输入的背景信息进行问答:

text = '陈明,男,1973年7月15日出生于中国福建省厦门市。\ 1991年毕业于厦门大学电子科学与技术系,继而于1998年在北京大学获得信息技术博士学位。\ 毕业后的陈明在硅谷的一家著名科技公司工作了五年,专注于人工智能和机器学习的研发。'  
   
response = client.chat.completions.create( model="glm-4",  
messages=[  
{"role": "system", "content": text},  
{"role": "user", "content": '请问陈明是那一年出生?'}  
] )   
   

注意:system role输入的信息也是输入给模型的信息,因此受限于大语言模型的最大输入信息长度,单独借助system role在ChatCompletion.create函数中输入背景信息并不能真正意义上实现高度定制化、超大规模文本的本地知识库问答。但是,如果围绕着超大规模本地文本知识库先进行基于滑动窗口的文本切分,以确保切分后的小文本段落满足Max tokens要求,并且配合Embedding过程进行user问题和短文本的实时匹配,再把每个user问题匹配的关联度最高的文本以system消息的形式输入到模型中,再进行回答,则可以非常高效并且准确的实现本地知识库问答。而在这个过程中,借助system role进行背景文字的输入就非常基本的技术手段。

message 实现多轮对话

messages参数的另一个重要应用是借助append方法来高效实现多轮对话 。不同于Completion模型需要将历史问答都拼接为一个字符串并输入到新的prompt中来实现历史消息的输入,对于Chat模型来说,我们只需要将模型返回的message消息+用户新的提问message拼接到模型的messages参数中,并再次向模型进行提问,即可非常便捷的实现多轮对话。

messages.append({"role": "assistant", "content": response.choices[0].message.content})  
  
messages.append({'role': 'user', 'content': '请问我刚才的问题是?'})  
  
接下来再次调用模型,并输入messages作为参数,此时模型将同时结合此前的所有消息,并围绕最后一个user信息进行回答:  
response = client.chat.completions.create(   
  model="glm-4",  
  messages=messages   
)  

进技术交流群请添加AINLP小助手微信(id: ainlp2)

请备注具体方向+所用到的相关技术点

![](https://api.allorigins.win/raw?url=https://mmbiz.qpic.cn/mmbiz_jpg/nW2ZPfuYqSJADkmZ2IX6Z23znAibuEevotDMq9iaMxiapK7jfMibiauGFkycicAJEs6x5U9SGyDJZ0S1tRed9TPNUUDQ/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括LLM、预训练模型、自动生成、文本摘要、智能问答、聊天机器人、机器翻译、知识图谱、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP小助手微信(id:ainlp2),备注工作/研究方向+加群目的。

  


![](https://api.allorigins.win/raw?url=https://mmbiz.qpic.cn/mmbiz_jpg/nW2ZPfuYqSKABHCqVVQkVYPrM4XY1vsd0iaeuXzyJnoFc8cibd5mYb4wdA3WMQtiaPVmr0XLZHMuVibqWncibpnTSnQ/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)       

更多AI工具,参考Github-AiBard123国内AiBard123

可关注我们的公众号:每天AI新工具