AI Interaction Pattern
AI 记得之前聊了什么,持续追问不丢失线索
解决的问题:很多 AI 对话是"金鱼记忆"——每句话都像第一句话。用户说"之前说的那个按钮",AI 问"什么按钮?"。这种体验让人不想再用第二次。
设计决策:后端维护 Session(会话),存储完整对话历史 + 评审摘要。每次新消息时把裁剪后的上下文(评审摘要 + 最近 12 轮对话)一起发给 AI。引用识别而非回忆(尼尔森第六原则)——AI 应该"记得"上下文,而不是让用户每次重复。同时用上下文窗口管理在 token 限制内保留最重要的信息。
生活类比:好的设计师跟你聊了 20 分钟后,不会问"对了,您家是几口人来着?"——因为他一开始就记住了。AI 也一样,上下文管理让 AI 变成一个"认真听你说话的人",而不是"每次都要你重新自我介绍的陌生人"。
先"创建评审"建立上下文,然后在聊天中追问 —— 右侧面板实时展示 AI 的记忆。
试试问:"之前提到的第一个问题能具体讲讲吗?" 或 "把建议总结成三条"
每次评审创建独立的 session_id,存储综合评分、各维度得分、视觉分析摘要。session 有 1 小时 TTL,到期自动清理。
每次追问追加到 chat_history,保留最近 12 条消息(6 轮对话)。超过限制时用 compact context 压缩为摘要。
每次 send 时打包:评审摘要(评分 + 维度)+ 最近对话历史 → 构建完整 prompt → 发送给 DeepSeek。AI 始终"记得"该 session 的全部关键信息。
# In-memory session store (dict)
sessions: Dict[str, dict] = {}
@router.post("/api/chat")
async def chat(req: ChatRequest):
session = sessions.get(req.session_id)
if not session or time.time() - session["created_at"] > 3600:
raise HTTPException(404, "Session expired or not found")
# Build compact context for AI
context = {
"review_summary": session["review"],
"chat_history": session["chat_history"][-12:] # last 6 turns
}
reply = await deepseek_client.chat_reply(
prompt=DEEPSEEK_CHAT_PROMPT,
context=context,
message=req.message
)
session["chat_history"].append({"role":"user","content":req.message})
session["chat_history"].append({"role":"assistant","content":reply})
return {"reply": reply, "session_id": req.session_id}
# Prompts
DEEPSEEK_CHAT_PROMPT = """你是一个设计评审助手。
以下是用户的评审记录和聊天上下文。
请基于上下文回答用户的追问,保持回答与之前的评审一致。"""