2026山东大学软件学院创新项目实训博客(二)
【智绘博弈】智谱 GLM-4V 接入实战
项目:智绘博弈 —— 人机对抗绘画猜词与心理解读系统
角色:AI 识别 & 心理解读模块负责人
日期:2026.4.6 - 2026.4.12
一、本周目标
上周完成了多模态大模型调研和选型,确定使用智谱 GLM-4V-Flash 作为主力模型。这周目标是:
-
完成 zhipuai SDK 的安装和配置
-
搞懂多模态消息的格式(怎么同时传图片和文字)
-
写出第一个能跑通的调用 demo
-
测试 temperature 参数对 AI 猜词的影响
二、SDK 安装与 API Key 获取
2.1 注册智谱开放平台
-
手机号注册
-
注册完就送 2000 万 Token,对短期项目测试够用
2.2 获取 API Key
登录后进入控制台 → API Keys → 创建新的 API Key
⚠️ 安全提醒:千万不要把 Key 写死在代码里提交到网络 包括 Git,后面会讲怎么安全管理。
2.3 安装 SDK
pip install zhipuai
安装完可以验证一下:
>>> import zhipuai
>>> zhipuai.__version__
'2.1.5'
三、多模态消息格式详解
这是我这周花最多时间理解的部分。
3.1 什么是“多模态消息”?
普通的文本对话很简单:
messages = [{"role": "user", "content": "你好"}]
但我们要让 AI 同时看到图片和文字,就需要用多模态消息格式:
messages = [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,xxxxx..." # 图片
}
},
{
"type": "text",
"text": "这幅画画的是什么?" # 文字提示
}
]
}
]
关键点:
-
content从字符串变成了数组 -
数组里可以放多个元素,每个元素有
type字段标明类型 -
type: "image_url"表示图片,type: "text"表示文字 -
图片和文字的顺序可以调换,AI 会同时理解它们
3.2 为什么用 Base64 而不是 URL?
智谱的 API 支持两种传图方式:
-
URL 方式:传一个图片的网络地址
-
Base64 方式:把图片编码成文本字符串直接传
我们选择 Base64,原因是:
-
我们的图片是 Canvas 画布实时生成的,根本没有 URL
-
Base64 直接嵌入请求,不需要额外的图片服务器
-
避免了”AI 服务器去下载图片“这一步的延迟
3.3 Base64 编码示例
import base64
# 假设 image_bytes 是 PNG 图片的二进制数据
image_base64 = base64.b64encode(image_bytes).decode('utf-8')
# 拼成 data URL 格式
data_url = f"data:image/png;base64,{image_base64}"
前端 Canvas 导出图片时也是类似的:
// 前端代码
const canvas = document.getElementById('drawing-board');
const dataUrl = canvas.toDataURL('image/png');
// 结果就是 "data:image/png;base64,xxxxx..."
四、第一次成功调用
4.1 最简代码
from zhipuai import ZhipuAI
# 初始化客户端
client = ZhipuAI(api_key="你的API Key")
# 调用多模态模型
response = client.chat.completions.create(
model="glm-4v-flash", # 模型名
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{image_base64}"
}
},
{
"type": "text",
"text": "这幅简笔画画的是什么?请用2-4个中文字回答。"
}
]
}
],
temperature=0.3,
max_tokens=200,
)
# 获取回复
answer = response.choices[0].message.content
print(answer)
4.2 实际运行结果
我画了一个蘑菇

AI 的回复:

五、temperature 参数的作用
在测试过程中,我发现一个重要参数:temperature。
5.1 temperature 是什么?
简单说:temperature 控制 AI 回答的”随机性“
| temperature | 效果 |
|---|---|
| 0.0 ~ 0.3 | 回答更确定、更稳定,每次问同样的问题结果差不多 |
| 0.7 ~ 1.0 | 回答更有创意、更多样,但可能不太稳定 |
5.2 对猜词游戏的影响
我用同一张 “苹果” 的简笔画,测试了不同 temperature:
| temperature | 5次测试结果 | 分析 |
|---|---|---|
| 0.1 | 苹果、苹果、苹果、苹果、苹果 | 非常稳定 |
| 0.5 | 苹果、苹果、水果、苹果、苹果 | 偶尔飘 |
| 0.9 | 苹果、球、樱桃、苹果、红果 | 很不稳定 |
5.3 我们的选择
对于猜词游戏,我们需要 AI 的回答稳定可预测(不然游戏体验会很混乱),所以最终设置 temperature=0.3。
response = client.chat.completions.create(
model="glm-4v-flash",
messages=[...],
temperature=0.3, # 低温度 = 稳定输出
max_tokens=200,
)
六、API Key 的安全管理
老师的文件里强调了代码安全,这里记录一下我们的做法。
6.1 问题:Key 不能写死在代码里
如果这样写:
# 错误示范
client = ZhipuAI(api_key="sk-xxxxxxxxxxxxxxxx")
一旦代码提交到 Git,任何人都能看到你的 Key,可能被盗用。
6.2 解决:用环境变量
我们在 config.py 里这样写:
import os
# 从环境变量读取,如果没有就用空字符串
ZHIPU_API_KEY = os.environ.get('ZHIPU_API_KEY', '')
然后在启动脚本里设置环境变量:
# Linux/Mac
export ZHIPU_API_KEY="你的密钥"
python app.py
# Windows (start.bat)
set ZHIPU_API_KEY=你的密钥
python app.py
这样 Key 只存在于本地环境,不会被提交到代码仓库。
七、遇到的问题
问题 1:第一次调用报错 zhipuai.APIError
原因:API Key 复制的时候多了个空格……仔细检查后解决了。
问题 2:返回结果格式不稳定
有时候 AI 会返回:
这是一个苹果
有时候返回:
{"guess": "苹果", "confidence": 0.9}
这个问题下周会专门处理——需要设计 Prompt 来约束输出格式。
问题 3:图片太大导致请求超时
一开始传原图(2000x2000),请求要好几秒。后来在前端压缩到 400x400 后,响应时间降到了 1 秒内。
八、下周计划
-
Prompt Engineering:设计三档难度的 prompt,让 AI 按我们要求的 JSON 格式返回
-
响应解析:处理 AI “不听话” 的情况,写一个健壮的解析函数
-
通义千问备份:实现自动降级机制,智谱挂了自动切换到千问
九、本周总结
这周完成了 AI 模块的“从 0 到 1”:
-
理解了多模态消息的格式(content 数组 + type 字段)
-
搞懂了 Base64 图片传输的原理
-
成功调用了智谱 GLM-4V-Flash,AI 能识别简笔画了
-
测试了 temperature 参数,确定用 0.3
-
学会了用环境变量保护 API Key
下周继续完善 Prompt 和错误处理!
(本文代码在 AI 辅助下完成。与 AI 的交互过程:我描述了 “需要调用智谱的多模态接口识别 Canvas 画布的图片” 这个需求,AI 提供了代码框架和多模态消息格式的写法,我根据智谱官方文档做了验证和调整。)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)