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

24 KiB
Raw Blame History

ASL 璐ㄩ噺淇濋殰涓庡彲杩芥函绛栫暐

*鏂囨。鐗堟湰锛? V1.0
*鍒涘缓鏃ユ湡锛? 2025-11-15
*閫傜敤妯″潡锛? AI 鏅鸿兘鏂囩尞锛圓SL锛? *<EFBFBD>爣锛? 鍒嗛樁娈垫彁鍗囨枃鐚<E69E83>瓫閫夈€佹暟鎹<E69A9F>彁鍙栫殑鍑嗙鐜囥€佽川閲忔帶鍒跺拰鍙<E68BB0>拷婧<E68BB7>€?


馃搵 鏂囨。姒傝堪

<EFBFBD>枃妗畾涔変簡 ASL 妯″潡鍦?MVP 鈫?V1.0 鈫?V2.0 涓変釜闃舵<E99783><EFBFBD>紝濡備綍閫愭<E996AB>鎻愬崌锛?

  1. **鎻愬彇鍑嗙‘鐜?*锛氫粠鍩虹<E98DA9><EFBFBD>敤 鈫?楂樿川閲?鈫?鍖诲<E98D96>绾ф爣鍑?
  2. 璐ㄩ噺鎺у埗锛氫粠浜哄伐鎶芥煡 鈫?鑷<>姩楠岃瘉 鈫?鏅鸿兘浠茶<E6B5A0>
  3. **鍙<>拷婧<E68BB7>€?*锛氫粠鍩烘湰璁板綍 鈫?瀹屾暣璇佹嵁閾?鈫?瀹¤<E780B9>绾ф棩蹇?

鏍稿績璁捐<EFBFBD>鍘熷垯

鍘熷垯 璇存槑
鎴愭湰鍙<EFBFBD> MVP 闃舵<E99783>浼樺厛浣跨敤 DeepSeek + Qwen3锛屾垚鏈<E59E9A>晱鎰?
*璐ㄩ噺鍙<EFBFBD>崌绾? <EFBFBD>垏鎹㈠埌 GPT-5-Pro + Claude-4.5 楂樼<E6A582>缁勫悎
鍒嗘<EFBFBD>瀹炴柦 閬垮厤杩囧害璁捐<EFBFBD>锛屾瘡涓<EFBFBD>樁娈典氦浠樺彲鐢ㄥ姛鑳?
鍖诲<EFBFBD>鍦烘櫙浼樺寲 閽堝<EFBFBD>鑻辨枃鍖诲<EFBFBD>鏂囩尞鐨勭壒鐐逛紭鍖栫瓥鐣?

馃幆 涓夐樁娈佃矾绾垮浘

