diff --git a/skills_developing/nfc-medicine-lookup/SKILL.md b/skills_developing/nfc-medicine-lookup/SKILL.md new file mode 100644 index 0000000..fc4e934 --- /dev/null +++ b/skills_developing/nfc-medicine-lookup/SKILL.md @@ -0,0 +1,179 @@ +--- +name: nfc-medicine-lookup +description: 药品检索技能,通过NFC芯片ID或药品名称查询药品信息。当用户提交NFC芯片ID、扫描药品标签、提到药品名称想了解用法、或提到"NFC"+"药"相关词汇时使用此技能。以语音助手身份向老人介绍药名、用途和用法用量。 +--- + +# NFC 药品检索 + +## Skill Structure + +``` +nfc-medicine-lookup/ +├── SKILL.md # Core instruction file (this file) +├── skill.yaml # Skill metadata +├── scripts/ +│ └── nfc_medicine_lookup.py # Main lookup script +``` + +## Overview + +通过 **NFC芯片ID** 或 **药品名称** 查询对应的药品信息。本技能面向老年用户,以**语音助手**的身份,用简洁、亲切、易懂的语言告知: + +1. 药品名称 +2. 这个药是干什么的 +3. 具体用法用量 +4. 注意事项 + +## 查询方式 + +支持两种查询入口,**至少提供一种**即可: + +| Parameter | Description | Type | Required | +|-----------|-------------|------|----------| +| **nfc_id** | NFC芯片ID(如 100000) | string | 二选一 | +| **name** | 药品名称,支持模糊匹配(如"阿莫西林") | string | 二选一 | + +## Quick Start + +```bash +# 方式一:通过NFC ID查询 +scripts/nfc_medicine_lookup.py --nfc-id "100000" + +# 方式二:通过药品名称查询 +scripts/nfc_medicine_lookup.py --name "阿莫西林" +``` + +## 查询流程 + +请严格按照以下流程执行: + +### Step 1: 本地数据库查询 + +运行脚本查询本地药品库: + +```bash +# 有NFC ID时 +scripts/nfc_medicine_lookup.py --nfc-id "{nfc_id}" + +# 有药品名称时 +scripts/nfc_medicine_lookup.py --name "{药品名称}" +``` + +### Step 2: 判断查询结果 + +- **查到了** → 跳到 Step 4(语音回复) +- **输出包含 `NOT_FOUND`** → 进入 Step 3(网络搜索兜底) + +### Step 3: 网络搜索兜底(本地未命中时) + +当本地药品库中查不到时,使用 WebSearch 工具搜索该药品的信息: + +``` +WebSearch: "{药品名称} 用法用量 注意事项 说明书" +``` + +从搜索结果中提取以下信息: +- 药品全称 +- 药品类别 +- 主要功效/适应症 +- 用法用量 +- 关键注意事项 + +**重要**:网络搜索到的信息,回复时必须在末尾加上免责提醒: +> 以上信息来自网络搜索,仅供参考。具体用药请遵医嘱,或咨询药师确认。 + +### Step 4: 以语音助手身份回复 + +无论信息来自本地库还是网络搜索,都按照下方「语音助手回复规范」进行回复。 + +## 语音助手回复规范 + +查询到药品后,你需要以**关怀老人的语音助手**身份回复。请遵循以下规范: + +### 回复模板 + +``` +您好,这个药叫**{药品名称}**,属于{药品类别}。 + +**它的作用是**:{简洁描述药品用途} + +**怎么吃**:{用法用量,用口语化表达} + +**要注意**:{关键注意事项} + +如果有任何不舒服,一定要及时告诉家人或去看医生哦。 +``` + +### 语言风格要求 + +- 使用口语化、亲切的表达,像家人在旁边叮嘱一样 +- 避免专业术语,用老人能听懂的话 +- 关键信息(药名、用量)要**重点强调** +- 结尾加上一句关心的话 +- 整段回复控制在150字以内,适合语音播报 + +### 示例回复 + +**示例1:NFC ID查询命中** + +输入: NFC ID = 100000 + +> 您好,这个药叫**阿莫西林胶囊**,是一种消炎药。 +> +> **它的作用是**:用来治疗细菌引起的感染,比如嗓子发炎、咳嗽有痰这些情况。 +> +> **怎么吃**:每次吃1粒,每天吃3到4次,每次间隔6到8个小时。记得在饭后吃,用温水把整粒药吞下去,不要嚼碎。 +> +> **要注意**:如果您对青霉素过敏,这个药就不能吃。另外,医生让吃几天就吃几天,不要觉得好了就自己停药。 +> +> 如果吃药后有任何不舒服,一定要及时告诉家人或去看医生哦。 + +**示例2:药品名称查询命中** + +输入: name = "布洛芬" + +> 您好,这个药叫**布洛芬缓释胶囊**,是一种止痛退烧药。 +> +> **它的作用是**:用来缓解头痛、牙痛、关节痛,感冒发烧也可以吃。 +> +> **怎么吃**:每次吃1粒,早晚各一次,饭后用温水整粒吞下去。 +> +> **要注意**:有胃病的人要小心,连续吃不要超过5天,要是还疼就去看医生。 +> +> 如果吃药后有任何不舒服,一定要及时告诉家人或去看医生哦。 + +**示例3:本地未命中,网络搜索兜底** + +输入: name = "氯雷他定"(本地库没有) + +> 您好,这个药叫**氯雷他定片**,是一种抗过敏药。 +> +> **它的作用是**:用来缓解过敏引起的打喷嚏、流鼻涕、皮肤发痒这些症状。 +> +> **怎么吃**:每次吃1片,每天吃1次就行,饭前饭后都可以。 +> +> **要注意**:吃了这个药可能会有点犯困,吃药后尽量别开车。 +> +> 以上信息来自网络搜索,仅供参考。具体用药请遵医嘱,或咨询药师确认。 +> +> 如果有任何不舒服,一定要及时告诉家人或去看医生哦。 + +## NFC ID 药品对照表 + +| NFC ID | 药品名称 | 类别 | +|--------|---------|------| +| 100000 | 阿莫西林胶囊 | 抗生素 | +| 100001 | 硝苯地平控释片 | 降压药 | +| 100002 | 二甲双胍片 | 降糖药 | +| 100003 | 阿司匹林肠溶片 | 抗血小板药 | +| 100004 | 辛伐他汀片 | 降脂药 | +| 100005 | 氨氯地平片 | 降压药 | +| 100006 | 美托洛尔缓释片 | 降压药/心率控制 | +| 100007 | 奥美拉唑肠溶胶囊 | 胃药 | +| 100008 | 氯吡格雷片 | 抗血小板药 | +| 100009 | 螺内酯片 | 利尿药 | +| 100010 | 复方丹参滴丸 | 心血管中成药 | +| 100011 | 蒙脱石散 | 止泻药 | +| 100012 | 布洛芬缓释胶囊 | 解热镇痛药 | +| 100013 | 碳酸钙D3片 | 补钙药 | +| 100014 | 甲钴胺片 | 营养神经药 | diff --git a/skills_developing/nfc-medicine-lookup/scripts/nfc_medicine_lookup.py b/skills_developing/nfc-medicine-lookup/scripts/nfc_medicine_lookup.py new file mode 100755 index 0000000..24ee714 --- /dev/null +++ b/skills_developing/nfc-medicine-lookup/scripts/nfc_medicine_lookup.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python3 +"""NFC药品检索脚本 - 通过NFC芯片ID查询对应药品信息""" + +import argparse +import json +import sys + +# NFC ID 与药品对应表 +NFC_MEDICINE_DB = { + "100000": { + "name": "阿莫西林胶囊", + "category": "抗生素", + "description": "用于治疗细菌感染,如呼吸道感染、泌尿道感染、皮肤软组织感染等。", + "dosage": "成人一次0.5g(1粒),每6-8小时一次,一日3-4次。饭后服用,用温水整粒吞服。", + "caution": "对青霉素过敏者禁用。需按疗程服用,不要自行停药。" + }, + "100001": { + "name": "硝苯地平控释片", + "category": "降压药", + "description": "用于治疗高血压,帮助控制血压,预防心脑血管意外。", + "dosage": "成人一次30mg(1片),一日1次。每天固定时间服用,整片吞服,不可掰开或嚼碎。", + "caution": "不可突然停药,需遵医嘱逐渐减量。服药期间避免吃柚子。" + }, + "100002": { + "name": "二甲双胍片", + "category": "降糖药", + "description": "用于治疗2型糖尿病,帮助控制血糖水平。", + "dosage": "成人起始剂量一次0.25g(1片),一日2-3次,随餐服用。可根据血糖情况遵医嘱调整用量。", + "caution": "肾功能不全者慎用。服药期间需定期监测血糖。" + }, + "100003": { + "name": "阿司匹林肠溶片", + "category": "抗血小板药", + "description": "用于预防心脑血管血栓形成,降低心梗和脑梗的风险。", + "dosage": "成人一次100mg(1片),一日1次。每天固定时间服用,饭前用温水整片吞服,不可嚼碎。", + "caution": "有胃溃疡病史者慎用。服药期间如有异常出血请及时就医。" + }, + "100004": { + "name": "辛伐他汀片", + "category": "降脂药", + "description": "用于降低血液中的胆固醇,预防动脉硬化和心血管疾病。", + "dosage": "成人一次20mg(1片),一日1次,晚间服用效果最佳。", + "caution": "服药期间避免大量饮用柚子汁。如出现肌肉疼痛请及时就医。" + }, + "100005": { + "name": "氨氯地平片", + "category": "降压药", + "description": "用于治疗高血压和心绞痛,帮助平稳降低血压。", + "dosage": "成人一次5mg(1片),一日1次。每天同一时间服用即可,不受进食影响。", + "caution": "首次服用可能出现头晕,起身时请缓慢。不可突然停药。" + }, + "100006": { + "name": "美托洛尔缓释片", + "category": "降压药/心率控制", + "description": "用于治疗高血压、心绞痛和心律不齐,帮助减慢心率、降低血压。", + "dosage": "成人一次47.5mg(1片),一日1次,早晨服用。整片吞服,不可掰开或嚼碎。", + "caution": "不可突然停药,需遵医嘱逐渐减量。心率过慢时请咨询医生。" + }, + "100007": { + "name": "奥美拉唑肠溶胶囊", + "category": "胃药", + "description": "用于治疗胃酸过多、胃溃疡、反流性食管炎,保护胃黏膜。", + "dosage": "成人一次20mg(1粒),一日1次,早晨饭前服用。整粒吞服,不可打开胶囊。", + "caution": "不宜长期服用,一般疗程4-8周。长期使用需定期复查。" + }, + "100008": { + "name": "氯吡格雷片", + "category": "抗血小板药", + "description": "用于预防血栓形成,常用于放过支架或有心梗脑梗风险的患者。", + "dosage": "成人一次75mg(1片),一日1次。每天固定时间服用,不受进食影响。", + "caution": "服药期间注意观察有无异常出血。手术前需提前告知医生正在服用此药。" + }, + "100009": { + "name": "螺内酯片", + "category": "利尿药", + "description": "用于治疗水肿和高血压,帮助排出体内多余水分,减轻心脏负担。", + "dosage": "成人一次20mg(1片),一日1-2次,早晨服用为宜。", + "caution": "服药期间需注意监测血钾,避免食用过多含钾高的食物如香蕉、橙子。" + }, + "100010": { + "name": "复方丹参滴丸", + "category": "心血管中成药", + "description": "用于活血化瘀,理气止痛。常用于冠心病、心绞痛的日常预防和缓解。", + "dosage": "一次10丸,一日3次。舌下含服效果更好,也可用温水吞服。", + "caution": "孕妇禁用。如胸痛持续不缓解,请立即就医。" + }, + "100011": { + "name": "蒙脱石散", + "category": "止泻药", + "description": "用于治疗腹泻,保护肠道黏膜,吸附肠道内的毒素和细菌。", + "dosage": "成人一次1袋(3g),一日3次。倒入半杯温水中搅匀后服用,建议空腹服用。", + "caution": "服用后可能引起便秘,症状缓解后可停药。与其他药物需间隔2小时服用。" + }, + "100012": { + "name": "布洛芬缓释胶囊", + "category": "解热镇痛药", + "description": "用于缓解头痛、牙痛、关节痛、肌肉痛以及感冒引起的发热。", + "dosage": "成人一次1粒(300mg),一日2次,早晚各一次。饭后服用,用温水整粒吞服。", + "caution": "有胃溃疡病史者慎用。连续使用不超过5天,如疼痛持续请就医。" + }, + "100013": { + "name": "碳酸钙D3片", + "category": "补钙药", + "description": "用于补充钙质和维生素D,预防和治疗骨质疏松。", + "dosage": "成人一次1片,一日1-2次。嚼碎后吞服或整片吞服均可,建议随餐服用。", + "caution": "肾结石患者慎用。每日补钙不宜超过医生建议量。" + }, + "100014": { + "name": "甲钴胺片", + "category": "营养神经药", + "description": "用于治疗周围神经病变,如手脚麻木、刺痛,常见于糖尿病引起的神经损伤。", + "dosage": "成人一次0.5mg(1片),一日3次,饭后服用。", + "caution": "避光保存。如服用一个月后症状无改善,请咨询医生。" + }, +} + + +def lookup_by_nfc_id(nfc_id: str) -> dict | None: + """通过NFC ID查询药品信息""" + return NFC_MEDICINE_DB.get(nfc_id) + + +def lookup_by_name(name: str) -> list[dict]: + """通过药品名称模糊查询,返回匹配的药品列表(含nfc_id)""" + results = [] + for nfc_id, medicine in NFC_MEDICINE_DB.items(): + if name in medicine["name"]: + results.append({"nfc_id": nfc_id, **medicine}) + return results + + +def format_voice_response(medicine: dict, nfc_id: str | None = None) -> str: + """格式化为语音助手风格的回复""" + lines = [ + f"## 药品识别结果\n", + ] + if nfc_id: + lines.append(f"**NFC ID**:{nfc_id}\n") + lines.extend([ + f"**药品名称**:{medicine['name']}\n", + f"**药品类别**:{medicine['category']}\n", + f"### 这个药是做什么的\n", + f"{medicine['description']}\n", + f"### 用法用量\n", + f"{medicine['dosage']}\n", + f"### 注意事项\n", + f"{medicine['caution']}", + ]) + return "\n".join(lines) + + +def main(): + parser = argparse.ArgumentParser(description="NFC药品检索 - 通过NFC芯片ID或药品名称查询药品信息") + parser.add_argument("--nfc-id", "-n", help="NFC芯片ID") + parser.add_argument("--name", "-m", help="药品名称(支持模糊匹配)") + args = parser.parse_args() + + if not args.nfc_id and not args.name: + print("错误:请提供 --nfc-id 或 --name 参数。") + sys.exit(1) + + if args.nfc_id: + medicine = lookup_by_nfc_id(args.nfc_id) + if medicine is None: + print(f"NOT_FOUND: 未找到NFC ID为 {args.nfc_id} 对应的药品记录。") + sys.exit(1) + print(format_voice_response(medicine, nfc_id=args.nfc_id)) + else: + results = lookup_by_name(args.name) + if not results: + print(f"NOT_FOUND: 本地药品库中未找到包含「{args.name}」的药品。") + sys.exit(1) + for r in results: + nfc_id = r.pop("nfc_id") + print(format_voice_response(r, nfc_id=nfc_id)) + print("\n---\n") + + +if __name__ == "__main__": + main() diff --git a/skills_developing/nfc-medicine-lookup/skill.yaml b/skills_developing/nfc-medicine-lookup/skill.yaml new file mode 100644 index 0000000..4a0aa7d --- /dev/null +++ b/skills_developing/nfc-medicine-lookup/skill.yaml @@ -0,0 +1,20 @@ +name: nfc-medicine-lookup +version: 1.0.0 +description: NFC药品检索技能,通过NFC芯片ID查询对应药品信息,以语音助手身份向老人介绍药名、用途和用法用量 +author: + name: sparticle + email: support@gbase.ai +license: MIT +tags: + - nfc + - medicine + - elderly-care + - voice-assistant +runtime: + python: ">=3.7" +entry_point: scripts/nfc_medicine_lookup.py +config: + nfc_id: + type: string + required: true + description: NFC芯片ID