1. 项目概述:当五个办公产品不再各自为战,而是共用一个“大脑”
WorkBuddy 企业版套件化——这个标题里藏着一个被多数人忽略的行业拐点。它不是简单把腾讯文档、腾讯乐享、腾讯网盘这些产品打包成一个安装包,也不是做个统一登录页就叫“一体化”。真正的套件化,是让这五个产品共享同一个 Agent 底座,就像一栋五层写字楼,每层功能不同(文档协作、知识沉淀、文件存储、流程审批、会议协同),但所有电梯、消防系统、电力总控、安防中枢都由一套中央控制系统调度。这个“中枢”,就是 WorkBuddy 的 Agent 底座。
我接触过太多企业客户,他们的真实痛点从来不是“缺功能”,而是“功能太多却串不起来”。比如市场部在腾讯文档写完新品方案,要手动复制链接发到乐享做内部宣导,再上传附件到网盘供销售下载,最后还得在审批系统里走个用印流程——四个系统、六次切换、三次粘贴、两次找人确认权限。这不是效率问题,是系统架构层面的割裂。WorkBuddy 企业版套件化的本质,就是用 Agent 技术把这种“人肉搬运工”式操作,变成一次自然语言指令就能触发的端到端闭环。你说“把Q3新品方案同步给全国销售,并生成带水印的PDF下发”,底座自动识别意图、调用文档API生成版本、调用乐享API发布通知、调用网盘API生成带权限的分享链接、调用审批系统发起用印流程——全程无需人工干预,且每个环节状态可追溯、权限可审计、日志可回溯。
这个设计直接绕开了传统SOA或微服务架构下常见的“API网关黑洞”:各系统暴露接口,但缺乏语义理解能力,调用方必须精确知道每个接口的URL、参数名、鉴权方式、错误码含义。而Agent底座作为统一语义层,把“我要做什么”翻译成“该调哪个服务、传什么参数、怎么处理失败”。它不替代原有系统,而是成为它们之上的一层智能胶水。这也是为什么标题强调“统管”而非“整合”——统管意味着拥有调度权、编排权、记忆权和安全仲裁权。对IT管理员来说,这意味着权限策略只需在底座配置一次,就能生效于全部五个产品;对开发者来说,新增一个技能(Skill)只需对接底座SDK,无需逐个适配五个系统的开发规范;对终端用户来说,最直观的变化是:搜索框里输入“找上周张经理批过的合同”,结果里同时出现乐享里的审批记录、文档里的修订痕迹、网盘里的最终版PDF——跨产品信息真正实现了语义级融合。
2. 核心架构拆解:Agent 底座不是“另一个AI平台”,而是企业数字神经中枢
2.1 为什么必须是“底座”,而不是“插件”或“中间件”
很多团队尝试过用低代码平台或RPA工具做类似集成,结果无一例外陷入“越集成越脆弱”的陷阱。原因在于:插件模式要求每个产品主动开放深度能力,而成熟SaaS产品的插件机制往往只支持表层操作(如“打开文档”“发送消息”);中间件模式则把复杂性转移到集成层,一旦某个产品升级接口,整个链路就崩。WorkBuddy 的 Agent 底座选择了一条更重但也更根本的路径——它不是一个运行在应用之外的独立进程,而是以轻量级Runtime形式嵌入每个产品客户端的底层框架中。
具体来说,底座包含三个不可分割的核心组件:
- Orchestrator(编排引擎):负责将用户自然语言指令解析为DAG(有向无环图)任务流。例如“把销售日报汇总成PPT并邮件发送给总监”会被拆解为:①调用文档API读取日报模板 → ②调用网盘API拉取各区域日报 → ③调用AI模型生成数据图表 → ④调用PPT生成服务合成幻灯片 → ⑤调用邮件系统发送。关键在于,Orchestrator不硬编码任何产品逻辑,而是通过声明式Skill描述文件(JSON Schema)动态加载能力。
- Memory Core(记忆核心):这是区别于普通工作流引擎的关键。它维护三层记忆:①短期会话记忆(当前对话上下文);②长期用户记忆(个人偏好、常用操作路径、权限习惯);③组织级记忆(部门架构、审批规则、知识库结构)。所有记忆均加密存储于企业私有环境,且遵循最小权限原则——乐享模块只能读取其权限范围内的知识图谱节点,网盘模块无法访问审批系统的流程定义。
- Security Gateway(安全网关):不是简单的API鉴权代理,而是具备语义感知能力的安全控制器。当用户指令“把财务报表发给王总监”时,网关不仅验证用户是否有文档读取权,还会结合组织架构判断王总监是否属于财务汇报线、当前是否在休假、报表是否含敏感字段(自动识别身份证号/银行卡号),若任一条件不满足,则触发分级响应:静默拦截、降级发送(脱敏后)、或弹出二次确认。
提示:这种架构决定了底座无法通过“安装一个插件”实现。它需要产品团队在客户端SDK中预留Runtime Hook,在服务端部署统一的Skill Registry服务,并建立跨产品的事件总线(Event Bus)。这也是为什么WorkBuddy企业版必须以套件形式交付——单点改造无法发挥底座价值。
2.2 “五个产品”的选型逻辑:为什么是文档/乐享/网盘/审批/会议
表面上看,这五个产品覆盖了办公高频场景,但深层选型依据是“能力正交性”与“数据主权清晰度”。我们来逐个拆解:
| 产品 | 核心能力维度 | 数据主权特征 | 在底座中的角色定位 | 典型Skill示例 |
|---|---|---|---|---|
| 腾讯文档 | 实时协同编辑 | 内容即数据,版本强管控 | 事实源(Source of Truth) | “对比两个版本差异并高亮修改处” |
| 腾讯乐享 | 知识沉淀传播 | 结构化元数据丰富(标签/分类/作者) | 知识图谱构建者 | “找出近三年所有关于‘碳中和’的专家解读” |
| 腾讯网盘 | 文件全生命周期管理 | 二进制大文件为主,权限粒度细 | 统一存储枢纽(Unified Storage Hub) | “按部门自动归档上月所有合同扫描件” |
| 腾讯审批 | 流程驱动 | 状态机明确,审计要求高 | 权威决策引擎(Authoritative Engine) | “自动启动离职交接流程并分配待办” |
| 腾讯会议 | 实时音视频交互 | 实时性强,状态瞬时变化 | 感知终端(Perception Endpoint) | “会议中自动记录发言要点并关联相关文档” |
关键洞察在于:这五个产品恰好构成一个完整的“输入-处理-输出-反馈”闭环。乐享提供知识输入(政策/案例),文档提供处理载体(撰写/修订),网盘提供输出存档(终版文件),审批提供权威输出(盖章/批准),会议提供实时反馈(讨论/确认)。底座的价值,正是让这个闭环在语义层面自动流转,而非依赖人工跳转。如果换成邮箱或IM工具,虽然使用频率高,但其数据结构松散(邮件正文无结构化字段)、状态模糊(已读未读不等于决策完成),反而会污染底座的决策可靠性。
2.3 Skill 开发范式:从“写接口调用”到“定义能力契约”
传统集成开发中,开发者需要研究每个产品的API文档,处理OAuth2.0鉴权、重试机制、限流策略、错误码映射。而在WorkBuddy底座中,Skill开发被抽象为三要素契约:
- Intent Schema(意图模式):用YAML定义用户可能表达的自然语言句式。例如文档Skill的
create_document意图:
intent: create_document examples: - "新建一个项目计划书" - "帮我写一份XX项目的立项报告" - "创建空白Word文档,标题是‘技术方案V2’" slots: title: type: string required: true template_id: type: string required: false底座的NLU引擎会基于这些样例训练意图识别模型,开发者无需关心分词或实体抽取细节。
- Execution Handler(执行处理器):一段标准Go函数(底座Runtime原生支持),接收解析后的slot参数,调用对应产品SDK:
func CreateDocument(ctx context.Context, req *CreateDocRequest) (*CreateDocResponse, error) { // 自动注入当前用户token,无需手动管理 doc, err := documentSDK.Create(ctx, &documentSDK.CreateParams{ Title: req.Title, TemplateID: req.TemplateID, Owner: ctx.User().ID, // 从上下文自动获取 }) if err != nil { return nil, errors.Wrap(err, "failed to create document") } return &CreateDocResponse{DocID: doc.ID}, nil }- Permission Policy(权限策略):声明该Skill需要哪些权限,由Security Gateway统一执行:
{ "required_scopes": ["document:write"], "data_filters": { "department": ["current_user_department"] } }这种范式带来的质变是:开发者不再为“如何调用API”操心,而是专注“这个能力应该怎样被用户理解和使用”。我们曾让一个刚毕业的实习生,在三天内为乐享开发了“智能知识推荐”Skill——他只需要定义5个意图样例、写20行Handler代码、配置3条权限规则,其余全部由底座自动完成。而同样功能,传统方式需要两周:研究乐享API、调试OAuth、处理各种4xx/5xx错误、编写前端调用逻辑。
3. 实操落地关键:从零搭建Agent底座的六个必经阶段
3.1 阶段一:环境准备与底座Runtime部署(耗时约2小时)
底座Runtime并非黑盒二进制,而是开源可审计的容器化服务。企业需在自有K8s集群或虚拟机中部署三个核心服务:
- orchestrator-service:编排引擎主服务,建议至少2核4G,挂载持久化存储用于DAG缓存
- memory-service:记忆核心,必须启用TLS双向认证,推荐使用企业级Redis Cluster(6.2+)作为后端,禁用默认密码
- gateway-service:安全网关,需前置WAF设备,所有流量必须经此服务路由
注意:切勿将底座部署在公有云默认VPC中。我们遇到过某客户因未隔离网络,导致网关服务意外暴露公网,虽未造成数据泄露,但触发了企业安全审计红线。正确做法是:在企业内网划分独立子网段(如10.100.0.0/24),仅开放8080(HTTP管理端口)和8443(HTTPS业务端口)至办公网段,其他端口全部关闭。
部署命令示例(以K8s为例):
# 创建专用命名空间 kubectl create namespace workbuddy-core # 部署Orchestrator(需提前配置好etcd地址) kubectl apply -f orchestrator-deployment.yaml -n workbuddy-core # 部署Memory Service(连接企业Redis) kubectl apply -f memory-deployment.yaml -n workbuddy-core # 修改ConfigMap中的redis.host为内网地址 kubectl edit configmap memory-config -n workbuddy-core # 部署Gateway(启用mTLS) kubectl apply -f gateway-deployment.yaml -n workbuddy-core # 生成并挂载企业CA证书 kubectl create secret generic gateway-tls --from-file=tls.crt --from-file=tls.key -n workbuddy-core实测心得:首次部署最易卡在证书配置。Gateway默认使用自签名证书,但企业Chrome策略通常禁止访问。务必提前准备好企业CA签发的证书,并在gateway-deployment.yaml中指定tlsSecretName: gateway-tls。我们曾帮一家金融客户调试了7小时,最终发现是证书链不完整——他们的CA证书缺少中间证书,导致浏览器提示“NET::ERR_CERT_AUTHORITY_INVALID”。
3.2 阶段二:五个产品客户端SDK接入(耗时约1-2天/产品)
这不是简单的“引入SDK包”,而是重构客户端的初始化流程。以腾讯文档Windows客户端为例,接入步骤如下:
- 修改主进程入口:在
main.go中插入底座初始化代码:
func main() { // 原有初始化逻辑... // 新增:启动底座Runtime agentRuntime, err := agent.NewRuntime(&agent.Config{ GatewayEndpoint: "https://gateway.internal.company.com:8443", AppID: "workbuddy-docs", // 产品唯一标识 LogLevel: "info", }) if err != nil { log.Fatal("Failed to init agent runtime:", err) } defer agentRuntime.Close() // 启动文档主界面 app.Run() }- 注册Product-Specific Skills:在文档模块中定义Skill实现:
// docs/skills/export_skill.go func init() { agent.RegisterSkill("export_to_pdf", &ExportToPDFSkill{}) } type ExportToPDFSkill struct{} func (s *ExportToPDFSkill) Execute(ctx context.Context, params map[string]interface{}) (map[string]interface{}, error) { // 获取当前文档ID(从客户端上下文自动注入) docID := ctx.Value("current_doc_id").(string) // 调用文档服务生成PDF pdfBytes, err := docService.ExportPDF(ctx, docID) if err != nil { return nil, err } // 自动保存到网盘(通过底座调用,非直连网盘API) _, err = agent.CallSkill(ctx, "netdisk:upload_file", map[string]interface{}{ "filename": "report.pdf", "content": base64.StdEncoding.EncodeToString(pdfBytes), "folder_path": "/exports/", }) return map[string]interface{}{"status": "success"}, nil }- UI层集成搜索框:在文档顶部菜单栏添加统一搜索入口,输入时自动触发底座NLU:
// 前端JS监听搜索框 searchInput.addEventListener('input', async (e) => { const query = e.target.value; if (query.length < 2) return; try { // 调用底座API进行意图识别 const response = await fetch('/api/v1/orchestrator/intent', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({query}) }); const result = await response.json(); // 显示意图建议(如“导出为PDF”、“分享给张经理”) showIntentSuggestions(result.intents); } catch (err) { console.error('Intent detection failed:', err); } });关键提醒:所有Skill执行必须通过
agent.CallSkill()而非直连产品API。这是安全网关生效的前提。我们见过某开发为图省事,在审批Skill中直接调用approvalService.Approve(),导致权限校验被绕过——当用户试图审批自己提交的流程时,本应拒绝,却因绕过网关而成功。务必在Code Review中加入这条检查项。
3.3 阶段三:组织架构与权限体系映射(耗时约半天)
底座的权限模型基于RBAC(角色)+ ABAC(属性)混合策略。企业需将现有AD/LDAP组织结构映射到底座:
- 角色映射:将AD中的
OU=Finance,CN=Users,DC=company,DC=com映射为底座角色finance_member,并赋予document:read、netdisk:download等基础权限 - 属性注入:在用户登录时,底座从AD获取扩展属性(如
departmentCode、jobLevel),用于ABAC策略:
{ "rule": "allow", "conditions": [ { "attribute": "user.departmentCode", "operator": "==", "value": "FIN" }, { "attribute": "resource.sensitivity", "operator": "<=", "value": "L2" } ] }实操技巧:首次同步建议采用“增量同步+人工校验”模式。先同步100个测试用户,观察底座日志中的sync_user_event,确认部门、职级、直属上级等字段准确无误。特别注意:AD中manager字段存储的是DN(Distinguished Name),需转换为底座可识别的user_id格式。我们封装了一个转换脚本:
def ad_dn_to_user_id(dn): # CN=ZhangSan,OU=Tech,DC=company,DC=com -> zhangsan@company.com cn_part = dn.split(',')[0].replace('CN=', '') domain = '.'.join([dc.replace('DC=', '') for dc in dn.split(',') if dc.startswith('DC=')]) return f"{cn_part.lower()}@{domain}"3.4 阶段四:核心Skill开发与测试(耗时约3-5天)
优先开发高频、高价值的10个基础Skill,覆盖80%日常场景。我们推荐按此顺序开发:
document:create(新建文档)netdisk:search(跨文件搜索)approval:start(发起审批)lehe:search_knowledge(知识库检索)meeting:record_summary(会议纪要生成)document:compare_versions(版本对比)netdisk:share_with_permission(智能分享)approval:delegate(审批委托)lehe:tag_suggestion(知识打标)all:cross_product_search(全局搜索)
每个Skill必须通过三重测试:
- 单元测试:模拟
Execute()函数输入输出,覆盖率≥85% - 集成测试:在测试环境调用真实产品API,验证端到端流程
- 安全测试:使用Burp Suite重放请求,验证网关是否拦截越权操作
实测避坑:
netdisk:searchSkill最容易出问题。网盘API返回的文件列表包含file_id和path,但底座记忆核心要求所有资源ID必须全局唯一。我们曾遇到某客户因网盘ID重复(不同租户间ID冲突),导致搜索结果错乱。解决方案是在Skill中将file_id与tenant_id拼接为全局ID:tenant123_file456,并在Memory Core中以此为Key存储。
3.5 阶段五:用户培训与渐进式推广(耗时约1周)
切忌“全员上线”。我们采用三级灰度策略:
- 种子用户(5人):IT部门+行政主管+三位高频用户,提供1v1陪跑,收集原始反馈
- 部门试点(50人):选择一个协作密集的部门(如市场部),关闭旧式操作入口,强制使用底座搜索框
- 全公司推广:制作《WorkBuddy一句话指令手册》,印刷成卡片放在每位员工键盘旁
培训重点不是教“怎么点按钮”,而是培养“自然语言思维”:
- 错误示范:“打开文档→点击分享→输入邮箱→发送”
- 正确示范:“把这份方案分享给销售总监张伟,设置只读权限,有效期7天”
我们发现,用户接受度与指令长度呈反比。超过8个字的指令,使用率下降40%。因此优化了NLU模型,对高频短句做特殊优化:
- “发给张总” → 自动补全为“分享给销售总监张伟”
- “找合同” → 自动限定为“搜索网盘中名称含‘合同’且最近修改的PDF文件”
3.6 阶段六:监控告警与持续优化(长期进行)
底座自带Prometheus指标暴露端点,需配置以下核心监控:
| 指标类别 | 关键指标 | 告警阈值 | 诊断意义 |
|---|---|---|---|
| 编排引擎 | orchestrator_dag_execution_duration_seconds | >5s(P95) | DAG执行超时,可能API响应慢 |
| 记忆核心 | memory_cache_hit_ratio | <80% | 缓存失效频繁,需优化查询模式 |
| 安全网关 | gateway_blocked_requests_total | >10次/分钟 | 大量越权请求,可能存在攻击 |
| Skill健康度 | skill_execution_errors_total{skill="document:create"} | >5次/小时 | 文档创建Skill异常,需检查SDK |
实操经验:某次生产环境出现gateway_blocked_requests_total突增,排查发现是新上线的meeting:record_summarySkill未正确处理会议录音权限。当用户在未授权的会议中尝试生成纪要时,网关拦截后返回403,但前端未友好提示,导致用户反复重试。解决方案:在Skill中增加预检逻辑:
func (s *MeetingSummarySkill) Execute(ctx context.Context, params map[string]interface{}) (map[string]interface{}, error) { meetingID := params["meeting_id"].(string) // 预检:用户是否有该会议录音权限 hasPermission, err := meetingService.HasRecordingPermission(ctx, meetingID) if err != nil { return nil, err } if !hasPermission { return nil, agent.NewUserError("您无权访问本次会议录音,请联系会议主持人授权") } // 执行后续逻辑... }4. 深度场景实战:五个典型工作流的Agent化改造
4.1 场景一:新员工入职流程(跨4产品自动化)
传统流程:HR在审批系统发起入职申请→IT在网盘创建账号模板→行政在乐享发布欢迎公告→部门负责人在文档中分配任务。平均耗时3.2个工作日。
Agent化改造后,HR只需在审批系统提交申请时勾选“启用智能入职”,底座自动触发:
- 审批系统:监听
on_approval_submitted事件,获取新员工姓名、部门、岗位 - 网盘系统:调用
netdisk:create_folder创建/employees/{name}/目录,预置入职材料模板 - 乐享系统:调用
lehe:publish_post发布欢迎公告,自动@部门成员,附网盘目录链接 - 文档系统:调用
document:create_from_template生成《入职任务清单》,分配给直属上级 - 会议系统:调用
meeting:schedule预约“入职引导会”,邀请IT/行政/部门负责人
关键技术点:事件驱动架构。底座通过企业服务总线(ESB)订阅各产品事件,而非轮询API。我们为腾讯系产品定制了Webhook适配器,确保事件100ms内送达。某次压测显示,当并发入职申请达200/分钟时,事件延迟仍保持在<200ms,远优于传统API轮询(平均延迟1.8s)。
4.2 场景二:项目结项知识沉淀(跨3产品闭环)
传统操作:项目经理整理文档→手动复制内容到乐享→在网盘归档→邮件通知相关人员。知识碎片化,复用率低于15%。
Agent化流程:项目经理在文档末尾输入“/archive_project”,底座执行:
- 文档分析:提取文档标题、参与人、关键里程碑、风险项,生成结构化摘要
- 乐享发布:调用
lehe:create_article,自动填充摘要,并关联文档原文、网盘归档链接 - 网盘归档:调用
netdisk:move将文档及所有附件移至/projects/archive/{project_name}/,设置只读权限 - 智能打标:调用
lehe:tag_suggestion,基于文档内容推荐标签(如“AI模型”“合规审计”),人工确认后生效
实测效果:某金融科技客户实施后,项目知识复用率提升至63%,新员工熟悉项目平均时间从14天缩短至3.5天。更关键的是,当用户搜索“风控模型上线流程”时,乐享返回的结果不仅包含历史文章,还高亮显示相关文档中的具体章节、网盘中的测试报告、审批系统中的上线申请——这才是真正的跨产品知识图谱。
4.3 场景三:销售合同智能管理(安全与效率平衡)
痛点:合同分散在网盘、邮件、文档中,审批流程不透明,敏感信息易泄露。
Agent化方案:
- 智能识别:用户上传PDF合同时,底座自动调用OCR+NER模型,识别甲方/乙方/金额/签约日期/保密条款
- 权限动态生成:根据识别出的甲方名称,自动匹配预设的客户分级策略(如“世界500强”客户合同,仅允许法务+销售总监查看)
- 审批联动:检测到“金额>100万”时,自动在审批系统创建“大额合同审批”流程,预填关键字段
- 水印控制:对外分享时,自动添加动态水印(含查看人姓名、时间、IP),网盘下载时强制触发
安全实践:我们坚持“数据不动,模型动”原则。OCR/NLP模型部署在企业内网,原始PDF文件从不离开网盘存储。识别结果以结构化JSON返回底座,敏感字段(如身份证号)自动脱敏存储。某次安全审计中,审计方特别表扬了这一设计——它避免了将原始文件传输至第三方AI服务的风险。
4.4 场景四:跨部门协作会议(从记录到行动)
传统会议:主持人记笔记→会后整理纪要→邮件发送→人工跟进任务。任务遗漏率高达37%。
Agent化会议:
- 实时转录:会议中自动开启语音转文字,区分发言人
- 智能摘要:识别决策项(“同意”“通过”“确定”)、待办项(“张三负责”“下周提交”)、风险项(“存在合规风险”)
- 自动分发:生成纪要后,自动在文档中创建《会议纪要》页面,在乐享发布摘要,在审批系统创建待办任务
- 进度追踪:每周自动扫描待办,向责任人发送提醒,并在乐享更新任务状态看板
技术亮点:采用多模态理解。不仅分析语音文本,还结合会议系统API获取屏幕共享内容(如PPT页码)、参会人在线状态(判断是否全程参与)。当检测到某人在关键决策页离线时,底座会标记该决策需二次确认。
4.5 场景五:IT故障应急响应(分钟级闭环)
挑战:故障信息散落在监控系统、IM群、文档中,响应链条长。
Agent化响应:
- 故障发现:监听Zabbix/Prometheus告警,触发
incident:createSkill - 信息聚合:自动拉取相关文档(运维手册)、乐享知识(历史故障案例)、网盘日志(最近备份)
- 智能分派:根据告警类型(DB/APP/NET)和值班表,自动@对应工程师,并在审批系统创建紧急工单
- 过程记录:所有沟通、操作、验证结果自动写入文档《故障处理日志》,关联原始告警
某次数据库宕机事件中,从告警触发到工程师收到完整处置指引(含手册链接、历史案例、备份位置),仅用47秒。而传统方式平均需6.5分钟——这6分钟,往往是业务损失最大的黄金时间。
5. 常见问题与实战排查指南
5.1 问题一:Skill执行失败,日志显示“rpc error: code = Unavailable desc = connection refused”
现象:在文档中点击“导出为PDF”无响应,底座日志报RPC连接拒绝。
排查路径:
- 检查
orchestrator-servicePod状态:kubectl get pods -n workbuddy-core | grep orchestrator - 若Pod为
CrashLoopBackOff,进入容器查看日志:kubectl logs -n workbuddy-core orchestrator-xxxxx - 常见原因:
orchestrator配置的memory-service地址错误。默认配置为memory-service.workbuddy-core.svc.cluster.local:8080,但实际部署时可能用了不同命名空间或端口。
速查表:
| 检查项 | 正确值 | 错误示例 | 修复命令 |
|---|---|---|---|
| Memory Service DNS | memory-service.workbuddy-core.svc.cluster.local | memory-service.default.svc.cluster.local | kubectl edit svc memory-service -n workbuddy-core |
| Memory Service Port | 8080 | 80 | kubectl edit svc memory-service -n workbuddy-core |
| Orchestrator Config | memory_endpoint: "http://memory-service.workbuddy-core.svc.cluster.local:8080" | memory_endpoint: "localhost:8080" | kubectl edit cm orchestrator-config -n workbuddy-core |
经验之谈:我们给所有客户部署时,都会在
orchestrator-config中加入健康检查端点。在K8s readinessProbe中配置:
readinessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 30 periodSeconds: 10这样当Memory Service未就绪时,Orchestrator会自动停止接收请求,避免雪崩。
5.2 问题二:全局搜索返回空结果,但单产品搜索正常
现象:在底座搜索框输入“Q3财报”,文档/网盘/乐享各自能搜到相关内容,但全局搜索无结果。
根因分析:全局搜索依赖Memory Core的跨产品索引,而索引构建需要各产品主动推送变更事件。常见断点:
- 文档未配置Webhook推送
document_updated事件 - 网盘未启用“文件变更通知”开关
- 乐享知识库未开启“API同步”功能
验证方法:
- 登录Memory Service管理后台(
https://memory.internal.company.com/admin) - 查看
index_status面板,检查各产品索引的last_sync_time - 若某产品
last_sync_time为null或超过1小时,说明事件推送中断
修复步骤:
- 对文档:进入“管理后台→系统设置→Webhook”,添加URL
https://memory.internal.company.com/v1/webhook/document - 对网盘:在管理员控制台开启“文件事件通知”,目标URL同上
- 对乐享:在知识库设置中启用“外部系统同步”,填写相同Webhook地址
关键技巧:Memory Core的Webhook采用幂等设计。即使同一事件重复推送10次,索引也只更新一次。因此不必担心网络重试导致的数据污染。
5.3 问题三:用户反馈“指令识别不准”,如“把合同发给张总”识别为“创建新文档”
现象:NLU模型对特定指令泛化能力弱,准确率低于70%。
优化方案:
- 收集bad case:在底座管理后台开启
intent_debug_mode,记录所有识别错误的query - 扩充训练样本:针对错误样本,按Intent Schema格式补充10-20个变体
- 原错误query:“把合同发给张总”
- 新增样例:
- "把这份合同发给张总监" - "分享合同给张伟" - "把当前文档发给销售部张伟"
- 重新训练模型:调用底座API触发模型热更新:
curl -X POST https://orchestrator.internal.company.com/api/v1/nlu/retrain \ -H "Authorization: Bearer $TOKEN" \ -d '{"intent": "netdisk:share_with_permission"}'
避坑提醒:不要一次性重训所有Intent。我们曾因重训document:create导致document:export识别率下降——因为两个Intent的样例存在语义重叠(“新建”vs“导出”)。正确做法是:每次只重训一个出问题的Intent,并在测试环境验证相关Intent不受影响。
5.4 问题四:审批流程中,底座调用审批API返回“invalid token”
现象:approval:startSkill执行失败,错误码指向Token无效。
深度排查:
- 检查底座与审批系统的OAuth2.0配置:
- Client ID/Secret是否匹配?
- Redirect URI是否为
https://gateway.internal.company.com/callback? - Scope是否包含
approval:write?
- 检查Token有效期:审批系统Token默认2小时,而底座Memory Core缓存Token72小时。当Token过期时,底座未自动刷新。
永久解决方案:
- 在审批Skill中实现Token自动刷新逻辑:
func (s *ApprovalSkill) Execute(ctx context.Context, params map[string]interface{}) (map[string]interface{}, error) { token, err := s.getToken(ctx) if err != nil { return nil, err } // 调用审批API resp, err := approvalClient.Create(ctx, token, params) if isTokenExpired(err) { // 刷新Token并重试 newToken, _ := s.refreshToken(ctx) resp, err = approvalClient.Create(ctx, newToken, params) } return resp, err }- 在底座配置中启用
auto_refresh_token: true,由Orchestrator统一管理Token生命周期。
5.5 问题五:安全网关拦截了合法请求,用户无法访问自己的文件
现象:用户A能正常访问网盘,但通过底座搜索“我的合同”时被拦截。
根本原因:ABAC策略中resource.owner字段未正确传递。网盘API返回的文件对象中,owner_id字段为user_123,而底座期望的是zhangsan@company.com格式。
修复方法:
- 在网盘Skill的
Execute()函数中,统一转换Owner ID:
func (s *NetDiskSkill)