MVP (4鍛?              V1.0 (6鍛?            V2.0 (8鍛?
鈹溾攢 鍩虹<E98DA9>鍙屾ā鍨嬮獙璇?     鈹溾攢 鏅鸿兘璐ㄩ噺鎺у埗      鈹溾攢 鍖诲<E98D96>绾ц川閲忎繚闅?
鈹溾攢 JSON Schema 绾︽潫    鈹溾攢 鍒嗘<E98D92>鎻愬彇浼樺寲      鈹溾攢 澶氭ā鍨嬪叡璇嗕徊瑁?
鈹溾攢 缃<>俊搴﹁瘎鍒?         鈹溾攢 璇佹嵁閾惧畬鏁磋拷婧?   鈹溾攢 鑷<>姩璐ㄩ噺瀹¤<E780B9>
鈹溾攢 浜哄伐澶嶆牳鏈哄埗        鈹溾攢 瑙勫垯寮曟搸楠岃瘉      鈹溾攢 鎻愮ず璇嶇増鏈<E5A297><E98F88>鐞?
鈹斺攢 鍩烘湰杩芥函鏃ュ織        鈹斺攢 Few-shot 绀轰緥搴?  鈹斺攢 HITL 鏅鸿兘鍒嗘祦
   鈫?                     鈫?                   鈫?
  鍙<>敤                  楂樿川閲?               鍖诲<E98D96>绾?

馃殌 MVP 闃舵<E99783>锛? 鍛<>

<EFBFBD>爣瀹氫綅

  • **鍑嗙‘鐜囩洰鏍?*锛氣墺 85%
  • 鎴愭湰棰勭畻锛氱瓫閫?1000 绡囨枃鐚?鈮?楼50
  • 浜や粯鏍囧噯锛氬熀纭€鍔熻兘鍙<EFBFBD>敤锛屾敮鎸佸弻妯″瀷瀵规瘮

涓€銆佹ā鍨嬮€夋嫨绛栫暐

1.1 涓诲姏妯″瀷缁勫悎锛堟垚鏈<E59E9A>紭鍏堬級

瑙掕壊 妯″瀷 Model ID 鐢ㄩ€? 鎴愭湰
妯″瀷 A DeepSeek-V3 deepseek-chat <EFBFBD>€熷垵绛? 楼0.001/1K tokens
妯″瀷 B Qwen3-72B qwen-max 浜ゅ弶楠岃瘉 楼0.004/1K tokens

**鍒囨崲閫夐」**锛堣川閲忎紭鍏堬級锛?

  • 楂樼<EFBFBD>缁勫悎锛欸PT-5-Pro (gpt-5-pro) + Claude-4.5-Sonnet (claude-sonnet-4-5-20250929)
  • 鎴愭湰澧炲姞锛氱害 3-5 鍊?
  • **鍑嗙‘鐜囨彁鍗?*锛?5% 鈫?92%+

1.2 妯″瀷璋冪敤绛栫暐

// 鍙屾ā鍨嬪苟琛岃皟鐢?
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]
  };
}

浜屻€佹牳蹇冩妧鏈<EFBFBD>瓥鐣?

2.1 鉁?鍙屾ā鍨嬩氦鍙夐獙璇?

**瀹炴柦鏂规<E98F82>**锛?

  • 鎵€鏈夌瓫閫変换鍔″悓鏃惰皟鐢ㄤ袱涓<EFBFBD>ā鍨?
  • <EFBFBD>姩瀵规瘮缁撴灉锛屾爣璁板樊寮?
  • 涓€鑷寸巼浣滀负璐ㄩ噺鎸囨爣锛堢洰鏍?鈮?80%锛?

浠g爜绀轰緥锛?

interface DualModelResult {
  consensus: 'high' | 'conflict';
  finalDecision: 'include' | 'exclude' | 'uncertain';
  needReview: boolean;
  models: ModelDecision[];
}

2.2 鉁?JSON Schema 绾︽潫

**瀹炴柦鏂规<E98F82>**锛?

  • 瀹氫箟涓ユ牸鐨勮緭鍑烘牸寮?
  • 浣跨敤鏋氫妇闄愬埗鍙栧€?
  • 鍖哄垎蹇呭~/鍙<>€夊瓧娈?

Schema 瀹氫箟锛?

{
  "$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"]
    }
  }
}

**鎻愮ず璇嶆ā鏉?*锛?

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>**锛?

  • 瑕佹眰妯″瀷瀵规瘡涓<EFBFBD>垽鏂<EFBFBD>粰鍑虹疆淇″害锛?-1锛?
  • <EFBFBD>俊搴?< 0.7 鑷<>姩鏍囪<E98F8D>涓洪渶浜哄伐澶嶆牳
  • 璁板綍缃<EFBFBD>俊搴﹀垎甯冿紝浼樺寲闃堝€?

<EFBFBD>姩鍒嗘祦瑙勫垯锛?

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>**锛?

  • 淇濆瓨鍘熷<EFBFBD>鎻愮ず璇嶅拰妯″瀷杈撳嚭
  • 璁板綍妯″瀷鐗堟湰鍜屾椂闂存埑
  • 鍏宠仈浜哄伐澶嶆牳璁板綍

