十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

智谱清言GLM API入门:用Python实现“大道至简”的AI对话

智谱清言GLM API入门:用Python实现“大道至简”的AI对话 1. 从一句哈哈哈说起这个标题到底在问什么一次刷朋友圈的时候撞见一个很有意思的标题发帖人只写了一句看看智谱清言怎么看待宇宙之美大道至简原来如此。大俗大雅大赏大观哈哈哈。乍一看纯粹的调侃细想又特别有意思——他想让一个AI来回答宇宙之美大道至简这种极其宏大的哲学命题同时还预设了大俗大雅、大赏大观的评价框架最后以一阵笑声结尾。这个场景我可以拆出三层意思来第一层是普通用户对AI能聊多深的好奇。像智谱清言这类大语言模型天天被用来写周报、改代码、查菜谱突然有人把宇宙之美这种题目甩给它它到底会输出一篇华而不实的小作文还是真的能说出点有结构的话第二层是大道至简这个概念本身。用户问的根本不是宇宙物理知识而是在试探AI能不能用最朴素的语言把最复杂的东西讲明白——这其实就是大道至简的做事方式。第三层是大俗大雅的碰撞。一个国产AI助手面对一个带点戏谑、带点哲学、带点艺术鉴赏味道的问题是正襟危坐地讲道理还是能接住这种语气、给出既有深度又不端着的内容顺着这个思路我把这个标题当成一个真实存在的测试场景。而这个场景往下延伸必然会落到两件事上一是智谱清言背后的GLM系列大模型到底是怎么理解这类抽象问题的二是如果我也想写代码调用它的API自己实现一个让AI谈天说地的小工具该怎么动手。这篇文章就把这两条线一起展开——先聊聊智谱清言和GLM的关系再用一个零基础Python调用的完整实操把大道至简落到具体的代码和接口调用上。看完之后你既能明白这类AI产品背后是怎么组织的也能立刻上手写一个自己的调用脚本。2. 智谱清言和GLM到底是什么关系在写代码之前必须先把智谱清言和GLM这两个名字的关系理清楚。很多刚接触的人会把它们混为一谈实际上了解这个区别会直接影响你后面查文档、调接口、看开源代码的效率。2.1 一个面向用户一个面向模型智谱清言是北京智谱华章科技有限公司推出的AI助手产品。你可以把它理解成包装好的完整应用——有网页端、有手机App、有对话界面、有各种预设的智能体普通用户注册之后直接就能聊。它解决的是我想用一个AI聊天工具的问题不需要任何编程知识打开就能用。GLM则是智谱AI自研的大语言模型系列全称General Language Model。它解决的是我需要一个能处理通用自然语言任务的模型能力的问题。目前常见的版本包括GLM-4、GLM-4-Plus、GLM-4-Flash等能力侧重和应用场景略有差异。类比一下GLM是发动机智谱清言是装了这台发动机的整车。你可以直接开车用智谱清言也可以把发动机拆下来装到你自己的车架上通过API调用GLM。2.2 为什么要区分这两个东西这个区分在实际操作中特别重要因为在网上搜索解决方案时你会同时看到两类内容一类是智谱清言怎么用智谱清言有哪些功能这类内容面向普通用户教的是对话、提问技巧、智能体使用。另一类是GLM-4 API怎么调Python如何接入智谱AI这类内容面向开发者教的是代码、SDK、鉴权、参数配置。如果你的目标是写代码调用搜索关键词就应该锁定智谱AI开放平台GLM API而不是智谱清言。刚开始我在这上面绕了不少弯路——搜了半天智谱清言的使用教程打开全是操作界面截图和我想做的事情完全不是一回事。2.3 GLM系列模型怎么选截至2025年初智谱AI开放平台提供的模型版本大致可以分成几档模型名定位适合场景价格特点GLM-4-Plus旗舰级复杂推理、长文本、高质量内容生成价格较高GLM-4通用级日常对话、文本处理、结构化输出中等GLM-4-Flash轻量级高并发、简单任务、入门学习非常便宜甚至有免费额度对于新手学习Python调用我最推荐先从GLM-4-Flash入手。原因很简单它的调用方式和旗舰模型完全一样但价格门槛低很多。就算写错了代码来回调几次也不会造成费用焦虑。等整个流程跑通了再把模型名改成GLM-4或GLM-4-Plus代码主体一行都不用动。3. 调用前的准备账号、密钥和环境一个都不能少在实际敲代码之前需要完成四件事。这个环节看着琐碎但是任何一个遗漏都会导致后面报错而且报错信息往往不够直观容易让新手一头雾水。我把每一步的关键点都标注出来。3.1 注册开放平台账号并完成实名认证打开智谱AI开放平台官网bigmodel.cn用手机号注册账号。注册之后需要完成实名认证这一步绕不开因为平台规定只有实名认证后的账号才能获取API密钥。认证过程很简单个人用户提供姓名和身份证号即可一般几分钟内就能通过。如果不认证后面创建API Key时会被卡住。3.2 创建API Key登录开放平台后在控制台找到API密钥或API Keys相关菜单点击创建新的密钥。创建成功后系统会生成一串以你的身份标识开头的字符串。这里有一个特别重要的提醒注意API Key只有在创建成功时才会完整展示一次。一定要在当时就复制保存到一个安全的地方。如果关掉页面再想查看只能删除旧的重新创建。这个坑我踩过。第一次创建时没保存第二天找遍了控制台所有页面都看不到完整密钥最后只能删掉重建。浪费了两分钟但是给新手提个醒。3.3 安装Python环境和SDK调用API有两种方式直接用HTTP请求或者用官方提供的Python SDK。对于新手我强烈建议用SDK因为它封装了鉴权、请求格式、错误处理等细节代码量少很多。需要安装的包只有一个在终端执行pip install zhipuai如果你使用的是国内Python源可能还需要指定镜像安装一般pip默认源也够用。确认安装成功pip show zhipuai能看到版本信息就说明安装好了。3.4 准备一个简单的代码目录结构建议单独建一个文件夹放本次练习代码比如glm-demo/ └── demo.py正式一点的项目还会用dotenv管理密钥而不是把API Key硬编码在代码里。新手期可以先把密钥写在代码里跑通但是一旦有把代码推到GitHub这类公开平台的想法就必须改用环境变量或配置文件的方式。这里提前打个预防针避免你后面养成了把密钥留在代码里的坏习惯。4. 核心代码一次完整的GLM API调用拆开讲现在进入实战环节。我会从最简单的调用开始逐步加上参数、流式输出、上下文管理这些功能。每一段代码都会说明为什么这么写而不只是贴一段让你跑。4.1 第一个调用版本兼容写法先看一段能完整调用GLM-4-Flash的Python代码from zhipuai import ZhipuAI # 初始化客户端传入API Key client ZhipuAI(api_key你的API Key) # 发起对话补全请求 response client.chat.completions.create( modelglm-4-flash, messages[ { role: user, content: 请用一句话解释什么是大道至简 } ] ) # 打印模型回复 print(response.choices[0].message.content)运行之后你会在终端看到模型输出的一句话解释。我实际测过它给出的回答大概是类似把复杂的事物归结为最简单本质的道理。到这里你已经完成了第一次成功的API调用。这段代码最关键的结构是messages参数。它必须是一个列表列表里每个元素是一个字典包含role和content两个字段。role有三种取值system系统角色用来设定AI的人设、行为规范、回答风格user用户角色表示你提出的问题或指令assistant助手角色表示AI之前给出的回答在简单的单轮对话中messages只需要一个user消息就够了。但在多轮对话场景下列表里需要交替存放user和assistant消息。4.2 加入system参数让AI按你的风格说话还记得标题里那句大俗大雅大赏大观吗如果直接问宇宙之美模型大概率会输出一篇四平八稳的科普文。但如果你在system里给它设定一种特殊的回答风格效果会完全不同。代码如下from zhipuai import ZhipuAI client ZhipuAI(api_key你的API Key) response client.chat.completions.create( modelglm-4-flash, messages[ { role: system, content: 你是一位兼具哲学深度和市井幽默的杂文家。回答问题时先用大白话说出核心观点再引用一个生活中的例子最后点一句让人回味的话。语言要活泼避免学术腔。 }, { role: user, content: 你怎么看待宇宙之美 } ] ) print(response.choices[0].message.content)这个system角色的威力非常大。同一个问题不设定system和设定了system输出风格可能天差地别。这其实就是让AI按你的套路说话的最直接手段比在问题里用自然语言描述要求更稳定、更可复用。4.3 控制随机性的temperature参数大语言模型的输出具有随机性同一个问题问两次答案不完全一样。这个随机性由一个关键参数控制——temperature取值范围通常从0到1之间部分模型允许到2。temperature0基本确定性的输出每次结果几乎一样适合需要稳定答案的场景如下围棋走法、代码生成temperature0.7~0.9有一定创造性适合文案写作、头脑风暴temperature1.0以上非常随机偶尔会蹦出意料之外的表达我在调试时一般这么设response client.chat.completions.create( modelglm-4-flash, temperature0.8, messages[ {role: user, content: 用三句话描述秋天的北京} ] )为什么强调这个参数因为它直接影响AI说话像不像人。你把temperature调得太低回答会显得死板调得太高回答会跑偏甚至产生事实错误。做一个聊天类应用我建议从0.7起步根据实际体验微调。4.4 流式输出让回复像打字一样逐字出现第一次调用时请求发出后要等模型把整段话生成完接口才会一次性返回完整结果。如果是几十个字的回答还能接受但生成一篇长文时等待时间可能长达十几秒用户体验很差。解决方式是用流式输出stream。开启之后模型每生成一小段内容就立刻返回给你前端可以像打字机一样一个字一个字地显示。代码如下from zhipuai import ZhipuAI client ZhipuAI(api_key你的API Key) response client.chat.completions.create( modelglm-4-flash, streamTrue, messages[ {role: user, content: 写一段150字左右的文字描述宇宙的浩瀚} ] ) for chunk in response: delta chunk.choices[0].delta if delta and delta.content: print(delta.content, end)注意两点开启stream后返回的对象不是一个完整的response而是一个可迭代的对象需要用for循环逐个取数据块每个数据块的返回结构稍有变化内容存在chunk.choices[0].delta.content中而不是choices[0].message.content在实战项目中比如做一个聊天机器人我几乎一定会用流式输出。它不仅能减少等待感还能避免大请求超时。4.5 多轮对话的messages结构如果你做一个客服机器人或者对话助手单轮问答是不够的。用户问了帮我写一句广告语然后又补一句再加个押韵的这第二个问题必须结合第一轮的上下文才能正确回答。这时messages要这样组装from zhipuai import ZhipuAI client ZhipuAI(api_key你的API Key) messages [ {role: system, content: 你是一个创意文案助手。}, {role: user, content: 帮我写一句咖啡店的广告语。}, {role: assistant, content: 一杯入喉时间慢走。}, {role: user, content: 这句不错可以再加一个押韵的版本吗} ] response client.chat.completions.create( modelglm-4-flash, messagesmessages ) print(response.choices[0].message.content)这里的核心逻辑是把整个对话历史都放进messages列表里。用户每发一条新消息你的程序就需要把之前的对话历史整理好连同新消息一起发给模型。实际开发中有两个关键点上下文长度有限对话历史太长要截断或摘要。GLM模型的上下文窗口虽然很大但不是无限的。如果用户连续聊了几百轮需要在程序里做历史消息的裁剪。system消息可以放在最前面但只需要放一次。多轮对话中不需要每轮都重复放。5. 从大俗大雅到代码实现用API做一个谈天说地的小工具前面把API的单次调用、流式输出、多轮对话都过了一遍。现在把这些能力组装起来做一个真正能用的命令行对话工具。这个工具的目标就是用代码实现标题里那个场景——让AI谈宇宙之美大道至简这类话题而且用你指定的风格来谈。5.1 设计思路命令行对话工具的交互流程很简单用户在终端输入问题程序把这个问题和前面的对话历史一起发给GLM拿到回复后打印出来然后循环等待下一个问题。但为了让它更符合大俗大雅的风格设定我给它设计了三个特性一个可配置的人设文件。不把system prompt写死在代码里而是放在外部配置中想换风格就改配置。自动记录对话历史。同一个会话内连续对话程序自动组装messages列表。支持流式输出。回复逐字出现体验更好。5.2 完整代码import os from zhipuai import ZhipuAI # 从环境变量读取API Key API_KEY os.environ.get(ZHIPU_API_KEY, 你的API Key兜底) MODEL_NAME glm-4-flash SYSTEM_PROMPT ( 你是一个既懂哲学又能说人话的聊天伙伴。 遇到大问题比如宇宙、人生、艺术先拆成通俗的大白话讲清楚 再给出一个生动的类比最后点一个让人回味的延伸。 不要用首先、其次、最后这类学术结构 不要写超过300字的回答。 ) client ZhipuAI(api_keyAPI_KEY) # 初始化对话历史 messages [{role: system, content: SYSTEM_PROMPT}] def chat_once(user_input: str) - None: 发送一条用户消息并接收回复流式输出 messages.append({role: user, content: user_input}) print(\n智谱清言, end, flushTrue) response client.chat.completions.create( modelMODEL_NAME, streamTrue, messagesmessages, temperature0.8, ) full_answer for chunk in response: delta chunk.choices[0].delta if delta and delta.content: content delta.content print(content, end, flushTrue) full_answer content print(\n) # 把助手的完整回答加入历史 messages.append({role: assistant, content: full_answer}) def main(): print(进入对话模式。输入exit退出。) while True: user_input input(\n你).strip() if user_input.lower() in (exit, quit): break if not user_input: continue chat_once(user_input) if __name__ __main__: main()这里面逻辑比较关键的是full_answer变量。流式输出时模型分块返回内容print是逐个打印了但如果你想把这些内容记录到对话历史里必须在循环里把它们拼接到一个字符串中。拼完之后再以assistant身份放入messages列表这样下一轮对话模型才能记得上一轮它说过什么。5.3 保存环境变量别把密钥写死在代码里前面代码里我写了os.environ.get(ZHIPU_API_KEY, 兜底Key)这是一种兼顾易用性和安全性的写法。如果系统环境变量里设置了ZHIPU_API_KEY它会优先使用环境变量里的值如果没设置才会使用代码里的兜底。在Linux或macOS上设置环境变量export ZHIPU_API_KEY你的API Key在Windows的PowerShell上$env:ZHIPU_API_KEY你的API Key更推荐的做法是使用.env文件配合python-dotenv库来管理这样密钥既不会进入代码也不会出现在终端历史记录里。5.4 实测效果问宇宙之美会得到什么我拿这个工具实际跑了一遍输入你怎么看待宇宙之美设定的是上面那套既懂哲学又能说人话的system prompt。模型的回复大意是宇宙之美就在于它不需要任何解说员。你仰望星空的时候其实是在看130多亿年前的往事那些光赶了那么远的路就是为了让你今天看它一眼。就像一位老朋友走了很远的路来和你见面见面了却什么话都没说你就懂了。这种美大俗大雅都有——俗到抬头就能看见雅到穷尽所有科学和想象都无法触及。这段话明显比不设system prompt时生动得多。核心内容包括了一个科学事实光传播了130亿年、一个生活类比老朋友走很远的路、一个辩证总结大俗大雅。这正好对应了帖子标题里大俗大雅大赏大观的期待——宏观主题并不等于空洞表达好的回答应该既有信息量又有画面感。6. 零基础入门最常见的坑以及怎么绕开把环境搭好、代码跑通之后你大概率会遇到下面几个问题。这些是我实际调试过程中踩过并解决掉的整理出来免得你重复走弯路。6.1 API Key鉴权报错错误信息类似ApiKeyError: API key is empty or invalid排查步骤检查代码里api_key字段是否拼写正确有没有多余的引号检查API Key是否完整复制确认没有漏掉字符确认该API Key当前处于有效状态没有在控制台被删除或停用检查代码是否加载了错误的环境变量比如环境变量里有一个旧的Key覆盖了新的有一个细节很容易忽略如果你在多个地方设置过环境变量比如系统级和用户级各设置了一次系统会优先读取用户级或者当前shell级的环境变量。最好在代码里临时打印一下API_KEY[:6]看前缀对不对。6.2 网络超时和连接错误错误信息可能表现为requests.exceptions.ConnectionError或TimeoutError。这种问题通常不是代码逻辑的问题而是网络环境导致的。解决办法包括检查网络代理设置特别是本地开启了某些代理工具时可能会导致请求被拦截重试几次可能是瞬时网络波动在ZhipuAI客户端初始化时加上超时时间配置client ZhipuAI(api_key你的API Key, timeout60)6.3 返回内容被截断有时候发现回复到一半就停了看起来像没说完。这种情况常见原因有几个会话上下文过长达到了模型的最大上下文限制生成了stop结束标记触发了提前终止设置的max_tokens参数太小限制了输出长度查看请求参数如果你设置了max_tokens100那么回复超过100个token就会被截断。解决办法是调大max_tokens或者在生成时检查response.choices[0].finish_reason的值是stop正常结束还是length达到长度限制。6.4 多轮对话越聊越傻如果你做一个连续对话工具聊了二十轮之后会发现模型好像忘了最开始的内容。这通常是因为messages列表太长前面的一部分内容被超出的上下文窗口挤掉了。解决办法有两个方向在程序里做历史裁剪只保留最近N轮对话用摘要的方式压缩早期的对话内容把前面聊过的核心话题用几句话概括后放入messages第一个位置实际项目中两种方法结合使用比较稳妥。裁剪策略可以设定为最多保留最近10轮对话超出部分用一句话总结后保留在system消息里。7. 从够用到好用进阶优化方向跑通最基本的调用程序后你的需求自然会从能通变成好用。下面这几个方向是我自己在项目中验证过、效果明显的优化路径。7.1 接入Web服务框架做成一个真正的API接口命令行工具适合自娱自乐但如果你想把它嵌进网页、小程序或者钉钉机器人就需要把调用逻辑封装成一个HTTP接口。推荐使用FastAPI轻量且自带异步支持。from fastapi import FastAPI from pydantic import BaseModel from zhipuai import ZhipuAI app FastAPI() client ZhipuAI(api_key你的API Key) class ChatRequest(BaseModel): message: str history: list [] app.post(/chat) def chat(req: ChatRequest): messages [{role: system, content: 你是一个乐于助人的助手。}] for item in req.history: messages.append(item) messages.append({role: user, content: req.message}) response client.chat.completions.create( modelglm-4-flash, messagesmessages ) return {reply: response.choices[0].message.content}把程序启动起来之后用浏览器或Postman访问http://127.0.0.1:8000/docs就能得到一个自动生成的交互式文档直接在里面测试接口效果。7.2 把system prompt外部化随时切换人设如果你准备做一个多功能的助手比如既能写文案又能答疑又能闲聊不同功能需要的system prompt完全不同。这时就不要把prompt写死在代码里而是做一个配置文件{ chat_bot: { system_prompt: 你是一个活泼友善的聊天伙伴回答言简意赅。, temperature: 0.8, model: glm-4-flash }, copywriter: { system_prompt: 你是一个资深文案策划擅长创作有感染力的广告语。, temperature: 0.9, model: glm-4 }, code_assistant: { system_prompt: 你是一位资深程序员回答要给出可运行的代码和精简的解释。, temperature: 0.2, model: glm-4-flash } }程序启动时读取JSON文件按用户选择的模式加载对应的模型和prompt。这样换风格完全不需要改代码运维起来非常舒服。7.3 对话历史持久化命令行工具关闭后聊天记录就丢了。生产级别的应用需要把用户会话历史保存到数据库或者Redis中。一个简单的做法是给每个会话分配一个session_id用JSON格式存储import redis import json r redis.Redis(hostlocalhost, port6379, db0) def get_history(session_id: str) - list: data r.get(fsession:{session_id}) return json.loads(data) if data else [] def save_history(session_id: str, messages: list) - None: r.set(fsession:{session_id}, json.dumps(messages, ensure_asciiFalse), ex3600)这样即使用户关闭页面再回来上下文依然能续上。设置ex3600表示会话缓存1小时过期避免无限堆积。7.4 引入检索增强回答更有据可依GLM的知识截止时间是一个固定时间点。如果你想让它回答你自家产品的售后问题或者让它基于一份特定的长文档做总结光靠模型本身的记忆是不够的。这时需要一个叫RAG检索增强生成的方案。基本思路是先把你的文档切成小块并向量化然后用户每次提问时程序先去你的文档库里检索最相关的几段内容把它们拼进prompt里再让模型基于这些内容回答。这个方案做起来有一定工作量但效果提升非常明显——回答不再是模型瞎说而是基于给定资料进行总结。8. 一个小实验用LangChain调用GLM体会大道至简最后聊一个偏进阶的话题。很多人在学习大模型开发时都会遇到LangChain这个框架它的核心理念就是把各种模型和工具标准化让你用模块化的方式组装复杂应用。8.1 安装和初始化pip install langchain langchain-community在LangChain中接入智谱GLM的代码如下from langchain_community.chat_models import ChatZhipuAI from langchain_core.messages import HumanMessage chat ChatZhipuAI( api_key你的API Key, modelglm-4-flash, temperature0.8 ) response chat.invoke( [HumanMessage(content用一句话说说你对大道至简的理解)] ) print(response.content)这个代码和之前直接调SDK的差别主要体现在框架化消息统一使用HumanMessage、AIMessage等类型模型可以随时替换后续还能挂各种工具比如搜索、计算器、数据库查询。8.2 为什么框架反而是另一种简单有人可能会说直接调SDK多简单为什么还要套一层框架我的体会是对于单次调用直接调SDK确实更简单但当你开始需要工具调用、多步骤Agent、记忆模块时框架能帮你省掉大量胶水代码。从这个角度回头看标题里的大道至简——它说的不是东西越少越好而是复杂度应该被合理地藏在简单的接口后面。LangChain做的事情就是把不同模型调用的复杂度统一隐藏起来让你只需要关心这个应用的业务逻辑是什么。9. 最后再说说大俗大雅这件事回到开头那个帖子。让AI谈宇宙之美大道至简本质上是在测试一件事AI能不能把最高级的道理讲得让人听进去。从我的实际操作体验来看答案是肯定的但前提是你得会用system prompt和temperature这些参数。同一个模型你让它写一篇哲学论文和让它说一段大白话效果差距极大。工具本身是一个中性能力怎么引导它、怎么控制它的风格才是使用者的水平所在。我建议读到这里的你也动手跑一遍上面的代码然后试试不同风格的system prompt。比如把你是一个哲学教授换成你是一个工地上的老师傅在教徒弟看看同一个宇宙之美会变成什么味道。这种对比实验远比读任何API文档都更能让你理解大模型对话的真正玩法。大道至简的简是建立在大量实践和调试之上的。用代码一步步把复杂的东西变简单这本身就是一件很大赏大观的事情。
返回列表