Files
AIclinicalresearch/docs/03-业务模块/ADMIN-运营管理端/00-给新AI的快速指南.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

183 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# <20><> 蝏蹱鰵AI<41><EFBFBD><E68B87><EFBFBD><EFBFBD><E7BFB0><EFBFBD><EFBFBD>?
> **<2A>湔鰵<E6B994>園𡢿嚗?* 2026-01-12
> **敶枏<E695B6><E69E8F><EFBFBD><E59786><EFBFBD>** <20>?Phase 3.5.5 隞<><E99A9E><EFBFBD><EFBFBD>惩歇摰峕<E691B0><EFBFBD><E59A97>蝡臬<E89DA1>蝡舀<E89DA1>霂?
---
## <20>?30蝘雴<E89D98><EFBFBD><E996AB><EFBFBD>滨𠶖<E6BBA8>?
```
<EFBFBD>?Phase 3.5.1-3.5.5 隞<><E99A9E><EFBFBD><EFBFBD>惩歇摰峕<E691B0>嚗?5%嚗?<3F>?敺<><E695BA><EFBFBD><EFBFBD>蝡臬<E89DA1>蝡舀<E89DA1>霂閖<E99C82>霂?
撌脣<EFBFBD><EFBFBD><EFBFBD>
<20>?<3F>唳旿摨橒<E691A8>capability_schema + prompt_templates + prompt_versions
<20>?<3F>𡒊垢嚗䥪romptService嚗?96銵䕘<E98AB5>+ 8銝服PI<50>亙藁
<20>?<3F>滨垢嚗𡁶恣<F0A181B6><E681A3><EFBFBD><EFBFBD> + Prompt<70>𡑒” + 蝻𤥁<E89DBB><F0A4A581><EFBFBD>CodeMirror 6嚗? <20>?瘚贝<E7989A>嚗𡁜<E59A97>蝡臬<E89DA1><E887AC><EFBFBD><EFBFBD>霂訫<E99C82><E8A8AB><EFBFBD><EFBFBD>
<20>?RVW<56><57><EFBFBD>嚗塄ditorialService + methodologyService 撌脫㺿<E884AB>𩤃<EFBFBD>2026-01-12嚗?
銝衤<EFBFBD>甇伐<EFBFBD>
<20>?<3F>臬𢆡<E887AC>𡒊垢<F0A1928A>滚𦛚瘚贝<E7989A>
<20>?蝡臬<E89DA1>蝡舀<E89DA1>霂閧<E99C82>摨阡<E691A8><EFBFBD><E996AB><EFBFBD>? <20>?<3F>湔鰵摰峕<E691B0>摨行<E691A8>獢?```
---
## <20><> <20>喲睸<E596B2><E79DB8>辣雿滨蔭
### <20><EFBFBD><E8A9A8><EFBFBD>辣嚗<E8BEA3><E59A97>霂鳴<E99C82>
| <20><>辣 | 霂湔<E99C82> | 銵峕㺭 |
|------|------|------|
| `backend/src/common/prompt/prompt.service.ts` | PromptService <20><EFBFBD><E8A9A8><EFBFBD> | 596 |
| `backend/src/modules/rvw/services/editorialService.ts` | RVW 蝔輻漲霂<E6BCB2><EFBFBD>滚𦛚 <20>?撌脫㺿<E884AB>?| 83 |
| `backend/src/modules/rvw/services/methodologyService.ts` | RVW <20><EFBFBD>摮西<E691AE>隡唳<E99AA1><E594B3>?<3F>?撌脫㺿<E884AB>?| 83 |
| `backend/src/modules/rvw/workers/reviewWorker.ts` | RVW Worker <20>?撌脫凒<E884AB><EFBFBD><E594AC>𠌊serId | 193 |
| `frontend-v2/src/pages/admin/PromptEditorPage.tsx` | Prompt 蝻𤥁<E89DBB><F0A4A581>券△<E588B8>?| 399 |
### <20><>﹝嚗<EFB99D><E59A97>霂鳴<E99C82>
| <20><>﹝ | <20><>捆 |
|------|------|
| `04-撘<><E69298>𤏸恣<F0A48FB8>?01-TODO皜<4F><E79A9C><EFBFBD>虾餈質葵嚗?md` | 霂衣<E99C82>隞餃𦛚皜<F0A69B9A><E79A9C>嚗?9/110 摰峕<E691B0>嚗车
| `04-撘<><E69298>𤏸恣<F0A48FB8>?02-Prompt蝞∠<E89D9E>蝟餌<E89D9F><EFBFBD><E69298>𤏸恣<F0A48FB8>?md` | 摰峕㟲撘<E39FB2><E69298>𤏸恣<F0A48FB8>?|
| `00-Phase3.5摰峕<EFBFBD><EFBFBD><EFBFBD>.md` | 撌脣<E6928C><E884A3>𣂼極雿𨀣<E99BBF><EFBFBD> |
---
## <20>㴓 Phase 3.5.5 隞餃𦛚霂西圾嚗<E59CBE><E59A97><><E99A9E><EFBFBD><EFBFBD>惩歇摰峕<E691B0> 2026-01-12嚗?
### <20>?隞餃𦛚 1嚗𡁏㺿<F0A1818F>?editorialService.ts - 撌脣<E6928C><E884A3>?
**<2A><EFBFBD><EFBFBD>**嚗<><E59A97>隞嗉粉<E59789><EFBFBD>
```typescript
const PROMPT_PATH = path.join(__dirname, '../../../../prompts/review_editorial_system.txt');
const prompt = fs.readFileSync(PROMPT_PATH, 'utf-8');
```
**<EFBFBD><EFBFBD><EFBFBD>**嚗㇊romptService嚗?```typescript
import { prisma } from '../../../config/database.js';
import { getPromptService } from '../../../common/prompt/index.js';
const promptService = getPromptService(prisma);
const { content: systemPrompt, isDraft } = await promptService.get('RVW_EDITORIAL', {}, { userId });
if (isDraft) {
logger.info('[RVW:Editorial] 雿輻鍂 DRAFT <20><>𧋦 Prompt嚗<74><E59A97>霂閙芋撘𧶏<E69298>', { userId });
}
```
### <20>?隞餃𦛚 2嚗𡁏㺿<F0A1818F>?methodologyService.ts - 撌脣<E6928C><E884A3>?
**<2A><EFBFBD><EFBFBD>**
```typescript
const { content: systemPrompt, isDraft } = await promptService.get('RVW_METHODOLOGY', {}, { userId });
```
### <20>?隞餃𦛚 3嚗𡁏凒<F0A1818F>?reviewWorker.ts - 撌脣<E6928C><E884A3>?
**<2A><EFBFBD><EFBFBD>** - 隡𣳇<E99AA1>?userId <20><EFBFBD><E88880>啣漲憸<E6BCB2><E686B8>
```typescript
// <20>?Phase 3.5.5: 隡𣳇<E99AA1>?userId <20><EFBFBD><E88880>啣漲憸<E6BCB2><E686B8>
editorialResult = await reviewEditorialStandards(extractedText, modelType, userId);
methodologyResult = await reviewMethodology(extractedText, modelType, userId);
```
### <20>?隞餃𦛚 4嚗𡁶垢<F0A181B6>啁垢瘚贝<E7989A> - 敺<><E695BA>霂?
**瘚贝<E7989A>甇仿炊**
1. <20><EFBFBD> Prompt撌亦<E6928C><EFBFBD><E692A3>`13800000002` / `123456`嚗?2. 餈𥕦<E9A488> `/admin/prompts`
3. 蝻𤥁<E89DBB> `RVW_EDITORIAL`嚗䔶耨<E494B6><EFBFBD><EFBFBD><E686AD>摰對<E691B0><EFBFBD><EFBFBD>?瘚贝<E7989A>"嚗?4. 靽嘥<E99DBD><E598A5>厩阮
5. 撘<><E69298><EFBFBD>霂閙芋撘𧶏<E69298><F0A7B68F>㗇𥋘 RVW 璅<E79285>
6. <20><><EFBFBD><EFBFBD><E594AC>∠垢 `/rvw`
7. 銝𠹺<E98A9D><EFBFBD>銝芣<E98A9D><EFBFBD><E78DA2><EFBFBD><EFBFBD>摰⊥䰻蝏𤘪<E89D8F><F0A498AA>臬炏雿輻鍂鈭<E98D82><EFBFBD><EFBFBD><E5ADB5>?Prompt
8. 撉諹<E69289><E8ABB9><EFBFBD>𡁶鍂<F0A181B6><EFBFBD>雿輻鍂<E8BCBB><EFBFBD><E68A92>?
---
## <20><> <20>喲睸隞<E79DB8><E99A9E>蝷箔<E89DB7>
### PromptService.get() <20><EFBFBD>
```typescript
// <20><EFBFBD> Prompt嚗<74><EFBFBD><EFBFBD>摨佗<E691A8>
const result = await promptService.get(
'RVW_EDITORIAL', // code
{}, // variables嚗㇌VW<56><EFBFBD><E683A9>𧶏<EFBFBD>
{ userId: req.user.id } // <20><EFBFBD><E585B6>斗鱏靚<E9B18F><E99D9A><E79285>
);
// 雿輻鍂皜脫<E79A9C><E884AB>𡒊<EFBFBD><F0A1928A><EFBFBD>
const messages = [
{ role: 'system', content: result.content },
{ role: 'user', content: documentText },
];
// 雿輻鍂璅<E79285><E288AA>滨蔭
const llmResponse = await llm.chat(messages, {
temperature: result.modelConfig.temperature,
model: result.modelConfig.model,
});
```
### 靚<><E99D9A><E79285> API
```typescript
// 撘<><E69298><EFBFBD>霂𤏪<E99C82><F0A48FAA><EFBFBD>霂?RVW嚗?POST /api/admin/prompts/debug
{
"modules": ["RVW"],
"enabled": true
}
// <20>喲𡡒靚<F0A1A192><E99D9A>
POST /api/admin/prompts/debug
{
"modules": [],
"enabled": false
}
```
---
## <20><>儭?<3F><EFBFBD>靽⊥<E99DBD>
### <20>唳旿摨?
```
Host: localhost
Port: 5432
Database: ai_clinical_research
User: postgres
Password: postgres123
```
### <20>𡒊垢<F0A1928A>滚𦛚
```
蝡臬藁: 3001
<EFBFBD>臬𢆡: cd backend && npm run dev
```
### <20>滨垢<E6BBA8>滚𦛚
```
蝡臬藁: 3000
<EFBFBD>臬𢆡: cd frontend-v2 && npm run dev
<EFBFBD><EFBFBD>: /api -> http://localhost:3001 (撌脤<E6928C>蝵?
```
---
## <20>𩤃<EFBFBD> 撣貉<E692A3><E8B289><EFBFBD>
### 1. Prisma Client <20><EFBFBD><E69B86>?prompt_templates
**閫<><E996AB>**嚗朞<E59A97>銵?`npx prisma generate`
### 2. <20>滨垢靚<E59EA2>鍂 API 401
**閫<><E996AB>**嚗𡁏<E59A97><F0A1818F>交糓<E4BAA4>血歇<E8A180><EFBFBD>嚗𥇍WT Token <20>臬炏<E887AC><EFBFBD>
### 3. CodeMirror 銝齿遬蝷?
**閫<><E996AB>**嚗𡁏<E59A97><F0A1818F>交糓<E4BAA4><EFBFBD><EFBFBD><E98B86> `codemirror` <20>?`@codemirror/*` 靘肽<E99D98>
---
## <20><> <20>𠉛頂靽⊥<E99DBD>
<EFBFBD><EFBFBD><EFBFBD>煾䔮嚗諹窈<EFBFBD>仿<EFBFBD>嚗?- <20><><EFBFBD>航挽霈∴<E99C88>`02-<2D><><EFBFBD>航挽霈?03-Prompt蝞∠<E89D9E>蝟餌<E89D9F>敹恍<E695B9><EFBFBD><E7AC94>?md`
- 撘<><E69298>𤏸<EFBFBD><F0A48FB8><EFBFBD><EFBFBD>`../../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?`
---
*蟡嘥<EFBFBD><EFBFBD>煾◇<EFBFBD><EFBFBD> <20><>*