【智绘博弈】智谱 GLM-4V 接入实战

项目:智绘博弈 —— 人机对抗绘画猜词与心理解读系统

角色:AI 识别 & 心理解读模块负责人

日期:2026.4.6 - 2026.4.12


一、本周目标

上周完成了多模态大模型调研和选型,确定使用智谱 GLM-4V-Flash 作为主力模型。这周目标是:

  1. 完成 zhipuai SDK 的安装和配置

  2. 搞懂多模态消息的格式(怎么同时传图片和文字)

  3. 写出第一个能跑通的调用 demo

  4. 测试 temperature 参数对 AI 猜词的影响


二、SDK 安装与 API Key 获取

2.1 注册智谱开放平台

  1. 打开 https://open.bigmodel.cn/

  2. 手机号注册

  3. 注册完就送 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 支持两种传图方式:

  1. URL 方式:传一个图片的网络地址

  2. 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 秒内。


八、下周计划

  1. Prompt Engineering:设计三档难度的 prompt,让 AI 按我们要求的 JSON 格式返回

  2. 响应解析:处理 AI “不听话” 的情况,写一个健壮的解析函数

  3. 通义千问备份:实现自动降级机制,智谱挂了自动切换到千问


九、本周总结

这周完成了 AI 模块的“从 0 到 1”:

  • 理解了多模态消息的格式(content 数组 + type 字段)

  • 搞懂了 Base64 图片传输的原理

  • 成功调用了智谱 GLM-4V-Flash,AI 能识别简笔画了

  • 测试了 temperature 参数,确定用 0.3

  • 学会了用环境变量保护 API Key

下周继续完善 Prompt 和错误处理!


(本文代码在 AI 辅助下完成。与 AI 的交互过程:我描述了 “需要调用智谱的多模态接口识别 Canvas 画布的图片” 这个需求,AI 提供了代码框架和多模态消息格式的写法,我根据智谱官方文档做了验证和调整。)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