AI辅助课题设计 · 药师节AI培训 Skill
定位(AI 必读)
本 skill 是 AI 构建药学课题研究假设方案的操作手册,记录了从"研究空白分析结论 + 课题方向 + 科室数据条件"到"生成格式化Word文档"的完整工作流。
- 用户:提供课题方向 + 可用数据源 + 前期研究空白结论,提出输出要求(禁止模糊动词/空话,结局指标必须可量化)
- AI:读本 skill → 解析空白 → 构建PICO → 写核心假设 → 选研究设计 → 写问题陈述 → 做自查清单 → 生成 Word 文档
- 目标:一次交付达到国自然评审标准的研究假设方案 Word 文档
Overview
核心流程:研究空白解析 → PICO四要素构建 → 核心假设(X通过Y影响Z) → 研究设计选型 → 五段式研究问题陈述 → 四维自查清单 → Word文档生成
适用于:
- 药学课题的研究假设方案设计
- 临床流行病学/循证药学科研设计
- 国自然/省自然等基金课题设计书
- 培训班/学习班的课题设计作业
- 基于已有文献缺口分析的快速方案生成
Step 1:解析研究空白结论
1.1 输入信息收集
用户需提供三类信息:
1. 课题方向:一句话描述研究主题(如"长期使用雷贝拉唑的老年患者新发骨折风险前瞻性队列研究")
2. 可用数据源:科室能拿到的数据(如HIS处方数据、门诊随访记录、部分患者MoCA评分)
3. 研究空白结论:来自前期文献缺口分析的输出,通常分为:
- 人群空白(如:≥80岁高龄老人缺失、中国社区队列空白)
- 方法空白(如:单药特异性证据缺失、cDDD量化设计缺失、前瞻性设计缺失)
- 机制空白(如:某信号通路仅为理论假设、某代谢通路无剂量-效应关系数据)
1.2 空白与课题的映射
将每条研究空白映射到本课题将如何填补它:
- 人群空白 → PICO中P的定义将覆盖缺失人群
- 方法空白 → I/C/O的设计将采用缺失的方法学
- 机制空白 → 统计分析中将引入中介效应检验等机制验证
在方案文档中以"研究空白背景"开篇,逐条引用空白编号,使方案与前期分析无缝衔接。
Step 2:PICO四要素构建
2.1 PICO框架规范
| 要素 | 定义要求 | 禁止事项 |
|---|---|---|
| P(人群) | 明确年龄、疾病状态、用药史、就诊类型 + 排除标准(编号列项) | 禁止"老年人"等模糊表述,必须写"≥65岁" |
| I(暴露/干预) | 明确药物名称 + 量化暴露指标 + 分档阈值 | 禁止"长期使用"等模糊表述,必须写"cDDD≥180" |
| C(对照) | 明确对照来源 + 匹配变量 + 匹配精度 | 禁止"健康对照"等模糊表述,必须写具体匹配方案 |
| O(结局) | 主要终点 + 次要终点,全部可量化 | 禁止"骨折风险"等模糊表述,必须写"12个月新发骨折发生率(‰)" |
2.2 暴露量化常用指标
药学队列研究常用的暴露量化方式:
- cDDD(累计限定日剂量):最适合回顾性/前瞻性处方数据分析
- 高暴露:cDDD≥180(相当于每日标准剂量持续≥180天)
- 中暴露:cDDD 90–179
- 低暴露:cDDD 30–89
- 用药持续时间(天):适合简单分组
- 平均日剂量(ADD):适合剂量-效应分析
- 处方频次:适合间断用药分析
2.3 排除标准设计
排除标准通常6条左右,覆盖:
1. 既往已有目标结局(如既往骨折史)
2. 已有影响结局的基础疾病(如已确诊骨质疏松症T≤-2.5)
3. 正在使用干扰药物(如双膦酸盐/降钙素/特立帕肽)
4. 合并影响代谢的器官功能异常(如甲旁腺功能异常)
5. 肾功能不全(如eGFR<30)
6. 相关手术史(如胃大部切除术)
2.4 结局指标可量化检查
每个结局指标必须能"测出数字":
- 主要终点:发生率(‰)、HR及95%CI
- 次要终点:变化率(g/cm²/年)、变化值(mmol/L)
- 检查方式:如果结局指标无法写出具体数值单位,则不合格
Step 3:核心假设构建
3.1 "X通过Y影响Z"句式
核心假设必须用以下句式:
X(暴露因素)通过 Y(中介/机制路径)导致 Z(结局效应,含量化阈值)
示例:
> 雷贝拉唑cDDD≥180通过降低肠道钙吸收效率导致≥65岁老年患者12个月新发骨折发生率较未用药对照组升高30%以上
3.2 句式约束
- 一句话:必须能一口气读完,中间不许转折(不用"但是""然而""虽然")
- 方向性:必须预测方向("升高"/"降低"),非双向探索
- 可量化:Z必须含量化阈值(如"升高30%以上")
- 机制路径:Y必须是可测量的中介变量(如"肠道钙吸收效率"→用"血清校正钙变化值"替代测量)
3.3 假设句式拆解展示
在文档中,核心假设后附"句式拆解"小字注释:
句式拆解:X(雷贝拉唑cDDD≥180)通过 Y(降低肠道钙吸收效率)影响 Z(≥65岁老年患者12个月新发骨折发生率升高30%以上)。
3.4 高亮呈现
核心假设用高亮边框盒呈现(浅黄底色 + 金色边框),使视觉上突出。
Step 4:研究设计选型
4.1 首选设计 + 理由
给出首选研究设计,理由必须紧扣用户科室的数据条件,每条理由说明"科室已有数据 → 可执行的方案步骤"。
示例(前瞻性队列研究):
1. 暴露识别可执行:HIS处方数据库可提取处方记录,计算cDDD
2. 结局追踪可执行:门诊随访系统可追踪就诊时间和影像学检查
3. 混杂控制可执行:已有MoCA评分数据可分层匹配认知障碍这一混杂因素
4. 时序优势:入组时统一采集基线数据,避免回顾性偏倚
4.2 备选方案
给出一个备选设计,说明触发条件(如"若随访依从性低于70%或事件数不足")和统计方法调整(如"改用条件Logistic回归估计OR值")。
常见备选方案:
- 前瞻性队列 → 巢式病例对照(当事件数不足时)
- 队列研究 → 病例对照(当随访成本过高时)
- 前瞻性 → 回顾性(当时间不允许时)
4.3 统计方法预设
在方案中预设关键统计方法:
- 效应估计:Cox比例风险模型(HR及95%CI)/ 条件Logistic回归(OR及95%CI)
- 中介效应:Baron-Kenny四步法检验中介变量
- 剂量-效应:cDDD作为连续变量建模,估计每增加90单位的风险增量
- 竞争风险:Fine-Gray模型(如以死亡为竞争事件)
Step 5:五段式研究问题陈述
每段1-2句,逻辑链:临床现象 → 已有研究 → 研究空白(关键) → 本研究做什么 → 预期回答什么
| 段落 | 内容要点 | 示例句式 |
|---|---|---|
| 1.临床现象 | 描述临床观察到的现象,用本院/本地数据 | "我院门诊≥65岁老年患者中长期服用雷贝拉唑者占主要部分;骨科住院记录显示老年低暴力骨折患者合并PPI用药史的比例高于非骨折同龄住院者。" |
| 2.已有研究 | 引用Meta分析/大队列数据,给出具体效应量 | "P2(Robert 2025)和P7(Veettil 2022)的Meta分析共纳入超10万例,报告PPI使用者骨折风险pooled OR=1.30(95%CI: 1.18–1.43)。" |
| 3.研究空白(关键) | 逐条引用空白编号,说明本课题将填补的空白 | "上述所有证据均将PPI作为整体暴露,未分离雷贝拉唑的独立效应(方法空白第1条);无一研究采用cDDD进行剂量-效应建模(方法空白第2条)。" |
| 4.本研究做什么 | 概述设计、暴露量化、终点、统计方法 | "建立≥65岁老年患者前瞻性队列,以cDDD三档量化暴露,随访12个月以影像学确诊为终点,采用Cox模型估计HR,并纳入Baron-Kenny中介效应检验。" |
| 5.预期回答什么 | 量化回答核心假设是否成立 | "量化回答'cDDD≥180是否使12个月新发骨折发生率升高30%以上',并给出cDDD从90增至180每增加90单位对应的骨折风险增量百分比。" |
5.1 段落呈现规范
- 每段以"序号. 标题 "开头(标题加粗,后接全角空格)
- 第3段"研究空白"标题用红色标注,突出关键性
- 第5段预期回答中,核心问题用引号加粗
Step 6:四维自查清单
6.1 四个维度
| 维度 | 判断标准 | "强"的标志 | "弱"的标志 |
|---|---|---|---|
| 方向性 | 假设是否预测明确方向 | 预测"升高"或"降低" | "探讨关系""了解影响" |
| 可检验性 | 暴露和结局是否可测量 | cDDD可从HIS计算;终点有金标准 | 暴露依赖患者自报;终点无客观定义 |
| 机制性 | 是否有可测量的中介路径 | 中介变量可直接测量并纳入统计检验 | 仅提及机制但未测量 |
| 具体性 | 是否锁定暴露阈值、人群、随访时长、效应量 | 全部写死具体数值 | 使用"长期""显著"等模糊词 |
6.2 "弱"的改法
对判断为"弱"的维度,直接给改法,不接受"建议进一步明确"等空话:
- 方向性弱 → 改为单向预测("升高30%以上"而非"是否有影响")
- 可检验性弱 → 替换为可从现有数据源直接计算的指标
- 机制性弱 → 引入可测量的中介变量,纳入Baron-Kenny检验
- 具体性弱 → 锁定所有阈值(暴露阈值、随访月数、效应量阈值、终点定义)
6.3 清单表格呈现
自查清单以三列表格呈现:维度 | 判断 | 理由或改法
- "强"用绿色标注
- "弱"用红色标注
- "已改"用金色标注
Step 7:Word文档生成
7.1 环境准备
# 确保 python-docx 已安装
C:/Users/xiany/.workbuddy/binaries/python/versions/3.13.12/python.exe -m pip install python-docx
7.2 文档结构
标题(16pt深蓝加粗居中)
副标题(10pt灰色居中,含课题方向和日期)
研究空白背景(来自前期缺口分析)
【人群空白】逐条列出,引用文献编号
【方法空白】逐条列出,引用文献编号
【机制空白】逐条列出,引用文献编号
一、PICO四要素
两列表格(要素 | 具体定义)
表头深色底白字,斑马纹
二、核心假设
高亮边框盒(浅黄底+金色边框)
下方附句式拆解小字注释
三、研究设计选型
首选设计 + 理由(紧扣科室数据)
备选方案 + 触发条件
四、研究问题陈述(五段式)
每段1-2句,第3段"研究空白"标题红色
五、自查清单
三列表格(维度 | 判断 | 理由或改法)
表头深色底白字,斑马纹
7.3 关键技术点
7.3.1 中文字体设置(必须同时设置eastAsia)
def set_font(run, size=11, bold=False, color=None, cn="宋体", en="Times New Roman"):
run.font.size = Pt(size)
run.font.bold = bold
run.font.name = en
rPr = run._element.get_or_add_rPr()
rFonts = rPr.find(qn('w:rFonts'))
if rFonts is None:
rFonts = OxmlElement('w:rFonts')
rPr.append(rFonts)
rFonts.set(qn('w:eastAsia'), cn)
rFonts.set(qn('w:ascii'), en)
rFonts.set(qn('w:hAnsi'), en)
if color:
run.font.color.rgb = RGBColor(*color)
7.3.2 表格单元格底纹
def set_cell_shading(cell, color):
tcPr = cell._tc.get_or_add_tcPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:fill'), color)
shd.set(qn('w:val'), 'clear')
tcPr.append(shd)
7.3.3 表格单元格边框
def set_cell_borders(cell, color="999999", sz="4"):
tcPr = cell._tc.get_or_add_tcPr()
borders = OxmlElement('w:tcBorders')
for b in ['top', 'left', 'bottom', 'right']:
elem = OxmlElement('w:' + b)
elem.set(qn('w:val'), 'single')
elem.set(qn('w:sz'), sz)
elem.set(qn('w:color'), color)
borders.append(elem)
tcPr.append(borders)
7.3.4 表头斑马纹逻辑
def make_row(table, cells, header=False, header_dark=False):
row = table.add_row()
for i, cell_data in enumerate(cells):
cell = row.cells[i]
cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
fill_cell(cell, cell_data, size=10, bold=header or header_dark)
set_cell_borders(cell)
if header_dark:
set_cell_shading(cell, "1F3A5F") # 深蓝底
# 字体改白色
for para in cell.paragraphs:
para.alignment = WD_ALIGN_PARAGRAPH.CENTER
for run in para.runs:
run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
elif header:
set_cell_shading(cell, "D6E4F0") # 浅蓝底
else:
idx = len(table.rows)
if idx % 2 == 0:
set_cell_shading(cell, "F5F9FC") # 斑马纹浅色
else:
set_cell_shading(cell, "FFFFFF")
return row
7.3.5 核心假设高亮边框盒
hyp_table = doc.add_table(rows=1, cols=1)
hyp_cell = hyp_table.rows[0].cells[0]
set_cell_shading(hyp_cell, "FFF8E1") # 浅黄底
tcPr = hyp_cell._tc.get_or_add_tcPr()
borders = OxmlElement('w:tcBorders')
for b in ['top', 'left', 'bottom', 'right']:
elem = OxmlElement('w:' + b)
elem.set(qn('w:val'), 'single')
elem.set(qn('w:sz'), '8') # 粗边框
elem.set(qn('w:color'), 'D4A017') # 金色
borders.append(elem)
tcPr.append(borders)
7.3.6 多段内容单元格填充
fill_cell 函数支持三种输入格式:
- 字符串:单段单行
- 元组列表:单段多行(每段可设不同bold/color)
- 列表的列表:多段多行(用于PICO的P/O等需要多行的单元格)
def fill_cell(cell, content, size=10, bold=False, align=None):
if isinstance(content, str):
lines = [[(content, bold)]]
elif isinstance(content, tuple):
lines = [content]
elif isinstance(content, list):
if content and isinstance(content[0], tuple):
lines = [content]
else:
lines = content
# ... 逐段逐行填充
7.4 颜色方案
| 用途 | RGB | 色值 |
|---|---|---|
| 主标题/一级标题 | (31, 58, 95) | #1F3A5F 深蓝 |
| 二级标题 | (46, 92, 138) | #2E5C8A 中蓝 |
| 表头深色底 | - | #1F3A5F |
| 表头浅色底 | - | #D6E4F0 |
| 斑马纹 | - | #F5F9FC / #FFFFFF |
| 核心假设底色 | - | #FFF8E1 浅黄 |
| 核心假设边框 | - | #D4A017 金色 |
| 空白标签/红色强调 | (176, 48, 48) | #B03030 |
| 自查"强" | (46, 125, 50) | #2E7D32 绿 |
| 自查"已改" | (212, 160, 23) | #D4A017 金 |
| 灰色注释 | (102, 102, 102) | #666666 |
7.5 完整生成脚本模板
参考 references/generate_hypothesis_template.py 获取完整的 Word 文档生成模板脚本。
使用方法:
1. 复制模板脚本到项目目录
2. 替换 # ====== 课题信息 ====== 部分的课题方向、空白结论、PICO内容、假设、设计、问题陈述、自查清单
3. 运行脚本生成 .docx 文件
4. 用 present_files 展示结果
7.6 质量检查清单
生成文档后,检查以下项目:
- [ ] PICO四要素中无模糊表述(搜索"探讨""研究""了解""分析"等动词)
- [ ] 核心假设为单句,无转折词,含量化阈值
- [ ] 研究设计理由每条扣住科室数据条件
- [ ] 五段式问题陈述第3段引用了具体空白编号
- [ ] 自查清单四个维度均有判断,弱项有改法
- [ ] 结局指标全部可量化(有数值单位)
- [ ] 无"具有重要意义""值得深入研究"等空话
- [ ] 表格格式正确(深色表头、斑马纹、边框)
- [ ] 中文字体正确(宋体/Times New Roman双设置)
- [ ] 无乱码、无格式错位
Step 8:交付与记忆
- 用
present_files工具展示生成的 .docx 文件 - 在回复中说明:
- 文档名称和路径
- 方案五部分结构概要
- 核心假设全文
- 自查清单结果(几个强/几个已改) - 更新项目记忆文件(
.workbuddy/memory/YYYY-MM-DD.md)
常见问题与陷阱
Q1: Unicode转义错误导致中文乱码
原因:脚本中中文字符使用Unicode转义时,码点错误会导致文件名或正文出现错别字。
案例:唑字正确码点为\u5511,曾误用\u5571(啱)和\u5541(啁)。
解决:用Python验证码点:
print(hex(ord('唑'))) # 输出 0x5511
所有中文字符的Unicode转义在写入脚本前都应验证。
Q2: python-docx 中文字体不生效
原因:仅设置 font.name 不够,还需设置东亚字体。
解决:
run.font.name = 'Times New Roman'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
Q3: 表格单元格内容多行时格式混乱
原因:python-docx的cell默认只有一个空段落,多行内容需要手动add_paragraph。
解决:使用fill_cell函数统一处理,支持字符串/元组列表/列表的列表三种输入格式,自动管理段落。
Q4: 核心假设无法一口气读完
原因:假设中嵌入了过多限定条件或转折。
解决:将限定条件(人群、随访时长)融入X和Z的描述中,避免插入从句。Y保持简洁的机制短语。如果超过60个字,考虑将部分限定条件移入PICO表格。
Q5: 自查清单判断为"弱"但不知如何改
原则:
- 方向性弱 → 将"是否有影响"改为"升高X%以上"或"降低X%以上"
- 可检验性弱 → 检查暴露指标是否可从HIS/随访系统直接提取,终点是否有客观诊断标准
- 机制性弱 → 找一个可测量的中介变量(如血清钙、骨密度变化率),纳入Baron-Kenny检验
- 具体性弱 → 逐一锁定:暴露阈值、人群年龄、随访月数、效应量阈值、终点定义
Q6: 文档中文智能引号处理
原因:Python字符串中使用中文引号""可能导致编码问题或与字符串定界符冲突。
解决:使用Unicode转义:
LQ = "\u201C" # 左智能引号 "
RQ = "\u201D" # 右智能引号 "
在需要引号的地方用 LQ + "内容" + RQ 拼接。