当前位置:首页>python>【Python】Day28:项目开发(中):功能完善 —— 异常处理与对话历史维护

【Python】Day28:项目开发(中):功能完善 —— 异常处理与对话历史维护

  • 2026-09-09 10:24:31
【Python】Day28:项目开发(中):功能完善 —— 异常处理与对话历史维护

🎯 学习目标

  1. 为项目添加 异常处理:API 超时、Key 错误、文件读取失败
  2. 实现多轮 对话历史维护:让 AI 能联系上下文
  3. 实现 上下文窗口管理:防止历史太长超过 Token 限制
  4. 让项目在出错时不崩溃,给用户友好提示

一、异常处理增强

  1. API 调用异常处理
    # api_utils.pyimport requestsdefcall_llm(messages, max_retries=2):"""带异常处理的API调用"""    api_key = os.getenv("OPENAI_API_KEY")# ... 构造请求 ...for attempt in range(max_retries + 1):try:            response = requests.post(url, headers=headers, json=data, timeout=60)            response.raise_for_status()return response.json()["choices"][0]["message"]["content"]except requests.exceptions.Timeout:return"⚠️ 请求超时,请稍后重试"except requests.exceptions.ConnectionError:return"⚠️ 网络连接失败"except requests.exceptions.HTTPError as e:if response.status_code == 401:return"⚠️ API Key 无效,请检查配置"elif response.status_code == 429:return"⚠️ 请求过于频繁,请稍后重试"else:returnf"⚠️ 服务器错误:{e}"except Exception as e:returnf"⚠️ 未知错误:{e}"

二、对话历史维护

  1. 在 session_state 中维护历史
    # app.py 中的逻辑if prompt := st.chat_input("请输入消息:"):# 1. 用户消息入历史    st.session_state.messages.append({"role": "user", "content": prompt})# 2. 构造请求(带上历史)    api_messages = build_messages(        system_prompt=st.session_state.system_prompt,        doc_content=st.session_state.doc_content,        user_question=prompt,        history=st.session_state.messages[:-1]   # 之前的对话    )# 3. 调用API    reply = call_llm(api_messages)# 4. AI回复入历史    st.session_state.messages.append({"role": "assistant", "content": reply})

三、上下文窗口管理

  1. 为什么需要管理?
    • 对话太长 → Token 超限 → API 报错
    • 解决:只保留最近 N 轮对话
  2. 实现截断
    deftrim_history(history, max_rounds=5):"""只保留最近N轮对话"""# 一轮 = 一条user + 一条assistant# 每条消息是一个字典if len(history) > max_rounds * 2:return history[-(max_rounds * 2):]return history

⚠️ 常见坑

  1. 历史消息中包含了 system 消息
    • 发送给 API 时,history 不应包含 system 消息(已经在构造时单独添加了)
  2. 截断历史时误删当前消息
    • 截断的是"之前的"对话,当前用户问题不能删

✍️ 实战练习

  1. 完善 api_utils.py
    • 添加异常处理和重试机制。
  2. 测试多轮对话
    • 上传文档后,连续问多个问题,验证 AI 能联系上下文。

✅ 自测清单

  • [ ] API 调用有完善的异常处理,能区分超时、Key错误、频率限制
  • [ ] 聊天历史维护在 st.session_state.messages 中
  • [ ] 发送给 API 的历史不包含当前用户问题(当前问题单独添加)
  • [ ] 实现了历史截断,防止 Token 超限

最新文章

随机文章