Files
AIclinicalresearch/docs/03-业务模块/ASL-AI智能文献/02-技术设计/06-质量保障与可追溯策略.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

954 lines
24 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.
# ASL 璐ㄩ噺淇濋殰涓庡彲杩芥函绛栫暐
> **鏂囨。鐗堟湰锛?* V1.0
> **鍒涘缓鏃ユ湡锛?* 2025-11-15
> **閫傜敤妯″潡锛?* AI 鏅鸿兘鏂囩尞锛圓SL锛?
> **鐩<>爣锛?* 鍒嗛樁娈垫彁鍗囨枃鐚<E69E83>瓫閫夈€佹暟鎹<E69A9F>彁鍙栫殑鍑嗙鐜囥€佽川閲忔帶鍒跺拰鍙<E68BB0>拷婧<E68BB7>€?
---
## 馃搵 鏂囨。姒傝堪
<EFBFBD>枃妗畾涔変簡 ASL 妯″潡鍦?**MVP 鈫?V1.0 鈫?V2.0** 涓変釜闃舵<E99783><EFBFBD>紝濡備綍閫愭<E996AB>鎻愬崌锛?
1. **鎻愬彇鍑嗙‘鐜?*锛氫粠鍩虹<E98DA9><EFBFBD>敤 鈫?楂樿川閲?鈫?鍖诲<E98D96>绾ф爣鍑?
2. **璐ㄩ噺鎺у埗**锛氫粠浜哄伐鎶芥煡 鈫?鑷<>姩楠岃瘉 鈫?鏅鸿兘浠茶<E6B5A0>
3. **鍙<>拷婧<E68BB7>€?*锛氫粠鍩烘湰璁板綍 鈫?瀹屾暣璇佹嵁閾?鈫?瀹¤<E780B9>绾ф棩蹇?
### 鏍稿績璁捐<E79281>鍘熷垯
| 鍘熷垯 | 璇存槑 |
|------|------|
| **鎴愭湰鍙<E6B9B0>** | MVP 闃舵<E99783>浼樺厛浣跨敤 DeepSeek + Qwen3锛屾垚鏈<E59E9A>晱鎰?|
| **璐ㄩ噺鍙<E599BA>崌绾?* | 鍙<>垏鎹㈠埌 GPT-5-Pro + Claude-4.5 楂樼<E6A582>缁勫悎 |
| **鍒嗘<E98D92>瀹炴柦** | 閬垮厤杩囧害璁捐<E79281>锛屾瘡涓<E798A1>樁娈典氦浠樺彲鐢ㄥ姛鑳?|
| **鍖诲<E98D96>鍦烘櫙浼樺寲** | 閽堝<E996BD>鑻辨枃鍖诲<E98D96>鏂囩尞鐨勭壒鐐逛紭鍖栫瓥鐣?|
---
## 馃幆 涓夐樁娈佃矾绾垮浘
```
MVP (4鍛? V1.0 (6鍛? V2.0 (8鍛?
鈹溾攢 鍩虹<E98DA9>鍙屾ā鍨嬮獙璇? 鈹溾攢 鏅鸿兘璐ㄩ噺鎺у埗 鈹溾攢 鍖诲<E98D96>绾ц川閲忎繚闅?
鈹溾攢 JSON Schema 绾︽潫 鈹溾攢 鍒嗘<E98D92>鎻愬彇浼樺寲 鈹溾攢 澶氭ā鍨嬪叡璇嗕徊瑁?
鈹溾攢 缃<>俊搴﹁瘎鍒? 鈹溾攢 璇佹嵁閾惧畬鏁磋拷婧? 鈹溾攢 鑷<>姩璐ㄩ噺瀹¤<E780B9>
鈹溾攢 浜哄伐澶嶆牳鏈哄埗 鈹溾攢 瑙勫垯寮曟搸楠岃瘉 鈹溾攢 鎻愮ず璇嶇増鏈<E5A297><E98F88>鐞?
鈹斺攢 鍩烘湰杩芥函鏃ュ織 鈹斺攢 Few-shot 绀轰緥搴? 鈹斺攢 HITL 鏅鸿兘鍒嗘祦
鈫? 鈫? 鈫?
<>敤 楂樿川閲? 鍖诲<E98D96>绾?
```
---
## 馃殌 MVP 闃舵<E99783>锛? 鍛<>
### 鐩<>爣瀹氫綅
- **鍑嗙‘鐜囩洰鏍?*锛氣墺 85%
- **鎴愭湰棰勭畻**锛氱瓫閫?1000 绡囨枃鐚?鈮?楼50
- **浜や粯鏍囧噯**锛氬熀纭€鍔熻兘鍙<E58598>敤锛屾敮鎸佸弻妯″瀷瀵规瘮
### 涓€銆佹ā鍨嬮€夋嫨绛栫暐
#### 1.1 涓诲姏妯″瀷缁勫悎锛堟垚鏈<E59E9A>紭鍏堬級
| 瑙掕壊 | 妯″瀷 | Model ID | 鐢ㄩ€?| 鎴愭湰 |
|------|------|---------|------|------|
| **妯″瀷 A** | DeepSeek-V3 | `deepseek-chat` | 蹇<>€熷垵绛?| 楼0.001/1K tokens |
| **妯″瀷 B** | Qwen3-72B | `qwen-max` | 浜ゅ弶楠岃瘉 | 楼0.004/1K tokens |
**鍒囨崲閫夐」**锛堣川閲忎紭鍏堬級锛?
- **楂樼<E6A582>缁勫悎**锛欸PT-5-Pro (`gpt-5-pro`) + Claude-4.5-Sonnet (`claude-sonnet-4-5-20250929`)
- **鎴愭湰澧炲姞**锛氱害 3-5 鍊?
- **鍑嗙‘鐜囨彁鍗?*锛?5% 鈫?92%+
#### 1.2 妯″瀷璋冪敤绛栫暐
```typescript
// 鍙屾ā鍨嬪苟琛岃皟鐢?
async function dualModelScreening(
literature: Literature,
protocol: Protocol
) {
// 骞惰<E9AA9E>璋冪敤涓や釜妯″瀷
const [resultA, resultB] = await Promise.all([
llmService.chat('deepseek', buildPrompt(literature, protocol)),
llmService.chat('qwen', buildPrompt(literature, protocol))
]);
// 瑙f瀽 JSON 缁撴灉
const decisionA = parseJSON(resultA.content);
const decisionB = parseJSON(resultB.content);
// 涓€鑷存€у垽鏂?
if (decisionA.decision === decisionB.decision) {
return {
finalDecision: decisionA.decision,
consensus: 'high',
needReview: false,
models: [decisionA, decisionB]
};
}
// 鍐茬獊 鈫?浜哄伐澶嶆牳
return {
finalDecision: 'uncertain',
consensus: 'conflict',
needReview: true,
models: [decisionA, decisionB]
};
}
```
### 浜屻€佹牳蹇冩妧鏈<E5A6A7>瓥鐣?
#### 2.1 鉁?鍙屾ā鍨嬩氦鍙夐獙璇?
**瀹炴柦鏂规<E98F82>**锛?
- 鎵€鏈夌瓫閫変换鍔″悓鏃惰皟鐢ㄤ袱涓<E8A2B1>ā鍨?
-<>姩瀵规瘮缁撴灉锛屾爣璁板樊寮?
- 涓€鑷寸巼浣滀负璐ㄩ噺鎸囨爣锛堢洰鏍?鈮?80%锛?
**浠g爜绀轰緥**锛?
```typescript
interface DualModelResult {
consensus: 'high' | 'conflict';
finalDecision: 'include' | 'exclude' | 'uncertain';
needReview: boolean;
models: ModelDecision[];
}
```
#### 2.2 鉁?JSON Schema 绾︽潫
**瀹炴柦鏂规<E98F82>**锛?
- 瀹氫箟涓ユ牸鐨勮緭鍑烘牸寮?
- 浣跨敤鏋氫妇闄愬埗鍙栧€?
- 鍖哄垎蹇呭~/鍙<>€夊瓧娈?
**Schema 瀹氫箟**锛?
```json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["decision", "reason", "confidence", "pico"],
"properties": {
"decision": {
"type": "string",
"enum": ["include", "exclude", "uncertain"]
},
"reason": {
"type": "string",
"minLength": 10,
"maxLength": 500
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"pico": {
"type": "object",
"required": ["population", "intervention", "comparison", "outcome"],
"properties": {
"population": {
"type": "string",
"enum": ["match", "partial", "mismatch"]
},
"intervention": {
"type": "string",
"enum": ["match", "partial", "mismatch"]
},
"comparison": {
"type": "string",
"enum": ["match", "partial", "mismatch", "not_applicable"]
},
"outcome": {
"type": "string",
"enum": ["match", "partial", "mismatch"]
}
}
},
"studyDesign": {
"type": "string",
"enum": ["RCT", "cohort", "case-control", "cross-sectional", "other"]
}
}
}
```
**鎻愮ず璇嶆ā鏉?*锛?
```typescript
const prompt = `
浣犳槸涓€浣嶅尰瀛︽枃鐚<EFBFBD>瓫閫変笓瀹躲€傝<EFBFBD>鏍规嵁浠ヤ笅 PICO 鏍囧噯鍒ゆ柇杩欑瘒鏂囩尞鏄<E5B09E>惁搴旇<E690B4>绾冲叆绯荤粺璇勪环銆?
# PICO 鏍囧噯
- Population: ${protocol.population}
- Intervention: ${protocol.intervention}
- Comparison: ${protocol.comparison}
- Outcome: ${protocol.outcome}
# 鏂囩尞淇℃伅
鏍囬<EFBFBD>: ${literature.title}
鎽樿<EFBFBD>: ${literature.abstract}
# 杈撳嚭瑕佹眰
璇蜂弗鏍兼寜鐓т互涓?JSON Schema 杈撳嚭缁撴灉锛?
${JSON.stringify(schema, null, 2)}
娉ㄦ剰锛?
1. decision 鍙<>兘鏄?"include"銆?exclude" 鎴?"uncertain"
2. reason 蹇呴』鍏蜂綋璇存槑鍒ゆ柇渚濇嵁锛?0-500瀛楋級
3. confidence 涓?0-1 涔嬮棿鐨勬暟鍊硷紝琛ㄧず浣犵殑鍒ゆ柇鎶婃彙
4. pico 瀛楁<E7809B>閫愰」璇勪及鍖归厤绋嬪害
`;
```
#### 2.3 鉁?缃<>俊搴﹁瘎鍒?
**瀹炴柦鏂规<E98F82>**锛?
- 瑕佹眰妯″瀷瀵规瘡涓<E798A1>垽鏂<E59EBD>粰鍑虹疆淇″害锛?-1锛?
-<>俊搴?< 0.7 鑷<>姩鏍囪<E98F8D>涓洪渶浜哄伐澶嶆牳
- 璁板綍缃<E7B68D>俊搴﹀垎甯冿紝浼樺寲闃堝€?
**鑷<>姩鍒嗘祦瑙勫垯**锛?
```typescript
function autoTriage(result: DualModelResult) {
const avgConfidence = (
result.models[0].confidence +
result.models[1].confidence
) / 2;
// 瑙勫垯1锛氬啿绐?鈫?蹇呴』澶嶆牳
if (result.consensus === 'conflict') {
return { needReview: true, priority: 'high' };
}
// 瑙勫垯2锛氫綆缃<E7B686>俊搴?鈫?闇€瑕佸<E79195>鏍?
if (avgConfidence < 0.7) {
return { needReview: true, priority: 'medium' };
}
// 瑙勫垯3锛氶珮缃<E78FAE>俊搴?+ 涓€鑷?鈫?鑷<>姩閫氳繃
return { needReview: false, priority: 'low' };
}
```
#### 2.4 鉁?鍩虹<E98DA9><EFBFBD>拷婧?
**瀹炴柦鏂规<E98F82>**锛?
- 淇濆瓨鍘熷<E98D98>鎻愮ず璇嶅拰妯″瀷杈撳嚭
- 璁板綍妯″瀷鐗堟湰鍜屾椂闂存埑
- 鍏宠仈浜哄伐澶嶆牳璁板綍
**鏁版嵁搴撹<E690B4>璁?*锛?
```prisma
model ScreeningResult {
id String @id @default(uuid())
literatureId String
protocolId String
// 妯″瀷A缁撴灉
modelAName String // "deepseek-chat"
modelAOutput Json // 鍘熷<E98D98>JSON杈撳嚭
modelAConfidence Float
// 妯″瀷B缁撴灉
modelBName String // "qwen-max"
modelBOutput Json
modelBConfidence Float
// 鏈€缁堝喅绛?
finalDecision String // "include"/"exclude"/"uncertain"
consensus String // "high"/"conflict"
needReview Boolean
// 浜哄伐澶嶆牳
reviewedBy String?
reviewedAt DateTime?
reviewDecision String?
reviewNotes String?
// 鍙<>拷婧<E68BB7>俊鎭?
promptTemplate String @db.Text // 浣跨敤鐨勬彁绀鸿瘝妯℃澘
createdAt DateTime @default(now())
@@map("asl_screening_results")
}
```
### 涓夈€丮VP 鎴愭湰棰勭畻
**鍦烘櫙锛氱瓫閫?1000 绡囨枃鐚?*
| 椤圭洰 | DeepSeek | Qwen3 | 鍚堣<E98D9A> |
|------|----------|-------|------|
| 杈撳叆 tokens锛堝钩鍧囷級 | 800 | 800 | - |
| 杈撳嚭 tokens锛堝钩鍧囷級 | 200 | 200 | - |
| 鍗曟<E98D97>鎴愭湰 | 楼0.001 | 楼0.004 | 楼0.005 |
| **1000 绡囨€绘垚鏈?* | 楼1 | 楼4 | **楼5** |
**鍐茬獊鐜?20% 浜哄伐澶嶆牳**锛?
-<>姩閫氳繃锛?00 绡?脳 楼0.005 = 楼4
- 浜哄伐澶嶆牳锛?00 绡?脳 2 鍒嗛挓 = 6.7 灏忔椂
- **鎬绘垚鏈?*锛毬? + 浜哄伐鎴愭湰
### 鍥涖€丮VP 楠屾敹鏍囧噯
| 鎸囨爣 | 鐩<>爣 | 楠岃瘉鏂规硶 |
|------|------|----------|
| 鍙屾ā鍨嬩竴鑷寸巼 | 鈮?80% | 缁熻<E7BC81>鎶ヨ〃 |
| JSON Schema 楠岃瘉閫氳繃鐜?| 鈮?95% | 鑷<>姩妫€鏌?|
| 浜哄伐澶嶆牳闃熷垪鍗犳瘮 | 鈮?20% | 绯荤粺缁熻<E7BC81> |
| 鎻愬彇缁撴灉鍙<E78189>拷婧?| 100% | 瀹¤<E780B9>妫€鏌?|
| 鎴愭湰鎺у埗 | 鈮?楼50/1000 绡?| 璐﹀崟鐩戞帶 |
---
## 馃搱 V1.0 闃舵<E99783>锛? 鍛<>
### 鐩<>爣瀹氫綅
- **鍑嗙‘鐜囩洰鏍?*锛氣墺 90%
- **鎴愭湰棰勭畻**锛氱瓫閫?1000 绡囨枃鐚?鈮?楼80
- **浜や粯鏍囧噯**锛氶珮璐ㄩ噺杈撳嚭锛屾櫤鑳借川閲忔帶鍒?
### 涓€銆佹ā鍨嬬瓥鐣ヤ紭鍖?
#### 1.1 鎴愭湰浼樺寲绛栫暐
**鏍稿績鎬濊矾**锛?0% 鐢ㄤ綆鎴愭湰妯″瀷锛?0% 楂樹环鍊间换鍔$敤椤剁骇妯″瀷
```typescript
async function smartScreening(literature: Literature, protocol: Protocol) {
// 绗<>竴闃舵<E99783>锛氬揩閫熷垵绛涳紙DeepSeek锛?
const quickResult = await llmService.chat('deepseek', buildPrompt(...));
const quickDecision = parseJSON(quickResult.content);
// 濡傛灉楂樼疆淇″害 + 鏄庣缁撹<E7BC81> 鈫?鐩存帴閲囩撼
if (
quickDecision.confidence > 0.85 &&
quickDecision.decision !== 'uncertain'
) {
return {
finalDecision: quickDecision.decision,
strategy: 'cost-optimized',
models: [quickDecision]
};
}
// 鍚﹀垯 鈫?鍚<>敤楂樼<E6A582>妯″瀷澶嶆牳
const detailedResult = await llmService.chat('gpt5', buildPrompt(...));
return {
finalDecision: detailedResult.decision,
strategy: 'quality-assured',
models: [quickDecision, detailedResult]
};
}
```
**棰勬湡鎴愭湰鑺傜渷**锛?
- 80% 浠诲姟鐢?DeepSeek锛?00 脳 楼0.001 = 楼0.8
- 20% 浠诲姟鐢?GPT-5锛?00 脳 楼0.10 = 楼20
- **鎬绘垚鏈?*锛毬?0.8锛堢浉姣斿叏鐢?GPT-5 鑺傜渷 80%锛?
### 浜屻€佹牳蹇冩妧鏈<E5A6A7><E98F88>寮?
#### 2.1 鉁?Few-shot 绀轰緥搴?
**瀹炴柦鏂规<E98F82>**锛?
- 浜哄伐鏍囨敞 20-30 涓<>珮璐ㄩ噺绀轰緥
- 閽堝<E996BD>涓嶅悓鐮旂┒绫诲瀷鍒嗙被锛圧CT銆侀槦鍒椼€佺梾渚嬪<E6B89A>鐓э級
- 鍔ㄦ€侀€夋嫨鐩镐技绀轰緥宓屽叆鎻愮ず璇?
**绀轰緥鏍煎紡**锛?
```json
{
"examples": [
{
"title": "Effect of aspirin on cardiovascular events in patients with diabetes",
"abstract": "...",
"goldStandard": {
"decision": "include",
"reason": "RCT鐮旂┒锛屼汉缇や负绯栧翱鐥呮偅鑰咃紙鍖归厤P锛夛紝骞查<E9AA9E>涓洪樋鍙稿尮鏋楋紙鍖归厤I锛夛紝瀵圭収涓哄畨鎱板墏锛堝尮閰岰锛夛紝缁撳眬涓哄績琛€绠簨浠讹紙鍖归厤O锛?,
"pico": {
"population": "match",
"intervention": "match",
"comparison": "match",
"outcome": "match"
},
"studyDesign": "RCT"
}
}
]
}
```
**鎻愮ず璇嶅<E79287>寮?*锛?
```typescript
const promptWithExamples = `
# 鍙傝€冪ず渚?
浠ヤ笅鏄?3 涓<>爣娉ㄥソ鐨勭ず渚嬶紝甯<E7B49D>姪浣犵悊瑙垽鏂<E59EBD>爣鍑嗭細
${examples.map((ex, i) => `
## 绀轰緥 ${i + 1}
鏍囬<EFBFBD>: ${ex.title}
鎽樿<EFBFBD>: ${ex.abstract}
鍒ゆ柇: ${ex.goldStandard.decision}
鐞嗙敱: ${ex.goldStandard.reason}
`).join('\n')}
# 寰呯瓫閫夋枃鐚?
鏍囬<EFBFBD>: ${literature.title}
鎽樿<EFBFBD>: ${literature.abstract}
璇峰弬鑰冧笂杩扮ず渚嬶紝杈撳嚭浣犵殑鍒ゆ柇缁撴灉锛圝SON鏍煎紡锛夈€?
`;
```
#### 2.2 鉁?鍒嗘<E98D92>鎻愬彇
**瀹炴柦鏂规<E98F82>**锛?
- 閽堝<E996BD>鍏ㄦ枃鏁版嵁鎻愬彇锛屾寜绔犺妭鍒嗘<E98D92>澶勭悊
- 姣忔<E5A7A3><EFBFBD>珛鎻愬彇锛屽噺灏戜笂涓嬫枃娣锋穯
- 鏈€鍚庡悎骞剁粨鏋滐紝浜ゅ弶楠岃瘉涓€鑷存€?
**鍒嗘<E98D92>绛栫暐**锛?
```typescript
async function segmentedExtraction(fullText: string, protocol: Protocol) {
// 鍒嗘<E98D92>
const sections = {
methods: extractSection(fullText, 'methods'),
results: extractSection(fullText, 'results'),
tables: extractTables(fullText),
};
// 骞惰<E9AA9E>鎻愬彇
const [methodsData, resultsData, tablesData] = await Promise.all([
extractFromMethods(sections.methods, protocol),
extractFromResults(sections.results, protocol),
extractFromTables(sections.tables, protocol),
]);
// 鍚堝苟缁撴灉
return mergeExtractionResults([methodsData, resultsData, tablesData]);
}
```
**鎻愬彇绀轰緥锛堟柟娉曞<E5A889>閮ㄥ垎锛?*锛?
```typescript
const methodsPrompt = `
璇蜂粠浠ヤ笅鏂规硶瀛﹂儴鍒嗘彁鍙栫爺绌惰<EFBFBD>俊鎭<EFBFBD>
# 鏂规硶瀛﹀師鏂?
${methodsSection}
# 鎻愬彇瀛楁<E7809B>
- 鐮旂┒璁捐<E79281>绫诲瀷锛圧CT/cohort/case-control绛夛級
- 鏍锋湰閲忥紙骞查<E9AA9E>缁?瀵圭収缁勶級
- 绾冲叆鏍囧噯
- 鎺掗櫎鏍囧噯
- 闅忔満鍖栨柟娉曪紙濡傞€傜敤锛?
- 鐩叉硶锛堝<E9949B>閫傜敤锛?
# 杈撳嚭鏍煎紡锛圝SON锛?
${methodsSchema}
`;
```
#### 2.3 鉁?瑙勫垯寮曟搸楠岃瘉
**瀹炴柦鏂规<E98F82>**锛?
- 瀹氫箟涓氬姟瑙勫垯锛岃嚜鍔ㄦ<E98D94>鏌ラ€昏緫閿欒<E996BF>
- 鏁板€艰寖鍥撮獙璇?
- 蹇呭瀛楁<E7809B>瀹屾暣鎬ф<E98EAC>鏌?
**楠岃瘉瑙勫垯**锛?
```typescript
const validationRules = [
{
name: '鏍锋湰閲忓悎鐞嗘€?,
check: (data) => {
const total = data.sampleSize.intervention + data.sampleSize.control;
return total >= 10 && total <= 100000;
},
errorMessage: '10-100000?
},
{
name: 'P鍊艰寖鍥?,
check: (data) => {
return data.pValue >= 0 && data.pValue <= 1;
},
errorMessage: 'P鍊煎繀椤诲湪0-1'
},
{
name: '<EFBFBD>?,
check: (data) => {
const required = ['studyDesign', 'sampleSize', 'primaryOutcome'];
return required.every(field => data[field] != null);
},
errorMessage: '缂哄皯蹇呭瀛楁<E7809B>'
}
];
function validateExtraction(data: ExtractionResult): ValidationReport {
const errors = [];
for (const rule of validationRules) {
if (!rule.check(data)) {
errors.push(rule.errorMessage);
}
}
return {
isValid: errors.length === 0,
errors
};
}
```
#### 2.4 鉁?瀹屾暣璇佹嵁閾?
**瀹炴柦鏂规<E98F82>**锛?
- 璁板綍鍘熸枃寮曠敤浣嶇疆锛堥〉鐮併€佹<E282AC>钀姐€佸彞瀛愶級
- 淇濆瓨妯″瀷瀹屾暣杈撳嚭锛堝惈涓<E68388>棿鎺ㄧ悊锛?
- 鍏宠仈鎵€鏈変汉宸ヤ慨鏀硅<E98F80>褰?
**鏁版嵁搴撳<E690B4>寮?*锛?
```prisma
model ExtractionResult {
id String @id @default(uuid())
// 鎻愬彇鍐呭<E98D90>
extractedData Json
// 璇佹嵁閾撅紙鏂板<E98F82>锛?
evidenceChain Json // {
// "sampleSize": {
// "value": 150,
// "source": {
// "page": 3,
// "paragraph": 2,
// "text": "A total of 150 patients were enrolled..."
// }
// }
// }
// 妯″瀷淇℃伅
modelName String
modelVersion String
promptVersion String // "v1.2.0"
rawOutput String @db.Text // 鍘熷<E98D98>杈撳嚭锛堝惈CoT鎺ㄧ悊锛?
// 淇<>敼鍘嗗彶
revisions ExtractionRevision[]
createdAt DateTime @default(now())
@@map("asl_extraction_results")
}
model ExtractionRevision {
id String @id @default(uuid())
extractionId String
fieldName String // 淇<>敼鐨勫瓧娈?
oldValue Json
newValue Json
reason String // 淇<>敼鐞嗙敱
revisedBy String
revisedAt DateTime @default(now())
extraction ExtractionResult @relation(fields: [extractionId], references: [id])
@@map("asl_extraction_revisions")
}
```
### 涓夈€乂1.0 鎴愭湰棰勭畻
**鍦烘櫙锛氱瓫閫?1000 绡?+ 鎻愬彇 200 绡囧叏鏂?*
| 浠诲姟 | 绛栫暐 | 鎴愭湰 |
|------|------|------|
| 鏍囬<E98F8D>鎽樿<E98EBD>绛涢€?| 80% DeepSeek + 20% GPT-5 | 楼21 |
| 鍏ㄦ枃鏁版嵁鎻愬彇 | 鍒嗘<E98D92>鎻愬彇锛圙PT-5锛?| 楼60 |
| **鎬绘垚鏈?* | - | **楼81** |
### 鍥涖€乂1.0 楠屾敹鏍囧噯
| 鎸囨爣 | 鐩<>爣 | 楠岃瘉鏂规硶 |
|------|------|----------|
| 鎻愬彇鍑嗙‘鐜?| 鈮?90% | 浜哄伐鎶芥煡 50 绡?|
| Few-shot 绀轰緥搴?| 鈮?20 涓?| 浜哄伐鏍囨敞 |
| 瑙勫垯寮曟搸瑕嗙洊鐜?| 鈮?80% | 浠g爜瀹℃煡 |
| 璇佹嵁閾惧畬鏁存€?| 100% | 瀹¤<E780B9>妫€鏌?|
| 鎴愭湰鎺у埗 | 鈮?楼80/椤圭洰 | 璐﹀崟鐩戞帶 |
---
## 馃弳 V2.0 闃舵<E99783>锛? 鍛<>
### 鐩<>爣瀹氫綅
- **鍑嗙‘鐜囩洰鏍?*锛氣墺 95%锛堝尰瀛︾骇锛?
- **鎴愭湰棰勭畻**锛氭寜闇€閰嶇疆
- **浜や粯鏍囧噯**锛氳嚜鍔ㄥ寲璐ㄩ噺瀹¤<E780B9>锛岀<E9949B>鍚堜复搴婄爺绌惰<E7BB8C>鑼?
### 涓€銆佸尰瀛︾骇璐ㄩ噺淇濋殰
#### 1.1 鉁?涓夋ā鍨嬪叡璇嗕徊瑁?
**瀹炴柦鏂规<E98F82>**锛?
- 鍙屾ā鍨嬪啿绐佹椂锛岃嚜鍔ㄥ惎鐢ㄧ<E990A2>涓夋柟浠茶<E6B5A0>
- 涓夋ā鍨嬫姇绁ㄥ喅绛?
- 璁板綍浠茶<E6B5A0>杩囩▼
```typescript
async function threeModelArbitration(
literature: Literature,
protocol: Protocol
) {
// 绗<>竴杞<E7ABB4>細鍙屾ā鍨?
const [resultA, resultB] = await Promise.all([
llmService.chat('deepseek', buildPrompt(...)),
llmService.chat('qwen', buildPrompt(...))
]);
// 濡傛灉涓€鑷达紝鐩存帴杩斿洖
if (resultA.decision === resultB.decision) {
return { finalDecision: resultA.decision, arbitration: false };
}
// 鍐茬獊 鈫?鍚<>敤 Claude 浠茶<E6B5A0>
console.log('妫€娴嬪埌鍐茬獊锛屽惎鐢?Claude-4.5 浠茶<E6B5A0>...');
const resultC = await llmService.chat('claude', buildPrompt(...));
// 涓夋ā鍨嬫姇绁?
const votes = [resultA.decision, resultB.decision, resultC.decision];
const voteCount = {
include: votes.filter(v => v === 'include').length,
exclude: votes.filter(v => v === 'exclude').length,
uncertain: votes.filter(v => v === 'uncertain').length,
};
// 澶氭暟鍐?
const winner = Object.entries(voteCount)
.sort((a, b) => b[1] - a[1])[0][0];
return {
finalDecision: winner,
arbitration: true,
votes: { resultA, resultB, resultC },
consensus: voteCount[winner] >= 2 ? 'strong' : 'weak'
};
}
```
**鎴愭湰鎺у埗**锛?
- 浠呭湪鍐茬獊鏃跺惎鐢ㄤ徊瑁侊紙棰勮<E6A3B0> 10-15%锛?
- 鍗曟<E98D97>浠茶<E6B5A0>棰濆<E6A3B0>鎴愭湰锛毬?.021锛圕laude-4.5锛?
#### 1.2 鉁?HITL 鏅鸿兘鍒嗘祦
**瀹炴柦鏂规<E98F82>**锛?
- 鍩轰簬瑙勫垯鐨勬櫤鑳戒紭鍏堢骇鎺掑簭
- 楂樹环鍊?楂橀<E6A582>闄╀换鍔紭鍏堜汉宸ュ<E5AEB8>鏍?
- 浣庨<E6B5A3>闄╀换鍔¤嚜鍔ㄥ寲澶勭悊
**鍒嗘祦瑙勫垯**锛?
```typescript
function intelligentTriage(result: ScreeningResult): TriageDecision {
let priority = 0;
let needReview = false;
// 瑙勫垯1锛氫笁妯″瀷浠嶄笉涓€鑷?鈫?鏈€楂樹紭鍏堢骇
if (result.arbitration && result.consensus === 'weak') {
priority = 100;
needReview = true;
}
// 瑙勫垯2锛歊CT 鐮旂┒ 鈫?涓<>瓑浼樺厛绾?
else if (result.studyDesign === 'RCT') {
priority = 70;
needReview = result.confidence < 0.9;
}
// 瑙勫垯3锛氬叧閿<E58FA7>粨灞€鎸囨爣 鈫?楂樹紭鍏堢骇
else if (result.outcome.includes('mortality')) {
priority = 80;
needReview = result.confidence < 0.85;
}
// 瑙勫垯4锛氶珮缃<E78FAE>俊搴?+ 涓€鑷?鈫?鑷<>姩閫氳繃
else if (result.confidence > 0.95 && result.consensus === 'high') {
priority = 10;
needReview = false;
}
return { priority, needReview };
}
```
#### 1.3 鉁?鎻愮ず璇嶇増鏈<E5A297><E98F88>鐞?
**瀹炴柦鏂规<E98F82>**锛?
- Git 绠$悊鎻愮ず璇嶆ā鏉?
- 鐗堟湰鍙锋爣璁帮紙璇<E7B499>箟鍖栫増鏈<E5A297>
- A/B 娴嬭瘯涓嶅悓鐗堟湰鏁堟灉
**鐩<>綍缁撴瀯**锛?
```
backend/prompts/asl/
鈹溾攢鈹€ screening/
鈹? 鈹溾攢鈹€ v1.0.0-basic.txt
鈹? 鈹溾攢鈹€ v1.1.0-with-examples.txt
鈹? 鈹斺攢鈹€ v1.2.0-cot.txt
鈹溾攢鈹€ extraction/
鈹? 鈹溾攢鈹€ v1.0.0-methods.txt
鈹? 鈹斺攢鈹€ v1.1.0-methods-segmented.txt
鈹斺攢鈹€ changelog.md
```
**鐗堟湰璁板綍**锛?
```prisma
model PromptVersion {
id String @id @default(uuid())
name String // "screening-v1.2.0"
content String @db.Text
version String // "1.2.0"
changelog String // "澧炲姞 Few-shot 绀轰緥"
// 鎬ц兘鎸囨爣
accuracy Float? // 0.92
usageCount Int @default(0)
isActive Boolean @default(false)
createdAt DateTime @default(now())
@@map("asl_prompt_versions")
}
```
#### 1.4 鉁?鑷<>姩璐ㄩ噺瀹¤<E780B9>
**瀹炴柦鏂规<E98F82>**锛?
- 瀹氭湡鎵归噺鎶芥煡锛?0%锛?
-<>姩鐢熸垚璐ㄩ噺鎶ュ憡
- 寮傚父妫€娴嬪拰鍛婅<E98D9B>
**瀹¤<E780B9>鎶ヨ〃**锛?
```typescript
interface QualityAuditReport {
period: { start: Date; end: Date };
totalTasks: number;
sampledTasks: number;
metrics: {
accuracy: number; // 鍑嗙‘鐜?
interRaterAgreement: number; // 浜烘満涓€鑷存€?
falsePositiveRate: number; // 鍋囬槼鎬х巼
falseNegativeRate: number; // 鍋囬槾鎬х巼
};
modelPerformance: {
deepseek: { accuracy: number; avgConfidence: number };
qwen: { accuracy: number; avgConfidence: number };
gpt5: { accuracy: number; avgConfidence: number };
};
issues: {
type: string;
count: number;
examples: string[];
}[];
recommendations: string[];
}
```
### 浜屻€侀珮绾ф彁绀鸿瘝宸ョ▼
#### 2.1 鉁?Chain of Thought (CoT)
**瀹炴柦鏂规<E98F82>**锛?
- 瑕佹眰妯″瀷杈撳嚭鎺ㄧ悊杩囩▼
- 鍒嗘<E98D92>楠ゅ垽鏂?PICO 鍖归厤搴?
- 鏈€鍚庣粰鍑虹患鍚堢粨璁?
**鎻愮ず璇嶇ず渚?*锛?
```
璇锋寜鐓т互涓嬫<EFBFBD>楠ゅ垽鏂<EFBFBD>繖绡囨枃鐚<EFBFBD>槸鍚﹀簲璇ョ撼鍏ワ細
# Step 1: 鐮旂┒璁捐<E79281>鍒ゆ柇
- 璇嗗埆鐮旂┒绫诲瀷锛圧CT/闃熷垪/鐥呬緥瀵圭収绛夛級
- 鍒ゆ柇鏄<E69F87>惁绗﹀悎绾冲叆鏍囧噯
# Step 2: PICO 閫愰」璇勪及
- Population: 璇︾粏鍒嗘瀽浜虹兢鏄<E585A2>惁鍖归厤
- Intervention: 璇︾粏鍒嗘瀽骞查<E9AA9E><EFBFBD>柦鏄<E69FA6>惁鍖归厤
- Comparison: 璇︾粏鍒嗘瀽瀵圭収鏄<E58F8E>惁鍖归厤
- Outcome: 璇︾粏鍒嗘瀽缁撳眬鎸囨爣鏄<E788A3>惁鍖归厤
# Step 3: 缁煎悎鍒ゆ柇
- 姹囨€讳互涓婂垎鏋?
- 缁欏嚭鏈€缁堝喅绛栵紙include/exclude/uncertain锛?
- 璇勪及缃<E58F8A>俊搴︼紙0-1锛?
# 杈撳嚭鏍煎紡
{
"reasoning": {
"studyDesign": "杩欐槸涓€椤?..",
"population": "浜虹兢鍖归厤搴﹀垎鏋?..",
"intervention": "骞查<E9AA9E><EFBFBD>柦鍒嗘瀽...",
"comparison": "瀵圭収鍒嗘瀽...",
"outcome": "缁撳眬鎸囨爣鍒嗘瀽..."
},
"decision": "include",
"confidence": 0.95,
"reason": "鍩轰簬浠ヤ笂鍒嗘瀽..."
}
```
#### 2.2 鉁?鍔ㄦ€佺ず渚嬮€夋嫨
**瀹炴柦鏂规<E98F82>**锛?
-畻寰呯瓫閫夋枃鐚<E69E83>笌绀轰緥搴撶殑璇<E6AE91>箟鐩镐技搴?
- 鍔ㄦ€侀€夋嫨鏈€鐩镐技鐨?3-5 涓<>ず渚?
- 宓屽叆鎻愮ず璇?
```typescript
async function selectSimilarExamples(
literature: Literature,
examplePool: Example[]
): Promise<Example[]> {
// 浣跨敤宓屽叆妯″瀷璁$畻鐩镐技搴?
const literatureEmbedding = await getEmbedding(
`${literature.title} ${literature.abstract}`
);
const similarities = examplePool.map(ex => ({
example: ex,
similarity: cosineSimilarity(literatureEmbedding, ex.embedding)
}));
// 杩斿洖鏈€鐩镐技鐨?5 涓?
return similarities
.sort((a, b) => b.similarity - a.similarity)
.slice(0, 5)
.map(s => s.example);
}
```
### 涓夈€乂2.0 鎴愭湰棰勭畻
**鍦烘櫙锛氶珮璐ㄩ噺绯荤粺璇勪环椤圭洰锛堢瓫閫?5000 绡?+ 鎻愬彇 300 绡囷級**
| 浠诲姟 | 绛栫暐 | 鎴愭湰 |
|------|------|------|
| 鏍囬<E98F8D>鎽樿<E98EBD>绛涢€?| 鎴愭湰浼樺寲 + 15% 浠茶<E6B5A0> | 楼120 |
| 鍏ㄦ枃鏁版嵁鎻愬彇 | GPT-5 + Claude 鍙屾ā鍨?| 楼350 |
| 璐ㄩ噺瀹¤<E780B9> | 10% 鎶芥煡 | 楼30 |
| **鎬绘垚鏈?* | - | **楼500** |
### 鍥涖€乂2.0 楠屾敹鏍囧噯
| 鎸囨爣 | 鐩<>爣 | 楠岃瘉鏂规硶 |
|------|------|----------|
| 鎻愬彇鍑嗙‘鐜?| 鈮?95% | 浜哄伐鎶芥煡 100 绡?|
| 浜烘満涓€鑷存€?| 鈮?90% | Cohen's Kappa |
| 鍋囬槼鎬х巼 | 鈮?5% | 缁熻<E7BC81>鍒嗘瀽 |
| 鍋囬槾鎬х巼 | 鈮?3% | 缁熻<E7BC81>鍒嗘瀽 |
| 鎻愮ず璇嶇増鏈<E5A297><E98F88>鐞?| 100% | Git 鍘嗗彶 |
| 鑷<>姩鍖栧<E98D96>璁?| 姣忓懆 1 娆?| 绯荤粺鎶ヨ〃 |
---
## 馃搳 涓夐樁娈靛<E5A888>姣旀€荤粨
| 缁村害 | MVP | V1.0 | V2.0 |
|------|-----|------|------|
| **鍑嗙‘鐜?* | 85% | 90% | 95% |
| **妯″瀷缁勫悎** | DeepSeek + Qwen3 | 鎴愭湰浼樺寲绛栫暐 | 涓夋ā鍨嬩徊瑁?|
| **璐ㄩ噺鎺у埗** | 鍙屾ā鍨嬮獙璇?| 瑙勫垯寮曟搸 + Few-shot | HITL + 鑷<>姩瀹¤<E780B9> |
| **鍙<>拷婧<E68BB7>€?* | 鍩烘湰鏃ュ織 | 瀹屾暣璇佹嵁閾?| 瀹¤<E780B9>绾ц<E7BBBE>褰?|
| **鎴愭湰/1000 绡?* | 楼5 | 楼21 | 楼24 + 浠茶<E6B5A0> |
| **寮€鍙戝懆鏈?* | 4 鍛?| 6 鍛?| 8 鍛?|
| **閫傜敤鍦烘櫙** | 蹇<>€熼獙璇?| 甯歌<E794AF>椤圭洰 | 楂樿川閲忓彂琛?|
---
## 馃攧 瀹炴柦璺<E69FA6>
### 闃舵<E99783> 1: MVP 寮€鍙戯紙Week 1-4锛?
**Week 1**锛氬熀纭€鏋舵瀯
- [ ] LLM 鏈嶅姟灏佽<E7818F>锛圖eepSeek + Qwen3锛?
- [ ] JSON Schema 瀹氫箟
- [ ] 鏁版嵁搴撹〃璁捐<E79281>
**Week 2**锛氭牳蹇冨姛鑳?
- [ ] 鍙屾ā鍨嬪苟琛岃皟鐢?
- [ ] 涓€鑷存€у垽鏂<E59EBD>€昏緫
- [ ] 浜哄伐澶嶆牳闃熷垪
**Week 3**锛氬墠绔<E5A2A0>紑鍙?
- [ ] 绛涢€夊伐浣滃彴
- [ ] 鍐茬獊瀵规瘮瑙嗗浘
- [ ] 浜哄伐澶嶆牳鐣岄潰
**Week 4**锛氭祴璇曢獙鏀?
- [ ] 鍔熻兘娴嬭瘯
- [ ] 鍑嗙‘鐜囪瘎浼?
- [ ] 鎴愭湰鐩戞帶
### 闃舵<E99783> 2: V1.0 澧炲己锛圵eek 5-10锛?
**Week 5-6**锛氭櫤鑳戒紭鍖?
- [ ] 鎴愭湰浼樺寲绛栫暐
- [ ] Few-shot 绀轰緥搴?
- [ ] 鍔ㄦ€佺ず渚嬮€夋嫨
**Week 7-8**锛氳川閲忔帶鍒?
- [ ] 鍒嗘<E98D92>鎻愬彇
- [ ] 瑙勫垯寮曟搸
- [ ] 璇佹嵁閾惧畬鏁村寲
**Week 9-10**锛氭祴璇曚紭鍖?
- [ ] A/B 娴嬭瘯
- [ ] 鍑嗙‘鐜囨彁鍗?
- [ ] 鏂囨。瀹屽杽
### 闃舵<E99783> 3: V2.0 瀹屽杽锛圵eek 11-18锛?
**Week 11-13**锛氶珮绾у姛鑳?
- [ ] 涓夋ā鍨嬩徊瑁?
- [ ] HITL 鏅鸿兘鍒嗘祦
- [ ] 鎻愮ず璇嶇増鏈<E5A297><E98F88>鐞?
**Week 14-16**锛氳川閲忓<E996B2>璁?
- [ ]<>姩瀹¤<E780B9>绯荤粺
- [ ] 璐ㄩ噺鎶ヨ〃
- [ ] 寮傚父妫€娴?
**Week 17-18**锛氬彂甯冨噯澶?
- [ ] 鍏ㄩ噺娴嬭瘯
- [ ] 鍖诲<E98D96>涓撳<E6B693>楠岃瘉
- [ ] 鏂囨。鍜屽煿璁?
---
## 馃摎 鐩稿叧鏂囨。
- [CloseAI 闆嗘垚鎸囧崡](../../../02-閫氱敤鑳藉姏灞?01-LLM澶фā鍨嬬綉鍏?03-CloseAI闆嗘垚鎸囧崡.md)
- [AI 妯″瀷闆嗘垚璁捐<E79281>](./04-AI妯″瀷闆嗘垚璁捐<E79281>.md)
- [鏁版嵁搴撹<E690B4><EFBFBD>(./01-鏁版嵁搴撹<E690B4>璁?md)
- [API 璁捐<E79281>瑙勮寖](./02-API璁捐<E79281>瑙勮寖.md)
---
**鏇存柊鏃ュ織**锛?
- 2025-11-15: 鍒涘缓鏂囨。锛屽畾涔?MVP/V1.0/V2.0 涓夐樁娈电瓥鐣?