必须主动构造并维护对话历史以支持连续追问,推荐用chatsession自动管理;需复用同一实例,跨请求时用redis持久化message列表并实时更新。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在调用Gemini API时让模型记住上一轮的提问和回答,从而支持连续追问、状态延续、任务分步推进,必须主动构造并维护对话历史,不能依赖模型自动记忆。
使用ChatSession对象自动管理会话
这是最轻量、最推荐的入门方式,适合单进程内快速搭建带记忆的Bot原型。
第一步:初始化支持聊天的模型实例,必须指定带“-latest”后缀的版本,例如 【gemini-1.5-flash-latest】;旧版如“gemini-pro”不支持ChatSession接口。
第二步:调用 model.start_chat() 创建一个 ChatSession 实例,它内部已初始化空的 messages 列表,后续所有 send_message() 都会自动追加历史。
第三步:对同一 ChatSession 实例反复调用 send_message("用户新问题"),SDK 会在每次请求中把完整 history 拼成 message 数组传给API。这一步操作起来很简单,直接把字符串传进去就行。
⚠️ 注意:如果在循环中每次都写 chat = model.start_chat(),那就等于每轮都新建会话,历史永远只有当前这一条——【必须复用同一个 chat 实例】。
手动拼接message列表控制上下文
当你需要精确控制角色标签、跳过默认格式、或对接已有消息结构时,绕过ChatSession更灵活。
方法一:显式标注角色 + 时间序拼接
构造一个字典列表,每条消息含 role 和 parts 字段;role 必须严格为 "user" 或 "model";首条必须是 user;相邻消息 role 不能重复。
方法二:插入分隔符增强结构识别
在每轮消息之间加入统一符号(如 --- ),并在系统提示词里声明:“请根据以下用‘---’分隔的对话历史作答”。实测发现 Gemini 对这种视觉锚点敏感度高于纯换行,尤其在长历史中能减少角色混淆。
方法三:动态截断+关键信息重申
当 messages 列表 token 超过 4096,从开头逐轮移除最旧消息,但遇到含变量指代(如“那个参数”“刚才的文件名”)的轮次,必须把对应实体值提取出来,以“当前上下文:文件名为 report_v2.xlsx”形式补在末尾。否则模型会因丢失指代对象而胡猜。
跨请求持久化会话状态
Web服务中,HTTP无状态特性导致每次请求都是全新进程,ChatSession 无法存活,必须外挂存储。
① 为每个用户生成唯一 session_id,例如 hashlib.md5(f"{user_id}_{timestamp}".encode()).hexdigest()[:12]。
② 每次收到用户消息前,用 session_id 从 Redis 读取已序列化的 message 列表(json.loads(redis.get(session_id)))。
③ 将新用户消息追加进列表,调用 model.generate_content(messages),拿到响应后,把响应也以 {"role": "model", "parts": [response_text]} 格式追加进列表。
④ 更新 Redis:redis.setex(session_id, 3600, json.dumps(messages)) —— 这里设 1 小时过期,避免无效会话长期占内存。
这一步的关键在于:不要等整个会话结束再存,而是每次交互后立刻更新。否则用户刷新页面或网络中断一次,最后那轮就丢了。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