**鏁版嵁搴撹<E690B4>璁?*锛?

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 鍚堣<EFBFBD>
杈撳叆 tokens锛堝钩鍧囷級 800 800 -
杈撳嚭 tokens锛堝钩鍧囷級 200 200 -
鍗曟<EFBFBD>鎴愭湰 楼0.001 楼0.004 楼0.005
*1000 绡囨€绘垚鏈? 楼1 楼4 楼5

鍐茬獊鐜?20% 浜哄伐澶嶆牳锛?

  • <EFBFBD>姩閫氳繃锛?00 绡?脳 楼0.005 = 楼4
  • 浜哄伐澶嶆牳锛?00 绡?脳 2 鍒嗛挓 = 6.7 灏忔椂
  • **鎬绘垚鏈?*锛毬? + 浜哄伐鎴愭湰

鍥涖€丮VP 楠屾敹鏍囧噯

鎸囨爣 <EFBFBD> 楠岃瘉鏂规硶
鍙屾ā鍨嬩竴鑷寸巼 鈮?80% 缁熻<EFBFBD>鎶ヨ〃
JSON Schema 楠岃瘉閫氳繃鐜? 鈮?95% <EFBFBD>姩妫€鏌?
浜哄伐澶嶆牳闃熷垪鍗犳瘮 鈮?20% 绯荤粺缁熻<EFBFBD>
鎻愬彇缁撴灉鍙<EFBFBD>拷婧? 100% 瀹¤<EFBFBD>妫€鏌?
鎴愭湰鎺у埗 鈮?楼50/1000 绡? 璐﹀崟鐩戞帶

馃搱 V1.0 闃舵<E99783>锛? 鍛<>

<EFBFBD>爣瀹氫綅

  • **鍑嗙‘鐜囩洰鏍?*锛氣墺 90%
  • 鎴愭湰棰勭畻锛氱瓫閫?1000 绡囨枃鐚?鈮?楼80
  • 浜や粯鏍囧噯锛氶珮璐ㄩ噺杈撳嚭锛屾櫤鑳借川閲忔帶鍒?

涓€銆佹ā鍨嬬瓥鐣ヤ紭鍖?

1.1 鎴愭湰浼樺寲绛栫暐

鏍稿績鎬濊矾锛?0% 鐢ㄤ綆鎴愭湰妯″瀷锛?0% 楂樹环鍊间换鍔$敤椤剁骇妯″瀷

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%锛?

浜屻€佹牳蹇冩妧鏈<EFBFBD><EFBFBD>寮?

2.1 鉁?Few-shot 绀轰緥搴?

**瀹炴柦鏂规<E98F82>**锛?

  • 浜哄伐鏍囨敞 20-30 涓<>珮璐ㄩ噺绀轰緥
  • 閽堝<EFBFBD>涓嶅悓鐮旂┒绫诲瀷鍒嗙被锛圧CT銆侀槦鍒椼€佺梾渚嬪<EFBFBD>鐓э級
  • 鍔ㄦ€侀€夋嫨鐩镐技绀轰緥宓屽叆鎻愮ず璇?

绀轰緥鏍煎紡锛?

