AI智能问药 (AI Drug Consultant)
AI智能问药技能,基于腾讯 ADP 平台的药品咨询 API,支持文本和图片两种方式查询药品信息。结合药品说明书知识库,回答药品用法用量、副作用、禁忌、药物相互作用等专业问题,同时支持拍药盒识别药品。
触发条件
当满足以下任一条件时,激活本技能:
- 用户明确要求使用 AI 智能问药 Skill:用户主动提及"问药"、"智能问药"、"药品咨询"等关键词,或直接要求使用本技能
- 纯文本药品问答:用户以文本形式提出药品相关问题,如药品用法用量、副作用、禁忌、药物相互作用、适应症等
- 带图片的药品问答:用户提供药品图片(药盒、说明书、药片等),要求识别药品或基于图片进行药品咨询
参数收集
调用 API 前,需从用户输入中收集以下参数:
| 参数 | 是否必填 | 说明 |
|---|---|---|
| 用户输入内容 | ✅ 必填 | 本次用户输入的问题内容,最多 1000 字符,超出自动截断 |
| 图片 URL | ❌ 选填 | 药品相关图片的可访问 URL;如用户提供本地文件,需先通过 upload_image.py 调用 ADP 文件服务接口上传获取媒体 URL |
基础目录
{{SKILL_BASE_DIR}} 代表本技能的根目录。
首次激活流程
> ⚠️ 必须先检查,严禁直接引导用户配置密钥。 多数情况下密钥已存在,跳过检查直接提醒是错误行为。
密钥检查(强制执行,不可跳过)
首次激活时,Agent 必须先执行以下检查,静默完成,不输出任何提示给用户:
# 步骤 1: 检查当前 shell 环境变量
echo $ADP_API_KEY
# 步骤 2: 如果为空,检查 /etc/environment 文件
grep "ADP_API_KEY" /etc/environment 2>/dev/null
检查结果分支:
- ✅ 找到密钥 → 流程结束,直接进入正常使用流程。 不输出任何关于密钥的提示。
- ❌ 未找到密钥 → 才进入下方「密钥获取流程」。
> 💡 脚本已内置 fallback:脚本会自动依次查找 os.environ → /etc/environment → ~/.env → .env
密钥获取流程(仅在上方检查未找到密钥时执行)
> 🚫 再次确认:如果上方检查已找到密钥,禁止执行本节。
主流程
告知用户需要 ADP API Key,引导用户按以下步骤操作:
- 访问 ADP 密钥管理页面
- 点击「新建密钥」
- 复制并提供密钥
> ⚠️ 权限提示(必须展示):如果用户无法访问该页面,说明当前账号权限不够,请联系管理员开通权限。
⚠️ 密钥最多只能创建 2 个。如提示已达上限,需先删除旧密钥再新建。
兜底流程(上述链接未正常跳转时):
- 访问 ADP 控制台
- 点击「产品体验」按钮
- 使用主账号登录
- 点击右上角头像 → 「企业管理」→「密钥管理」
- 点击「新建密钥」
密钥存储(仅在用户提供新密钥后执行)
用户提供密钥后,存储到环境中。
主方案:写入 /etc/environment(全局生效,需 sudo 权限):
echo 'ADP_API_KEY=<用户提供的密钥>' | sudo tee -a /etc/environment > /dev/null
source /etc/environment
兜底方案:无 sudo 权限时,写入项目 .env 文件:
echo 'ADP_API_KEY=<用户提供的密钥>' >> .env
⚠️ 变量名必须为 ADP_API_KEY,不可更改。
存储完成后告知用户密钥已保存。
工具选择
本技能提供两个 API 工具,根据用户需求自动选择:
| 场景 | 选择工具 | 说明 |
|---|---|---|
| 用户提供了药品图片 | LLMDiagnosisDrug | 支持图文混合的药品问答 |
| 纯文本药品问题 | LLMDiagnosisDrugChat | 纯文本药品问答,更轻量 |
选择逻辑:
- 用户提供图片(本地文件或 URL) → 使用 LLMDiagnosisDrug
- 仅文本问题 → 使用 LLMDiagnosisDrugChat
调用流程
场景A:纯文本药品问答
直接运行 call_drug_api.py 脚本:
python3 {{SKILL_BASE_DIR}}/scripts/call_drug_api.py "布洛芬的用法用量是什么?"
或指定对话ID以支持多轮对话:
python3 {{SKILL_BASE_DIR}}/scripts/call_drug_api.py "它有什么副作用?" --dialogue-id "abc123def456"
场景B:带图片的药品问答
图片为公开URL
直接传入图片URL:
python3 {{SKILL_BASE_DIR}}/scripts/call_drug_api.py "这是什么药?" --image-url "https://example.com/drug.jpg"
图片为本地文件
先使用上传脚本调用 ADP 文件服务接口获取媒体 URL,再调用 API:
# 第一步:通过 ADP 文件服务上传图片获取媒体 URL
IMAGE_URL=$(python3 {{SKILL_BASE_DIR}}/scripts/upload_image.py /path/to/drug_photo.jpg)
# 第二步:使用媒体 URL 调用 API
python3 {{SKILL_BASE_DIR}}/scripts/call_drug_api.py "这是什么药?帮我看看用法" --image-url "$IMAGE_URL"
⚠️ 关键提醒:API 的 ImageUrl 参数要求可访问的 URL。本地文件必须先通过 upload_image.py 调用 ADP 文件服务接口上传,获取 COS 媒体 URL 后再传入。上传接口使用与问药 API 相同的 ADP_API_KEY,无需额外配置。
脚本用法参考
# 纯文本问药
python3 {{SKILL_BASE_DIR}}/scripts/call_drug_api.py "阿莫西林和头孢能一起吃吗?"
# 带图片问药
python3 {{SKILL_BASE_DIR}}/scripts/call_drug_api.py "这个药怎么吃?" -i "https://example.com/drug.jpg"
# 指定工具
python3 {{SKILL_BASE_DIR}}/scripts/call_drug_api.py "感冒吃什么药?" -t LLMDiagnosisDrugChat
# 获取原始JSON(用于调试)
python3 {{SKILL_BASE_DIR}}/scripts/call_drug_api.py "布洛芬" --raw
输出结果整理
脚本返回的结果包含多个维度信息,整理为统一的回答时遵循以下规则:
- 主要回答(Content):作为核心回答内容输出
- 药品列表(DrugList):列出识别到的药品,包含药品名、商品名、厂商、分类(处方药/非处方药)和说明书链接
- 引用资料(ReferResourceItems):标注回答内容的引用来源
- 猜你想问(GuessQuestions):作为延伸建议提供给用户
- 敏感词提醒(IsSensitive):如果为 true,需提醒用户回答内容可能涉及敏感信息
- 思考过程(Think):如有,可选择性展示 AI 的推理过程
整合输出格式建议:
- 先给出药品回答(Content)
- 如有药品列表,以结构化方式展示药品信息和说明书链接
- 如有引用资料,在回答末尾标注来源
- 最后提供「猜你想问」作为后续建议
API 参考
完整的 API 参数和响应格式详见:{{SKILL_BASE_DIR}}/references/api_reference.md
关键搜索模式(用于在参考文档中快速定位):
- grep "DrugList" - 药品列表结构
- grep "ReferResourceItems" - 引用资料结构
- grep "HighlightWords" - 高亮词结构
- grep "错误处理" - 错误码说明
注意事项
- Message 长度限制:最多 1000 字符,超出自动截断
- DialogueId 规范:10-40 字符,用于多轮对话关联上下文
- 流式接口:两个工具均为流式返回,脚本已自动聚合处理
- 处方药提醒:当 DrugCategory=1(处方药)时,应提醒用户遵医嘱使用
- 依赖:脚本需要
requests库,如未安装可执行pip install requests
常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 401 Unauthorized | API Key 无效或未设置 | 检查 ADP_API_KEY 环境变量,重新获取密钥 |
| 配额不足 / quota exceeded | 调用次数超出套餐限额 | 前往 https://buy.cloud.tencent.com/adp 购买套餐或增购包 |
| 返回内容不完整 | 流式响应未完全读取 | 检查网络连接,重试请求 |
| 密钥创建提示已达上限 | 最多只能创建 2 个密钥 | 删除旧的不用的密钥,再新建 |
| 超时 | 网络问题 | 重试请求 |
配额不足处理
当接口返回配额不足错误(如 Code=3000003、quota exceeded 等)时:
- 脚本会自动识别并输出配额不足的提示信息
- 请引导用户前往 ADP 购买页面 购买套餐或增购包
- 购买完成后重新调用即可