💬

AI Interaction Pattern

多轮上下文

AI 记得之前聊了什么,持续追问不丢失线索

设计思路

解决的问题:很多 AI 对话是"金鱼记忆"——每句话都像第一句话。用户说"之前说的那个按钮",AI 问"什么按钮?"。这种体验让人不想再用第二次。

设计决策:后端维护 Session(会话),存储完整对话历史 + 评审摘要。每次新消息时把裁剪后的上下文(评审摘要 + 最近 12 轮对话)一起发给 AI。引用识别而非回忆(尼尔森第六原则)——AI 应该"记得"上下文,而不是让用户每次重复。同时用上下文窗口管理在 token 限制内保留最重要的信息。

生活类比:好的设计师跟你聊了 20 分钟后,不会问"对了,您家是几口人来着?"——因为他一开始就记住了。AI 也一样,上下文管理让 AI 变成一个"认真听你说话的人",而不是"每次都要你重新自我介绍的陌生人"。

识别而非回忆 上下文窗口管理 会话持久化 一致性

交互 Demo

先"创建评审"建立上下文,然后在聊天中追问 —— 右侧面板实时展示 AI 的记忆。

点击下方按钮,创建评审上下文,然后开始追问

试试问:"之前提到的第一个问题能具体讲讲吗?" 或 "把建议总结成三条"

AI 的上下文记忆

等待评审完成后显示 AI 记住了什么...
策略:评审摘要 + 最近 12 轮对话
会话 1 小时自动过期

实现方式

1

评审时创建 Session

每次评审创建独立的 session_id,存储综合评分、各维度得分、视觉分析摘要。session 有 1 小时 TTL,到期自动清理。

2

chat_history 累积对话

每次追问追加到 chat_history,保留最近 12 条消息(6 轮对话)。超过限制时用 compact context 压缩为摘要。

3

构建 compact context 发送给 AI

每次 send 时打包:评审摘要(评分 + 维度)+ 最近对话历史 → 构建完整 prompt → 发送给 DeepSeek。AI 始终"记得"该 session 的全部关键信息。

源码参考

src/backend/routers/chat.py + services/prompts.py
# 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 = """你是一个设计评审助手。
以下是用户的评审记录和聊天上下文。
请基于上下文回答用户的追问,保持回答与之前的评审一致。"""
上一个模式失败兜底
下一个模式确认机制