Skip to content

智谱GLM集成

除了通义千问,国内另一家值得关注的是智谱 AI 的 GLM 系列。它家 glm-4-flash 免费额度大,适合新手练手;glm-4-plus 能力对标 GPT-4o。本章讲怎么接进 LangGraph。

一、智谱 GLM 简介

智谱 AI 出自清华,主打 GLM(General Language Model)系列。常用模型:

模型特点适用
glm-4-plus旗舰,能力强复杂任务/智能体
glm-4-flash免费、快、能力弱练手/简单任务
glm-4-air性价比档日常
glm-4v多模态(图文)图像理解

新手特点:glm-4-flash 免费,做实验不烧钱;要做正经智能体上 glm-4-plus

二、安装与配置

2.1 安装

智谱的 LangChain 集成在 langchain-community,依赖官方 SDK zhipuai

bash
pip install langchain-community zhipuai -i https://pypi.tuna.tsinghua.edu.cn/simple

也有官方包 langchain-zhipu(更新更及时),二选一:

bash
pip install langchain-zhipu -i https://pypi.tuna.tsinghua.edu.cn/simple

本文用 langchain-communityChatZhipuAI,社区版用户多、文档全。

2.2 获取 API Key

  1. 登录智谱开放平台:https://open.bigmodel.cn
  2. 注册后在"API Keys"页面创建 key。
  3. 复制保存(形如 xxx.yyy)。

2.3 配置环境变量

bash
# Windows
setx ZHIPUAI_API_KEY "你的key"

# macOS / Linux
export ZHIPUAI_API_KEY="你的key"

ChatZhipuAI 会自动读 ZHIPUAI_API_KEY。设完重开终端

三、ChatZhipuAI 基础用法

3.1 最简调用

python
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.messages import HumanMessage

llm = ChatZhipuAI(model="glm-4-plus", temperature=0)
resp = llm.invoke([HumanMessage(content="你好,用一句话介绍自己")])
print(resp.content)

3.2 常用参数

python
llm = ChatZhipuAI(
    model="glm-4-plus",
    temperature=0,        # 0-1
    max_tokens=1024,
)

注意 ChatZhipuAI 也不用配 base_url,国内直连。

3.3 流式输出

python
for chunk in llm.stream([HumanMessage(content="写一首关于秋天的诗")]):
    print(chunk.content, end="", flush=True)

四、工具调用

GLM-4 系列支持 OpenAI 风格工具调用:

python
from langchain_core.tools import tool

@tool
def add(a: float, b: float) -> float:
    """两数相加。"""
    return a + b

@tool
def get_weather(city: str) -> str:
    """查城市天气。"""
    return {"北京": "晴 25°C", "上海": "多云 28°C"}.get(city, "未知")

llm = ChatZhipuAI(model="glm-4-plus", temperature=0)
llm_with_tools = llm.bind_tools([add, get_weather])

resp = llm_with_tools.invoke("上海天气?算 10+20")
print(resp.tool_calls)

实测:

  • glm-4-plus:工具调用稳定,和 qwen-plus 同档。
  • glm-4-flash:免费但能力弱,复杂工具经常不触发或参数错。智能体别用 flash。

五、GLM-4V 多模态简介

glm-4v 支持图像输入。LangChain 里通过 HumanMessage 带图片 URL 调用:

python
from langchain_core.messages import HumanMessage

llm = ChatZhipuAI(model="glm-4v")

msg = HumanMessage(content=[
    {"type": "text", "text": "描述这张图"},
    {"type": "image_url", "image_url": {"url": "https://example.com/cat.jpg"}},
])
print(llm.invoke([msg]).content)

多模态不是本章重点,知道有这能力即可。

六、在 LangGraph 中构建智能体

和通义千问套路完全一致,换个类名就行:

python
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage
from langgraph.prebuilt import create_react_agent

@tool
def add(a: float, b: float) -> float:
    """两数相加。"""
    return a + b

@tool
def multiply(a: float, b: float) -> float:
    """两数相乘。"""
    return a * b

@tool
def get_weather(city: str) -> str:
    """查城市天气,支持北京/上海/广州。"""
    data = {"北京": "晴 25°C", "上海": "多云 28°C", "广州": "雨 31°C"}
    return data.get(city, f"{city} 未知")

agent = create_react_agent(
    model=ChatZhipuAI(model="glm-4-plus", temperature=0),
    tools=[add, multiply, get_weather],
    prompt="你是中文助手,按需调工具,简体中文回答。",
)

result = agent.invoke({
    "messages": [HumanMessage(content="查北京天气,再算 12 乘以 8")]
})
print(result["messages"][-1].content)

七、完整可运行示例

python
import os
from dotenv import load_dotenv
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage
from langgraph.prebuilt import create_react_agent

load_dotenv()   # 从 .env 读 ZHIPUAI_API_KEY

# 1. 基础对话
llm = ChatZhipuAI(model="glm-4-plus", temperature=0)
print("=== 基础对话 ===")
print(llm.invoke([HumanMessage(content="用一句话介绍 LangGraph")]).content)

# 2. 流式
print("\n=== 流式 ===")
for chunk in llm.stream([HumanMessage(content="写一句关于AI的格言")]):
    print(chunk.content, end="", flush=True)
print()

# 3. 工具调用 ReAct
@tool
def add(a: float, b: float) -> float:
    """两数相加。"""
    return a + b

@tool
def get_weather(city: str) -> str:
    """查城市天气,支持北京/上海。"""
    return {"北京": "晴 25°C", "上海": "多云 28°C"}.get(city, "未知")

print("\n=== ReAct 智能体 ===")
agent = create_react_agent(
    llm, [add, get_weather],
    prompt="你是中文助手,按需调工具,简体中文回答。",
)
r = agent.invoke({"messages": [HumanMessage(content="上海天气?再算 50+60")]})
print(r["messages"][-1].content)

八、常见踩坑

1. flash 模型能力弱

glm-4-flash 免费很诱人,但工具调用经常"不触发"或参数乱填。做智能体别用 flash,老老实实 glm-4-plus。flash 只适合纯对话练手。

2. 工具调用兼容性

智谱的 tool_calls 格式偶有边缘 case 和 OpenAI 不完全一致,极少数情况下 LangChain 解析会出小问题。升级 zhipuailangchain-community 到最新版可避坑:

bash
pip install -U zhipuai langchain-community -i https://pypi.tuna.tsinghua.edu.cn/simple

3. API Key 格式特殊

智谱 key 是 id.secret 形式(中间一个点),别只复制一半。ChatZhipuAI 内部会自动拆分,直接整个传或塞环境变量即可。

4. 限流与计费

  • glm-4-flash 免费但 QPS 低,并发高会 429。
  • glm-4-plus 按量计费,新用户有赠金。
  • 后台能看用量看板,注意别跑超。

5. streaming 需显式开

某些版本 ChatZhipuAI 默认 streaming=False,调 stream() 不报错但不流式。显式设 streaming=True

python
llm = ChatZhipuAI(model="glm-4-plus", streaming=True)

九、小结

  • 智谱 GLM:glm-4-plus 强、glm-4-flash 免费练手。
  • ChatZhipuAI(model="glm-4-plus") 即可,自动读 ZHIPUAI_API_KEY,国内直连。
  • 工具调用 API 和通义/OpenAI 一致,靠 bind_tools
  • 踩坑:flash 别做智能体、注意 key 格式、streaming 要显式开。

下一章讲完全免费、隐私最好的方案:本地模型 Ollama