1. 智谱大模型流式API调用实战解析
最近在对接智谱(Zhipu)GLM-4大模型的流式API时,发现不少开发者会遇到两个典型问题:一是无法正确处理流式响应,二是找不到正确的文本内容字段。今天我就来分享下如何用Python正确调用智谱的流式API,实现诗歌生成的实时输出效果。
智谱的流式API基于Server-Sent Events(SSE)协议,与标准的HTTP请求有些不同。当我们需要处理长文本生成(如诗歌、文章)时,流式接口可以显著提升用户体验,实现类似打字机效果的逐字输出。下面我们就从原理到实践,完整走一遍这个流程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心问题与解决方案
2.1 常见错误分析
先来看开发者最常踩的两个坑:
-
错误使用response.text读取流式响应
很多同学习惯性地用response.text获取响应内容,这在普通HTTP请求中没问题,但对于流式接口,这会阻塞直到所有数据接收完成,完全失去了"流式"的意义。 -
找不到正确的文本字段
智谱GLM-4的流式响应结构与OpenAI有所不同,文本内容存放在choices[0].delta.reasoning_content而非常见的content字段,这个差异很容易被忽略。
2.2 正确实现方案
解决上述问题的核心方法是:
- 使用
requests库的stream=True参数+iter_lines()方法逐行读取 - 正确解析SSE格式的数据流
- 从
delta.reasoning_content提取文本内容
3. 完整实现代码解析
3.1 基础配置
首先设置API的基本参数:
python复制import requests
import json
url = "https://open.bigmodel.cn/api/paas/v4/chat/completions"
headers = {
"Authorization": "Bearer your_api_key_here",
"Content-Type": "application/json"
}
payload = {
"model": "glm-4-7",
"messages": [{
"role": "user",
"content": "写一首关于春天的诗。"
}],
"stream": True,
"temperature": 1
}
注意:这里的API Key需要替换为你自己的有效密钥,温度参数temperature控制生成文本的随机性,1表示中等创造性。
3.2 流式请求处理
核心的流式处理逻辑如下:
python复制response = requests.post(url, json=payload, headers=headers, stream=True)
if response.status_code != 200:
print(f"请求失败: {response.status_code} - {response.text}")
exit()
full_content = []
print("正在生成...\n")
try:
for line in response.iter_lines():
if line:
decoded_line = line.decode('utf-8')
if decoded_line.startswith("data:"):
json_str = decoded_line[len("data:"):].strip()
if json_str == "[DONE]":
break
try:
chunk = json.loads(json_str)
if "choices" in chunk and len(chunk["choices"]) > 0:
d
