TencentCloud ADP - 药品说明书查询 (LLMQueryDrugInstructions)
> ADP 药品说明书查询 Skill | 本 Skill 调用 ADP 平台的 LLMQueryDrugInstructions 插件 API,支持输入药品相关问题,返回匹配药品的结构化信息(药品名、商品名、生产企业、规格、用法用量、适应症、不良反应)和说明书链接。
概述
本技能提供药品信息查询能力,帮助用户快速了解药品的基本信息和获取官方说明书。
| 特性 | 说明 |
|---|---|
| 能力类型 | 药品信息查询 / 说明书链接获取 |
| 交互模式 | 单轮对话(一问一答,无追问) |
| 调用方式 | 非流式(直接返回完整 JSON) |
| 输入 | 药品相关问题 |
| 输出 | 药品结构化信息 + 说明书链接 |
| 典型用途 | 查药品用法用量、适应症、副作用、说明书 |
重要说明
- 本 Skill 调用的是 ADP 平台的插件 API,不是腾讯云 API(lke.tencentcloudapi.com),因此认证方式与其他 ADP 知识库系列 Skill 不同
- 认证方式为 Bearer Token,密钥通过 ADP 平台的密钥管理页面获取(与智能问诊 Skill 共用同一个密钥)
- 响应格式为非流式 JSON,直接解析即可
- 本 Skill 的结果仅供参考,不构成用药建议。用药请遵医嘱。
首次激活流程
> ⚠️ 必须先检查,严禁直接引导用户配置密钥。 多数情况下密钥已存在,跳过检查直接提醒是错误行为。
密钥检查(强制执行,不可跳过)
首次激活时,Agent 必须先执行以下检查,静默完成,不输出任何提示给用户:
# 步骤 1: 检查当前 shell 环境变量
echo $ADP_API_KEY
# 步骤 2: 如果为空,检查 /etc/environment 文件(可能存在但未加载到当前 shell)
grep "ADP_API_KEY" /etc/environment 2>/dev/null
检查结果分支:
- ✅ 找到密钥 → 流程结束,直接进入正常使用流程。 不输出任何关于密钥的提示,不提醒用户,不引导配置。如果密钥在
/etc/environment中但当前 shell 未加载,先执行source /etc/environment。 - ❌ 未找到密钥 → 才进入下方「密钥获取流程」。
> 💡 脚本已内置 fallback:脚本会自动依次查找 os.environ → /etc/environment → ~/.env → .env,与智能问诊 Skill 共用同一个密钥。即使当前 shell 未加载变量,脚本也能找到密钥。但 Agent 在执行脚本前仍建议先 source /etc/environment,确保后续命令行操作也能使用该变量。
密钥获取流程(仅在上方检查未找到密钥时执行)
> 🚫 再次确认:如果上方检查已找到密钥,禁止执行本节。
主流程
引导用户按以下步骤操作:
- 访问 ADP 密钥管理页面
- 点击「新建密钥」
- 保存密钥,发送给 agent
> ⚠️ 注意:密钥最多只能创建 2 个。如果提示已达上限,需要先删除旧的密钥再新建。
> 🔒 必须展示的提示:在引导用户访问上述链接时,每次都必须同时告知用户:如果无法访问该页面,说明当前账号权限不够,请联系管理员开通权限。
兜底流程(主流程链接未正常跳转时)
如果上述链接没有正常跳转到密钥管理页面,引导用户:
- 访问 ADP 控制台
- 点击「产品体验」按钮
- 使用主账号登录
- 点击右上角头像 → 「企业管理」 → 「密钥管理」
- 点击「新建密钥」
密钥存储(仅在用户提供新密钥后执行)
用户提供密钥后,优先写入 /etc/environment(全局生效),如果没有 sudo 权限则兜底写入项目 .env 文件。
主方案:写入 /etc/environment(推荐)
# 写入 /etc/environment(需要 sudo 权限,对所有用户和 shell 生效)
echo 'ADP_API_KEY=用户提供的密钥' | sudo tee -a /etc/environment > /dev/null
写入后,重新加载使当前会话生效:
source /etc/environment
兜底方案:写入 .env 文件(无 sudo 权限时)
如果用户没有 sudo 权限,写入项目根目录的 .env 文件:
echo 'ADP_API_KEY=用户提供的密钥' >> .env
> ⚠️ 变量名必须为 ADP_API_KEY,完全一致,不可更改,否则会影响 ADP 平台上的业务逻辑。
存储完成后,告知用户密钥已保存。
触发条件
显式触发
用户明确询问药品信息、用法、副作用或说明书:
- "布洛芬怎么吃"
- "阿莫西林的副作用有哪些"
- "头孢克肟的用法用量"
- "对乙酰氨基酚说明书"
- "这个药有什么禁忌症"
- "帮我查一下连花清瘟的信息"
场景触发
用户在咨询药品相关问题,或需要确认药品信息:
- "退烧药有哪些" → 触发,但需引导用户给具体药名(泛类查询路径)
- "消炎药推荐一下" → 触发,同上
- "感冒药能和消炎药一起吃吗" → 触发,走药物交互路径(拆分查询 + 对比分析)
- "布洛芬和头孢能一起吃吗" → 触发,走药物交互路径
- "医生开了 XX 药,帮我查查" → 触发,精确查询路径
与问诊 Skill 的协同
本 Skill 可以与智能问诊 Skill(tencentcloud-adp-diagnosis)配合使用:
- 问诊 Skill 的最终结果中提到了药品 → 可以主动调用本 Skill 补充药品详细信息
- 用户在问诊后追问药品 → 直接触发本 Skill
- 用户直接问药 → 本 Skill 独立处理,不需要走问诊流程
不触发
- 症状分析(非药品问题):"我头疼怎么办" → 应使用智能问诊 Skill ❌
- 药品购买/价格:"布洛芬多少钱" → 超出本接口范围 ❌
- 急救用药:"中毒了该吃什么解药" → 直接建议拨打 120 ❌
执行工作流
步骤 1:识别查询类型
先判断用户问题属于哪种类型,走不同路径:
| 类型 | 判断依据 | 处理方式 |
|---|---|---|
| 精确药品查询 | 包含具体药品名(通用名或商品名) | 直接调接口 |
| 泛类查询 | 只有药物分类、无具体药名("退烧药"、"消炎药") | 引导用户给出具体药名 |
| 药物交互查询 | 问两种或多种药能否一起吃、有无冲突 | 拆分查询 + 对比分析 |
| 从问诊结果引用 | 问诊 Skill 的结果中提到了某药 | 直接用药品名调接口 |
步骤 2:处理不同查询类型
2a. 精确药品查询(核心路径)
将用户问题直接作为 Message 调用接口:
- 用户:"布洛芬怎么吃" → Message:
"布洛芬怎么吃" - 用户:"芬必得的副作用" → Message:
"芬必得的副作用" - 问诊提到了"布洛芬" → Message:
"布洛芬说明书"
2b. 泛类查询(无具体药名)
本接口不支持按药效分类检索,"退烧药"、"止咳药"、"消炎药" 这类查询会返回空。
Agent 应引导用户给出具体药品名,同时提供常见药品作为参考选项:
> 药品说明书查询需要提供具体的药品名称。请问您想查哪种药?
>
> 比如常见的退烧药有布洛芬、对乙酰氨基酚等,您想了解哪一种?
引导时注意:
- 根据用户提到的品类,给出 2-3 个最常见的具体药名供选择
- 不要给一个长长的药品列表,给太多反而让用户迷茫
- 如果用户说"随便"或"常用的那种",默认查最常见的那个
2c. 药物交互查询(能不能一起吃)
本接口不支持药物交互分析,但 Agent 可以通过拆分查询 + 自身分析能力给出参考。
处理流程:
- 提取药品名:从"布洛芬和头孢能一起吃吗"中提取出"布洛芬"和"头孢"
- 分别调用接口:对每个药品独立发起查询
- 对比分析:基于两份说明书中的「禁忌」「不良反应」「注意事项」等信息,提炼出两者之间可能的交叉风险
- 组织回答:以针对性的分析结论为主,说明书原文为辅
- 强化免责:此类回答必须加强免责提示
交互查询的呈现要求:
- ❌ 不要简单地把两个药的说明书并列贴出来——用户问的是"能不能一起吃",不是"分别介绍一下"
- ✅ 应该先直接回应用户的问题(基于说明书信息的参考分析),再附上各药品的关键信息
- 交互分析的免责声明需要比普通查询更显著:
> ⚠️ 重要提示:以上分析仅基于药品说明书信息的参考性对比,不能替代专业的药物交互评估。药物能否同时使用受多种因素影响(个体差异、剂量、时间间隔等),请务必咨询医生或药师后再决定。
步骤 3:调用接口
使用 scripts/drug_instructions.py 中的 query_drug() 函数发起请求。
参数配置
| 参数 | 值 | 说明 |
|---|---|---|
| Message | 用户的药品问题 | 必填,最多 1000 字符 |
对于药物交互查询,需要分别调用,每个药品一次。
步骤 4:组织回答
> 核心原则:给用户完整、有针对性的回答,而不是平铺信息。
Agent 的回答应该是一个有组织、有重点的专业回复,不是简单地把接口返回的字段一个个列出来。
回答要求
- 先回应用户的问题:用户问"怎么吃",开头就说用法;问"副作用",开头就说不良反应。不要每次都从药品名、厂家、规格开始平铺
- 突出重点信息:根据用户问的问题,把最相关的字段放在最前面、最显眼的位置
- 补充关键信息:在回应了核心问题之后,适当补充用户可能关心的其他要点(比如问了用法,可以顺带提一下禁忌)
- 说明书链接必须给:无论哪种问题,
DocUrl都要展示,这是用户获取完整信息的入口 - 控制篇幅:不良反应、注意事项这类字段如果很长,提炼要点即可,引导用户点说明书看全文
回答示例
用户问"布洛芬怎么吃":
> 布洛芬片的用法用量:口服,成人一次 1-2 片,一日 3 次,餐后服用。服药间隔应不少于 4-6 小时,24 小时内不超过 4 次。
>
> 需要注意的是,布洛芬不宜空腹服用,有胃溃疡病史的患者应慎用。如果服药 3 天后症状未缓解,建议就医。
>
> 📋 查看完整说明书
>
> ⚠️ 以上信息仅供参考,具体用法用量请遵医嘱。
而不是这样平铺(❌ 反例):
> ### 💊 布洛芬片
> - 生产企业:XXX药业
> - 规格:0.2g
> - 适应症:用于缓解轻至中度疼痛...
> - 用法用量:口服...
> - 不良反应:消化道反应...
多个药品的呈现
返回多个药品时,同样要有组织:
- 如果用户问的是某个具体的药(但接口返回了多个同名不同规格的),帮用户指出区别
- 如果用户同时问了多个药,按药品分块,每块内依然遵循"先回应问题、再补充信息"的原则
无结果的处理
如果接口返回的 DrugInfos 为空:
> 抱歉,没有找到"{用户问题}"的药品信息。这个接口需要比较具体的药品名称才能查到。
>
> 您可以试试:
> - 告诉我具体的药品名,比如"布洛芬"、"阿莫西林"
> - 如果您知道商品名也行,比如"芬必得"、"泰诺"
> - 如果是从药盒上看到的名字,直接告诉我就行
步骤 5:附加免责声明
每次给出药品信息后,必须附带免责提示:
> ⚠️ 以上药品信息仅供参考,不构成用药建议。用药请遵医嘱,如有疑问请咨询医生或药师。
对于药物交互查询,使用步骤 2c 中更强的免责声明。
接口详情
LLMQueryDrugInstructions 接口
- 地址:
https://adp.cloud.tencent.com/plugin/api/v1/2ff2d6ff-13de-43df-9706-400cb4608b54/abe70f18-5218-45ad-bf0d-61b4f8629830 - 方法:POST
- 认证:
Authorization: Bearer <ADP_API_KEY> - 响应格式:JSON(非流式)
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| Message | string | 是 | 用户输入的内容(药品相关问题,最多 1000 字符) |
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
| Code | int | 返回码,0 为正常,非 0 异常 |
| Msg | string | 返回信息,Code=0 时为 "success" |
| Data | object | 返回数据 |
| Data.DrugInfos | array | 药品列表 |
| Data.DrugInfos[].DrugName | string | 药品名称(通用名) |
| Data.DrugInfos[].TradeName | string | 商品名称 |
| Data.DrugInfos[].Manufacturer | string | 生产企业 |
| Data.DrugInfos[].Specification | string | 规格 |
| Data.DrugInfos[].DrugUsage | string | 用法用量 |
| Data.DrugInfos[].Indication | string | 适应症 |
| Data.DrugInfos[].AdverseReaction | string | 不良反应 |
| Data.DrugInfos[].DocUrl | string | 说明书链接 |
常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 401 Unauthorized | API Key 无效或未设置 | 检查 ADP_API_KEY 环境变量,重新获取密钥 |
| Code=8000001, message is empty | Message 传了空字符串 | Agent 应在调用前检查,不发空请求 |
| Code=8000001, message length must be less than 1000 | 用户输入超 1000 字符 | 截取前 1000 字符,并提示用户简要描述 |
| Code=3000003, quota exceeded | 配额不足 | 前往 ADP 购买页 购买套餐或增购包 |
| DrugInfos 为空 | 未匹配到药品 | 引导用户给出具体药品名称(通用名或商品名) |
| 泛类查询返回空 | 接口不支持按药效分类检索 | 引导用户提供具体药品名,给出 2-3 个常见药名供选择 |
| 药物交互问题 | 接口不支持交互分析 | 拆分为单独查询,基于说明书信息进行对比分析,强化免责声明 |
| Code 非 0(其他) | 接口异常 | 展示 Msg 内容,建议稍后重试 |
| 密钥创建提示已达上限 | 最多只能创建 2 个密钥 | 删除旧的不用的密钥,再新建 |
| 配额不足 / quota exceeded | 当前套餐调用额度已用完 | 引导用户前往 ADP 购买页 购买套餐或增购包 |
| 返回字段含 HTML 标签 | 接口源数据未完全清洗 | 无需特殊处理,大模型组织回答时自动过滤 |
配额不足处理
当接口返回 配额不足(如 Code=3000003、quota exceeded 等错误提示)时,说明当前账号的调用额度已用完。Agent 应告知用户:
> ⚠️ 当前配额已用完,无法继续调用。请前往 ADP 购买页 购买套餐或增购包后重试。
未覆盖场景
如遇到本 Skill 未覆盖的问题,建议查阅 ADP 官方文档。