当前位置:首页>python>Python调用智谱AI实现带记忆多轮对话

Python调用智谱AI实现带记忆多轮对话

  • 2026-09-10 23:59:00
Python调用智谱AI实现带记忆多轮对话

很多人调用大模型API只会单轮对话,聊完一句模型就失忆。 核心秘密就在于维护 messages 消息列表, system/user/assistant 三者配合完成上下文记忆。下面完整Demo基于智谱GLM‑4‑Flash,复制修改密钥即可运行。

依赖安装

  1. pip install requests

完整源码

  1. """
  2. messages 三大角色说明
  3. - system:系统设定,给 AI 规定身份、回答规则,全程生效
  4. - user:用户,人类发出的提问、需求
  5. - assistant:助手,AI 之前回复的内容,用于保存聊天上下文
  6. """
  7. import requests
  8. classZhipuAI:
  9. def __init__(self):
  10. # 替换为你自己的智谱API Key
  11.         self.api_key ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  12.         self.url ="https://open.bigmodel.cn/api/paas/v4/chat/completions"
  13.         self.headers ={
  14. "Authorization": f"Bearer {self.api_key}",
  15. "Content-Type":"application/json"
  16. }
  17. # 初始化对话列表,预先写入system角色,设定AI身份为小魏
  18.         self.messages =[
  19. {"role":"system","content":"你是AI小助手小魏,回答简洁友好,分点回答每条单独换行,排版清晰"}
  20. ]
  21. def chat(self, prompt, model="glm-4-flash"):
  22. # 打印用户输入
  23. print(f"吕浩:{prompt}")
  24. # 1.把用户提问追加到消息列表 user
  25.         self.messages.append({"role":"user","content": prompt})
  26. # 组装请求体,把完整历史消息全部传给大模型接口
  27.         payload ={
  28. "model": model,
  29. "messages": self.messages
  30. }
  31. # http请求调用智谱接口,超时30秒
  32.         resp = requests.post(self.url, headers=self.headers, json=payload, timeout=30)
  33.         res_data = resp.json()
  34. # 解析拿到AI返回的回答
  35.         ai_answer = res_data["choices"][0]["message"]["content"]
  36. print(f"小魏:{ai_answer}\n")
  37. # 2.将AI回答存入assistant,保存对话历史,实现记忆
  38.         self.messages.append({"role":"assistant","content": ai_answer})
  39. return ai_answer
  40. if __name__ =="__main__":
  41.     ai =ZhipuAI()
  42.     ai.chat("你叫什么名字?")
  43.     ai.chat("你能做什么?")
  44.     ai.chat("你喜欢做什么?")
  45.     ai.chat("我第一次问你的答案是啥?")
  46.     ai.chat("你那觉得,你爱我或者说,我爱你嘛?我们能一直在一起嘛?")
  47.     ai.chat("请简洁介绍大模型对话 messages 里 system、user、assistant 三个角色分别是什么作用")

代码逐块解读

1.类初始化 __init__

  1. def __init__(self):
  2.     self.api_key ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  3.     self.url ="https://open.bigmodel.cn/api/paas/v4/chat/completions"
  4.     self.headers ={
  5. "Authorization": f"Bearer {self.api_key}",
  6. "Content-Type":"application/json"
  7. }
  8.     self.messages =[
  9. {"role":"system","content":"你是AI小助手小魏,回答简洁友好,分点回答每条单独换行,排版清晰"}
  10. ]
  • api_key:平台申请的密钥,用来鉴权,千万不要把真实密钥直接公开发布。
  • url:智谱开放平台接口地址。
  • headers:请求头,携带身份凭证,告诉接口发送的是json数据。
  • messages:对话历史容器,是实现多轮记忆最核心变量。
  • 数组最开始放一条 system消息,从一开始就定义AI的人设、输出格式,全局生效。

2.chat方法:一次完整对话逻辑

  1. def chat(self, prompt, model="glm-4-flash"):
  2. print(f"吕浩:{prompt}")
  3.     self.messages.append({"role":"user","content": prompt})
  4.     payload ={
  5. "model": model,
  6. "messages": self.messages
  7. }
  8.     resp = requests.post(self.url, headers=self.headers, json=payload, timeout=30)
  9.     res_data = resp.json()
  10.     ai_answer = res_data["choices"][0]["message"]["content"]
  11. print(f"小魏:{ai_answer}\n")
  12.     self.messages.append({"role":"assistant","content": ai_answer})
  13. return ai_answer

执行流程:

  1. 将当前用户提问,以 user角色加入消息列表。
  2. 将完整的全部messages数组打包发送给大模型接口。

✨关键点:大模型本身没有内存,它不知道上一轮聊了什么,全部上下文都是我们程序把历史消息塞过去的。

  1. 发送http post请求,设置30秒超时防止卡死。
  2. 解析返回json,取出AI输出文本。
  3. 把AI返回的回答,以 assistant角色追加进messages。 如果漏掉这一步,下一轮对话AI就会失忆,记不住自己上一轮说过什么。
  4. 返回回答文本,控制台打印聊天效果。

3.主程序入口

  1. if __name__ =="__main__":
  2.     ai =ZhipuAI()
  3.     ai.chat("你叫什么名字?")
  4.     ai.chat("你能做什么?")
  5. ...

实例化对象,连续多次调用chat,模拟人持续聊天。 运行之后控制台可以看到一问一答,模型可以记住前面全部对话,比如可以反问“我第一次问你的答案是什么”,模型可以正确回忆。


messages三大角色通俗解释

  1. system 系统角色 相当于给AI下达初始指令,设定身份、性格、输出规范。写在消息列表最前面,每一轮请求都会读取这条消息。

例子:你是小魏,回答简洁友好。

  1. user 用户角色代表人类的输入,每一次我们说的话,都包装成 role:user放到数组。

  2. assistant 助手角色代表大模型输出的回复。必须把AI输出存进messages,下一次请求一起传给接口,模型才能看见自己之前的回答,实现“记忆”。

消息数组的顺序有意义,严格遵循:system → user → assistant → user → assistant……循环。


常见问题与坑

  1. 为什么AI失忆?大概率忘记 append(assistant),只追加user消息,模型看不到自己之前的回复。

  2. 密钥泄露风险代码里硬编码密钥,发布到公众号/GitHub会被别人盗用,产生扣费。正式建议使用环境变量读取key。

  3. 上下文越来越长多次对话后messages会越来越大,token消耗上涨,长对话需要做消息截断,丢弃最早的历史。

  4. 网络异常没有捕获异常示例代码没有try‑except,生产环境需要捕获超时、接口报错、返回异常json。

扩展:增加重置对话方法

  1. def reset_chat(self):
  2. """清空历史,重置会话,保留system人设"""
  3.     self.messages =[
  4. {"role":"system","content":"你是AI小助手小魏,回答简洁友好,分点回答每条单独换行,排版清晰"}
  5. ]

公众号小提示

  1. 把示例里的api_key全部替换为占位符 xxxxxxxx,提醒读者填入自己的密钥。
  2. 可以配一张简单示意图展示消息流转: system→user请求→模型输出assistant→存入列表,循环。
  3. 结尾引流话术:

看懂这个小Demo,就搞懂绝大多数大模型应用底层多轮对话原理。复制代码即可本地跑起来,动手试一试。 关注我,持续分享Python、大模型实战小案例。

最新文章

随机文章