add nfc-medicine-lookup

This commit is contained in:
朱潮 2026-04-03 21:10:19 +08:00
parent 0d18c2fc61
commit cc7336b3a4
3 changed files with 379 additions and 0 deletions

View File

@ -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字以内适合语音播报
### 示例回复
**示例1NFC 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 | 甲钴胺片 | 营养神经药 |

View File

@ -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.5g1粒每6-8小时一次一日3-4次。饭后服用用温水整粒吞服。",
"caution": "对青霉素过敏者禁用。需按疗程服用,不要自行停药。"
},
"100001": {
"name": "硝苯地平控释片",
"category": "降压药",
"description": "用于治疗高血压,帮助控制血压,预防心脑血管意外。",
"dosage": "成人一次30mg1片一日1次。每天固定时间服用整片吞服不可掰开或嚼碎。",
"caution": "不可突然停药,需遵医嘱逐渐减量。服药期间避免吃柚子。"
},
"100002": {
"name": "二甲双胍片",
"category": "降糖药",
"description": "用于治疗2型糖尿病帮助控制血糖水平。",
"dosage": "成人起始剂量一次0.25g1片一日2-3次随餐服用。可根据血糖情况遵医嘱调整用量。",
"caution": "肾功能不全者慎用。服药期间需定期监测血糖。"
},
"100003": {
"name": "阿司匹林肠溶片",
"category": "抗血小板药",
"description": "用于预防心脑血管血栓形成,降低心梗和脑梗的风险。",
"dosage": "成人一次100mg1片一日1次。每天固定时间服用饭前用温水整片吞服不可嚼碎。",
"caution": "有胃溃疡病史者慎用。服药期间如有异常出血请及时就医。"
},
"100004": {
"name": "辛伐他汀片",
"category": "降脂药",
"description": "用于降低血液中的胆固醇,预防动脉硬化和心血管疾病。",
"dosage": "成人一次20mg1片一日1次晚间服用效果最佳。",
"caution": "服药期间避免大量饮用柚子汁。如出现肌肉疼痛请及时就医。"
},
"100005": {
"name": "氨氯地平片",
"category": "降压药",
"description": "用于治疗高血压和心绞痛,帮助平稳降低血压。",
"dosage": "成人一次5mg1片一日1次。每天同一时间服用即可不受进食影响。",
"caution": "首次服用可能出现头晕,起身时请缓慢。不可突然停药。"
},
"100006": {
"name": "美托洛尔缓释片",
"category": "降压药/心率控制",
"description": "用于治疗高血压、心绞痛和心律不齐,帮助减慢心率、降低血压。",
"dosage": "成人一次47.5mg1片一日1次早晨服用。整片吞服不可掰开或嚼碎。",
"caution": "不可突然停药,需遵医嘱逐渐减量。心率过慢时请咨询医生。"
},
"100007": {
"name": "奥美拉唑肠溶胶囊",
"category": "胃药",
"description": "用于治疗胃酸过多、胃溃疡、反流性食管炎,保护胃黏膜。",
"dosage": "成人一次20mg1粒一日1次早晨饭前服用。整粒吞服不可打开胶囊。",
"caution": "不宜长期服用一般疗程4-8周。长期使用需定期复查。"
},
"100008": {
"name": "氯吡格雷片",
"category": "抗血小板药",
"description": "用于预防血栓形成,常用于放过支架或有心梗脑梗风险的患者。",
"dosage": "成人一次75mg1片一日1次。每天固定时间服用不受进食影响。",
"caution": "服药期间注意观察有无异常出血。手术前需提前告知医生正在服用此药。"
},
"100009": {
"name": "螺内酯片",
"category": "利尿药",
"description": "用于治疗水肿和高血压,帮助排出体内多余水分,减轻心脏负担。",
"dosage": "成人一次20mg1片一日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.5mg1片一日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()

View File

@ -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