{
  "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>寮?*锛?

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>**锛?

  • 閽堝<EFBFBD>鍏ㄦ枃鏁版嵁鎻愬彇锛屾寜绔犺妭鍒嗘<EFBFBD>澶勭悊
  • 姣忔<EFBFBD><EFBFBD>珛鎻愬彇锛屽噺灏戜笂涓嬫枃娣锋穯
  • 鏈€鍚庡悎骞剁粨鏋滐紝浜ゅ弶楠岃瘉涓€鑷存€?

鍒嗘<EFBFBD>绛栫暐锛?

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>閮ㄥ垎锛?*锛?

const methodsPrompt = `
璇蜂粠浠ヤ笅鏂规硶瀛﹂儴鍒嗘彁鍙栫爺绌惰<EFBFBD>俊鎭<EFBFBD>
# 鏂规硶瀛﹀師鏂?
${methodsSection}

# 鎻愬彇瀛楁<E7809B>
- 鐮旂┒璁捐<E79281>绫诲瀷锛圧CT/cohort/case-control绛夛級
- 鏍锋湰閲忥紙骞查<E9AA9E>缁?瀵圭収缁勶級
- 绾冲叆鏍囧噯
- 鎺掗櫎鏍囧噯
- 闅忔満鍖栨柟娉曪紙濡傞€傜敤锛?
- 鐩叉硶锛堝<E9949B>閫傜敤锛?

# 杈撳嚭鏍煎紡锛圝SON锛?
${methodsSchema}
`;

2.3 鉁?瑙勫垯寮曟搸楠岃瘉

**瀹炴柦鏂规<E98F82>**锛?

  • 瀹氫箟涓氬姟瑙勫垯锛岃嚜鍔ㄦ<EFBFBD>鏌ラ€昏緫閿欒<EFBFBD>
  • 鏁板€艰寖鍥撮獙璇?
  • 蹇呭瀛楁<EFBFBD>瀹屾暣鎬ф<EFBFBD>鏌?

楠岃瘉瑙勫垯锛?

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>**锛?

  • 璁板綍鍘熸枃寮曠敤浣嶇疆锛堥〉鐮併€佹<EFBFBD>钀姐€佸彞瀛愶級
  • 淇濆瓨妯″瀷瀹屾暣杈撳嚭锛堝惈涓<EFBFBD>棿鎺ㄧ悊锛?
  • 鍏宠仈鎵€鏈変汉宸ヤ慨鏀硅<EFBFBD>褰?

**鏁版嵁搴撳<E690B4>寮?*锛?

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 绡囧叏鏂?

浠诲姟 绛栫暐 鎴愭湰
鏍囬<EFBFBD>鎽樿<EFBFBD>绛涢€? 80% DeepSeek + 20% GPT-5 楼21
鍏ㄦ枃鏁版嵁鎻愬彇 鍒嗘<EFBFBD>鎻愬彇锛圙PT-5锛? 楼60
*鎬绘垚鏈? - 楼81

鍥涖€乂1.0 楠屾敹鏍囧噯

鎸囨爣 <EFBFBD> 楠岃瘉鏂规硶
鎻愬彇鍑嗙‘鐜? 鈮?90% 浜哄伐鎶芥煡 50 绡?
Few-shot 绀轰緥搴? 鈮?20 涓? 浜哄伐鏍囨敞
瑙勫垯寮曟搸瑕嗙洊鐜? 鈮?80% 浠g爜瀹℃煡
璇佹嵁閾惧畬鏁存€? 100% 瀹¤<EFBFBD>妫€鏌?
鎴愭湰鎺у埗 鈮?楼80/椤圭洰 璐﹀崟鐩戞帶

馃弳 V2.0 闃舵<E99783>锛? 鍛<>

<EFBFBD>爣瀹氫綅

  • **鍑嗙‘鐜囩洰鏍?*锛氣墺 95%锛堝尰瀛︾骇锛?
  • 鎴愭湰棰勭畻锛氭寜闇€閰嶇疆
  • 浜や粯鏍囧噯锛氳嚜鍔ㄥ寲璐ㄩ噺瀹¤<EFBFBD>锛岀<EFBFBD>鍚堜复搴婄爺绌惰<EFBFBD>鑼?

涓€銆佸尰瀛︾骇璐ㄩ噺淇濋殰

1.1 鉁?涓夋ā鍨嬪叡璇嗕徊瑁?

**瀹炴柦鏂规<E98F82>**锛?

  • 鍙屾ā鍨嬪啿绐佹椂锛岃嚜鍔ㄥ惎鐢ㄧ<EFBFBD>涓夋柟浠茶<EFBFBD>
  • 涓夋ā鍨嬫姇绁ㄥ喅绛?
  • 璁板綍浠茶<EFBFBD>杩囩▼
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'
  };
}

