feat(aia): Integrate PromptService for 10 AI agents
Features: - Migrate 10 agent prompts from hardcoded to database - Add grayscale preview support (DRAFT/ACTIVE distribution) - Implement 3-tier fallback (DB -> Cache -> Hardcoded) - Add version management and rollback capability Files changed: - backend/scripts/migrate-aia-prompts.ts (new migration script) - backend/src/common/prompt/prompt.fallbacks.ts (add AIA fallbacks) - backend/src/modules/aia/services/agentService.ts (integrate PromptService) - backend/src/modules/aia/services/conversationService.ts (pass userId) - backend/src/modules/aia/types/index.ts (fix AgentStage type) Documentation: - docs/03-业务模块/AIA-AI智能问答/06-开发记录/2026-01-18-Prompt管理系统集成.md - docs/02-通用能力层/00-通用能力层清单.md (add FileCard, Prompt management) - docs/00-系统总体设计/00-系统当前状态与开发指南.md (update to v3.6) Prompt codes: - AIA_SCIENTIFIC_QUESTION, AIA_PICO_ANALYSIS, AIA_TOPIC_EVALUATION - AIA_OUTCOME_DESIGN, AIA_CRF_DESIGN, AIA_SAMPLE_SIZE - AIA_PROTOCOL_WRITING, AIA_METHODOLOGY_REVIEW - AIA_PAPER_POLISH, AIA_PAPER_TRANSLATE Tested: Migration script executed, all 10 prompts inserted successfully
This commit is contained in:
@@ -1,14 +1,14 @@
|
||||
# AIclinicalresearch 系统当前状态与开发指南
|
||||
|
||||
> **文档版本:** v3.5
|
||||
> **文档版本:** v3.6
|
||||
> **创建日期:** 2025-11-28
|
||||
> **维护者:** 开发团队
|
||||
> **最后更新:** 2026-01-16
|
||||
> **重大进展:** 🎉 **运营管理端用户管理完成!模块权限系统架构升级!**
|
||||
> - 🆕 用户管理功能(CRUD + 租户管理 + 模块权限配置)
|
||||
> - 🏆 模块权限系统改造(版本系统 → 模块代码系统)
|
||||
> - ✅ user_modules 表(精细化权限控制)
|
||||
> - ✅ 登录API返回模块列表,前端导航智能过滤
|
||||
> **最后更新:** 2026-01-18
|
||||
> **重大进展:** 🎉 **AIA V2.1 完成!Prompt管理系统集成!**
|
||||
> - 🆕 AIA 10个智能体 Prompt 迁移到数据库
|
||||
> - 🏆 支持管理端在线配置和调试提示词
|
||||
> - ✅ 灰度预览(调试者看DRAFT,普通用户看ACTIVE)
|
||||
> - ✅ 三级容灾(数据库→缓存→兜底)
|
||||
> **部署状态:** ✅ 生产环境运行中 | 公网地址:http://8.140.53.236/
|
||||
> **文档目的:** 快速了解系统当前状态,为新AI助手提供上下文
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
| 模块代号 | 模块名称 | 核心功能 | 商业价值 | 当前状态 | 优先级 |
|
||||
|---------|---------|---------|---------|---------|--------|
|
||||
| **AIA** | AI智能问答 | 12个智能体(选题→方案→评审→写作) | ⭐⭐⭐⭐⭐ | 🎉 **V2.0完成(85%)** - 通用能力层架构 | **P0** |
|
||||
| **AIA** | AI智能问答 | 12个智能体(选题→方案→评审→写作) | ⭐⭐⭐⭐⭐ | 🎉 **V2.1完成(90%)** - Prompt管理集成 | **P0** |
|
||||
| **PKB** | 个人知识库 | RAG问答、私人文献库 | ⭐⭐⭐ | ✅ **核心功能完成(90%)** | P1 |
|
||||
| **ASL** | AI智能文献 | 文献筛选、Meta分析、证据图谱 | ⭐⭐⭐⭐⭐ | 🚧 **正在开发** | **P0** |
|
||||
| **DC** | 数据清洗整理 | ETL + 医学NER(百万行级数据) | ⭐⭐⭐⭐⭐ | ✅ **Tool B完成 + Tool C 99%(异步架构+性能优化-99%+多指标转换+7大功能)** | **P0** |
|
||||
@@ -121,9 +121,43 @@
|
||||
|
||||
---
|
||||
|
||||
## 🚀 当前开发状态(2026-01-14)
|
||||
## 🚀 当前开发状态(2026-01-18)
|
||||
|
||||
### 🏆 最新进展:通用能力层重大升级 + AIA V2.0(2026-01-14)
|
||||
### 🏆 最新进展:AIA V2.1 Prompt管理集成(2026-01-18)
|
||||
|
||||
#### ✅ AIA 模块 Prompt 管理系统集成
|
||||
|
||||
**功能:**
|
||||
- ✅ 10 个智能体 Prompt 迁移到数据库(`capability_schema.prompt_templates`)
|
||||
- ✅ 管理端可在线编辑和调试提示词
|
||||
- ✅ 灰度预览(调试者看 DRAFT,普通用户看 ACTIVE)
|
||||
- ✅ 三级容灾(数据库 → 缓存 → 兜底)
|
||||
- ✅ 版本管理和回滚
|
||||
|
||||
**Prompt Code 列表:**
|
||||
|
||||
| Prompt Code | 智能体 |
|
||||
|-------------|--------|
|
||||
| `AIA_SCIENTIFIC_QUESTION` | 科学问题梳理 |
|
||||
| `AIA_PICO_ANALYSIS` | PICO 梳理 |
|
||||
| `AIA_TOPIC_EVALUATION` | 选题评价 |
|
||||
| `AIA_OUTCOME_DESIGN` | 观察指标设计 |
|
||||
| `AIA_CRF_DESIGN` | 病例报告表设计 |
|
||||
| `AIA_SAMPLE_SIZE` | 样本量计算 |
|
||||
| `AIA_PROTOCOL_WRITING` | 临床研究方案撰写 |
|
||||
| `AIA_METHODOLOGY_REVIEW` | 方法学评审智能体 |
|
||||
| `AIA_PAPER_POLISH` | 论文润色 |
|
||||
| `AIA_PAPER_TRANSLATE` | 论文翻译 |
|
||||
|
||||
**修改文件:**
|
||||
- `backend/scripts/migrate-aia-prompts.ts` - 迁移脚本
|
||||
- `backend/src/common/prompt/prompt.fallbacks.ts` - 兜底 Prompt
|
||||
- `backend/src/modules/aia/services/agentService.ts` - 集成 PromptService
|
||||
- `backend/src/modules/aia/services/conversationService.ts` - 传递 userId
|
||||
|
||||
---
|
||||
|
||||
### 🏆 历史进展:通用能力层重大升级 + AIA V2.0(2026-01-14)
|
||||
|
||||
#### ✅ Phase 1: 通用流式响应服务(OpenAI Compatible)
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
# 通用能力层清单
|
||||
|
||||
> **文档版本:** v2.0
|
||||
> **文档版本:** v2.1
|
||||
> **创建日期:** 2026-01-14
|
||||
> **最后更新:** 2026-01-14
|
||||
> **最后更新:** 2026-01-18
|
||||
> **文档目的:** 列出所有通用能力模块,提供快速调用指南
|
||||
> **本次更新:** Ant Design X FileCard 组件使用、Prompt管理 AIA 集成
|
||||
|
||||
---
|
||||
|
||||
@@ -42,6 +43,7 @@
|
||||
| 能力 | 路径 | 状态 | 说明 |
|
||||
|------|------|------|------|
|
||||
| **Chat组件** | `shared/components/Chat/` | ✅ 🆕 | AI对话通用组件(V2) |
|
||||
| **FileCard组件** | `@ant-design/x` | ✅ 🆕 | 文件卡片展示(附件) |
|
||||
| **认证API** | `framework/auth/api.ts` | ✅ | Token管理 |
|
||||
| **API Client** | `common/api/axios.ts` | ✅ | 带认证的axios实例 |
|
||||
| **通用布局** | `shared/layouts/` | ✅ | 主布局、侧边栏 |
|
||||
@@ -95,7 +97,59 @@ data: [DONE]\n\n
|
||||
|
||||
---
|
||||
|
||||
### 2. Chat 通用组件(🆕 重点推荐)
|
||||
### 2. Prompt 管理服务
|
||||
|
||||
**路径:** `backend/src/common/prompt/`
|
||||
|
||||
**功能:** 动态 Prompt 配置、灰度预览、版本管理
|
||||
|
||||
**核心特性:**
|
||||
- 灰度预览(DRAFT/ACTIVE 分发)
|
||||
- Handlebars 模板渲染
|
||||
- 变量提取与校验
|
||||
- 三级容灾(数据库→缓存→兜底)
|
||||
|
||||
**使用方式:**
|
||||
|
||||
```typescript
|
||||
import { getPromptService } from '../../../common/prompt';
|
||||
import { prisma } from '../../../config/database';
|
||||
|
||||
// 获取 Prompt(支持灰度预览)
|
||||
const promptService = getPromptService(prisma);
|
||||
const { content, isDraft, version } = await promptService.get(
|
||||
'AIA_SCIENTIFIC_QUESTION', // Prompt Code
|
||||
{}, // 变量(如 { userName: '张三' })
|
||||
{ userId } // 用于灰度判断
|
||||
);
|
||||
|
||||
if (isDraft) {
|
||||
console.log('使用 DRAFT 版本(调试模式)');
|
||||
}
|
||||
```
|
||||
|
||||
**已集成模块:**
|
||||
- ✅ RVW - 稿件审查(2个 Prompt)
|
||||
- ✅ AIA - AI智能问答(10个 Prompt)🆕 2026-01-18
|
||||
|
||||
**AIA 模块 Prompt Code 列表:**
|
||||
|
||||
| Prompt Code | 智能体 |
|
||||
|-------------|--------|
|
||||
| `AIA_SCIENTIFIC_QUESTION` | 科学问题梳理 |
|
||||
| `AIA_PICO_ANALYSIS` | PICO 梳理 |
|
||||
| `AIA_TOPIC_EVALUATION` | 选题评价 |
|
||||
| `AIA_OUTCOME_DESIGN` | 观察指标设计 |
|
||||
| `AIA_CRF_DESIGN` | 病例报告表设计 |
|
||||
| `AIA_SAMPLE_SIZE` | 样本量计算 |
|
||||
| `AIA_PROTOCOL_WRITING` | 临床研究方案撰写 |
|
||||
| `AIA_METHODOLOGY_REVIEW` | 方法学评审智能体 |
|
||||
| `AIA_PAPER_POLISH` | 论文润色 |
|
||||
| `AIA_PAPER_TRANSLATE` | 论文翻译 |
|
||||
|
||||
---
|
||||
|
||||
### 3. Chat 通用组件(🆕 重点推荐)
|
||||
|
||||
**路径:** `frontend-v2/src/shared/components/Chat/`
|
||||
|
||||
@@ -137,7 +191,77 @@ import {
|
||||
|
||||
---
|
||||
|
||||
### 3. LLM 网关
|
||||
### 4. Ant Design X FileCard 组件(🆕 2026-01-18)
|
||||
|
||||
**来源:** `@ant-design/x` (Ant Design X 2.1)
|
||||
|
||||
**功能:** 紧凑的文件卡片展示,适用于聊天界面附件显示
|
||||
|
||||
**安装:**
|
||||
```bash
|
||||
npm install @ant-design/x
|
||||
```
|
||||
|
||||
**使用方式:**
|
||||
|
||||
```tsx
|
||||
import { Attachments } from '@ant-design/x';
|
||||
|
||||
const { FileCard } = Attachments;
|
||||
|
||||
// 单个文件卡片
|
||||
<FileCard
|
||||
item={{
|
||||
uid: 'file-1',
|
||||
name: '研究方案.pdf',
|
||||
size: 1024000, // 字节
|
||||
}}
|
||||
/>
|
||||
|
||||
// 文件卡片列表(水平排列)
|
||||
<FileCard.List
|
||||
items={[
|
||||
{ uid: '1', name: '方案.pdf', size: 512000 },
|
||||
{ uid: '2', name: '数据.xlsx', size: 256000 },
|
||||
]}
|
||||
/>
|
||||
```
|
||||
|
||||
**在聊天界面中使用:**
|
||||
|
||||
```tsx
|
||||
// 将附件与工具栏放在同一行
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
|
||||
<Button icon={<PaperClipOutlined />}>上传附件</Button>
|
||||
<Button icon={<BulbOutlined />}>深度思考</Button>
|
||||
|
||||
{/* 附件列表 */}
|
||||
{attachments.length > 0 && (
|
||||
<FileCard.List
|
||||
items={attachments.map(att => ({
|
||||
uid: att.id,
|
||||
name: att.filename,
|
||||
size: att.size,
|
||||
}))}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
```
|
||||
|
||||
**样式特点:**
|
||||
- 自动识别文件类型图标(PDF/Word/Excel/图片等)
|
||||
- 自动格式化文件大小(KB/MB)
|
||||
- 紧凑设计,适合水平排列
|
||||
- 支持删除回调
|
||||
|
||||
**已使用模块:**
|
||||
- ✅ AIA - AI智能问答(附件上传预览)
|
||||
|
||||
**官方文档:** https://x.ant.design/components/attachments-cn
|
||||
|
||||
---
|
||||
|
||||
### 5. LLM 网关
|
||||
|
||||
**路径:** `backend/src/common/llm/`
|
||||
|
||||
@@ -769,3 +893,6 @@ await storage.upload('path/file.txt', buffer);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -613,6 +613,9 @@ async saveProcessedData(recordId, newData) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -228,3 +228,6 @@ const userId = 'test'; // ❌ 应该用 getUserId(request)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -800,6 +800,9 @@ export const AsyncProgressBar: React.FC<AsyncProgressBarProps> = ({
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -297,3 +297,6 @@ Level 3: 兜底Prompt(缓存也失效)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -483,3 +483,6 @@ const pageSize = Number(query.pageSize) || 20;
|
||||
|
||||
**开发完成时间:** 2026-01-16 13:30
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -217,3 +217,6 @@ ADMIN-运营管理端/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -316,3 +316,6 @@ INST-机构管理端/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
# AIA AI智能问答模块 - 当前状态与开发指南
|
||||
|
||||
> **文档版本:** v2.0
|
||||
> **文档版本:** v2.1
|
||||
> **创建日期:** 2026-01-14
|
||||
> **维护者:** AIA模块开发团队
|
||||
> **最后更新:** 2026-01-14 🎉 **V2版本发布 - 通用能力层架构重构完成**
|
||||
> **最后更新:** 2026-01-18 🎉 **V2.1版本发布 - Prompt管理系统集成完成**
|
||||
> **重大里程碑:**
|
||||
> - 🏆 通用流式响应服务(OpenAI Compatible)
|
||||
> - 🎨 现代感UI(100%还原原型图V11)
|
||||
> - 🚀 Ant Design X 深度集成
|
||||
> - ✨ 12个智能体配置完成
|
||||
> - 🆕 Prompt管理系统集成(灰度预览、版本管理)
|
||||
|
||||
---
|
||||
|
||||
@@ -40,9 +41,33 @@ AIA(AI Intelligent Assistant)模块提供覆盖临床研究全生命周期
|
||||
|
||||
### 当前状态
|
||||
|
||||
- **开发阶段:** ✅ **V2.0 MVP 完成**
|
||||
- **架构版本:** V2(基于通用能力层重构)
|
||||
- **完成度:** 85%(核心功能完成,部分高级特性待开发)
|
||||
- **开发阶段:** ✅ **V2.1 Prompt 管理集成完成**
|
||||
- **架构版本:** V2.1(集成 PromptService)
|
||||
- **完成度:** 90%(Prompt 管理已对接,支持灰度预览)
|
||||
|
||||
### ✅ V2.1 新增功能(2026-01-18)
|
||||
|
||||
**Prompt 管理系统集成**
|
||||
- [x] 10 个智能体 Prompt 迁移到数据库
|
||||
- [x] 支持在管理端在线编辑和调试
|
||||
- [x] 灰度预览(调试者看 DRAFT,普通用户看 ACTIVE)
|
||||
- [x] 三级容灾(数据库 → 缓存 → 兜底)
|
||||
- [x] 版本管理和回滚
|
||||
|
||||
**Prompt Code 映射表**
|
||||
|
||||
| 智能体 | Prompt Code |
|
||||
|--------|-------------|
|
||||
| 科学问题梳理 | `AIA_SCIENTIFIC_QUESTION` |
|
||||
| PICO 梳理 | `AIA_PICO_ANALYSIS` |
|
||||
| 选题评价 | `AIA_TOPIC_EVALUATION` |
|
||||
| 观察指标设计 | `AIA_OUTCOME_DESIGN` |
|
||||
| 病例报告表设计 | `AIA_CRF_DESIGN` |
|
||||
| 样本量计算 | `AIA_SAMPLE_SIZE` |
|
||||
| 临床研究方案撰写 | `AIA_PROTOCOL_WRITING` |
|
||||
| 方法学评审智能体 | `AIA_METHODOLOGY_REVIEW` |
|
||||
| 论文润色 | `AIA_PAPER_POLISH` |
|
||||
| 论文翻译 | `AIA_PAPER_TRANSLATE` |
|
||||
|
||||
---
|
||||
|
||||
@@ -657,3 +682,6 @@ const DEFAULT_MODEL = 'qwen-max'; // 或 'gpt-5', 'claude-4.5'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -883,3 +883,6 @@ export interface SlashCommand {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
193
docs/03-业务模块/AIA-AI智能问答/06-开发记录/2026-01-18-Prompt管理系统集成.md
Normal file
193
docs/03-业务模块/AIA-AI智能问答/06-开发记录/2026-01-18-Prompt管理系统集成.md
Normal file
@@ -0,0 +1,193 @@
|
||||
# AIA 模块开发记录 - Prompt 管理系统集成
|
||||
|
||||
> **日期:** 2026-01-18
|
||||
> **开发者:** AI Assistant (Claude)
|
||||
> **版本:** V2.1
|
||||
> **状态:** ✅ 已完成
|
||||
|
||||
---
|
||||
|
||||
## 📋 开发目标
|
||||
|
||||
将 AIA 智能问答模块的 10 个智能体 Prompt 从硬编码迁移到 PromptService,实现:
|
||||
- 在管理端可视化配置和调试提示词
|
||||
- 灰度预览(调试者看 DRAFT,普通用户看 ACTIVE)
|
||||
- 版本管理和回滚
|
||||
- 三级容灾(数据库 → 缓存 → 兜底)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 完成内容
|
||||
|
||||
### 1. 数据库迁移脚本
|
||||
|
||||
**文件:** `backend/scripts/migrate-aia-prompts.ts`
|
||||
|
||||
将 10 个智能体的 Prompt 插入 `capability_schema.prompt_templates` 和 `prompt_versions` 表。
|
||||
|
||||
**Prompt Code 命名规则(语义化):**
|
||||
|
||||
| 智能体 ID | Prompt Code | 名称 |
|
||||
|-----------|-------------|------|
|
||||
| TOPIC_01 | `AIA_SCIENTIFIC_QUESTION` | 科学问题梳理 |
|
||||
| TOPIC_02 | `AIA_PICO_ANALYSIS` | PICO 梳理 |
|
||||
| TOPIC_03 | `AIA_TOPIC_EVALUATION` | 选题评价 |
|
||||
| DESIGN_04 | `AIA_OUTCOME_DESIGN` | 观察指标设计 |
|
||||
| DESIGN_05 | `AIA_CRF_DESIGN` | 病例报告表设计 |
|
||||
| DESIGN_06 | `AIA_SAMPLE_SIZE` | 样本量计算 |
|
||||
| DESIGN_07 | `AIA_PROTOCOL_WRITING` | 临床研究方案撰写 |
|
||||
| REVIEW_08 | `AIA_METHODOLOGY_REVIEW` | 方法学评审智能体 |
|
||||
| WRITING_11 | `AIA_PAPER_POLISH` | 论文润色 |
|
||||
| WRITING_12 | `AIA_PAPER_TRANSLATE` | 论文翻译 |
|
||||
|
||||
**执行命令:**
|
||||
```bash
|
||||
cd backend && npx tsx scripts/migrate-aia-prompts.ts
|
||||
```
|
||||
|
||||
### 2. 兜底 Prompt
|
||||
|
||||
**文件:** `backend/src/common/prompt/prompt.fallbacks.ts`
|
||||
|
||||
添加 `AIA_FALLBACKS` 对象,包含 10 个智能体的兜底提示词,当数据库和缓存都不可用时使用。
|
||||
|
||||
### 3. agentService 改造
|
||||
|
||||
**文件:** `backend/src/modules/aia/services/agentService.ts`
|
||||
|
||||
**改动:**
|
||||
- 添加 `AGENT_TO_PROMPT_CODE` 映射表
|
||||
- 修改 `getAgentSystemPrompt()` 函数:
|
||||
- 新增 `userId` 参数(用于灰度预览)
|
||||
- 调用 `PromptService.get()` 获取提示词
|
||||
- 返回 `{ content, isDraft }` 结构
|
||||
- 失败时降级到硬编码兜底
|
||||
|
||||
**关键代码:**
|
||||
```typescript
|
||||
export async function getAgentSystemPrompt(
|
||||
agentId: string,
|
||||
userId?: string
|
||||
): Promise<{ content: string; isDraft: boolean }> {
|
||||
const promptCode = AGENT_TO_PROMPT_CODE[agentId];
|
||||
|
||||
if (promptCode) {
|
||||
try {
|
||||
const promptService = getPromptService(prisma);
|
||||
const result = await promptService.get(promptCode, {}, { userId });
|
||||
|
||||
if (result.isDraft) {
|
||||
logger.info('[AIA] 使用 DRAFT 版本 Prompt(调试模式)', { agentId, userId });
|
||||
}
|
||||
|
||||
return { content: result.content, isDraft: result.isDraft };
|
||||
} catch (error) {
|
||||
logger.warn('[AIA] PromptService 获取失败,使用兜底', { agentId });
|
||||
}
|
||||
}
|
||||
|
||||
// 兜底:使用硬编码
|
||||
const agent = await getAgentById(agentId);
|
||||
return { content: agent?.systemPrompt || '', isDraft: false };
|
||||
}
|
||||
```
|
||||
|
||||
### 4. conversationService 改造
|
||||
|
||||
**文件:** `backend/src/modules/aia/services/conversationService.ts`
|
||||
|
||||
**改动:**
|
||||
- 调用 `getAgentSystemPrompt()` 时传递 `userId`
|
||||
- 处理返回的 `{ content, isDraft }` 结构
|
||||
- 添加调试模式日志
|
||||
|
||||
**关键代码:**
|
||||
```typescript
|
||||
const { content: systemPrompt, isDraft } = await agentService.getAgentSystemPrompt(
|
||||
conversation.agentId,
|
||||
userId // 传递 userId 以支持灰度预览
|
||||
);
|
||||
|
||||
if (isDraft) {
|
||||
logger.info('[AIA:Conversation] 使用 DRAFT 版本 Prompt(调试模式)', {
|
||||
userId,
|
||||
agentId: conversation.agentId
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 类型定义修复
|
||||
|
||||
**文件:** `backend/src/modules/aia/types/index.ts`
|
||||
|
||||
修复 `AgentStage` 类型定义,添加缺失的阶段值:
|
||||
|
||||
```typescript
|
||||
export type AgentStage = 'topic' | 'design' | 'review' | 'data' | 'writing';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 修改文件清单
|
||||
|
||||
| 文件路径 | 操作 | 说明 |
|
||||
|----------|------|------|
|
||||
| `backend/scripts/migrate-aia-prompts.ts` | 新增 | 数据库迁移脚本 |
|
||||
| `backend/src/common/prompt/prompt.fallbacks.ts` | 修改 | 添加 AIA 兜底 Prompt |
|
||||
| `backend/src/modules/aia/services/agentService.ts` | 修改 | 集成 PromptService |
|
||||
| `backend/src/modules/aia/services/conversationService.ts` | 修改 | 传递 userId |
|
||||
| `backend/src/modules/aia/types/index.ts` | 修改 | 修复类型定义 |
|
||||
|
||||
---
|
||||
|
||||
## 🧪 测试验证
|
||||
|
||||
### 1. 迁移脚本执行结果
|
||||
|
||||
```
|
||||
✅ 共迁移 10 个 AIA Prompt:
|
||||
📋 AIA_CRF_DESIGN - 病例报告表设计 - v1 (ACTIVE)
|
||||
📋 AIA_METHODOLOGY_REVIEW - 方法学评审智能体 - v1 (ACTIVE)
|
||||
📋 AIA_OUTCOME_DESIGN - 观察指标设计 - v1 (ACTIVE)
|
||||
...
|
||||
```
|
||||
|
||||
### 2. 功能测试
|
||||
|
||||
- [x] 管理端可以看到 AIA 的 10 个 Prompt
|
||||
- [x] 可以编辑和保存草稿
|
||||
- [x] 开启调试模式后可以预览 DRAFT 版本
|
||||
- [x] 发布后普通用户使用新版本
|
||||
- [x] 数据库不可用时自动降级到兜底
|
||||
|
||||
---
|
||||
|
||||
## 🔮 后续可优化
|
||||
|
||||
1. **变量支持**
|
||||
- 数据库层面已支持(`variables` 字段)
|
||||
- 代码层面暂未传入变量
|
||||
- 后续可添加:`{{目标期刊}}`、`{{研究类型}}` 等
|
||||
|
||||
2. **A/B 测试**
|
||||
- 按用户比例分流不同 Prompt 版本
|
||||
- 收集效果数据进行对比
|
||||
|
||||
3. **Prompt 模板**
|
||||
- 提供常用 Prompt 模板库
|
||||
- 支持一键套用和自定义修改
|
||||
|
||||
---
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- [ADMIN 模块状态](../../ADMIN-运营管理端/00-模块当前状态与开发指南.md)
|
||||
- [Prompt 管理系统快速参考](../../../02-技术设计/03-Prompt管理系统快速参考.md)
|
||||
- [通用能力层清单](../../../02-通用能力层/00-通用能力层清单.md)
|
||||
|
||||
---
|
||||
|
||||
## 📝 备注
|
||||
|
||||
本次开发遵循了现有 PromptService 的设计模式,与 RVW 模块集成方式保持一致。
|
||||
|
||||
@@ -1293,6 +1293,9 @@ interface FulltextScreeningResult {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -407,6 +407,9 @@ GET /api/v1/asl/fulltext-screening/tasks/:taskId/export
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -350,6 +350,9 @@ Linter错误:0个
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -509,6 +509,9 @@ Failed to open file '\\tmp\\extraction_service\\temp_10000_test.pdf'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -575,6 +575,9 @@ df['creatinine'] = pd.to_numeric(df['creatinine'], errors='coerce')
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -413,6 +413,9 @@ npm run dev
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -990,6 +990,9 @@ export const aiController = new AIController();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1324,6 +1324,9 @@ npm install react-markdown
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -232,6 +232,9 @@ FMA___基线 | FMA___1个月 | FMA___2个月
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -390,6 +390,9 @@ formula = "FMA总分(0-100) / 100"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -224,6 +224,9 @@ async handleFillnaMice(request, reply) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -196,6 +196,9 @@ method: 'mean' | 'median' | 'mode' | 'constant' | 'ffill' | 'bfill'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -346,6 +346,9 @@ Changes:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -418,6 +418,9 @@ cd path; command
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -647,6 +647,9 @@ import { logger } from '../../../../common/logging/index.js';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -651,6 +651,9 @@ Content-Length: 45234
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -303,6 +303,9 @@ Response:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -456,6 +456,9 @@ Response:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -450,6 +450,9 @@ import { ChatContainer } from '@/shared/components/Chat';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -360,6 +360,9 @@ const initialMessages = defaultMessages.length > 0 ? defaultMessages : [{
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -400,6 +400,9 @@ python main.py
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -648,6 +648,9 @@ http://localhost:5173/data-cleaning/tool-c
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -258,6 +258,9 @@ Day 5 (6-8小时):
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -436,6 +436,9 @@ Docs: docs/03-业务模块/DC-数据清洗整理/06-开发记录/DC模块重建
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -411,6 +411,9 @@ const mockAssets: Asset[] = [
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -395,6 +395,9 @@ frontend-v2/src/modules/dc/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -355,6 +355,9 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -309,6 +309,9 @@ ConflictDetectionService // 冲突检测(字段级对比)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -358,6 +358,9 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -321,6 +321,9 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -385,6 +385,9 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -473,6 +473,9 @@ Tool B后端代码**100%复用**了平台通用能力层,无任何重复开发
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -319,6 +319,9 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -250,6 +250,9 @@ $ node scripts/check-dc-tables.mjs
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -483,6 +483,9 @@ ${fields.map((f, i) => `${i + 1}. ${f.name}:${f.desc}`).join('\n')}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -692,3 +692,6 @@ private async processMessageAsync(xmlData: any) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1083,6 +1083,9 @@ async function testIntegration() {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -223,6 +223,9 @@ Content-Type: application/json
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -647,3 +647,6 @@ REDCap API: exportRecords success { recordCount: 1 }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -650,6 +650,9 @@ backend/src/modules/iit-manager/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -801,5 +801,8 @@ CREATE TABLE iit_schema.wechat_tokens (
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -557,6 +557,9 @@ Day 3 的开发工作虽然遇到了多个技术问题,但最终成功完成
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -326,4 +326,7 @@ AI: "出生日期:2017-01-04
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -267,6 +267,9 @@ Day 4: REDCap EM(Webhook推送)← 作为增强,而非核心
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -685,3 +685,6 @@ const answer = `根据研究方案[1]和CRF表格[2],纳入标准包括:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -442,3 +442,6 @@ export const calculateAvailableQuota = async (tenantId: string) => {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -315,3 +315,6 @@ https://platform.example.com/t/pharma-abc/login
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -365,3 +365,6 @@ const newResults = resultsData.map((docResult: any) => ({
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -238,3 +238,6 @@ const chatApi = axios.create({
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -772,6 +772,9 @@ docker exec redcap-apache php /tmp/create-redcap-password.php
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -154,6 +154,9 @@ AIclinicalresearch/redcap-docker-dev/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -323,3 +323,6 @@ npx tsx check_iit_asl_data.ts
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -191,3 +191,6 @@ interface DecodedToken {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -890,6 +890,9 @@ ACR镜像仓库:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1377,6 +1377,9 @@ SAE应用配置:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1193,6 +1193,9 @@ docker exec -e PGPASSWORD="密码" ai-clinical-postgres psql -h RDS地址 -U air
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -604,6 +604,9 @@ scripts/*.ts
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -292,6 +292,9 @@ Node.js后端部署成功后:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -515,6 +515,9 @@ Node.js后端 (SAE) ← http://172.17.173.88:3001
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -230,6 +230,9 @@ curl http://localhost:3001/health
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -268,6 +268,9 @@ npm run dev
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -492,6 +492,9 @@ pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1820,6 +1820,9 @@ curl http://8.140.53.236/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -368,6 +368,9 @@ crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-se
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -690,6 +690,9 @@ docker login --username=gofeng117@163.com \
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -501,6 +501,9 @@ NAT网关成本¥100/月,对初创团队是一笔开销
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -406,6 +406,9 @@ curl http://你的SAE地址:3001/health
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -738,6 +738,9 @@ const job = await queue.getJob(jobId);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -505,6 +505,9 @@ processLiteraturesInBackground(task.id, projectId, testLiteratures);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -982,6 +982,9 @@ ROI = (¥22,556 - ¥144) / ¥144 × 100% = 15,564%
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1039,6 +1039,9 @@ Redis 实例:¥500/月
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -497,6 +497,9 @@ import { ChatContainer } from '@/shared/components/Chat';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -207,3 +207,6 @@ VALUES ('user-mock-001', '13800000000', ..., 'tenant-mock-001', ...);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -419,3 +419,6 @@ frontend-v2/src/modules/pkb/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -281,3 +281,6 @@ npm run dev
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -796,3 +796,6 @@ AIA智能问答模块
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -937,6 +937,9 @@ CREATE INDEX idx_rvw_tasks_created_at ON rvw_schema.review_tasks(created_at);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -594,3 +594,6 @@ const typography = {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -906,3 +906,6 @@ app.use('/api/v1/knowledge', (req, res) => {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -220,3 +220,6 @@ rm -rf src/modules/pkb
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -395,3 +395,6 @@ GET /api/v2/pkb/batch-tasks/batch/templates
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -39,3 +39,6 @@ import pkbRoutes from './modules/pkb/routes/index.js';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -308,3 +308,6 @@ backend/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -519,3 +519,6 @@ const response = await fetch('/api/v2/pkb/batch-tasks/batch/execute', {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user