1. 背景介绍
在 2024 年的最后一天,智谱发布了 GLM-Zero 的初代版本 GLM-Zero-Preview,是基于扩展强化学习技术训练的推理模型【1】。GLM-Zero-Preview的推理能力还挺强的,类似于open ai的o1模型,擅长在一些有确定性结果的场景,比如逻辑推理、数学、编程。
稍微试用了一下,感觉确实不错,尝试了智谱清言的Zero推理agent,以及SDK【2】两种方式, 还是建议用SDK的模式,似乎会更加稳定。agent有时候会出现一些效果波动。
2. SDK方式
2.1 接口信息
2.2 请求参数
参数名称 |
类型 |
必填 |
参数描述 |
model |
String |
是 |
要调用的模型编码。 |
messages |
List<Object> |
是 |
调用语言模型时,当前对话消息列表作为模型的提示输入,以JSON数组形式提供,例如{"role": "user", "content": "Hello"}。可能的消息类型包括系统消息、用户消息、助手消息和工具消息。 |
request_id |
String |
否 |
由用户端传递,需要唯一;用于区分每次请求的唯一标识符。如果用户端未提供,平台将默认生成。 |
do_sample |
Boolean |
否 |
当do_sample为true时,启用采样策略;当do_sample为false时,温度和top_p等采样策略参数将不生效。默认值为true。 |
stream |
Boolean |
否 |
该参数在使用同步调用时应设置为false或省略。表示模型在生成所有内容后一次性返回所有内容。默认值为false。如果设置为true,模型将通过标准Event Stream逐块返回生成的内容。当Event Stream结束时,将返回一个data: [DONE]消息。 |
temperature |
Float |
否 |
采样温度,控制输出的随机性,必须为正数取值范围是:[0.0, 1.0],默认值为0.95。 |
top_p |
Float |
否 |
另用温度取样的另一种方法,取值范围是:[0.0, 1.0],默认值为0.7。 |
max_tokens |
Integer |
否 |
模型输出的最大token数,最大输出为16k,默认值为12k。 |
stop |
List |
否 |
模型遇到stop指定的字符时会停止生成。目前仅支持单个stop词,格式为["stop_word1"]。 |
user_id |
String |
否 |
终端用户的唯一ID,帮助平台对终端用户的非法活动、生成非法不当信息或其他滥用行为进行干预。ID长度要求:至少6个字符,最多128个字符。 |
2.3 Message 格式
System Message
参数名称 |
类型 |
必填 |
参数说明 |
role |
String |
是 |
消息的角色信息,此时应为system , |
content |
String |
是 |
消息内容,GLM-Zero-Preview 启动深度思考模型,System Prompt需设置为:Please think deeply before your response. |
User Message
参数名称 |
类型 |
必填 |
参数说明 |
role |
String |
是 |
消息的角色信息,此时应为user |
content |
String |
是 |
消息内容 |
Assistant Message
参数名称 |
类型 |
必填 |
参数说明 |
role |
String |
是 |
消息的角色信息,此时应为assistant |
content |
String |
是 |
消息内容 |
2.4 响应参数
参数名称 |
类型 |
参数描述 |
id |
String |
任务ID |
created |
Long |
请求创建时间,为Unix时间戳,单位为秒 |
model |
String |
模型名称 |
choices |
List |
当前对话的模型输出内容 |
index |
Integer |
结果索引 |
finish_reason |
String |
模型推理终止的原因。可以是'stop'、'tool_calls'、'length'、'sensitive'或'network_error'。 |
message |
Object |
模型返回的文本消息 |
role |
String |
当前对话角色,默认为'assistant'(模型) |
content |
String |
当前对话内容。命中函数时为null,否则返回模型推理结果。GLM-Zero-Preview 返回内容由以下两部分构成:###Thinking模型的详细思考过程。###Response模型的最终回答或输出。 |
usage |
Object |
模型调用结束时返回的token使用统计。 |
prompt_tokens |
Integer |
用户输入的token数量 |
completion_tokens |
Integer |
模型输出的token数量 |
total_tokens |
Integer |
总token数量 |
2.5 请求示例
python
复制代码
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 请填写您自己的APIKey
response = client.chat.completions.create(
model="glm-zero-preview", # 请填写您要调用的模型名称
messages=[
{"role": "system", "content": "Please think deeply before your response."},#GLM-Zero-Preview 启动深度思考,System Prompt需设置为:Please think deeply before your response.
{"role": "user", "content": "一个袋子中有5个红球和3个蓝球,随机抽取2个球,抽到至少1个红球的概率为:"}
],
max_tokens=12000,
)
print(response)
2.6 异步调用
以上是同步调用的方式,也可以支持异步调用。
2.6.1 接口请求
类型 |
说明 |
传输方式 |
HTTPS |
请求URL |
https://open.bigmodel.cn/api/paas/v4/async/chat/completions |
调用方式 |
异步,结果必须通过查询接口获取 |
字符编码 |
UTF-8 |
请求格式 |
JSON |
响应格式 |
JSON |
HTTP方法 |
POST |
开发语言 |
任何能够发起HTTP请求的开发语言 |
2.6.2 调用示例
python
复制代码
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 请填写您自己的APIKey
response = client.chat.asyncCompletions.create(
model="glm-zero-preview", # 请填写您要调用的模型名称
messages=[
{"role": "system", "content": "Please think deeply before your response."},
{"role": "user", "content": "一个袋子中有5个红球和3个蓝球,随机抽取2个球,抽到至少1个红球的概率为:"}
],
)
print(response)
2.6.3 任务结果查询
接口请求
请求参数
参数名称 |
类型 |
必填 |
描述 |
id |
String |
是 |
任务id |
响应参数
参数名称 |
类型 |
描述 |
model |
String |
模型名称 |
choices |
List |
当前对话模型输出内容,目前仅返回一个 |
index |
Integer |
结果索引 |
finish_reason |
String |
模型推理终止的原因。"stop"表示自然结束或触发stop词,"length"表示达到token长度限制。 |
message |
Object |
模型返回的文本消息 |
role |
String |
当前对话角色,目前默认为assistant(模型) |
content |
String |
当前对话内容 |
task_status |
String |
处理状态:PROCESSING(处理中),SUCCESS(成功),FAIL(失败) |
request_id |
String |
客户端请求时提交的任务号或平台生成的任务号 |
id |
String |
智谱AI开放平台生成的任务序号,调用请求结果接口时使用此序号 |
usage |
Object |
本次模型调用的token统计 |
prompt_tokens |
int |
用户输入的token数量 |
completion_tokens |
int |
模型输出的token数量 |
total_tokens |
int |
总token数量 |
请求示例
python
复制代码
import time
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 请填写您自己的APIKey
response = client.chat.asyncCompletions.create(
model="glm-zero-preview", # 请填写您要调用的模型名称
messages=[
{"role": "system", "content": "Please think deeply before your response."},#GLM-Zero-Preview 启动深度思考,System Prompt需设置为:Please think deeply before your response.
{"role": "user", "content": "一个袋子中有5个红球和3个蓝球,随机抽取2个球,抽到至少1个红球的概率为:"}
],
)
task_id = response.id
task_status = ''
get_cnt = 0
while task_status != 'SUCCESS' and task_status != 'FAILED' and get_cnt <= 40:
result_response = client.chat.asyncCompletions.retrieve_completion_result(id=task_id)
print(result_response)
task_status = result_response.task_status
time.sleep(2)
get_cnt += 1
响应示例
python
复制代码
AsyncTaskStatus(id='101002-9116561662663388866', request_id='-9116561662663388867', model=None, task_status='PROCESSING')
AsyncTaskStatus(id='101002-9116561662663388866', request_id='-9116561662663388867', model=None, task_status='PROCESSING')
AsyncTaskStatus(id='101002-9116561662663388866', request_id='-9116561662663388867', model=None, task_status='PROCESSING')
AsyncTaskStatus(id='101002-9116561662663388866', request_id='-9116561662663388867', model=None, task_status='PROCESSING')
AsyncTaskStatus(id='101002-9116561662663388866', request_id='-9116561662663388867', model=None, task_status='PROCESSING')
AsyncTaskStatus(id='101002-9116561662663388866', request_id='-9116561662663388867', model=None, task_status='PROCESSING')
AsyncTaskStatus(id='101002-9116561662663388866', request_id='-9116561662663388867', model=None, task_status='PROCESSING')
AsyncTaskStatus(id='101002-9116561662663388866', request_id='-9116561662663388867', model=None, task_status='PROCESSING')
AsyncCompletion(id='101002-9116561662663388866', request_id='-9116561662663388867', model='GLM-Zero-Preview', task_status='SUCCESS', choices=[CompletionChoice(index=0, finish_reason='stop', message=CompletionMessage(content='###Thinking\n\n让我们来计算从一个装有5个红球和3个蓝球的袋子中随机抽取2个球,抽到至少1个红球的概率。\n\n首先,我们可以直接计算抽到至少1个红球的情况数,但这可能会有些复杂。所以,一个更简便的方法是先计算抽到没有红球的概率,也就是抽到全是蓝球的概率,然后用1减去这个概率。\n\n总共有8个球,从中随机抽取2个球的总情况数是组合数 \\( C(8, 2) \\):\n\n\\[\nC(8, 2) = \\frac{8!}{2!(8-2)!} = \\frac{8 \\times 7}{2 \\times 1} = 28\n\\]\n\n接下来,计算抽到全是蓝球的情况数。袋子里有3个蓝球,从中抽取2个蓝球的情况数是 \\( C(3, 2) \\):\n\n\\[\nC(3, 2) = \\frac{3!}{2!(3-2)!} = \\frac{3 \\times 2}{2 \\times 1} = 3\n\\]\n\n所以,抽到全是蓝球的概率是:\n\n\\[\nP(\\text{全是蓝球}) = \\frac{C(3, 2)}{C(8, 2)} = \\frac{3}{28}\n\\]\n\n因此,抽到至少1个红球的概率就是:\n\n\\[\nP(\\text{至少1个红球}) = 1 - P(\\text{全是蓝球}) = 1 - \\frac{3}{28} = \\frac{25}{28}\n\\]\n\n不过,为了确认这个结果,我们也可以直接计算抽到至少1个红球的情况数。\n\n抽到至少1个红球包括两种情况:抽到1个红球和1个蓝球,或者抽到2个红球。\n\n先计算抽到1个红球和1个蓝球的情况数。红球有5个,蓝球有3个,所以:\n\n\\[\n\\text{1红1蓝的情况数} = C(5, 1) \\times C(3, 1) = 5 \\times 3 = 15\n\\]\n\n再计算抽到2个红球的情况数:\n\n\\[\n\\text{2红的情况数} = C(5, 2) = \\frac{5!}{2!(5-2)!} = \\frac{5 \\times 4}{2 \\times 1} = 10\n\\]\n\n所以,抽到至少1个红球的总情况数是:\n\n\\[\n\\text{至少1个红球的情况数} = 15 + 10 = 25\n\\]\n\n这样,抽到至少1个红球的概率就是:\n\n\\[\nP(\\text{至少1个红球}) = \\frac{25}{28}\n\\]\n\n我们通过两种方法计算得到了相同的结果,这让我们更加确信答案的正确性。\n\n在解决这类概率问题时,直接计算所需事件的概率有时会比较复杂,而通过计算其对立事件的概率然后用1减去,通常会更简便。不过,直接计算虽然可能稍微麻烦一些,但也是个好方法,尤其是当直接计算看起来也不太复杂的时候。而且,通过两种方法得到相同的结果,可以相互验证,确保答案的准确性。\n\n因此,抽到至少1个红球的概率是 \\(\\boxed{\\dfrac{25}{28}}\\)。\n\n###Response\n\n**解题步骤**\n\n1. **确定总球数及各类球的数量**\n - 红球数量:5个\n - 蓝球数量:3个\n - 总球数:5 + 3 = 8个\n\n2. **计算总共有多少种抽取2个球的方式**\n \\[\n C(8, 2) = \\frac{8!}{2!(8-2)!} = \\frac{8 \\times 7}{2 \\times 1} = 28\n \\]\n\n3. **计算抽到全是蓝球的情况数**\n \\[\n C(3, 2) = \\frac{3!}{2!(3-2)!} = \\frac{3 \\times 2}{2 \\times 1} = 3\n \\]\n\n4. **计算抽到全是蓝球的概率**\n \\[\n P(\\text{全是蓝球}) = \\frac{3}{28}\n \\]\n\n5. **计算抽到至少1个红球的概率**\n \\[\n P(\\text{至少1个红球}) = 1 - P(\\text{全是蓝球}) = 1 - \\frac{3}{28} = \\frac{25}{28}\n \\]\n\n**最终答案**\n\n\\[\n\\boxed{\\dfrac{25}{28}}\n\\]', role='assistant', tool_calls=None))], usage=CompletionUsage(prompt_tokens=41, completion_tokens=1020, total_tokens=1061), created=1735459527)
可以看到里面的Thinking的过程。
3. 参考材料
【1】智谱深度推理模型 GLM-Zero 预览版上线
【2】GLM-Zero-Preview