鎴愭湰鎺у埗锛?

  • 浠呭湪鍐茬獊鏃跺惎鐢ㄤ徊瑁侊紙棰勮<EFBFBD> 10-15%锛?
  • 鍗曟<EFBFBD>浠茶<EFBFBD>棰濆<EFBFBD>鎴愭湰锛毬?.021锛圕laude-4.5锛?

1.2 鉁?HITL 鏅鸿兘鍒嗘祦

**瀹炴柦鏂规<E98F82>**锛?

  • 鍩轰簬瑙勫垯鐨勬櫤鑳戒紭鍏堢骇鎺掑簭
  • 楂樹环鍊?楂橀<E6A582>闄╀换鍔紭鍏堜汉宸ュ<E5AEB8>鏍?
  • 浣庨<EFBFBD>闄╀换鍔¤嚜鍔ㄥ寲澶勭悊

鍒嗘祦瑙勫垯锛?

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 绠$悊鎻愮ず璇嶆ā鏉?
  • 鐗堟湰鍙锋爣璁帮紙璇<EFBFBD>箟鍖栫増鏈<EFBFBD>
  • A/B 娴嬭瘯涓嶅悓鐗堟湰鏁堟灉

<EFBFBD>綍缁撴瀯锛?

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

鐗堟湰璁板綍锛?

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%锛?
  • <EFBFBD>姩鐢熸垚璐ㄩ噺鎶ュ憡
  • 寮傚父妫€娴嬪拰鍛婅<EFBFBD>

**瀹¤<E780B9>鎶ヨ〃**锛?

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>**锛?

  • 瑕佹眰妯″瀷杈撳嚭鎺ㄧ悊杩囩▼
  • 鍒嗘<EFBFBD>楠ゅ垽鏂?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>**锛?

  • 畻寰呯瓫閫夋枃鐚<EFBFBD>笌绀轰緥搴撶殑璇<EFBFBD>箟鐩镐技搴?
  • 鍔ㄦ€侀€夋嫨鏈€鐩镐技鐨?3-5 涓<>ず渚?
  • 宓屽叆鎻愮ず璇?
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 绡囷級

浠诲姟 绛栫暐 鎴愭湰
鏍囬<EFBFBD>鎽樿<EFBFBD>绛涢€? 鎴愭湰浼樺寲 + 15% 浠茶<E6B5A0> 楼120
鍏ㄦ枃鏁版嵁鎻愬彇 GPT-5 + Claude 鍙屾ā鍨? 楼350
璐ㄩ噺瀹¤<EFBFBD> 10% 鎶芥煡 楼30
*鎬绘垚鏈? - 楼500

鍥涖€乂2.0 楠屾敹鏍囧噯

鎸囨爣 <EFBFBD> 楠岃瘉鏂规硶
鎻愬彇鍑嗙‘鐜? 鈮?95% 浜哄伐鎶芥煡 100 绡?
浜烘満涓€鑷存€? 鈮?90% Cohen's Kappa
鍋囬槼鎬х巼 鈮?5% 缁熻<EFBFBD>鍒嗘瀽
鍋囬槾鎬х巼 鈮?3% 缁熻<EFBFBD>鍒嗘瀽
鎻愮ず璇嶇増鏈<EFBFBD><EFBFBD>鐞? 100% Git 鍘嗗彶
<EFBFBD>姩鍖栧<EFBFBD>璁? 姣忓懆 1 娆? 绯荤粺鎶ヨ〃

馃搳 涓夐樁娈靛<E5A888>姣旀€荤粨

