docs(personal-assistant): define confirmed memory and simpler UX

This commit is contained in:
2026-07-19 02:32:26 +08:00
parent 1028c55f42
commit a8460bbaed
5 changed files with 286 additions and 50 deletions
@@ -1,10 +1,11 @@
# 银城数字师傅产品方案(整合修订) # 银城数字师傅产品方案(整合修订)
> 版本:v1.3 | 日期:2026-07-11 > 版本:v1.4 | 日期:2026-07-19
> 输入源:①客户方《物业数字师傅系统三期建设方案》(2026-07-08 早,下称"第三版")②《企业内部AI培训学习APP产品需求与发布会内容讨论》会议纪要(2026-07-08)③客户方会后微信补充(学模块课程化+考试;巡检点位转入职学习任务)④2026-07-11 客户微信语音补充(员工个人 AI 助理/个人知识空间)。 > 输入源:①客户方《物业数字师傅系统三期建设方案》(2026-07-08 早,下称"第三版")②《企业内部AI培训学习APP产品需求与发布会内容讨论》会议纪要(2026-07-08)③客户方会后微信补充(学模块课程化+考试;巡检点位转入职学习任务)④2026-07-11 客户微信语音补充(员工个人 AI 助理/个人知识空间)。
> v1.1 重构:按"产品是什么 → 发布会做什么 → 决策记录 → 执行"四部分分层,产品定义与发布会演示不再混写。 > v1.1 重构:按"产品是什么 → 发布会做什么 → 决策记录 → 执行"四部分分层,产品定义与发布会演示不再混写。
> v1.2 更新(2026-07-08,客户回复三项待确认):①多端跳转议题**暂缓**,现阶段只保证能打开小程序页面;②工作积分排行榜**保留功能、可选择不用**(开关配置);③员工评价管理团队**按组织架构与权限控制**,需有权限才能评价。详见 §3.3。 > v1.2 更新(2026-07-08,客户回复三项待确认):①多端跳转议题**暂缓**,现阶段只保证能打开小程序页面;②工作积分排行榜**保留功能、可选择不用**(开关配置);③员工评价管理团队**按组织架构与权限控制**,需有权限才能评价。详见 §3.3。
> v1.3 更新(2026-07-11):阶段二新增员工个人 AI 助理,首批做个人资料/链接收藏、时间检索、带引用问答和工作整理;PPT 生成后置为 P1;北森等外部个人数据归阶段三。 > v1.3 更新(2026-07-11):阶段二新增员工个人 AI 助理,首批做个人资料/链接收藏、时间检索、带引用问答和工作整理;PPT 生成后置为 P1;北森等外部个人数据归阶段三。
> v1.4 更新(2026-07-19):个人助理增加确认式长期记忆,并把一级入口收敛为“工作助手 / 查全网”;内部个人资料、项目记录和企业知识默认自动路由,来源在答案中透明展示。
> 与《银城员工端APP分阶段实施总纲》《AI陪练二期开发推进计划》的关系:本方案是增量修订,不推翻既有阶段划分;§4.2 回写清单已于 2026-07-08 执行——总纲升 v0.3、二期计划升 v0.8。BRD v1.2 已于 2026-07-11 增补个人 AI 助理,BRD 4.4 师徒演练等旧口径仍待后续版本继续修订。 > 与《银城员工端APP分阶段实施总纲》《AI陪练二期开发推进计划》的关系:本方案是增量修订,不推翻既有阶段划分;§4.2 回写清单已于 2026-07-08 执行——总纲升 v0.3、二期计划升 v0.8。BRD v1.2 已于 2026-07-11 增补个人 AI 助理,BRD 4.4 师徒演练等旧口径仍待后续版本继续修订。
--- ---
@@ -133,7 +134,7 @@
**用户原始诉求:**员工除了使用公司通用资料,还会遇到个人认为有用的表格、PPT、文章、网页链接、工作灵感和临时冲突;希望随手发给个人助理保存,之后可按日期/主题追问、汇总分析并整理为文字或 PPT。 **用户原始诉求:**员工除了使用公司通用资料,还会遇到个人认为有用的表格、PPT、文章、网页链接、工作灵感和临时冲突;希望随手发给个人助理保存,之后可按日期/主题追问、汇总分析并整理为文字或 PPT。
产品归属:整体进入总纲阶段二“知识学习平台”,作为「问」的个人知识增强层;不回塞阶段一 AI 陪练。首批先解决“收得进、找得到、答有据”,再做复杂内容生成。 产品归属:整体进入总纲阶段二“知识学习平台”,作为「问」的个人知识与工作记忆增强层;不回塞阶段一 AI 陪练。首批先解决“收得进、确认记、找得到、答有据”,再做复杂内容生成。一级只让用户选择“工作助手 / 查全网”,内部数据域默认自动路由;“资料范围”仅作为次级高级筛选。
| 优先级 | 能力 | 验收口径 | | 优先级 | 能力 | 验收口径 |
|---|---|---| |---|---|---|
@@ -141,6 +142,7 @@
| P0 | 个人资料问答与总结 | 可选择个人资料/企业知识范围;答案展示引用来源,权限不足或无结果时明确提示 | | P0 | 个人资料问答与总结 | 可选择个人资料/企业知识范围;答案展示引用来源,权限不足或无结果时明确提示 |
| P0 | 时间与主题检索 | 支持“从哪天到哪天”“哪些资料与保洁管理相关”等查询 | | P0 | 时间与主题检索 | 支持“从哪天到哪天”“哪些资料与保洁管理相关”等查询 |
| P0 | 工作问题与灵感整理 | 将零散输入整理为结论、行动项、待确认事项,不替员工自动对外发送 | | P0 | 工作问题与灵感整理 | 将零散输入整理为结论、行动项、待确认事项,不替员工自动对外发送 |
| P0 | 确认式长期记忆 | 从文字/ASR 转写识别住户需求、待跟进事项和个人经验;必须经用户确认,个人经验写个人域,住户需求/跟进事项写项目业务域 |
| P1 | 多资料对比、周报/月报、汇报提纲 | 输出可编辑结构,保留每个结论的资料来源 | | P1 | 多资料对比、周报/月报、汇报提纲 | 输出可编辑结构,保留每个结论的资料来源 |
| P1 | PPT 生成与导出 | 先确认大纲和模板再生成;不作为阶段二首批上线阻塞项 | | P1 | PPT 生成与导出 | 先确认大纲和模板再生成;不作为阶段二首批上线阻塞项 |
@@ -148,6 +150,7 @@
- 个人资料默认私有,分享给团队或沉淀企业知识库需员工明确操作并进入审核链。 - 个人资料默认私有,分享给团队或沉淀企业知识库需员工明确操作并进入审核链。
- 企业密级权限继续生效;个人助理不得因“个人收藏”绕过账号等级 × 知识密级控制。 - 企业密级权限继续生效;个人助理不得因“个人收藏”绕过账号等级 × 知识密级控制。
- 工作助手自动路由只覆盖已授权内部域;内部无命中时提示用户是否“查全网”,不得自动转发原问题或住户/项目数据。
- 网页内容保存原链接、抓取时间与正文快照;外链抓取需增加安全、版权和内容失效检查。 - 网页内容保存原链接、抓取时间与正文快照;外链抓取需增加安全、版权和内容失效检查。
- 阶段三接入北森后,才允许在授权范围内分析考勤、请假、任职等 HR 数据;阶段二不复制或模拟这些外部数据。 - 阶段三接入北森后,才允许在授权范围内分析考勤、请假、任职等 HR 数据;阶段二不复制或模拟这些外部数据。
+232 -22
View File
@@ -1,12 +1,14 @@
# 员工个人 AI 助理 / 个人知识空间专项 TechSpec # 员工个人 AI 助理 / 个人知识空间专项 TechSpec
> 版本:v1.0 | 日期:2026-07-11 > 版本:v1.1 | 日期:2026-07-19
> >
> 归属:《银城员工端 APP 分阶段实施总纲》阶段二 > 归属:《银城员工端 APP 分阶段实施总纲》阶段二
> >
> 需求基线:《物业 AI 人力资源系统业务需求文档 BRD》4.8 > 需求基线:《物业 AI 人力资源系统业务需求文档 BRD》4.8
> >
> 实施边界:首批交付个人资料收藏、检索、带引用问答和工作整理;PPT 生成为 P1;北森、考勤等外部数据归阶段三。 > 实施边界:首批交付个人资料收藏、检索、带引用问答、工作整理,以及“识别候选记忆 → 用户确认 → 分域持久化 → 可追溯召回”闭环;PPT 生成为 P1;北森、考勤等外部数据归阶段三。
>
> v1.1 需求补充:客户明确提出,员工在对话中描述住户需求、待跟进事项或个人经验时,个人助理应识别值得长期保留的信息,返回可编辑确认卡;仅在用户确认后写入对应记忆域,后续问答可按权限召回。模型不得直接修改数据库,提醒必须单独确认。
## 1. 目标与非目标 ## 1. 目标与非目标
@@ -17,9 +19,13 @@
1. 收藏个人文字、文件、图片和网页链接。 1. 收藏个人文字、文件、图片和网页链接。
2. 自动解析正文、生成摘要与主题标签。 2. 自动解析正文、生成摘要与主题标签。
3. 按日期、主题、来源和关键词检索个人资料。 3. 按日期、主题、来源和关键词检索个人资料。
4. 在授权范围内选择“个人资料 / 企业知识 / 混合”进行问答。 4. 默认由“工作助手”在个人资料、项目业务记忆和企业知识之间自动路由并展示实际来源;资料范围只作为次级高级筛选。
5. 输出结论、行动项和待确认事项,并逐条展示引用来源。 5. 输出结论、行动项和待确认事项,并逐条展示引用来源。
6. 删除个人资料时同步清理关系库、对象存储和向量索引。 6. 删除个人资料时同步清理关系库、对象存储和向量索引。
7. 从文字或 ASR 转写中识别“住户需求、待跟进事项、个人经验”三类候选记忆,返回可编辑确认卡。
8. 用户确认后,将个人经验写入本人私有空间,将住户需求与跟进事项写入项目业务记忆;两域分别鉴权和检索。
9. 后续问答可召回已确认记忆,并展示来源消息、记录时间、当前状态和可见范围。
10. 对确认后的修改保留版本历史;提醒时间与长期保存分别确认。
### 1.2 非目标 ### 1.2 非目标
@@ -29,6 +35,10 @@
- 不允许个人资料自动进入企业知识库。 - 不允许个人资料自动进入企业知识库。
- 不通过“收藏网页”绕过登录、付费墙、企业内网或版权限制。 - 不通过“收藏网页”绕过登录、付费墙、企业内网或版权限制。
- 不复用企业知识表增加 `scope_type` 来承载个人数据。 - 不复用企业知识表增加 `scope_type` 来承载个人数据。
- 不把普通聊天历史自动升级为长期记忆,不在用户确认前写入个人或项目长期记忆表。
- 不允许 LLM 直接执行 SQL、更新业务实体、创建提醒或对外发送消息;模型只生成结构化候选草稿。
- 不把住户服务事实只存入员工私人空间;这类记录属于项目业务域,员工调岗后仍按项目权限保留。
- 阶段二首批不替代权威房屋、住户、工单或 CRM 主数据;未接入权威主数据时不得伪造住户身份。
## 2. 核心架构决策 ## 2. 核心架构决策
@@ -42,6 +52,7 @@
| 全文检索 | 使用个人片段表 MySQL Fulltext | 查询必须包含 `tenant_id + owner_user_id` | | 全文检索 | 使用个人片段表 MySQL Fulltext | 查询必须包含 `tenant_id + owner_user_id` |
| 向量检索 | 新建 `aihr_personal_knowledge` collection | Qdrant filter 必须包含 `tenant_id + owner_user_id` | | 向量检索 | 新建 `aihr_personal_knowledge` collection | Qdrant filter 必须包含 `tenant_id + owner_user_id` |
| 企业知识检索 | 调用现有企业 RAG 服务 | 继续执行企业知识密级、项目和角色权限 | | 企业知识检索 | 调用现有企业 RAG 服务 | 继续执行企业知识密级、项目和角色权限 |
| 项目业务记忆 | 独立 `aihr_service_memory` 关系表与同名 Qdrant collection | 查询必须包含 `tenant_id + project_id`,不得写入个人或企业知识表 |
禁止将个人资料写入: 禁止将个人资料写入:
@@ -53,18 +64,22 @@
### 2.2 检索流程 ### 2.2 检索流程
```text ```text
用户问题 + scope(personal / enterprise / mixed) 用户问题 + scopeMode(AUTO / MANUAL) + scope(personal / project_service / enterprise)
→ 从移动端 token 取得 tenantId、userId、extPartyId → 从移动端 token 取得 tenantId、userId、extPartyId
→ AUTO: 意图路由只在三个内部授权域中选择;MANUAL: 校验用户指定的内部范围
→ 校验日期、itemIds、知识范围和配额 → 校验日期、itemIds、知识范围和配额
→ personal: 个人 Fulltext + 个人 Qdrant(强制 owner filter) → personal: 个人 Fulltext + 个人 Qdrant(强制 owner filter)
→ project_service: 项目业务记忆 Fulltext + 独立 Qdrant(强制 project filter)
→ enterprise: 企业 Fulltext + 企业 Qdrant(强制企业权限) → enterprise: 企业 Fulltext + 企业 Qdrant(强制企业权限)
→ mixed: 两域分别检索并授权后融合,不做跨域原始结果直连 → mixed: 所选域分别检索并授权后融合,不做跨域原始结果直连
→ Rerank → Rerank
→ LLM 生成答案 → LLM 生成答案
→ 返回 citations,每条标记 PERSONAL / ENTERPRISE / WEB → 返回 citations,每条标记 PERSONAL / PROJECT_SERVICE / ENTERPRISE / WEB
→ 保存会话、答案、引用和 prompt/model 版本 → 保存会话、答案、引用和 prompt/model 版本
``` ```
`AUTO` 永远不包含公网查询。内部域没有命中时只返回“是否查全网”的用户操作建议,不得把原问题、住户信息或项目数据自动转发到全网 AI。
### 2.3 模块边界 ### 2.3 模块边界
后端新增独立包,避免继续扩大 `AihrSopSeedService`: 后端新增独立包,避免继续扩大 `AihrSopSeedService`:
@@ -79,6 +94,10 @@ org.dromara.aihr.personal
├── service/PersonalAnswerService.java ├── service/PersonalAnswerService.java
├── service/PersonalCleanupService.java ├── service/PersonalCleanupService.java
├── service/PersonalUrlFetchService.java ├── service/PersonalUrlFetchService.java
├── memory/MemoryCandidateService.java
├── memory/MemoryConfirmationService.java
├── memory/ServiceMemoryService.java
├── memory/ServiceMemoryRetrievalService.java
└── support/PersonalKnowledgeProperties.java └── support/PersonalKnowledgeProperties.java
``` ```
@@ -93,6 +112,40 @@ org.dromara.aihr.knowledge.parse
共享解析器只接受文件/字节和解析参数,只返回内存对象,不知道企业表、个人表或 Qdrant collection。 共享解析器只接受文件/字节和解析参数,只返回内存对象,不知道企业表、个人表或 Qdrant collection。
### 2.4 确认式长期记忆
个人助理统一承接三层记忆,但持久化边界不同:
| 记忆层 | 用途 | 生命周期与事实源 |
|---|---|---|
| 对话上下文 | 理解“刚才那位住户”等短期指代 | 仅进入受限上下文窗口;会话历史不自动成为长期记忆 |
| 个人工作记忆 | 员工自己的经验、灵感、工作方法 | 用户确认后写入 `aihr_personal_item`,默认仅本人可见 |
| 项目业务记忆 | 住户需求、服务事实、待跟进事项 | 用户确认后写入 `aihr_service_memory`,按租户 + 项目 + 角色授权共享 |
写入流程固定为:
```text
文字输入 / 语音 ASR 转写
→ 规则预筛(明确“记一下”等意图,或同时出现对象 + 需求/跟进事实)
→ 服务端先提取并令牌化楼栋、单元、房号、姓名、电话等标识
→ LLM 仅输出符合 JSON Schema 的候选类型、摘要、缺失字段和置信度
→ 服务端恢复标识并校验当前租户、项目、字段完整性、重复记录和权限
→ 信息不足:在会话中追问,不允许确认
→ 信息完整:持久化 DRAFT 候选并返回可编辑确认卡
→ 用户修改并确认(携带幂等键和 expectedVersion)
→ 确定性 Service 按 PERSONAL / PROJECT_SERVICE 分域写关系库
→ 事务提交后异步写检索索引
→ 如用户另行确认 followUpAt,则进入“今日安排”;不默认创建提醒
```
约束:
1. 候选检测可自动发生,但任何置信度都不得跳过用户确认。
2. DRAFT 候选只为跨刷新恢复确认卡,不进入检索和回答;忽略或过期后清理草稿内容。
3. 同一来源消息和候选哈希在有效期内只展示一次,避免重复打扰。
4. 当前仓库没有权威房屋/住户主数据。首批允许保存经员工确认的项目、楼栋、单元、房号定位;声称“某位住户”但缺少可区分房号或权威主体 ID 时必须追问。
5. 关系数据库是事实源,向量索引只负责召回;索引写入失败不得丢失已确认记录,可重试重建。
## 3. 身份、权限与数据隔离 ## 3. 身份、权限与数据隔离
### 3.1 所有者身份 ### 3.1 所有者身份
@@ -124,6 +177,15 @@ org.dromara.aihr.knowledge.parse
5. 个人资料转企业知识必须复制经审核后的脱敏版本,不能把个人 item 直接改成企业 scope。 5. 个人资料转企业知识必须复制经审核后的脱敏版本,不能把个人 item 直接改成企业 scope。
6. 自动化测试必须使用两个用户交叉访问,验证列表、详情、检索、向量和删除均返回不可见。 6. 自动化测试必须使用两个用户交叉访问,验证列表、详情、检索、向量和删除均返回不可见。
### 3.4 项目业务记忆权限
1. `project_id` 必须由当前登录员工的有效项目任职解析,客户端不得指定越权项目。
2. 项目业务记忆的列表、详情、修改和召回必须同时过滤 `tenant_id + project_id`,创建人不因“本人记录”获得跨项目访问权。
3. 住户姓名、电话、身份证件和健康信息不作为自由文本检索字段;首批优先保存房屋定位、需求摘要、跟进状态和必要说明。
4. 发送外部模型前先由服务端提取并令牌化可识别信息;模型输出不得覆盖服务端保存的主体定位。
5. 员工修改已确认记录必须携带 `expectedVersion`,成功后新增版本快照,不原地抹除历史。
6. 项目业务记忆不能通过个人资料删除接口删除;作废使用 `VOID` 状态并保留操作人、原因和版本记录。
## 4. 数据模型 ## 4. 数据模型
初始化 SQL:`backend/script/sql/aihr_personal_knowledge_mysql8.sql`。 初始化 SQL:`backend/script/sql/aihr_personal_knowledge_mysql8.sql`。
@@ -153,6 +215,7 @@ org.dromara.aihr.knowledge.parse
| id | bigint PK | 资料 ID | | id | bigint PK | 资料 ID |
| tenant_id/space_id/owner_user_id | bigint/varchar | 冗余所有权键,便于强制过滤 | | tenant_id/space_id/owner_user_id | bigint/varchar | 冗余所有权键,便于强制过滤 |
| source_type | varchar(20) | TEXT / FILE / IMAGE / URL | | source_type | varchar(20) | TEXT / FILE / IMAGE / URL |
| capture_channel | varchar(20) | TEXT / VOICE / UPLOAD / SHARE;语音保存 ASR 文本,不把音频文件冒充正文 |
| title | varchar(500) | 标题 | | title | varchar(500) | 标题 |
| original_url | varchar(2000) null | 原网页地址 | | original_url | varchar(2000) null | 原网页地址 |
| oss_id | bigint null | 原文件或网页快照 OSS ID | | oss_id | bigint null | 原文件或网页快照 OSS ID |
@@ -193,7 +256,7 @@ org.dromara.aihr.knowledge.parse
### 4.4 `aihr_personal_chat_session` 与 `aihr_personal_chat_message` ### 4.4 `aihr_personal_chat_session` 与 `aihr_personal_chat_message`
Session 保存 `id/tenant_id/owner_user_id/title/default_scope/create_time/update_time`。 Session 保存 `id/tenant_id/owner_user_id/title/default_scope_mode/default_scope_json/create_time/update_time`;`default_scope_mode` 默认 AUTO。
Message 保存: Message 保存:
@@ -217,15 +280,65 @@ Message 保存:
紧急审计专用不可变日志:`tenant_id/auditor_user_id/target_owner_user_id/item_id/action/reason/ticket_no/result/create_time`。日志不保存个人正文、附件 URL、问题或答案内容;业务接口不提供更新和删除操作。 紧急审计专用不可变日志:`tenant_id/auditor_user_id/target_owner_user_id/item_id/action/reason/ticket_no/result/create_time`。日志不保存个人正文、附件 URL、问题或答案内容;业务接口不提供更新和删除操作。
### 4.7 `aihr_memory_candidate`
确认卡草稿表,不属于长期记忆,也不进入全文/向量索引。
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint PK | 候选 ID |
| tenant_id/owner_user_id/project_id | varchar/bigint | 当前身份与候选项目范围 |
| source_session_id/source_message_id | bigint | 来源会话与消息 |
| candidate_hash | varchar(64) | 来源 + 规范化草稿哈希,用于防重复 |
| memory_type | varchar(30) | PERSONAL_NOTE / WORK_IDEA / RESIDENT_NEED / FOLLOW_UP |
| target_domain | varchar(30) | PERSONAL / PROJECT_SERVICE |
| status | varchar(20) | NEEDS_INPUT / DRAFT / CONFIRMED / DISMISSED / EXPIRED |
| draft_json | json | 可编辑结构化草稿;不得包含未脱敏模型原始响应 |
| missing_fields_json | json | 仍需追问的字段 |
| confidence | decimal(5,4) | 只决定是否建议展示,不决定自动保存 |
| target_id | bigint null | 确认后生成的个人 item 或业务记忆 ID |
| expires_at/confirmed_at | datetime null | 草稿过期与确认时间 |
| create_time/update_time | datetime | 审计时间 |
约束:`UNIQUE(tenant_id, owner_user_id, source_message_id, candidate_hash)`;DRAFT 默认 24 小时过期,DISMISSED/EXPIRED 的 `draft_json` 在 24 小时内物理清理。
### 4.8 `aihr_service_memory`
项目共享的住户需求和待跟进事实,不放入个人知识表。
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint PK | 业务记忆 ID |
| tenant_id/project_id | varchar/bigint | 租户与项目数据范围 |
| subject_type | varchar(20) | RESIDENT / LOCATION |
| resident_external_id | varchar(100) null | 仅权威住户主数据接入后保存;不得自行生成 |
| building_name/unit_name/room_no | varchar | 员工确认的结构化房屋定位 |
| category | varchar(50) | 需求分类,例如养老咨询、维修、投诉、增值服务 |
| title/summary/detail | varchar/text | 标题、最小必要摘要与说明 |
| status | varchar(20) | OPEN / IN_PROGRESS / RESOLVED / VOID |
| occurred_at | datetime | 事件发生或获知时间 |
| follow_up_at | datetime null | 用户单独确认的跟进时间;空值不产生提醒 |
| source_session_id/source_message_id | bigint | 可追溯来源 |
| created_by/confirmed_by | bigint | 记录人与确认人 |
| version | int | 乐观锁版本,从 1 开始 |
| create_time/update_time | datetime | 审计时间 |
索引至少包含 `(tenant_id, project_id, status, follow_up_at)`、`(tenant_id, project_id, building_name, unit_name, room_no)`;全文检索只覆盖 `title/summary/detail`,向量 payload 强制包含 `tenant_id + project_id + memory_id + status`。
### 4.9 `aihr_service_memory_version`
每次确认修改、状态变更或作废都追加版本:`memory_id/version/snapshot_json/change_type/change_reason/operator_user_id/create_time`。快照只保存业务字段,不复制姓名、电话等无关标识;`UNIQUE(memory_id, version)`。
## 5. Qdrant 与 OSS 设计 ## 5. Qdrant 与 OSS 设计
### 5.1 Qdrant ### 5.1 Qdrant
- collection:`aihr_personal_knowledge` - collections:个人资料使用 `aihr_personal_knowledge`;项目业务记忆使用 `aihr_service_memory`,两者不混 collection。
- 向量维度:跟随当前启用的 vector 模型;模型或维度变化使用独立重建任务。 - 向量维度:跟随当前启用的 vector 模型;模型或维度变化使用独立重建任务。
- payload:`tenant_id`、`owner_user_id`、`space_id`、`item_id`、`fragment_id`、`source_type`、`captured_at`。 - 个人 payload:`tenant_id`、`owner_user_id`、`space_id`、`item_id`、`fragment_id`、`source_type`、`captured_at`;必建 index 为 `tenant_id`、`owner_user_id`、`item_id`。
- 必建 payload index:`tenant_id`、`owner_user_id`、`item_id`。 - 项目业务记忆 payload:`tenant_id`、`project_id`、`memory_id`、`status`、`occurred_at`、`updated_at`;必建 index 为 `tenant_id`、`project_id`、`memory_id`、`status`。
- 查询无 owner filter 时,`PersonalRetrievalService` 直接拒绝执行并记录安全日志。 - 个人查询无 owner filter、项目业务查询无 project filter 时,检索服务直接拒绝执行并记录安全日志。
- `aihr_memory_candidate` 的任何状态都不写 Qdrant;只有关系库确认事务提交成功后才异步索引目标记录。
### 5.2 OSS ### 5.2 OSS
@@ -284,7 +397,8 @@ Message 保存:
{ {
"sessionId": null, "sessionId": null,
"queryText": "结合我的资料和企业制度,整理本周保洁管理改进建议", "queryText": "结合我的资料和企业制度,整理本周保洁管理改进建议",
"scope": ["PERSONAL", "ENTERPRISE"], "scopeMode": "AUTO",
"scope": [],
"dateFrom": "2026-07-01", "dateFrom": "2026-07-01",
"dateTo": "2026-07-10", "dateTo": "2026-07-10",
"itemIds": [], "itemIds": [],
@@ -298,6 +412,7 @@ Message 保存:
{ {
"sessionId": 301, "sessionId": 301,
"answer": "结论……\n行动项……\n待确认事项……", "answer": "结论……\n行动项……\n待确认事项……",
"resolvedScopes": ["PERSONAL", "ENTERPRISE"],
"citations": [ "citations": [
{ {
"domain": "PERSONAL", "domain": "PERSONAL",
@@ -321,6 +436,8 @@ Message 保存:
若无可用引用,返回明确的“当前资料中没有足够依据”,不得生成无引用的业务结论。 若无可用引用,返回明确的“当前资料中没有足够依据”,不得生成无引用的业务结论。
`scopeMode=AUTO` 时服务端只在 PERSONAL / PROJECT_SERVICE / ENTERPRISE 三个内部域路由,并在响应返回 `resolvedScopes`;`scopeMode=MANUAL` 时 `scope` 至少包含一个内部域。`PROJECT_SERVICE` 结果必须在融合前按当前项目权限过滤;引用额外返回 `status/occurredAt/updatedAt`,使用户能区分历史记录与当前状态。`POST /ask` 可在正常答案外返回一个 `memoryCandidate`,但不能因生成答案成功而自动确认候选。
### 6.3 会话 ### 6.3 会话
| 方法 | 路径 | 说明 | | 方法 | 路径 | 说明 |
@@ -351,6 +468,42 @@ Message 保存:
紧急审计接口与员工接口使用不同 Controller;超级管理员也不能绕过权限、工单号和原因校验。 紧急审计接口与员工接口使用不同 Controller;超级管理员也不能绕过权限、工单号和原因校验。
### 6.6 确认式记忆
候选确认沿用 `/api/aihr/personal-assistant`;项目业务记忆使用独立前缀 `/api/aihr/service-memories`。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/memory-candidates?status=DRAFT` | 恢复当前用户尚未过期的确认卡 |
| POST | `/memory-candidates/{id}/confirm` | 提交编辑后的草稿、`expectedVersion`、`idempotencyKey`;分域写入 |
| POST | `/memory-candidates/{id}/dismiss` | 明确不保存;同源候选本会话不再提示 |
| GET | `/api/aihr/service-memories` | 按当前项目、状态、日期、楼栋/单元/房号查询 |
| GET | `/api/aihr/service-memories/{id}` | 项目权限内查看详情、来源和版本 |
| PATCH | `/api/aihr/service-memories/{id}` | 携带 `expectedVersion` 修改必要字段或状态并生成版本 |
确认请求示例:
```json
{
"idempotencyKey": "01J-memory-confirm-301",
"expectedVersion": 1,
"targetDomain": "PROJECT_SERVICE",
"memoryType": "RESIDENT_NEED",
"subject": {
"projectId": 88,
"buildingName": "3栋",
"unitName": "2单元",
"roomNo": "1201"
},
"category": "养老服务咨询",
"summary": "住户希望了解社区可提供的养老服务",
"occurredAt": "2026-07-19T14:00:00+08:00",
"followUpAt": null
}
```
服务端必须忽略请求中的 `projectId` 作为授权依据,仅用它与当前登录态可访问项目做一致性校验。确认成功返回 `targetDomain/targetId/version`;同一 `idempotencyKey` 重放必须返回同一结果,不重复创建记录。
## 7. 网页采集安全 ## 7. 网页采集安全
`PersonalUrlFetchService` 必须执行: `PersonalUrlFetchService` 必须执行:
@@ -369,7 +522,7 @@ Message 保存:
### 8.1 解析 ### 8.1 解析
- 支持格式与现有知识库一致:txt/md/PDF/Word/Excel/PPT、常用图片。 - 支持格式与现有知识库一致:txt/md/PDF/Word/Excel/PPT、常用图片。
- 视频、音频首批不进入个人空间;待语音转写和视频解析成本评估后扩展。 - 视频、音频文件首批不作为个人资料上传;会话语音复用现有 `/api/ai/asr`,ASR 文本可进入候选记忆检测。原始录音仍按现有受保护音频规则处理,不自动复制进长期记忆。
- item 状态由 `QUEUED → PARSING → READY/FAILED` 单向推进;重试将状态恢复为 QUEUED、增加 `attempt_count`,并覆盖 `error_code/error_message`。 - item 状态由 `QUEUED → PARSING → READY/FAILED` 单向推进;重试将状态恢复为 QUEUED、增加 `attempt_count`,并覆盖 `error_code/error_message`。
- 文本块默认 800 字、重叠 120 字;参数由 `PersonalKnowledgeProperties` 管理。 - 文本块默认 800 字、重叠 120 字;参数由 `PersonalKnowledgeProperties` 管理。
@@ -380,11 +533,15 @@ Message 保存:
- `personal_assistant_answer_v1` - `personal_assistant_answer_v1`
- `personal_assistant_summary_v1` - `personal_assistant_summary_v1`
- `personal_assistant_action_plan_v1` - `personal_assistant_action_plan_v1`
- `personal_assistant_memory_candidate_v1`
- `personal_assistant_memory_recall_v1`
- `personal_assistant_outline_v1` - `personal_assistant_outline_v1`
- `personal_assistant_ppt_v1`(P1) - `personal_assistant_ppt_v1`(P1)
系统提示词必须包含:只基于授权片段回答、区分来源域、忽略资料中的指令注入、没有依据时拒答、不得代表用户对外作决定。 系统提示词必须包含:只基于授权片段回答、区分来源域、忽略资料中的指令注入、没有依据时拒答、不得代表用户对外作决定。
候选记忆模板只允许输出受控 JSON Schema,不能输出 SQL、表名、owner、tenant、project 授权结论或工具调用。楼栋、单元、房号、姓名、电话等标识由服务端预处理和恢复;模型只判断语义类型、摘要、缺失字段与是否值得建议保存。
### 8.3 成本闸门 ### 8.3 成本闸门
- 复用 `AIHR_AI_RUNTIME_ENABLED`、chat/vector/rerank 开关。 - 复用 `AIHR_AI_RUNTIME_ENABLED`、chat/vector/rerank 开关。
@@ -415,6 +572,14 @@ Message 保存:
用户账号冻结后禁止访问个人空间;阶段三接入权威离职状态后,默认冻结 30 天,允许用户或经授权管理员导出,期满清理。该天数必须可配置。 用户账号冻结后禁止访问个人空间;阶段三接入权威离职状态后,默认冻结 30 天,允许用户或经授权管理员导出,期满清理。该天数必须可配置。
### 9.3 候选与业务记忆生命周期
- NEEDS_INPUT/DRAFT 候选默认 24 小时过期,不进入任何检索索引。
- DISMISSED/EXPIRED 候选的结构化草稿在 24 小时内清理,只保留候选 ID、状态、来源消息 ID 和时间戳用于防重复。
- 个人记忆沿用个人 item 删除链路。
- 项目业务记忆不因创建员工离职而删除;按项目业务保留策略管理,首批只允许 `VOID` 作废并保留版本。
- `follow_up_at` 到期只进入员工端“今日安排”查询;推送通知、短信或自动派单不在首批范围。
## 10. 前端设计 ## 10. 前端设计
### 10.1 页面与入口 ### 10.1 页面与入口
@@ -422,21 +587,29 @@ Message 保存:
`mobile-uni` 新增: `mobile-uni` 新增:
```text ```text
src/pages/user/assistant/index.vue 个人助理首页/提问 src/pages/user/sop/index.vue 既有微信式会话,升级为工作助手主入口
src/pages/user/assistant/library.vue 个人资料列表 src/pages/user/assistant/library.vue 个人资料列表
src/pages/user/assistant/item.vue 资料详情与解析状态 src/pages/user/assistant/item.vue 资料详情与解析状态
src/pages/user/assistant/capture.vue 文字、文件、链接收藏 src/pages/user/assistant/capture.vue 文字、文件、链接收藏
src/pages/user/assistant/sessions.vue 历史会话 src/pages/user/assistant/sessions.vue 历史会话
src/pages/user/assistant/memories.vue 待确认、个人记忆与项目跟进记录
src/services/personal-assistant.ts API 客户端 src/services/personal-assistant.ts API 客户端
``` ```
入口策略:员工端「问」页增加“企业知识 / 我的资料”范围切换和“收藏资料”入口;不新增第五个底部 Tab。 入口策略:一级只提供用户任务导向的“工作助手 / 查全网”。“工作助手”复用员工端「问」页现有微信式会话,在个人资料、项目记录和企业知识之间自动路由;回答以引用徽标说明实际使用范围。输入区仅提供次级“资料范围:自动”入口,专业用户需要时才切换为手动筛选。不新增个人助理 Tab 或第五个底部 Tab;“我”页提供“我的资料与记忆”管理入口。
### 10.2 关键交互 ### 10.2 关键交互
- 上传后立即返回列表并显示解析状态,不阻塞页面等待解析。 - 上传后立即返回列表并显示解析状态,不阻塞页面等待解析。
- 每条答案引用显示域徽标:我的资料、企业 SOP、外部网页。 - 每条答案引用显示域徽标:我的资料、项目记录、企业 SOP;外部网页只在独立“查全网”入口展示。
- 混合问答默认关闭,用户主动选择后才同时检索两域。 - 工作助手默认 `scopeMode=AUTO`,自动路由仅限本人和当前项目可访问的内部域;界面展示 `依据:企业 SOP · 项目记录 · 我的资料` 等实际命中来源。
- “资料范围”是次级设置而非一级 Tab;手动模式才允许选择个人资料、项目记录或企业知识。
- “查全网”保持独立入口和接口。内部资料无命中时只显示“是否查全网”,必须由用户点击后才进入外部查询;包含住户或项目内部信息时不得自动带入原问题。
- 每条用户文字或 ASR 转写完成后可触发候选检测;普通问答不得频繁弹卡,同源候选被忽略后本会话不再提示。
- 确认卡必须展示类型、对象定位、摘要、保存范围、记录时间和可选跟进时间,并提供“修改 / 暂不保存 / 确认保存”。
- 信息不足时显示追问,不展示可确认按钮;“某位住户”但无法唯一定位时不得保存为 RESIDENT。
- 保存与提醒是两个独立选择;未填写 `followUpAt` 不创建提醒或今日任务。
- 项目业务记忆引用必须展示来源时间、当前状态和最后更新时间;历史状态不能冒充当前事实。
- 删除前明确提示会删除附件、解析正文和搜索索引。 - 删除前明确提示会删除附件、解析正文和搜索索引。
- 资料详情允许修正标题、时间和标签,不允许直接编辑解析正文。 - 资料详情允许修正标题、时间和标签,不允许直接编辑解析正文。
- P1 PPT 生成必须先展示可编辑大纲和模板选择,再提交异步任务。 - P1 PPT 生成必须先展示可编辑大纲和模板选择,再提交异步任务。
@@ -453,8 +626,13 @@ src/services/personal-assistant.ts API 客户端
| `PERSONAL_NO_CITATION` | 无足够资料支撑 | 不生成业务结论 | | `PERSONAL_NO_CITATION` | 无足够资料支撑 | 不生成业务结论 |
| `ENTERPRISE_SCOPE_FORBIDDEN` | 无企业知识范围权限 | 保留个人结果,提示企业范围不可用 | | `ENTERPRISE_SCOPE_FORBIDDEN` | 无企业知识范围权限 | 保留个人结果,提示企业范围不可用 |
| `PERSONAL_AI_DISABLED` | AI 成本闸门关闭 | 仍允许收藏和关键词检索,暂停摘要/问答 | | `PERSONAL_AI_DISABLED` | AI 成本闸门关闭 | 仍允许收藏和关键词检索,暂停摘要/问答 |
| `MEMORY_CANDIDATE_NEEDS_INPUT` | 对象或必要字段不完整 | 继续追问,不展示确认按钮 |
| `MEMORY_CANDIDATE_EXPIRED` | 确认草稿已过期 | 基于原消息重新识别,不直接写入 |
| `MEMORY_CONFIRM_CONFLICT` | 版本冲突或幂等键对应不同内容 | 刷新确认卡,禁止覆盖 |
| `SERVICE_MEMORY_PROJECT_FORBIDDEN` | 当前用户无项目访问权 | 统一显示不可访问,不泄露记录存在性 |
| `SERVICE_MEMORY_SUBJECT_AMBIGUOUS` | 住户/房屋定位不足或冲突 | 要求补充房号或选择权威主体 |
企业检索失败时,mixed 查询可只返回个人结果并标记降级;个人权限校验失败时不得降级为企业或公开检索。 企业检索失败时,mixed 查询可返回仍然可用且已授权的个人/项目业务结果并标记降级;任一域权限校验失败时不得用其他域结果掩盖越权错误。
## 12. 测试策略 ## 12. 测试策略
@@ -466,6 +644,10 @@ src/services/personal-assistant.ts API 客户端
- 引用域序列化和无引用拒答。 - 引用域序列化和无引用拒答。
- 删除任务幂等性。 - 删除任务幂等性。
- prompt injection 文本不得改变系统指令。 - prompt injection 文本不得改变系统指令。
- 规则预筛不会把普通问答误判为候选;明确“记一下”必定进入候选检测。
- 模型候选输出不能覆盖服务端解析的 tenant、project、楼栋、单元和房号。
- NEEDS_INPUT、DRAFT、CONFIRMED、DISMISSED、EXPIRED 状态转换只允许规定方向。
- 同一确认幂等键只生成一个目标记录;版本冲突不覆盖较新业务记忆。
### 12.2 集成测试 ### 12.2 集成测试
@@ -473,6 +655,10 @@ src/services/personal-assistant.ts API 客户端
- Qdrant:未带 owner filter 的调用被拒绝;用户 A 不返回用户 B point。 - Qdrant:未带 owner filter 的调用被拒绝;用户 A 不返回用户 B point。
- OSS:签名 URL 只能由本人生成;删除后对象不可访问。 - OSS:签名 URL 只能由本人生成;删除后对象不可访问。
- mixed:个人和企业结果分别授权、融合、引用域正确。 - mixed:个人和企业结果分别授权、融合、引用域正确。
- confirmed memory:未确认不写个人 item、业务记忆或向量;确认后按目标域写入并返回可追溯来源。
- project service:两个项目交叉读取、修改和召回均不可见;创建人调岗后不保留越权访问。
- version:每次修改和作废均追加版本,旧版本可审计但不参与当前状态回答。
- PII:外部模型请求只含令牌化定位,姓名、电话和房号原值不出现在供应商请求体。
- 成本闸门关闭:收藏与关键词检索可用,LLM 能力明确降级。 - 成本闸门关闭:收藏与关键词检索可用,LLM 能力明确降级。
### 12.3 浏览器 E2E ### 12.3 浏览器 E2E
@@ -485,6 +671,10 @@ src/services/personal-assistant.ts API 客户端
6. 检查引用徽标和原始来源。 6. 检查引用徽标和原始来源。
7. 删除资料并确认列表、问答和下载均不可再访问。 7. 删除资料并确认列表、问答和下载均不可再访问。
8. 切换另一手机号,确认看不到前一用户的资料、标题和会话。 8. 切换另一手机号,确认看不到前一用户的资料、标题和会话。
9. 语音描述一条住户需求,检查信息不足时先追问,字段完整后出现确认卡。
10. 分别执行“暂不保存”和“确认保存”,验证前者不进入检索,后者可按楼栋/日期召回并显示来源、状态和更新时间。
11. 确认时不设置跟进日期,验证不会生成今日任务;另建一条带 `followUpAt` 的记录,验证只出现一次。
12. 双击确认或重放请求,验证只创建一条记录;修改后验证版本递增且旧状态不被当作当前答案。
## 13. 非功能指标 ## 13. 非功能指标
@@ -498,6 +688,10 @@ src/services/personal-assistant.ts API 客户端
| 删除可见性 | API 成功后立即隐藏 | | 删除可见性 | API 成功后立即隐藏 |
| 物理内容清理 | 24 小时内完成 | | 物理内容清理 | 24 小时内完成 |
| URL 私网/元数据地址拦截 | 100% | | URL 私网/元数据地址拦截 | 100% |
| 未确认候选进入长期存储/检索 | 0 |
| 确认接口重复创建 | 0;幂等测试 100% 通过 |
| 跨项目业务记忆泄漏 | 0;项目越权矩阵 100% 通过 |
| 当前状态回答可追溯 | 100% 返回来源时间、状态和最后更新时间 |
## 14. 里程碑与发布闸门 ## 14. 里程碑与发布闸门
@@ -516,17 +710,23 @@ src/services/personal-assistant.ts API 客户端
- 日期/主题/来源检索。 - 日期/主题/来源检索。
- 个人问答、引用、会话和成本统计。 - 个人问答、引用、会话和成本统计。
### M3:企业知识授权融合 ### M3:确认式长期记忆
- 文字/ASR 候选识别、信息补充、确认卡、忽略和过期。
- 个人记忆与项目业务记忆分域写入、幂等确认、版本和受控召回。
- `followUpAt` 经单独确认进入“今日安排”,不做推送或自动派单。
### M4:企业知识授权融合
- 企业知识权限过滤。 - 企业知识权限过滤。
- 个人/企业/mixed 三范围切换和引用域标记。 - 个人/项目业务/企业三域分别授权后融合和引用域标记。
### M4:移动端闭环与试点 ### M5:移动端闭环与试点
- 员工端页面、真实浏览器 E2E、20 名试点员工。 - 员工端页面、真实浏览器 E2E、20 名试点员工。
- 试点期间不开放分享/企业入库和 PPT 文件生成。 - 试点期间不开放分享/企业入库和 PPT 文件生成。
### M5:P1 增强 ### M6:P1 增强
- 分享/企业入库审核。 - 分享/企业入库审核。
- 周报月报、汇报提纲、PPTX 异步生成。 - 周报月报、汇报提纲、PPTX 异步生成。
@@ -538,8 +738,11 @@ src/services/personal-assistant.ts API 客户端
预计新增: 预计新增:
- `backend/script/sql/aihr_personal_knowledge_mysql8.sql` - `backend/script/sql/aihr_personal_knowledge_mysql8.sql`
- `backend/script/sql/aihr_service_memory_mysql8.sql`
- `backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/personal/**` - `backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/personal/**`
- `backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/memory/**`(候选识别、确认编排与项目业务记忆)
- `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/personal/**` - `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/personal/**`
- `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/memory/**`
- `mobile-uni/src/pages/user/assistant/*.vue` - `mobile-uni/src/pages/user/assistant/*.vue`
- `mobile-uni/src/services/personal-assistant.ts` - `mobile-uni/src/services/personal-assistant.ts`
- `mobile-uni/tests/personal-assistant.test.mjs` - `mobile-uni/tests/personal-assistant.test.mjs`
@@ -565,3 +768,10 @@ src/services/personal-assistant.ts API 客户端
5. 个人资料默认私有,分享和企业入库走 P1 审核链。 5. 个人资料默认私有,分享和企业入库走 P1 审核链。
6. PPT 是 P1,不阻塞阶段二首批。 6. PPT 是 P1,不阻塞阶段二首批。
7. 北森、考勤等外部个人数据属于阶段三。 7. 北森、考勤等外部个人数据属于阶段三。
8. 对话历史不是长期记忆;只有用户确认的候选才能进入个人或项目业务记忆。
9. 个人经验写个人域,住户需求和跟进事项写项目业务域,不因创建员工调岗而丢失。
10. 模型只生成结构化草稿,主体解析、授权、幂等、版本和数据库写入全部由确定性服务完成。
11. 保存和提醒分别确认;未设置 `followUpAt` 不产生今日任务、推送或自动派单。
12. 当前没有权威住户主数据时不伪造主体 ID;无法唯一定位的住户信息必须先追问。
13. 用户界面不暴露系统的三域架构作为一级选择;一级只保留“工作助手 / 查全网”,内部来源默认自动路由并以引用透明展示。
14. 公网查询永不由 AUTO 触发;必须由用户明确进入“查全网”,且不得自动携带住户或项目内部信息。
@@ -52,7 +52,7 @@
| 文件 | 职责 | | 文件 | 职责 |
|---|---| |---|---|
| mobile-uni/src/services/personal-assistant.ts | API 客户端和类型归一化 | | mobile-uni/src/services/personal-assistant.ts | API 客户端和类型归一化 |
| mobile-uni/src/pages/user/assistant/index.vue | 提问、范围切换、答案与引用 | | mobile-uni/src/pages/user/sop/index.vue | 复用既有微信式会话,作为工作助手主入口;内部来源默认自动路由 |
| mobile-uni/src/pages/user/assistant/library.vue | 个人资料列表和筛选 | | mobile-uni/src/pages/user/assistant/library.vue | 个人资料列表和筛选 |
| mobile-uni/src/pages/user/assistant/capture.vue | 文字、文件、网页收藏 | | mobile-uni/src/pages/user/assistant/capture.vue | 文字、文件、网页收藏 |
| mobile-uni/src/pages/user/assistant/item.vue | 资料详情、状态、重试、删除 | | mobile-uni/src/pages/user/assistant/item.vue | 资料详情、状态、重试、删除 |
@@ -180,7 +180,8 @@ Expected: FAIL,提示 aihr_personal_knowledge_mysql8.sql 不存在。
tenant_id varchar(20) NOT NULL, tenant_id varchar(20) NOT NULL,
owner_user_id bigint NOT NULL, owner_user_id bigint NOT NULL,
title varchar(200) NOT NULL, title varchar(200) NOT NULL,
default_scope varchar(50) NOT NULL DEFAULT 'PERSONAL', default_scope_mode varchar(20) NOT NULL DEFAULT 'AUTO',
default_scope_json json,
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id), PRIMARY KEY (id),
@@ -305,10 +306,13 @@ Expected: FAIL,PersonalAssistantDto 不存在。
public record ItemCreatedResponse(long itemId, String status, Long duplicateOf) {} public record ItemCreatedResponse(long itemId, String status, Long duplicateOf) {}
public enum SearchScope { PERSONAL, ENTERPRISE } public enum ScopeMode { AUTO, MANUAL }
public enum SearchScope { PERSONAL, PROJECT_SERVICE, ENTERPRISE }
public record AskRequest( public record AskRequest(
Long sessionId, String queryText, java.util.List<SearchScope> scope, Long sessionId, String queryText, ScopeMode scopeMode,
java.util.List<SearchScope> scope,
java.time.LocalDate dateFrom, java.time.LocalDate dateTo, java.time.LocalDate dateFrom, java.time.LocalDate dateTo,
java.util.List<Long> itemIds, String outputFormat) {} java.util.List<Long> itemIds, String outputFormat) {}
@@ -317,7 +321,8 @@ Expected: FAIL,PersonalAssistantDto 不存在。
java.time.LocalDateTime capturedAt) {} java.time.LocalDateTime capturedAt) {}
public record AskResponse( public record AskResponse(
long sessionId, String answer, java.util.List<CitationResponse> citations, long sessionId, String answer, java.util.List<SearchScope> resolvedScopes,
java.util.List<CitationResponse> citations,
String model, String promptVersion) {} String model, String promptVersion) {}
public record SpaceResponse( public record SpaceResponse(
@@ -348,7 +353,7 @@ Expected: FAIL,PersonalAssistantDto 不存在。
String queryText, java.util.List<SearchHitResponse> hits) {} String queryText, java.util.List<SearchHitResponse> hits) {}
public record SessionResponse( public record SessionResponse(
long id, String title, String defaultScope, long id, String title, String defaultScopeMode,
java.time.LocalDateTime updatedAt) {} java.time.LocalDateTime updatedAt) {}
public record SessionDetailResponse( public record SessionDetailResponse(
@@ -970,11 +975,10 @@ Expected: 单测 PASS;匿名请求业务响应为 401,接口没有 @SaIgnore
--- ---
### Task 10: 实现 mobile-uni 个人助理页面 ### Task 10: 将现有「问」页升级为工作助手并接入个人助理
**Files:** **Files:**
- Create: mobile-uni/src/services/personal-assistant.ts - Create: mobile-uni/src/services/personal-assistant.ts
- Create: mobile-uni/src/pages/user/assistant/index.vue
- Create: mobile-uni/src/pages/user/assistant/library.vue - Create: mobile-uni/src/pages/user/assistant/library.vue
- Create: mobile-uni/src/pages/user/assistant/capture.vue - Create: mobile-uni/src/pages/user/assistant/capture.vue
- Create: mobile-uni/src/pages/user/assistant/item.vue - Create: mobile-uni/src/pages/user/assistant/item.vue
@@ -982,6 +986,7 @@ Expected: 单测 PASS;匿名请求业务响应为 401,接口没有 @SaIgnore
- Create: mobile-uni/tests/personal-assistant.test.mjs - Create: mobile-uni/tests/personal-assistant.test.mjs
- Modify: mobile-uni/src/pages.json - Modify: mobile-uni/src/pages.json
- Modify: mobile-uni/src/pages/user/sop/index.vue - Modify: mobile-uni/src/pages/user/sop/index.vue
- Modify: mobile-uni/src/pages/user/web-ai/index.vue
- Modify: mobile-uni/src/types/api.ts - Modify: mobile-uni/src/types/api.ts
- [ ] **Step 1: 写失败的页面契约测试** - [ ] **Step 1: 写失败的页面契约测试**
@@ -992,14 +997,23 @@ Expected: 单测 PASS;匿名请求业务响应为 401,接口没有 @SaIgnore
const source = (path) => readFile(new URL(path, import.meta.url), 'utf8'); const source = (path) => readFile(new URL(path, import.meta.url), 'utf8');
test('个人助理页面提供范围切换、引用和收藏入口', async () => { test('工作助手默认自动选择内部资料范围', async () => {
const page = await source('../src/pages/user/assistant/index.vue'); const page = await source('../src/pages/user/sop/index.vue');
assert.match(page, /我的资料/); assert.match(page, /工作助手/);
assert.match(page, /企业知识/); assert.match(page, /资料范围/);
assert.match(page, /自动/);
assert.match(page, /收藏资料/); assert.match(page, /收藏资料/);
assert.match(page, /citation\.domain/); assert.match(page, /citation\.domain/);
}); });
test('一级入口只区分工作助手与查全网', async () => {
const internalPage = await source('../src/pages/user/sop/index.vue');
const webPage = await source('../src/pages/user/web-ai/index.vue');
assert.match(internalPage, /工作助手/);
assert.match(webPage, /查全网/);
assert.doesNotMatch(internalPage, /企业问师傅\s*\/\s*个人助理\s*\/\s*全网/);
});
test('个人资料页面包含状态、重试和删除', async () => { test('个人资料页面包含状态、重试和删除', async () => {
const page = await source('../src/pages/user/assistant/item.vue'); const page = await source('../src/pages/user/assistant/item.vue');
assert.match(page, /PARSING|解析中/); assert.match(page, /PARSING|解析中/);
@@ -1013,18 +1027,19 @@ Run:
npm --prefix mobile-uni run test:unit npm --prefix mobile-uni run test:unit
Expected: FAIL,assistant 页面不存在。 Expected: FAIL,现有「问」页尚未提供工作助手 AUTO 范围和简化后的一级入口。
- [ ] **Step 3: 实现 API 客户端** - [ ] **Step 3: 实现 API 客户端**
personal-assistant.ts 固定使用现有 apiRequest: personal-assistant.ts 固定使用现有 apiRequest:
export type KnowledgeScope = 'PERSONAL' | 'ENTERPRISE'; export type InternalKnowledgeScope = 'PERSONAL' | 'PROJECT_SERVICE' | 'ENTERPRISE';
export const askPersonalAssistant = (payload: { export const askPersonalAssistant = (payload: {
sessionId?: number; sessionId?: number;
queryText: string; queryText: string;
scope: KnowledgeScope[]; scopeMode: 'AUTO' | 'MANUAL';
scope: InternalKnowledgeScope[];
dateFrom?: string; dateFrom?: string;
dateTo?: string; dateTo?: string;
itemIds?: number[]; itemIds?: number[];
@@ -1047,7 +1062,8 @@ personal-assistant.ts 固定使用现有 apiRequest:
关键状态必须唯一: 关键状态必须唯一:
const scopes = ref<KnowledgeScope[]>(['PERSONAL']); const scopeMode = ref<'AUTO' | 'MANUAL'>('AUTO');
const manualScopes = ref<InternalKnowledgeScope[]>([]);
const queryText = ref(''); const queryText = ref('');
const asking = ref(false); const asking = ref(false);
const answer = ref<PersonalAskResponse>(); const answer = ref<PersonalAskResponse>();
@@ -1059,7 +1075,8 @@ personal-assistant.ts 固定使用现有 apiRequest:
try { try {
answer.value = await askPersonalAssistant({ answer.value = await askPersonalAssistant({
queryText: question, queryText: question,
scope: scopes.value, scopeMode: scopeMode.value,
scope: scopeMode.value === 'MANUAL' ? manualScopes.value : [],
outputFormat: 'ACTION_PLAN' outputFormat: 'ACTION_PLAN'
}); });
} finally { } finally {
@@ -1067,7 +1084,7 @@ personal-assistant.ts 固定使用现有 apiRequest:
} }
}; };
引用卡必须按 citation.domain 显示“我的资料 / 企业 SOP / 外部网页”。默认只选 PERSONAL;用户主动选择后才启用 mixed。 一级只显示“工作助手 / 查全网”。工作助手默认 `AUTO`,只在 PERSONAL / PROJECT_SERVICE / ENTERPRISE 三个内部授权域路由;“资料范围”放在输入区次级设置中。引用卡按 `citation.domain` 显示“我的资料 / 项目记录 / 企业 SOP”,让用户看得见实际来源。公网查询继续使用独立页面和接口,内部无命中时只能提示用户主动进入“查全网”,不得自动转发原问题或住户/项目内容。
- [ ] **Step 5: 运行移动端检查** - [ ] **Step 5: 运行移动端检查**
@@ -1081,7 +1098,7 @@ Expected: 全部 PASS;无新增横向滚动;页面路由存在。
- [ ] **Step 6: 提交** - [ ] **Step 6: 提交**
git add mobile-uni/src/pages.json mobile-uni/src/pages/user/assistant mobile-uni/src/pages/user/sop/index.vue mobile-uni/src/services/personal-assistant.ts mobile-uni/src/types/api.ts mobile-uni/tests/personal-assistant.test.mjs git add mobile-uni/src/pages.json mobile-uni/src/pages/user/assistant mobile-uni/src/pages/user/sop/index.vue mobile-uni/src/pages/user/web-ai/index.vue mobile-uni/src/services/personal-assistant.ts mobile-uni/src/types/api.ts mobile-uni/tests/personal-assistant.test.mjs
git commit -m "feat(mobile): add personal assistant knowledge flow" git commit -m "feat(mobile): add personal assistant knowledge flow"
--- ---
@@ -1128,7 +1145,7 @@ demo-check 增加静态 marker:
contains backend/script/sql/aihr_personal_knowledge_mysql8.sql "aihr_personal_fragment" contains backend/script/sql/aihr_personal_knowledge_mysql8.sql "aihr_personal_fragment"
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/personal/service/PersonalVectorStore.java "owner_user_id" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/personal/service/PersonalVectorStore.java "owner_user_id"
contains mobile-uni/src/pages/user/assistant/index.vue "我的资料" contains mobile-uni/src/pages/user/sop/index.vue "资料范围"
API_INTEGRATION 记录 API、owner 注入规则和 mixed 引用域;DEV_SETUP 记录 Qdrant collection、配额配置和 smoke 命令;DEMO_ACCEPTANCE 记录浏览器闭环。 API_INTEGRATION 记录 API、owner 注入规则和 mixed 引用域;DEV_SETUP 记录 Qdrant collection、配额配置和 smoke 命令;DEMO_ACCEPTANCE 记录浏览器闭环。
@@ -1240,7 +1257,7 @@ Expected: PASS;批准生成企业副本;个人 item owner 不变;员工可
- Create: backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/personal/service/PersonalExportService.java - Create: backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/personal/service/PersonalExportService.java
- Create: backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/personal/PersonalExportServiceTest.java - Create: backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/personal/PersonalExportServiceTest.java
- Modify: mobile-uni/src/services/personal-assistant.ts - Modify: mobile-uni/src/services/personal-assistant.ts
- Modify: mobile-uni/src/pages/user/assistant/index.vue - Modify: mobile-uni/src/pages/user/sop/index.vue
- [ ] **Step 1: 写“先大纲后 PPT”的失败测试** - [ ] **Step 1: 写“先大纲后 PPT”的失败测试**
@@ -1305,7 +1322,7 @@ Expected: PASS;未确认大纲不能生成;PPTX 可被 POI 重新打开;
- [ ] **Step 6: 提交** - [ ] **Step 6: 提交**
git add backend/ruoyi-modules/ruoyi-aihr/pom.xml backend/script/sql/aihr_personal_knowledge_mysql8.sql backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/personal backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/personal/PersonalExportServiceTest.java mobile-uni/src/services/personal-assistant.ts mobile-uni/src/pages/user/assistant/index.vue git add backend/ruoyi-modules/ruoyi-aihr/pom.xml backend/script/sql/aihr_personal_knowledge_mysql8.sql backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/personal backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/personal/PersonalExportServiceTest.java mobile-uni/src/services/personal-assistant.ts mobile-uni/src/pages/user/sop/index.vue
git commit -m "feat(personal): export reviewed outlines to pptx" git commit -m "feat(personal): export reviewed outlines to pptx"
--- ---
@@ -1,9 +1,10 @@
# 物业行业 AI 人力资源系统 · 业务需求文档(BRD) # 物业行业 AI 人力资源系统 · 业务需求文档(BRD)
> 版本:v1.2(统一版)| 日期:2026-07-11 > 版本:v1.3(统一版)| 日期:2026-07-19
> 定位:本文是本项目的**唯一事实源(Single Source of Truth)**,收敛此前所有讨论与文档,取代分散的局部材料作为业务需求基准。 > 定位:本文是本项目的**唯一事实源(Single Source of Truth)**,收敛此前所有讨论与文档,取代分散的局部材料作为业务需求基准。
> v1.1 变更:第 5 章数据模型方向补充"HR 主干已对齐《手册》卷1 第9章"结论(见 5.2)。 > v1.1 变更:第 5 章数据模型方向补充"HR 主干已对齐《手册》卷1 第9章"结论(见 5.2)。
> v1.2 变更:新增阶段二“员工个人 AI 助理 / 个人知识空间”需求(见 4.8),明确个人资料、网页链接、时间检索、来源引用、PPT 增强项和阶段三外部 HR 数据边界。 > v1.2 变更:新增阶段二“员工个人 AI 助理 / 个人知识空间”需求(见 4.8),明确个人资料、网页链接、时间检索、来源引用、PPT 增强项和阶段三外部 HR 数据边界。
> v1.3 变更:个人助理新增确认式长期记忆;一级交互收敛为“工作助手 / 查全网”,内部个人资料、项目业务记录和企业知识默认自动路由并透明展示来源。
> >
> **收敛来源**: > **收敛来源**:
> - 《物业管家与生活顾问 AI 陪练系统建设方案》(原始业务方案,陪练视角) > - 《物业管家与生活顾问 AI 陪练系统建设方案》(原始业务方案,陪练视角)
@@ -149,11 +150,13 @@
- **个人资料收藏**:员工可保存个人工作文字、PDF/Word/Excel/PPT、图片和网页链接;系统记录来源、收藏时间、主题、解析状态和原始附件,支持删除与导出。 - **个人资料收藏**:员工可保存个人工作文字、PDF/Word/Excel/PPT、图片和网页链接;系统记录来源、收藏时间、主题、解析状态和原始附件,支持删除与导出。
- **个人检索与问答**:支持按日期范围、主题和来源查询个人内容,例如“上周收藏了哪些保洁管理资料”;基于选定资料总结、分析和提炼行动建议,回答必须展示引用来源。 - **个人检索与问答**:支持按日期范围、主题和来源查询个人内容,例如“上周收藏了哪些保洁管理资料”;基于选定资料总结、分析和提炼行动建议,回答必须展示引用来源。
- **混合知识范围**:员工可选择仅查个人资料、仅查企业知识或在权限范围内混合查询;个人资料与企业知识分域存储,不得因个人收藏绕过企业知识密级。 - **内部知识自动路由**:员工默认只使用“工作助手”,系统在个人资料、项目业务记录和企业知识之间按意图和权限自动路由并展示实际引用;“资料范围”仅作为次级手动筛选,不要求普通员工预先理解数据域。
- **确认式长期记忆**:系统可从文字或语音转写中识别住户需求、待跟进事项和个人经验,但只能生成可编辑候选卡;用户确认后,个人经验写入本人私有域,住户需求和跟进事项写入项目业务域,后续召回必须展示来源、时间和当前状态。
- **工作思路整理**:对日常冲突、工作灵感和零散想法生成结论、行动项、待确认事项;AI 仅辅助整理,不自动代替员工对外发布或作出管理决策。 - **工作思路整理**:对日常冲突、工作灵感和零散想法生成结论、行动项、待确认事项;AI 仅辅助整理,不自动代替员工对外发布或作出管理决策。
- **内容生成**:阶段二首批提供摘要、提纲和可编辑文字;多资料对比、周报/月报和 PPT 生成作为阶段二增强项,PPT 先确认大纲与模板再生成。 - **内容生成**:阶段二首批提供摘要、提纲和可编辑文字;多资料对比、周报/月报和 PPT 生成作为阶段二增强项,PPT 先确认大纲与模板再生成。
- **分享与入库**:个人资料默认本人可见;分享给团队或沉淀为企业知识时必须由本人明确发起,经过权限校验、脱敏、审核和版本治理。 - **分享与入库**:个人资料默认本人可见;分享给团队或沉淀为企业知识时必须由本人明确发起,经过权限校验、脱敏、审核和版本治理。
- **网页安全与版权**:保留原 URL、抓取时间和正文快照;禁止访问内网地址或绕过登录/付费权限,需处理内容失效、版权与恶意页面风险。 - **网页安全与版权**:保留原 URL、抓取时间和正文快照;禁止访问内网地址或绕过登录/付费权限,需处理内容失效、版权与恶意页面风险。
- **公网查询边界**:一级只另设“查全网”;内部 AUTO 路由不得自动调用公网服务,不得自动把住户或项目内部信息带入全网查询。
- **阶段三边界**:北森、考勤、请假、组织任职等外部个人数据只在阶段三完成授权对接后使用,阶段二不得以手工复制数据伪造跨系统个人助理。 - **阶段三边界**:北森、考勤、请假、组织任职等外部个人数据只在阶段三完成授权对接后使用,阶段二不得以手工复制数据伪造跨系统个人助理。
--- ---
@@ -1,12 +1,13 @@
# 银城员工端 APP 分阶段实施总纲 # 银城员工端 APP 分阶段实施总纲
> 版本:v0.3 | 日期:2026-07-08 > 版本:v0.5 | 日期:2026-07-19
> 输入源:《基于AI的银城员工端APP项目立项与开发规划会议(2026-07-07)》纪要 +《BRD v1.1》+《AI陪练二期开发推进计划 v0.8》+《数字师傅学练问报整合方案 v1.1》(docs/20260708/)。 > 输入源:《基于AI的银城员工端APP项目立项与开发规划会议(2026-07-07)》纪要 +《BRD v1.1》+《AI陪练二期开发推进计划 v0.8》+《数字师傅学练问报整合方案 v1.1》(docs/20260708/)。
> 定位:立项会把交付物从"AI 人力资源系统"升级为**银城员工端 APP**(员工服务载体)。本总纲定义三阶段顺序与边界;各阶段的执行细节仍由对应专项计划承载(阶段一 = 二期推进计划)。 > 定位:立项会把交付物从"AI 人力资源系统"升级为**银城员工端 APP**(员工服务载体)。本总纲定义三阶段顺序与边界;各阶段的执行细节仍由对应专项计划承载(阶段一 = 二期推进计划)。
> 分阶段口径(已定):**第一步陪练相关全部工作 → 第二步银城大喇叭 + 知识学习平台 → 第三步北森人事考勤对接**。 > 分阶段口径(已定):**第一步陪练相关全部工作 → 第二步银城大喇叭 + 知识学习平台 → 第三步北森人事考勤对接**。
> v0.2 确认(2026-07-07,客户方):①"管家"与场景库"生活顾问"为**同一岗位**,术语统一为"管家(生活顾问)",`position` 标签沿用现有值不迁移;②APP 形态定为 **H5 套壳 APP**(WebView 包装可安装),原生重写不做,D6 决策维持。 > v0.2 确认(2026-07-07,客户方):①"管家"与场景库"生活顾问"为**同一岗位**,术语统一为"管家(生活顾问)",`position` 标签沿用现有值不迁移;②APP 形态定为 **H5 套壳 APP**(WebView 包装可安装),原生重写不做,D6 决策维持。
> v0.3 修订(2026-07-08,客户产品讨论):①阶段二"知识学习平台"扩充**学模块**——标准学习计划/课程/防快进视频/最短阅读时长/不定期考试,见 §4.5;②"新问题挂榜共创"产品形态定案为**开放问题榜**,定向师带徒经会议否决不做,见 §4.4;③新增知识分级访问权限工程需求;④三项待确认已获客户回复(2026-07-08):多端跳转暂缓(只保证能打开小程序页面,D6 不动)、排行榜保留为可选开关、员工评管理层按组织架构权限控制,见 §8 与《数字师傅学练问报整合方案 v1.2》§3.3。 > v0.3 修订(2026-07-08,客户产品讨论):①阶段二"知识学习平台"扩充**学模块**——标准学习计划/课程/防快进视频/最短阅读时长/不定期考试,见 §4.5;②"新问题挂榜共创"产品形态定案为**开放问题榜**,定向师带徒经会议否决不做,见 §4.4;③新增知识分级访问权限工程需求;④三项待确认已获客户回复(2026-07-08):多端跳转暂缓(只保证能打开小程序页面,D6 不动)、排行榜保留为可选开关、员工评管理层按组织架构权限控制,见 §8 与《数字师傅学练问报整合方案 v1.2》§3.3。
> v0.4 修订(2026-07-11,客户微信补充):阶段二新增**员工个人 AI 助理 / 个人知识空间**——员工收藏个人文件、表格、PPT、文字和网页链接,按时间/主题检索并生成带来源的总结与分析;PPT 生成为增强项;北森、考勤等外部个人数据仍归阶段三。 > v0.4 修订(2026-07-11,客户微信补充):阶段二新增**员工个人 AI 助理 / 个人知识空间**——员工收藏个人文件、表格、PPT、文字和网页链接,按时间/主题检索并生成带来源的总结与分析;PPT 生成为增强项;北森、考勤等外部个人数据仍归阶段三。
> v0.5 修订(2026-07-19,客户讨论确认):个人助理新增“候选记忆 → 用户确认 → 分域持久化 → 可追溯召回”闭环。一级交互只保留“工作助手 / 查全网”;个人资料、项目业务记录和企业知识由工作助手内部自动路由并展示来源,不要求普通员工理解数据域。
## 1. 立项会带来的定位变化 ## 1. 立项会带来的定位变化
@@ -103,13 +104,14 @@
### 4.6 员工个人 AI 助理 / 个人知识空间(2026-07-11 新增) ### 4.6 员工个人 AI 助理 / 个人知识空间(2026-07-11 新增)
定位:在公司公共知识库之外,为每名员工提供个人工作资料与灵感的沉淀、检索和再加工空间;入口可复用员工端「问」,但个人资料与公司知识必须分域、分权限、分来源展示。 定位:在公司公共知识库之外,为每名员工提供个人工作资料与灵感的沉淀、检索和再加工空间;入口复用员工端「问」。界面一级只区分“工作助手 / 查全网”,个人资料、项目业务记录和公司知识在工作助手内部自动路由并以引用说明实际来源,不把系统的数据域划分交给普通员工判断。
| 层级 | 能力 | 阶段口径 | | 层级 | 能力 | 阶段口径 |
|---|---|---| |---|---|---|
| MVP | 收藏个人文字、PDF/Word/Excel/PPT、图片和网页链接;自动提取正文、标题、来源、收藏时间和主题标签 | 阶段二首批 | | MVP | 收藏个人文字、PDF/Word/Excel/PPT、图片和网页链接;自动提取正文、标题、来源、收藏时间和主题标签 | 阶段二首批 |
| MVP | 按日期范围、主题、来源查询“我哪些天收藏了什么”;基于选定资料问答、总结、提炼工作想法,答案必须带来源 | 阶段二首批 | | MVP | 按日期范围、主题、来源查询“我哪些天收藏了什么”;基于选定资料问答、总结、提炼工作想法,答案必须带来源 | 阶段二首批 |
| MVP | 将冲突处理、工作灵感、保洁管理等问题交给个人助理分析;允许同时引用个人资料与有权限的企业知识 | 阶段二首批 | | MVP | 将冲突处理、工作灵感、保洁管理等问题交给个人助理分析;允许同时引用个人资料与有权限的企业知识 | 阶段二首批 |
| MVP | 从文字或语音中识别住户需求、待跟进事项和个人经验,返回可编辑确认卡;确认后个人经验写个人域,住户需求/跟进事项写项目业务域 | 阶段二首批 |
| 增强 | 多份资料对比、周报/月报、结构化汇报提纲、个人知识标签和长期记忆 | 阶段二后半 | | 增强 | 多份资料对比、周报/月报、结构化汇报提纲、个人知识标签和长期记忆 | 阶段二后半 |
| 增强 | 将总结导出为 PPT/汇报材料;先生成可编辑大纲,再生成文件,不把“一键 PPT”作为首批阻塞项 | 阶段二后半/P1 | | 增强 | 将总结导出为 PPT/汇报材料;先生成可编辑大纲,再生成文件,不把“一键 PPT”作为首批阻塞项 | 阶段二后半/P1 |
| 外部数据 | 北森、考勤、请假、组织任职等个人数据接入后再做跨系统分析 | 阶段三 | | 外部数据 | 北森、考勤、请假、组织任职等个人数据接入后再做跨系统分析 | 阶段三 |
@@ -119,6 +121,7 @@
- 个人资料默认仅本人可见;主动分享或申请进入企业知识库时必须经过权限检查、脱敏和审核,不得自动混入公司公共知识。 - 个人资料默认仅本人可见;主动分享或申请进入企业知识库时必须经过权限检查、脱敏和审核,不得自动混入公司公共知识。
- 网页链接需保留原 URL、抓取时间和正文快照;抓取必须防 SSRF、尊重访问权限与版权,登录态/付费内容不绕过授权。 - 网页链接需保留原 URL、抓取时间和正文快照;抓取必须防 SSRF、尊重访问权限与版权,登录态/付费内容不绕过授权。
- 回答需区分“个人资料”“企业 SOP”“外部网页”三类引用;未命中时明确提示,不编造来源。 - 回答需区分“个人资料”“企业 SOP”“外部网页”三类引用;未命中时明确提示,不编造来源。
- 公网查询不得由内部 AUTO 路由自动触发;必须由用户明确进入“查全网”,且不得自动携带住户或项目内部信息。
- 开工前另出专项 TechSpec,至少覆盖个人资料元数据、内容解析、个人检索空间、来源引用、删除/导出和数据保留策略。 - 开工前另出专项 TechSpec,至少覆盖个人资料元数据、内容解析、个人检索空间、来源引用、删除/导出和数据保留策略。
## 5. 阶段二不做什么(边界) ## 5. 阶段二不做什么(边界)