From c95a9c4c951b7ed619fb7def2730d2f6619c3369 Mon Sep 17 00:00:00 2001 From: lik Date: Tue, 1 Sep 2026 23:32:54 +0800 Subject: [PATCH] tmp --- agent/escort/agent.js | 75 ++-- agent/escort/prompts.js | 9 +- .../skills/medical-escort-standard/SKILL.md | 52 +++ .../medical-escort-standard/standard.md | 331 ++++++++++++++++++ conf.json | 2 + 5 files changed, 444 insertions(+), 25 deletions(-) create mode 100644 agent/escort/skills/medical-escort-standard/SKILL.md create mode 100644 agent/escort/skills/medical-escort-standard/standard.md diff --git a/agent/escort/agent.js b/agent/escort/agent.js index a93e149..7f338b7 100644 --- a/agent/escort/agent.js +++ b/agent/escort/agent.js @@ -15,6 +15,9 @@ import { } from "./tools/index.js"; export default class EscortAgent { + // 历史消息字符数上限,超出时从头部丢弃完整轮次 + static MAX_HISTORY_CHARS = config.agent.maxHistoryChars || 40000; + constructor() { } @@ -22,13 +25,39 @@ export default class EscortAgent { this.messages = []; } + // 按字符数裁剪历史:只以 HumanMessage 为界从头部删除完整轮次, + // 避免切断 AI(tool_calls) -> Tool 的链式结构;永远保留最新一轮 + _trimHistory() { + const size = (msgs) => msgs.reduce((sum, m) => sum + (m.text?.length ?? 0), 0); + if (size(this.messages) <= EscortAgent.MAX_HISTORY_CHARS) { + return; + } + + const starts = []; + this.messages.forEach((m, i) => { + if (HumanMessage.isInstance(m)) starts.push(i); + }); + if (starts.length < 2) { + return; + } + + let cut = 0; + for (let i = 0; i < starts.length - 1; i++) { + cut = starts[i + 1]; + if (size(this.messages.slice(cut)) <= EscortAgent.MAX_HISTORY_CHARS) { + break; + } + } + this.messages = this.messages.slice(cut); + logger.info(`History trimmed to ${this.messages.length} messages, ${size(this.messages)} chars`); + } + // msg: { ts: "2023-08-01 10:00:00", content: "你好" } async streamChat(userInfo, msgs, callback) { if (!msgs.length) { return; } - const agent = this._genAgent(userInfo); msgs.forEach(msg => { if (msg.type === "clear") { this.messages = []; @@ -42,6 +71,10 @@ export default class EscortAgent { return; } + this._trimHistory(); + + // 在处理完 clear 消息后再生成 agent,确保清空后使用新实例 + const agent = this._genAgent(userInfo); const INTERESTING_NODES = new Set(["model_request", "tools"]); for await (const [namespace, mode, data] of await agent.stream( { messages: this.messages }, @@ -55,27 +88,27 @@ export default class EscortAgent { const isSubagent = namespace.some(s => s.startsWith("tools:")); const source = isSubagent ? "subagent" : "main"; if (mode === "updates") { - for (const nodeName of Object.keys(data)) { - if (!INTERESTING_NODES.has(nodeName)) continue; - // Main agent updates (empty namespace) - if (namespace.length === 0) { - for (const [nodeName, data_] of Object.entries(data)) { - if (nodeName === "tools") { - // Subagent results returned to main agent - for (const msg of data_.messages ?? []) { - if (msg.type === "tool") { - logger.info(`Subagent complete: ${msg.name}, Result: ${String(msg.content).slice(0, 200)}`); - } + // Main agent updates (empty namespace) + if (namespace.length === 0) { + for (const [nodeName, data_] of Object.entries(data)) { + if (!INTERESTING_NODES.has(nodeName)) continue; + if (nodeName === "tools") { + // 工具结果必须并入历史,否则下一轮会出现 tool_calls 缺少对应 tool 结果的断链 + for (const msg of data_.messages ?? []) { + if (msg.type === "tool") { + this.messages.push(msg); + logger.info(`Tool complete: ${msg.name}, Result: ${String(msg.content).slice(0, 200)}`); } - } else if (nodeName === "model_request") { - this.messages.push(...data_.messages); } + } else if (nodeName === "model_request") { + this.messages.push(...data_.messages); } - } else { - // Subagent updates (non-empty namespace) - for (const [nodeName, data_] of Object.entries(data)) { - logger.info(`[${namespace[0]}] step: ${nodeName}`); - } + } + } else { + // Subagent updates (non-empty namespace) + for (const nodeName of Object.keys(data)) { + if (!INTERESTING_NODES.has(nodeName)) continue; + logger.info(`[${namespace[0]}] step: ${nodeName}`); } } } else if (mode === "messages") { @@ -87,10 +120,10 @@ export default class EscortAgent { continue; } if (AIMessageChunk.isInstance(message)) { - if (message.text && !message.tool_call_chunks?.length) { + if (message.text) { callback(source, "ai", message.text, message.id); } - if (message.additional_kwargs.reasoning_content && !message.tool_call_chunks?.length) { + if (message.additional_kwargs.reasoning_content) { callback(source, "reasoning", message.additional_kwargs.reasoning_content, message.id); } } diff --git a/agent/escort/prompts.js b/agent/escort/prompts.js index 0e56e69..e229f44 100644 --- a/agent/escort/prompts.js +++ b/agent/escort/prompts.js @@ -40,10 +40,11 @@ class Prompts { # 铁律 1. 服务相关回答必须基于参考信息,不编造。 -2. 感知用户情绪,给予共情回应。 -3. 涉及医疗问题,提醒以医生诊断为准。 -4. 超出能力范围,引导联系客服。 -5. 保护用户隐私,提示AI内容需甄别。 +2. 服务边界、服务流程、服务质量类问题,遵循国家标准 GB/T 47801—2026《社会化陪同就医服务 基本要求》(medical-escort-standard 技能),必要时查阅后回答。 +3. 感知用户情绪,给予共情回应。 +4. 涉及医疗问题,提醒以医生诊断为准。 +5. 超出能力范围,引导联系客服。 +6. 保护用户隐私,提示AI内容需甄别。 ## 参考信息 用户信息:${userInfo_str}; diff --git a/agent/escort/skills/medical-escort-standard/SKILL.md b/agent/escort/skills/medical-escort-standard/SKILL.md new file mode 100644 index 0000000..45378d7 --- /dev/null +++ b/agent/escort/skills/medical-escort-standard/SKILL.md @@ -0,0 +1,52 @@ +--- +name: medical-escort-standard +description: 《社会化陪同就医服务 基本要求》国家标准(GB/T 47801—2026)要点与全文。当用户咨询陪诊服务范围、服务边界(能做什么/不能做什么)、服务流程、服务质量、投诉处理、陪诊员职责,或需要引用国家标准作为回答依据时,先读本文件要点,再按需读同目录 standard.md 核对条款原文。 +--- + +# GB/T 47801—2026《社会化陪同就医服务 基本要求》 + +首项陪诊服务国家标准。2026-07-02 发布,2026-11-01 实施,全国服务标准化技术委员会(SAC/TC 264)归口,中国标准化研究院牵头起草。 + +## 何时使用 + +- 用户询问陪诊员能做什么、不能做什么(服务边界) +- 用户询问服务流程(下单前中后各环节)、服务交付规范 +- 用户质疑服务质量、提出投诉,需要标准依据 +- 回答需要权威出处、避免编造时 + +## 使用方法 + +1. 先用本文件的"要点速查"回答一般性问题 +2. 涉及具体条款时,读同目录 `standard.md` 核对原文后再回答,**不凭记忆编造条款** + +## 要点速查(源自市场监管总局官方解读) + +### 服务边界(最重要,第 8 章) + +**8.1 可开展**(需服务对象或其法定监护人同意): +领取预约号;代买或代取基础医疗用品;引导至指定科室/检查室/治疗区域;预检核查、候检准备;样本送检;领取药物和检查结果(必要时代发快递);记录医嘱;代取、复印病历、诊断证明等医疗文书;办理出入院手续;办理缴费;生活辅助(预订交通、餐饮、临时保管物品等);情感支持。 + +**8.2 不应开展**: +检查结果判读;参与医疗操作;提供医疗建议;代替服务对象或家属选择或同意治疗方案;调整用药方案;关键医疗信息的隐瞒、篡改和选择性传递;签署具有法律效力的医疗文书。 + +### 服务流程(3 阶段) + +服务信息提供 → 委托与受理 → 服务交付。关键节点:信息公示、需求评估、合同订立、服务执行与收尾;并要求建立服务评价与投诉管理机制,持续改进。 + +### 服务框架(7 个方面) + +服务提供者、服务用品、服务平台、服务人员、服务内容、服务评价与改进,以及贯穿其中的服务流程。 + +### 服务提供者要求 + +涵盖人力资源管理、信息管理、安全管理、合同与收费管理;具体包括人员准入与培训、服务用品配备、服务对象敏感信息保护(引用 GB/T 35273 个人信息安全规范)、服务对象风险评估与应急预案、服务合同订立与收费公示。 + +### 术语要点 + +- 服务提供者限定为"机构",区别于志愿服务 +- "服务对象"(接受服务的就医者)与"顾客"(购买方)是两个概念,适配子女为父母购买服务等场景 +- 陪同就医服务人员(陪诊员)直接服务对象;服务支持人员(订单管理员、客服、技术支持)提供支持 + +## 全文 + +完整条文见同目录 `standard.md`(前言、正文 1-10 章、参考文献,由官方 PDF 转录)。 diff --git a/agent/escort/skills/medical-escort-standard/standard.md b/agent/escort/skills/medical-escort-standard/standard.md new file mode 100644 index 0000000..37c8266 --- /dev/null +++ b/agent/escort/skills/medical-escort-standard/standard.md @@ -0,0 +1,331 @@ +# GB/T 47801—2026 社会化陪同就医服务 基本要求 + +> Commercial patient companion service—General requirements +> ICS 03.080, CCS A 16 +> 2026-07-02 发布,2026-11-01 实施 +> 国家市场监督管理总局、国家标准化管理委员会 发布 +> +> 本文由官方 PDF 逐页转录,全文完整(正文 1-10 章及参考文献)。 + +## 前言 + +本文件按照 GB/T 1.1—2020《标准化工作导则 第1部分:标准化文件的结构和起草规则》的规定起草。 + +请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别专利的责任。 + +本文件由全国服务标准化技术委员会(SAC/TC 264)提出并归口。 + +本文件起草单位:中国标准化研究院、国家卫生健康委科学技术研究所、国家卫生健康委卫生发展研究中心、上海交通大学医学院附属上海儿童医学中心、山东第二医科大学附属医院、湖州市中心医院、中国中医药研究促进会、中国技术创业协会、中国社会福利与养老服务协会、中国社会工作学会、青岛大学附属医院、中国中医科学院西苑医院、石河子大学、北京橙医健康科技有限公司、上海泰禾颐健康管理有限公司、中国标准化协会、北京樾动科技有限公司、常州市养老服务指导中心、攀枝花学院、中国医药教育协会、上海心广体胖管理咨询有限公司、上海陪诊医家科技有限公司、上海快易师健康服务有限公司、陕西医健达康健康科技有限公司、江苏小易陪伴科技有限公司、国投沪康(上海)养老服务有限公司。 + +本文件主要起草人:陈萌、付强、郑娟尔、侯非、高武、果吉尔锑、郝晓宁、常勇杰、杜玥瑾、匡晓华、赵朝、卢笛、王瑞芳、郭春莉、单信芝、张永峰、王娜娜、张雨辰、罗婉莹、李刚、刘建国、费园艳、姬春、蒋可心、姜宇鑫、王光然、毛玉江、张超、徐建中、徐玉娟、冯奇、王萼、林进、马建明、陈丽红、费青云、徐波、张志援、王才发、韩元良、左彭湘、刘拓、邵建锋、孙昊明、曹琴、李强、刘洪山、杨凌鹤。 + +## 1 范围 + +本文件界定了社会化陪同就医服务相关术语,规定了服务提供者、服务用品、服务平台、服务人员、服务内容、服务评价与改进的要求,确立了服务流程。 + +本文件适用于社会化陪同就医服务机构的管理。 + +## 2 规范性引用文件 + +下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中,注日期的引用文件,仅该日期对应的版本适用于本文件;不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。 + +GB/T 35273 信息安全技术 个人信息安全规范 + +## 3 术语和定义 + +下列术语和定义适用于本文件。 + +### 3.1 社会化陪同就医服务 commercial patient companion service + +由服务提供者(3.2)为服务对象(3.3)提供的辅助性就医活动。 + +### 3.2 服务提供者 service provider + +通过提供社会化陪同就医服务(3.1)获取收益的机构。 + +### 3.3 服务对象 patient + +因行动、认知、地域差异等原因导致的就医不便者,或追求更好就医体验的个人。 + +### 3.4 顾客 customer + +购买社会化陪同就医服务(3.1)的组织或个人。 + +### 3.5 陪同就医服务人员 patient companion + +直接为服务对象(3.3)提供社会化陪同就医服务(3.1)的人员。 + +### 3.6 服务支持人员 operational support specialist + +为服务对象(3.3)、顾客(3.4)和陪同就医服务人员(3.5)提供支持的人员。 + +示例:订单管理员、客服人员、技术支持人员。 + +## 4 服务提供者 + +### 4.1 基本要求 + +服务提供者应依法进行工商登记,配备与所提供服务匹配的服务人员、服务用品和服务平台,建立服务管理制度,并接受社会监督。 + +### 4.2 服务管理 + +#### 4.2.1 人力资源管理 + +4.2.1.1 服务提供者配备的专职服务人员应符合第 7 章提出的要求。 + +4.2.1.2 服务提供者应组织服务人员完成岗前培训,并定期提供专项培训。 +注:培训内容包括操作性培训、专业能力培训、安全与应急培训、心理健康培训、人文素养培训等。 + +4.2.1.3 服务提供者应定期核验陪同就医服务人员(以下简称"陪同人员")的健康证明。 + +4.2.1.4 服务提供者应建立人员聘用管理制度,明确劳动合同或劳务合同的签订、履行及终止等要求,规范双方的权利和义务。 + +4.2.1.5 服务提供者宜建立陪同人员信息公示机制。 +示例:公示信息包括基本信息(如健康证明有效期、培训记录、服务年限和累计服务次数等)、专业技能(如擅长服务场景、掌握的特殊技能、过往服务评价等)等。 + +4.2.1.6 服务提供者宜建立陪同人员分级及订单匹配制度。 + +#### 4.2.2 信息管理 + +4.2.2.1 服务提供者应建立服务对象信息管理制度,按照 GB/T 35273 的要求管理服务对象的信息。 + +4.2.2.2 服务提供者应在服务对象授权同意的前提下收集和使用其信息。 + +4.2.2.3 服务提供者应保护服务对象的信息,防止信息泄露、丢失。 + +#### 4.2.3 安全管理 + +4.2.3.1 服务提供者应建立服务对象风险评估制度,评估和识别服务对象风险,评估结果应作为服务方案制定的依据。 + +4.2.3.2 服务提供者应制定服务安全规范,明确陪同人员在服务过程中的安全注意事项。 + +4.2.3.3 服务提供者应制定多场景突发事件应急预案,并定期组织培训和应急演练。 +注:包括服务对象突发情况、医疗场所意外事件、服务人员与顾客冲突、信息泄露等场景。 + +4.2.3.4 服务提供者宜为陪同人员购买意外险或相关保险。 + +4.2.3.5 服务提供者宜建立服务过程记录与追溯机制,对关键服务节点进行记录与监测。 + +#### 4.2.4 合同与收费管理 + +4.2.4.1 服务提供者应与顾客签订书面服务合同或电子服务合同。 + +4.2.4.2 服务提供者应通过服务平台对收费标准进行公示。服务实际收费应符合收费标准。 + +## 5 服务用品 + +5.1 服务提供者应配备必要服务用品,包括但不限于: + +- 移动辅助设备; + 示例1:轮椅、拐杖等。 +- 卫生防护用品。 + 示例2:口罩、呕吐袋等。 + +5.2 服务用品应符合质量与安全要求。 + +5.3 服务提供者应定期维护、补充服务用品,满足正常服务交付的需求。 + +## 6 服务平台 + +6.1 服务提供者应建立服务平台。服务平台具备但不限于以下功能: + +- 服务内容展示与项目选择; +- 陪同人员信息展示与选择; +- 服务预约; +- 订单管理; +- 在线支付与结算; +- 服务评价与反馈; +- 个人账号管理。 + +6.2 服务平台应安全、可靠、稳定,能够满足服务需求。 + +## 7 服务人员 + +### 7.1 陪同人员 + +7.1.1 陪同人员应满足以下基本要求: + +- 遵守医疗机构规章制度,不扰乱诊疗秩序,不误导服务对象,不干预医务人员的专业决策; +- 参加岗前培训并考核通过; +- 定期参加专项培训; +- 持有效期内的健康证明。 + +7.1.2 陪同人员应具备以下职业道德和职业素养: + +- 具备同理心和人文关怀,能主动关怀服务对象身心状态; +- 尊重服务对象的自主选择权、决策权、个人习惯和民族习俗; +- 良好的责任意识和守时观念; +- 心理素质好,善于自我调节情绪; +- 保护患者信息和隐私。 + +7.1.3 陪同人员应掌握以下专业知识: + +- 医疗场馆常识; + 示例1:挂号流程、医院科室布局、终端服务设备使用方法等。 +- 基本安全知识; + 示例2:医院应急疏散路线、常见突发事件(如摔倒、晕厥)的应对。 +- 其他满足陪同就医服务正常开展的专业知识。 + +7.1.4 陪同人员应具备以下职业能力: + +- 就医安排能力; + 示例1:就诊信息的梳理、就诊流程的安排等。 +- 协调与沟通能力; + 示例2:协助医患沟通、就诊信息的记录和转达等。 +- 情绪支持能力; + 示例3:陪伴、倾听、安抚等支持。 +- 应急能力。 + +### 7.2 服务支持人员 + +服务支持人员应满足以下要求: + +- 具备与岗位职责相匹配的专业知识和职业能力; + 示例:订单管理员具备服务需求评估、人员匹配和调度等相关知识和能力;客服人员具备客服工具使用、沟通和协调等相关知识和能力;技术支持人员具备服务平台构建和运维等相关知识和能力。 +- 隐私保护意识,对接触的服务对象信息、服务数据及内部运营信息严格保密; +- 沟通协调能力,能有效对接服务对象、陪同人员。 + +## 8 服务内容 + +8.1 陪同人员应在服务对象或其法定监护人同意的前提下,协助服务对象开展以下活动: + +- 领取预约号; +- 代买或代取基础医疗用品; + 示例1:轮椅、陪护床、一次性口罩等。 +- 引导服务对象至指定科室、检查室或治疗区域; +- 预检核查、候检准备; +- 样本送检; +- 领取药物和检查结果,必要时代发快递; +- 记录医嘱; +- 代取、复印病历、诊断证明等医疗文书; +- 办理出入院手续; +- 办理缴费; +- 生活辅助; + 示例2:预订交通工具、餐饮、临时保管物品等。 +- 情感支持。 + +8.2 陪同人员不应开展以下服务: + +- 检查结果判读; +- 参与医疗操作; +- 提供医疗建议; +- 代替服务对象或家属选择或同意治疗方案; +- 调整用药方案; +- 关键医疗信息的隐瞒、篡改和选择性传递; +- 签署具有法律效力的医疗文书。 + +## 9 服务流程 + +### 9.1 服务信息提供 + +9.1.1 服务提供者应为顾客和服务对象提供服务相关信息,主要包括: + +- 服务提供者基本情况; +- 服务内容; +- 陪同服务人员技能特征; +- 收费标准,以及预订、支付规定; +- 服务变更手续; + 示例:变更申请时限、流程和费用调整规则等。 +- 服务承诺和风险提示; +- 投诉渠道。 + +9.1.2 服务提供者应为顾客提供信息咨询服务,对顾客希望了解的服务相关事项应进行解释说明;咨询渠道宜方便、快捷、畅通。 + +9.1.3 服务信息应真实、完整、清晰,与实际的服务交付一致。 + +### 9.2 委托与受理 + +9.2.1 服务提供者应采集服务对象基本信息及需求,并对服务风险进行评估。如不能接受委托,应向顾客说明理由。如可接受委托的,应与顾客或服务对象共同商定服务方案,服务方案应获得顾客或服务对象同意。服务方案应包括以下内容: + +- 服务对象信息; +- 服务核心目标; +- 服务项目; +- 服务时间和地点; +- 服务人员配置; +- 服务用品保障; +- 服务流程; +- 风险评估与应对预案; +- 服务沟通机制。 + +9.2.2 服务提供者应与顾客在平等、自愿、信息对称的情况下订立服务合同,服务合同的条款应公平、公正。 + +9.2.3 服务合同应包括以下内容: + +- 服务方案; +- 服务费用及明细; + 注:含单项服务的单价、总价及可能产生的额外费用说明。 +- 服务变更手续; +- 投诉与纠纷解决方法; +- 隐私保护; +- 风险提示; +- 权利义务、法律责任及免责条件; +- 影响服务质量的其他关键要素; +- 服务终止条件。 + +9.2.4 服务提供者应告知、提醒顾客注意服务合同中与顾客和服务对象利益密切相关的内容,并根据顾客要求进行说明、解释。 + +9.2.5 服务提供者应为顾客提供多种支付方式,当适用某种支付方式将产生额外费用时,服务提供者应在支付前向顾客说明。 + +9.2.6 在完成支付后,服务提供者应为顾客提供支付凭证和消费明细,支付凭证和消费明细应准确、详细。 + +### 9.3 服务交付 + +#### 9.3.1 陪同就医服务前 + +9.3.1.1 服务提供者应提前与顾客或服务对象沟通,包括但不限于以下内容: + +- 陪同家属信息确认; +- 就诊材料携带提醒; +- 服务对象行动能力与特殊需求; +- 服务人员信息告知; +- 应急联系人确认。 + +9.3.1.2 服务提供者应提前核查医院最新信息,确保就医流程规划的准确性。 +注:如医生出诊时间、挂号规则变动等。 + +#### 9.3.2 陪同就医服务中 + +9.3.2.1 陪同人员应核对服务对象信息。 + +9.3.2.2 陪同人员应为服务对象提供与服务合同、信息宣传一致的服务,不应擅自变更服务项目。 + +9.3.2.3 陪同人员应在服务对象同意的前提下,协助保管医疗单据及相关证件。 + +9.3.2.4 陪同人员应尊重服务对象的隐私和自主权,不代替服务对象做决策。 + +9.3.2.5 如遇突发情况,陪同人员应立即启动应急预案,应急预案内容可包括: + +- 第一时间联系医院医护人员及应急联系人; +- 向服务提供者报告; +- 保留现场记录(如照片、视频、沟通记录),作为后续说明依据。 + +#### 9.3.3 陪同就医服务后 + +9.3.3.1 陪同人员应清点就诊材料,并逐项交由服务对象或其法定监护人签收。 + +9.3.3.2 如有后续需要的服务材料,陪同人员应告知服务对象领取方式。 +示例:延迟出具的检查报告、外送检验结果、特殊药品处方等。 + +9.3.3.3 陪同人员应提醒服务对象或其法定监护人谨遵医嘱。 + +9.3.3.4 陪同人员应在每次服务后,对服务过程进行记录和总结。 + +## 10 服务评价与改进 + +10.1 服务提供者应建立服务评价和投诉管理机制,定期收集来自内外的信息,开展服务评价。信息收集渠道包括但不限于: + +- 客服电话、线上服务平台; +- 意见反馈表、投诉邮箱; +- 定期回访。 + +10.2 服务提供者应根据服务评价结果,制定整改措施,明确责任人和完成时限,持续改进、不断提高服务水平。 + +## 参考文献 + +[1] 中华人民共和国医师法 +[2] 中华人民共和国基本医疗卫生与健康促进法 +[3] 中华人民共和国消费者权益保护法 +[4] 中华人民共和国个人信息保护法 +[5] 医疗机构管理条例 +[6] 中华人民共和国消费者权益保护法实施条例 +[7] 国家职业技能标准 社群健康助理员(2021年版) diff --git a/conf.json b/conf.json index 59a53a3..d8aeaa5 100644 --- a/conf.json +++ b/conf.json @@ -6,6 +6,8 @@ } }, "agent": { + "maxHistoryChars": 40000, + "model": "deepseek", "deepseek": { "apiKey": "sk-a58ccd82b7ba4ce3ac176a88c9381095", "flashModel": "deepseek-v4-flash",