缁村害 MVP V1.0 V2.0
*鍑嗙‘鐜? 85% 90% 95%
妯″瀷缁勫悎 DeepSeek + Qwen3 鎴愭湰浼樺寲绛栫暐 涓夋ā鍨嬩徊瑁?
璐ㄩ噺鎺у埗 鍙屾ā鍨嬮獙璇? 瑙勫垯寮曟搸 + Few-shot HITL + 鑷<>姩瀹¤<E780B9>
*<EFBFBD>拷婧<EFBFBD>€? 鍩烘湰鏃ュ織 瀹屾暣璇佹嵁閾? 瀹¤<EFBFBD>绾ц<EFBFBD>褰?
*鎴愭湰/1000 绡? 楼5 楼21 楼24 + 浠茶<E6B5A0>
*寮€鍙戝懆鏈? 4 鍛? 6 鍛? 8 鍛?
閫傜敤鍦烘櫙 <EFBFBD>€熼獙璇? 甯歌<EFBFBD>椤圭洰 楂樿川閲忓彂琛?

馃攧 瀹炴柦璺<E69FA6>

闃舵<EFBFBD> 1: MVP 寮€鍙戯紙Week 1-4锛?

Week 1锛氬熀纭€鏋舵瀯

  • LLM 鏈嶅姟灏佽<E7818F>锛圖eepSeek + Qwen3锛?
  • JSON Schema 瀹氫箟
  • 鏁版嵁搴撹〃璁捐<EFBFBD>

Week 2锛氭牳蹇冨姛鑳?

  • 鍙屾ā鍨嬪苟琛岃皟鐢?
  • 涓€鑷存€у垽鏂<EFBFBD>€昏緫
  • 浜哄伐澶嶆牳闃熷垪

Week 3锛氬墠绔<EFBFBD>紑鍙?

  • 绛涢€夊伐浣滃彴
  • 鍐茬獊瀵规瘮瑙嗗浘
  • 浜哄伐澶嶆牳鐣岄潰

Week 4锛氭祴璇曢獙鏀?

  • 鍔熻兘娴嬭瘯
  • 鍑嗙‘鐜囪瘎浼?
  • 鎴愭湰鐩戞帶

闃舵<EFBFBD> 2: V1.0 澧炲己锛圵eek 5-10锛?

Week 5-6锛氭櫤鑳戒紭鍖?

  • 鎴愭湰浼樺寲绛栫暐
  • Few-shot 绀轰緥搴?
  • 鍔ㄦ€佺ず渚嬮€夋嫨

Week 7-8锛氳川閲忔帶鍒?

  • 鍒嗘<EFBFBD>鎻愬彇
  • 瑙勫垯寮曟搸
  • 璇佹嵁閾惧畬鏁村寲

Week 9-10锛氭祴璇曚紭鍖?

  • A/B 娴嬭瘯
  • 鍑嗙‘鐜囨彁鍗?
  • 鏂囨。瀹屽杽

闃舵<EFBFBD> 3: V2.0 瀹屽杽锛圵eek 11-18锛?

Week 11-13锛氶珮绾у姛鑳?

  • 涓夋ā鍨嬩徊瑁?
  • HITL 鏅鸿兘鍒嗘祦
  • 鎻愮ず璇嶇増鏈<EFBFBD><EFBFBD>鐞?

Week 14-16锛氳川閲忓<EFBFBD>璁?

  • <EFBFBD>姩瀹¤<EFBFBD>绯荤粺
  • 璐ㄩ噺鎶ヨ〃
  • 寮傚父妫€娴?

Week 17-18锛氬彂甯冨噯澶?

  • 鍏ㄩ噺娴嬭瘯
  • 鍖诲<EFBFBD>涓撳<EFBFBD>楠岃瘉
  • 鏂囨。鍜屽煿璁?

馃摎 鐩稿叧鏂囨。


鏇存柊鏃ュ織锛?

  • 2025-11-15: 鍒涘缓鏂囨。锛屽畾涔?MVP/V1.0/V2.0 涓夐樁娈电瓥鐣?