P0 实施路线:PC 端 Copilot、分层记忆与任务模式
给出 WeKnora 靠拢 IMA PC 端核心体验的第一阶段详细实施步骤,覆盖全局浮窗、页面上下文、四层记忆、Plan-and-Execute 任务模式和关键测试方案。
P0 实施路线:PC 端 Copilot、分层记忆与任务模式
WeKnora 靠拢 IMA 的第一阶段应该只抓三件事:PC 端全局 Copilot、IMA 式可见记忆、Plan-and-Execute 任务模式。这三件事组合起来,才会让用户从“我在聊天页问知识库”转向“我在当前工作台旁边有一个长期协作助手”。如果先做 PPT、播客、知识广场或移动端外观,产品会显得热闹,但核心体验不会发生质变。
本路线以本地源码 /Users/colin/code/WeKnora 为基础。所有步骤都假设继续使用现有 Go 后端、Vue 3 前端、TDesign、Pinia、AgentQA、MCP、Skills、MemoryService、知识库检索、对象存储和 RBAC 体系,不引入新的大框架。每个阶段都写明当前基础、目标体验、后端改动、前端改动、数据结构、失败模式和测试方式。
一、P0-1:PC 端全局 Copilot 浮窗
当前基础
WeKnora 前端入口在 frontend/src/App.vue,平台路由在 frontend/src/router/index.ts。当前主要页面包括知识库列表、知识库详情、Agent 列表、设置、创建聊天、聊天详情和组织列表。聊天能力主要集中在 frontend/src/views/chat/index.vue 和 frontend/src/views/creatChat/creatChat.vue,输入栏资源依赖由 frontend/src/stores/chatResources.ts 统一缓存。后端 AgentQA 入口在 internal/application/service/session_agent_qa.go,它已经能接收 query、知识库范围、具体文件、MCP、Skill、图片、附件和引用上下文。
这些基础说明 WeKnora 不需要重写聊天系统。它需要新增一个全局浮窗壳层,把当前路由上下文转化为 AgentQA 能理解的请求上下文。
目标体验
用户在 PC 端打开任意工作页面时,都能在右下角或右侧边缘唤起 Copilot。用户在知识库详情页问“这批文档里最重要的风险是什么”,Copilot 自动把当前知识库 ID、已选标签、当前筛选条件和可见文档摘要带入上下文。用户在文档预览页问“这份合同里付款条款有什么问题”,Copilot 自动把当前文件 ID、标题、解析状态、选中文本和用户可见内容片段带入上下文。用户在 Wiki 页面问“这个概念和上一个页面有什么关系”,Copilot 自动带入 Wiki 页面 slug、页面类型、链接关系和当前知识库。用户在设置页问“我这个 MCP 为什么不可用”,Copilot 带入当前 MCP 服务 ID、测试结果和错误摘要,但不泄露凭证明文。
前端改动
第一步,在 frontend/src/stores 新增 copilot.ts。这个 store 保存浮窗开合状态、当前会话 ID、当前任务 ID、当前页面上下文、固定上下文列表、浮窗位置、最小化状态和最近一次错误。上下文对象建议命名为 PageContextSnapshot,字段包括 route_name、route_path、resource_type、resource_id、resource_title、tenant_id、kb_id、knowledge_id、wiki_slug、selection_text、visible_summary、safe_metadata、captured_at。字段必须只包含用户当前有权限看到的内容。
第二步,在 frontend/src/components 新增 GlobalCopilot.vue。它通过 Vue <Teleport to="body"> 挂载,不依赖具体页面布局。浮窗需要有三种状态:折叠按钮、紧凑对话面板、展开工作面板。紧凑面板用于快速问答,展开面板用于任务模式、引用列表和产物预览。组件不应直接写业务页面逻辑,只读取 copilot store 中的上下文。
第三步,在 frontend/src/App.vue 引入 GlobalCopilot.vue,但只在登录后、非嵌入独立入口、非登录注册页展示。需要尊重 Lite 模式和当前租户状态。如果当前用户没有任何可用 Agent,浮窗应提示创建 Agent 或选择知识库,而不是直接报错。
第四步,为主要页面新增上下文提供器。可以先不引入复杂插件系统,而是在页面组件中调用 useCopilotContext().setContext(...)。知识库详情页提供 kb 上下文,文档预览组件提供 knowledge 上下文,Wiki 页面提供 wiki_page 上下文,MCP 设置抽屉提供 mcp_service 上下文,Agent 编辑器提供 agent_config 上下文。每个页面卸载时清理自己的上下文,避免切换路由后旧上下文污染。
第五步,支持文本选择上下文。在文档预览、Wiki 内容、Markdown 渲染区域监听 selectionchange,当选中文本长度在合理范围内时写入 selection_text。如果选中文本过长,前端只保留前后片段和字符数,完整内容由后端根据 resource ID 拉取,避免把大段正文塞进请求体。
后端改动
第一步,在 internal/types/qa_request.go 扩展 QARequest,新增 PageContext *PageContext。结构体字段与前端保持一致,但后端需要重新校验资源权限,不能信任前端传来的标题和摘要。建议 PageContext 只作为“用户当前意图线索”,真正正文应通过 kb_id、knowledge_id、wiki_slug 等 ID 在服务端读取。
第二步,在 internal/handler/session/types.go 的 CreateKnowledgeQARequest 增加 PageContext *PageContextRequest。Handler 层负责清洗字符串长度、去掉危险字段、记录 request id,并将其转成 service 层类型。
第三步,在 session_agent_qa.go 构造 agentQuery 时追加一个清晰的运行时上下文块。这个上下文块不应该写入用户消息历史,只在本次 LLM 调用生效,避免多轮历史里遗留旧页面状态。格式可以是:
[当前页面上下文]页面类型:knowledge_document资源标题:合同模板-供应商版资源 ID:...用户当前选中文本:...服务端确认摘要:...请把用户问题里的“这篇”“这里”“当前文档”优先理解为上述资源。第四步,新增 PageContextResolver 服务。它按 resource_type 分派:知识库上下文调用 KnowledgeBaseService,文件上下文调用 KnowledgeService 和 ChunkService,Wiki 上下文调用 WikiPageService,MCP 上下文调用 MCPService 的安全元数据接口,Agent 上下文调用 AgentService 的可读配置摘要。Resolver 必须返回“安全摘要”,不能返回凭证明文、API Key、Bearer Token、对象存储签名 URL 或跨租户资源。
数据结构
第一阶段可以不新建表。浮窗状态放前端本地和 Pinia;会话仍复用 sessions 和 messages;页面上下文不持久化到消息历史。只有当用户点击“固定此上下文”时,才在 sessions 的 LastRequestState 或新表 session_context_pins 中保存资源 ID、类型和标题。建议第二阶段再新建 session_context_pins,避免继续把太多 UI 状态塞进 sessions.agent_config。
失败模式
最常见失败是上下文过期。用户打开文档后文档被删除,后端 Resolver 应返回“当前文档不可访问或已删除”,并让 Copilot 回退到普通问答。第二类失败是权限变化,用户切换租户或角色后,前端旧上下文必须清空,后端也必须按当前 request context 再检查 tenant 和 RBAC。第三类失败是上下文过大,Resolver 必须有字符上限和摘要策略,不允许把整本文档直接塞进 prompt。第四类失败是嵌入 Widget 的访客上下文,必须默认关闭用户个人记忆,避免把站外访客对话写入登录用户记忆。
测试方式
前端单测覆盖 copilot store 的上下文设置、清理、固定和路由切换。组件测试覆盖浮窗折叠、展开、发送、停止、错误提示和上下文 chip 展示。后端单测覆盖 PageContextResolver 的权限校验和敏感字段脱敏。集成测试覆盖在知识库详情页发起 Copilot 问答时,请求体包含 page_context,后端实际根据资源 ID 解析摘要。端到端测试覆盖用户从知识库详情页打开浮窗、询问当前文档、收到引用答案、切换到设置页后上下文变化。
二、P0-2:IMA 式四层记忆产品化
当前基础
WeKnora 已有 MemoryService、Neo4j MemoryRepository、MemoryPlugin、Episode 类型和用户偏好开关。现有实现能在聊天管线里检索相关 Episode,并在回答完成后异步保存对话摘要和实体关系。这是很好的底层雏形,但它还不能让用户理解“系统记住了什么”,也不能稳定表达 Copilot 设定、用户档案、长期项目记忆和任务经验。
目标体验
用户在 PC 端设置 Copilot 时,可以填写助手称呼、角色、沟通风格、默认输出格式和禁忌。用户第一次告诉 Copilot“我是做企业知识库产品的,偏好详细实施步骤,不要短词短句”,系统会把这类信息写入用户档案,并在后续会话中自动生效。用户完成一次“调研 IMA 并写实施方案”的任务后,系统会总结任务经验,例如“该用户希望先分文件写入,长流程需要拆分提交”,下次类似任务会自动采用。用户可以打开记忆面板,查看、编辑、删除、禁用或重新生成某条记忆。
数据结构
新增四类记忆表,而不是把所有内容都塞进 Neo4j。
copilot_profiles 存 Soul 层,字段包括 id、tenant_id、user_id、agent_id、display_name、persona、tone、default_output_style、created_at、updated_at。它表示“这个 Copilot 应该如何工作”。
user_memory_profiles 存 User 层,字段包括 id、tenant_id、user_id、facts_json、preferences_json、communication_style、last_reviewed_at。它表示“这个用户是谁、偏好什么、常用什么格式”。
memory_items 存长期 Memory 层,字段包括 id、tenant_id、user_id、agent_id、source_session_id、source_task_id、type、content、summary、entities_json、confidence、status、visibility、created_at、updated_at。它表示“跨会话需要记住的事实、项目、决策、背景”。
agent_experience_items 存 Agent 层,字段包括 id、tenant_id、agent_id、user_id、task_type、trigger_pattern、lesson、recommended_plan_json、success_count、failure_count、last_used_at。它表示“完成任务后沉淀的方法和经验”。
Neo4j Episode 图谱继续保留,用于实体关系检索。关系型表负责用户可见、可编辑、可审计的记忆资产;图数据库负责关联召回和上下文扩展。两者不要互相替代。
后端改动
第一步,扩展 interfaces.MemoryService。保留 AddEpisode 和 RetrieveMemory,新增 ExtractMemoryCandidates、ApproveMemoryItem、UpdateMemoryItem、DeleteMemoryItem、ListMemoryItems、GetCopilotProfile、UpdateCopilotProfile、GetUserMemoryProfile、UpdateUserMemoryProfile 和 SummarizeAgentExperience。旧接口继续服务聊天管线,新接口服务可见记忆面板和任务模式。
第二步,把记忆写入从“回答完成后直接保存”改为“候选提取 + 自动规则 + 用户可见”。对于低风险偏好,例如“用户喜欢详细步骤”,可以自动写入并标记 auto_approved。对于敏感身份、商业项目、个人信息,应先进入 pending 状态,在记忆面板提示用户确认。对于嵌入 Widget、匿名访客、API Key 调用,默认不写入个人记忆。
第三步,在 AgentQA 构造 system prompt 时按顺序注入四层记忆。Soul 层靠前,告诉模型助手身份和表达方式;User 层描述用户偏好和背景;Memory 层只注入与当前 query、page_context、task_id 相关的少量记忆;Agent 层注入与当前任务类型匹配的经验。每层都要有字符预算,避免记忆挤占知识库引用。
第四步,增加记忆检索策略。现有关键词到 Episode 的方式可以保留,但长期记忆应支持按 type、entities_json、source_task_id、agent_id 和最近使用时间召回。后续可以将 memory_items 也向量化,但第一阶段先用结构化过滤加 LLM rerank,降低迁移成本。
前端改动
第一步,在设置页新增“Copilot 记忆”面板。该面板分为四个标签:助手设定、用户档案、长期记忆、任务经验。每个标签都用完整句子解释当前记忆如何影响回答,但不要写成营销文案。用户可以编辑 Soul 和 User 层,可以搜索和删除 Memory 层,可以禁用某条 Agent 经验。
第二步,在全局 Copilot 浮窗中增加“记忆使用提示”。当一次回答使用了长期记忆时,回答下方显示“本次使用了 3 条记忆”,点击后展示记忆摘要和来源。这样可以建立用户信任,避免用户觉得助手“莫名其妙知道太多”。
第三步,在任务完成页增加“从本次任务学习”的提示。系统展示候选经验,例如“此类调研任务应先写文件 1,再写文件 2,避免一次性大补丁”,用户可以确认写入 Agent 经验。
失败模式
最危险的失败是错误记忆持续影响后续回答。解决方式是每条记忆都必须有来源、状态、更新时间、禁用按钮和删除按钮。第二个失败是敏感信息泄露到共享 Agent 或嵌入 Widget。解决方式是记忆必须按 user、tenant、agent 和 channel 隔离,默认不向公共分享和嵌入访客注入个人记忆。第三个失败是记忆过量导致模型忽略知识库事实。解决方式是记忆注入设置严格 token 预算,并在 prompt 中明确知识库事实优先于不确定记忆。第四个失败是 LLM 提取用户偏好时过度推断。解决方式是候选记忆需要置信度,低置信度只进入 pending。
测试方式
单测覆盖候选记忆提取、敏感类型识别、记忆状态流转、用户可见列表过滤和跨租户隔离。集成测试覆盖用户开启记忆、完成一次对话、生成候选记忆、下次对话使用该记忆。安全测试覆盖嵌入 Widget 不写入登录用户记忆、共享 Agent 不读取私有记忆、删除记忆后不会再次注入。人工验收覆盖“用户修改称呼后 Copilot 立即使用新称呼”“删除错误偏好后后续回答不再引用”。
三、P0-3:Plan-and-Execute 任务模式
当前基础
WeKnora 有 ReAct Agent、MCP、Skills、Web Search、知识库检索、事件总线、异步任务队列、Wiki 入库任务、文档解析进度和对象存储。它已经能执行多步推理,但这些步骤附着在一次聊天回答上,而不是一个可管理任务。IMA 任务模式的关键是用户给出目标后,系统生成计划、执行步骤、产出文件,并允许用户回看和继续。
目标体验
用户在 PC 端 Copilot 中输入“深度调研 IMA PC 端功能,并给出 WeKnora 实施方案”。系统先生成任务计划,包括资料来源、检索步骤、源码分析步骤、文档输出结构和预计产物。用户可以接受计划、修改计划或要求先执行第一步。执行过程中,任务面板展示每个步骤的状态、开始时间、耗时、工具调用、引用来源和中间草稿。任务可以暂停、继续、取消和失败重试。最终产物不是一段聊天文本,而是一组 artifact,例如调研报告、架构分析、实施清单和来源索引。
数据结构
新增 agent_tasks 表,字段包括 id、tenant_id、user_id、agent_id、session_id、title、objective、status、mode、priority、current_step_id、plan_json、context_snapshot_json、created_at、updated_at、completed_at、failed_reason。status 包括 draft_plan、waiting_user_confirmation、running、paused、completed、failed、cancelled。
新增 agent_task_steps 表,字段包括 id、task_id、index、title、description、status、tool_policy_json、input_json、output_summary、references_json、started_at、finished_at、error_message。步骤状态包括 pending、running、waiting_user、completed、failed、skipped。
新增 agent_artifacts 表,字段包括 id、tenant_id、task_id、step_id、type、title、format、content_text、file_path、metadata_json、source_refs_json、status、created_at、updated_at。type 包括 markdown_report、source_pack、pptx、podcast_script、audio、mindmap、quiz、note。
后端改动
第一步,新增 TaskService。它负责创建任务、生成计划、更新计划、执行任务、暂停、继续、取消、列出任务和读取产物。TaskService 不直接替代 AgentService,而是调用 AgentService、KnowledgeBaseService、MCPService、SkillService 和 WebSearchProvider。
第二步,新增计划生成器。计划生成器接收 objective、page_context、selected_kbs、available_tools、available_skills 和 user_memory,输出严格 JSON。计划必须包含步骤标题、步骤目标、需要的工具、是否需要用户确认、预期产物和失败回退。计划生成阶段只生成计划,不执行工具。
第三步,新增任务执行器。执行器按 step 顺序运行,每一步根据 tool_policy_json 创建受限 AgentConfig,只暴露本步骤需要的工具和知识范围。这样可以避免模型在“写报告”步骤意外调用危险 MCP,或者在“调研来源”步骤直接跳到最终答案。
第四步,把事件总线扩展为任务事件。新增事件类型包括 task.plan.created、task.step.started、task.step.progress、task.step.completed、task.artifact.created、task.waiting_user、task.failed、task.completed。前端任务面板通过 SSE 或现有流式机制订阅这些事件。
第五步,加入人工确认节点。对高成本、长耗时、外部写入、MCP 风险工具、删除操作和发布操作,任务执行器必须暂停并进入 waiting_user。用户确认后继续,拒绝后跳过或改写计划。
前端改动
第一步,在 GlobalCopilot 展开面板中新增“任务”标签。用户可以从普通问答切换到任务模式,或者由系统识别复杂目标后建议创建任务。任务计划以可编辑列表展示,用户可以修改步骤标题、顺序、产物类型和是否需要确认。
第二步,新增任务详情页或抽屉。任务详情展示状态、步骤时间线、工具调用、引用来源、产物列表、错误和重试按钮。PC 端需要支持并排查看:左侧计划和步骤,右侧 artifact 预览。
第三步,新增 artifact 预览组件。Markdown 报告使用现有 Markdown renderer,PPT 先显示大纲和下载链接,播客先显示脚本和音频播放器,思维导图用 markmap 或 Mermaid 预览。每个 artifact 都有“保存到知识库”“下载”“复制链接”“继续修改”。
失败模式
任务模式最容易出现长时间无反馈。每个步骤必须有心跳和进度事件,如果超过阈值没有事件,前端提示“仍在执行”或“可能卡住”,并允许用户停止。第二个失败是工具调用成本不可控。任务计划必须展示预计工具和风险,执行器必须限制最大步骤数、最大工具调用次数和最大 token。第三个失败是中间结果丢失。每个步骤完成后必须立即写入数据库,不能只放内存。第四个失败是用户修改计划后执行器仍按旧计划运行。计划版本号必须随修改递增,执行器开始步骤前检查版本。
测试方式
单测覆盖计划 JSON schema、状态机合法流转、暂停继续、步骤失败重试和 artifact 创建。集成测试覆盖一个完整研究任务:创建计划、确认计划、执行检索步骤、生成 Markdown artifact、任务完成。权限测试覆盖任务读取只能由同租户同用户或有授权角色访问。E2E 测试覆盖 PC 端 Copilot 创建任务、用户确认计划、查看步骤进度、打开最终报告。压力测试覆盖长任务 SSE 连接断开后重连,任务状态仍可恢复。
四、P0 验收标准
第一阶段完成后,用户应该能在 PC 端任意主要页面唤起 Copilot,并让它正确理解当前知识库、文档、Wiki 或设置对象。用户应该能看到并管理 Copilot 记住的设定、用户偏好、长期记忆和任务经验。用户应该能创建一个研究型任务,确认计划,观察步骤执行,拿到至少一个 Markdown artifact,并在任务完成后继续追问或保存产物。
如果这三件事完成,即使 PPT、播客、知识广场和移动端增强还没做,WeKnora 的核心体验也会明显接近 IMA PC 端工作台。后续 P1 和 P2 才应该继续扩展内容生成套件、多端协同和知识能力市场。