必须主动构造并维护对话历史,不能依赖模型自动记忆;推荐用ChatSession快速搭建带记忆的Bot原型,需复用同一chat实例、正确配置API密钥与模型版本,并通过序列化history实现跨单元格持久化。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Jupyter Notebook中让Gemini模型记住上一轮的提问和回答,从而支持连续追问、状态延续、任务分步推进,必须主动构造并维护对话历史,不能依赖模型自动记忆。
用ChatSession快速搭建带记忆的Bot原型
这是最轻量、最推荐的入门方式,适合单Notebook内快速验证多轮逻辑。
第一步:安装并导入SDK,执行 pip install google-generativeai(若未安装)→ 启动Notebook后运行 import google.generativeai as genai。
第二步:配置API密钥,调用 genai.configure(api_key="your_api_key_here");【密钥必须正确且未过期,否则后续所有请求均返回401】。
第三步:初始化支持聊天的模型实例,必须指定带“-latest”后缀的版本,例如 model = genai.GenerativeModel("gemini-1.5-flash-latest");旧版如 "gemini-pro" 不支持 ChatSession 接口,会直接报错 AttributeError。
第四步:调用 chat = model.start_chat() 创建会话实例 → 此时 chat.history 为空列表,但已准备好接收消息。
第五步:对同一 chat 实例反复调用 chat.send_message("用户新问题");每次调用后,chat.history 自动追加 user/model 两条记录。这一步操作起来很简单,直接把字符串传进去就行。
⚠️ 注意:如果在循环或多次单元格运行中每次都写 chat = model.start_chat(),那就等于每轮都新建会话,历史永远只有当前这一条——【必须复用同一个 chat 实例】。
手动拼接message列表精确控制上下文结构
当你需要调试原始请求、对接已有消息格式,或绕过SDK默认行为时,此方法更灵活可靠。
方法一:显式标注角色 + 时间序拼接
使用AIsa生成图像与视频。仅需一个API密钥即可调用Gemini 3 Pro Image(图像)和Qwen Wan 2.6(视频)。
构造一个字典列表,每条消息含 role 和 parts 字段;role 必须严格为 "user" 或 "model";首条必须是 user;相邻消息 role 不能重复。
方法二:插入分隔符增强结构识别
在每轮消息之间加入统一符号(如 ---),并在系统提示词里声明:“请根据以下用‘---’分隔的对话历史作答”。实测发现 Gemini 对这种视觉锚点敏感度高于纯换行,尤其在长历史中能减少角色混淆。
方法三:动态截断+关键信息重申
当 messages 列表 token 超过 4096,从开头逐轮移除最旧消息,但遇到含变量指代(如“那个参数”“刚才的文件名”)的轮次,必须把对应实体值提取出来,以“当前上下文:文件名为 report_v2.xlsx”形式补在末尾。否则模型会因丢失指代对象而胡猜。
跨单元格/跨运行持久化会话状态
Notebook重启、Kernel重置或切换Cell执行时,ChatSession对象会丢失。要保持会话连续性,必须外挂存储。
① 每次 send_message 后,立即调用 chat.history 获取当前 message 列表;
② 用 json.dumps(chat.history, ensure_ascii=False) 序列化该列表,生成纯文本快照;
③ 将快照存入本地变量、JSON文件或内存字典(如 session_store = {}),以唯一 session_id(例如 "notebook_user_001")为 key;
④ 下次需要恢复会话时,反序列化该快照,传给 model.start_chat(history=loaded_history) —— 这一步必须显式传入 history 参数,否则 SDK 不会恢复旧记录。

















