Files
AIclinicalresearch/docs/03-业务模块/ASL-AI智能文献/02-技术设计/08-全文复筛质量保障策略.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

42 KiB
Raw Blame History

蜈ィ譁<EFBFBD>、咲ュ幄エィ驥丈ソ晞囿荳主庄霑ス貅ッ遲也払

*<EFBFBD>。」迚域悽<EFBFBD>? V1.0
*蛻帛サコ譌・譛滂シ? 2025-11-22
*騾ら畑讓。蝮暦シ? AI 譎コ閭ス譁<EFBDBD>鍵 - 蜈ィ譁<EFBDA8>、咲ュ<E592B2>
*逶ョ譬<EFBFBD>シ?<>亳谿オ謠仙合蜈ィ譁<EFBDA8>、咲ュ帷噪蜃<E599AA>。ョ邇<EFBDAE>€∵婿豕募ュヲ雍ィ驥丞愛譁ュ蜥悟ョ梧紛蜿ッ霑ス貅ッ諤?


<EFBFBD>搭 譁<>。」讎りソー

譛ャ譁<EFBFBD>。」螳壻ケ我コ<EFBFBD>**蜈ィ譁<EFBDA8>、咲ュ帶ィ。蝮<EFBDA1>**蝨?MVP 竊?V1.0 竊?V2.0 荳我クェ髦カ谿オ逧<EFBDB5>エィ驥丈ソ晞囿遲也払縲?

蜈ィ譁<EFBFBD>、咲ュ<EFBFBD> vs 譬<>「俶遭隕∝<E99A95>遲幢シ壽<EFBDBC>ク蠢<EFBDB8>キョ蠑?

扈エ蠎ヲ <EFBFBD>「俶遭隕∝<EFBFBD><EFBFBD> 蜈ィ譁<EFBFBD>、咲ュ<EFBFBD> 遲也払蟾ョ蠑<EFBFBD>
*菫。諱ッ驥? 200-500蟄? 5,000-20,000蟄? <EFBFBD>閥 髴€<C280>ョオ螟<EFBDB5>
蛻、譁ュ萓晄紺 PICOS蛹ケ驟榊コ? 12蟄玲ョオ譁ケ豕募ュヲ雍ィ驥? <EFBFBD>閥 髴€荳謎ク壼愛譁ュ譬<EFBDAD>
*蜀ウ遲門、肴揩蠎? 菴?譏?蜷? 鬮?12荳ェ蟄玲ョオテ?郤? <EFBFBD>閥 髴€扈捺桷蛹匁署蜿?
螳ケ髞咏ュ也払 <EFBFBD>漠蜍ソ貍<EFBFBD> 荳崎<EFBFBD>貍丞<EFBFBD>髞ョ菫。諱? <EFBFBD>閥 髴€鬪瑚ッ∵惻蛻カ
Token謌先悽 ツ・0.005/遽? ツ・0.05-0.20/遽? <EFBFBD>閥 髴€謌先悽莨伜喧
*蜿ッ霑ス貅ッ諤? 蠑慕畑鞫倩ヲ<EFBFBD> 蜈キ菴馴。オ遐<EFBFBD>/谿オ關ス/陦ィ譬シ <EFBFBD>閥 髴€隸∵紺體?

譬ク蠢<EFBFBD>ョセ隶。蜴溷<EFBFBD>

蜴溷<EFBFBD> 隸エ譏<EFBFBD>
蠕ェ隸∝現蟄ヲ譬<EFBFBD> 蝓コ莠擦ochrane RoB 2.0蟾・蜈キ逧<EFBFBD>婿豕募ュヲ雍ィ驥剰ッ<EFBFBD>シー譬<EFBFBD>
*扈捺桷蛹匁署蜿? Nougat + 蛻<>ョオ謠仙叙 + 蜈ィ譁<EFBDA8>ェ瑚ッ<E7919A>シ碁∩蜈?Lost in the Middle"
*螳梧紛隸∵紺體? 豈丈クェ蟄玲ョオ蠑コ蛻カ隕∵アょ次譁<EFBFBD>シ慕畑<EFBFBD>磯。オ遐√€∵ョオ關ス縲∬。ィ譬シ<EFBFBD><EFBFBD>
<EFBFBD>ュ・螳樊命 MVP蜈磯ェ瑚ッ∝庄陦梧€<EFBFBD>祁1.0謠仙合雍ィ驥擾シ祁2.0霎セ蛻ー蛹サ蟄ヲ郤ァ譬<EFBFBD><EFBFBD>?
*謌先悽荳手エィ驥丞ケウ陦? MVP逕ィ謌先悽蜿句・ス讓。蝙具シ悟<EFBFBD>髞ョ蟄玲ョオ逕ィ鬮倡ォッ讓。蝙矩ェ瑚ッ?

<EFBFBD>識 荳蛾亳谿オ霍ッ郤ソ蝗セ

MVP (3蜻?              V1.0 (5蜻?            V2.0 (8蜻?
笏懌楳 Nougat扈捺桷蛹匁署蜿?   笏懌楳 Cochrane譬<65>㊥Prompt  笏懌楳 荳画ィ。蝙倶サイ陬?
笏懌楳 12蟄玲ョオ蛻<EFBDB5>ョオ謠仙叙      笏懌楳 Few-shot蛹サ蟄ヲ譯井セ句コ? 笏懌楳 蛹サ蟄ヲ騾サ霎題ァ<E9A18C><EFBDA7>蠑墓梼
笏懌楳 蜿梧ィ。蝙矩ェ瑚ッ?         笏懌楳 螳梧紛隸∵紺體?         笏懌楳 閾ェ蜉ィ雍ィ驥丞ョ。隶。
笏懌楳 蟄玲ョオ郤ァ蜀イ遯∵」€豬?     笏懌楳 蜈ィ譁<EFBDA8>コ、蜿蛾ェ瑚ッ<E7919A>        笏懌楳 HITL譎コ閭ス蛻<EFBDBD><EFBFBD>
笏披楳 蝓コ遑€蜿ッ霑ス貅?         笏披楳 蛻<>コァ莠コ蟾・螟肴<E89E9F>ク        笏披楳 螳。隶。郤ァ譌・蠢?
   竊?                     竊?                   竊?
  蜃<>。ョ邇?竕?85%           蜃<>。ョ邇?竕?92%          蜃<>。ョ邇?竕?96%

<EFBFBD>噫 MVP 髦カ谿オ<E8B0BF>? 蜻ィ<E89CBB><EFBDA8>

逶ョ譬<EFBFBD>ョ壻ス<EFBFBD>

  • **蜃<>。ョ邇<EFBDAE>岼譬?*<2A>壺翁 85%
  • **菫。諱ッ螳梧紛邇?*<2A>壺翁 90%<25>?2蟄玲ョオ荳埼貍擾シ<E693BE>
  • 謌先悽鬚<EFBFBD><EFBFBD><EFBFBD>壺王 ツ・0.05/遽<><EFBFBD>eepSeek-V3 + Qwen3-Max<61>?
  • 莠、莉俶<EFBFBD><EFBFBD><EFBFBD>壼渕遑€蜉溯<EFBFBD>蜿ッ逕ィ<EFBFBD>梧髪謖∫サ捺桷蛹匁署蜿門柱蜿梧ィ。蝙矩ェ瑚ッ<EFBFBD>

€縲∵<EFBFBD>ク蠢<EFBFBD>橿譛ッ遲也<EFBFBD>?

1.1 笨?Nougat扈捺桷蛹匁署蜿厄シ亥<EFBDBC>髞ョ莨伜漢<E4BC9C>?

荳コ莉€荵磯€画叫Nougat<EFBFBD>?

蟇ケ豈皮サエ蠎ヲ PyMuPDF Nougat
霎灘<EFBFBD>譬シ蠑<EFBFBD> 郤ッ譁<EFBFBD><EFBFBD>? Markdown扈捺桷蛹?
<EFBFBD>闃りッ<EFBFBD> €LLM莠梧ャ。隸<EFBFBD><EFBFBD>?0%蜃<>。ョ邇<EFBDAE><EFBFBD> 螟ゥ辟カ菫晉蕗扈捺桷<EFBFBD>?5%蜃<>。ョ邇<EFBDAE>シ俄<EFBDBC>?
陦ィ譬シ螟<EFBFBD> <EFBFBD>悽荵ア遐<EFBFBD> Markdown陦ィ譬シ 笨?
蜈ャ蠑剰ッ<EFBFBD> 荵ア遐<EFBFBD> LaTeX譬シ蠑<EFBFBD> 笨?
騾ら畑蝨コ譎ッ 荳ュ譁<EFBFBD>ョコ譁<EFBFBD> 闍ア譁<EFBFBD>ュヲ譛ッ隶コ譁<EFBFBD> 笨?

螳樊命譁ケ譯<EFBFBD><EFBFBD>?

// 豺キ蜷育ュ也払<E4B99F>哢ougat莨伜<E88EA8><E4BC9C>訓yMuPDF髯咲コァ
async function extractFullText(pdfBuffer: Buffer, filename: string) {
  // Step 1: 譽€豬玖ッュ險€
  const language = await detectLanguage(pdfBuffer);
  
  // Step 2: 闍ア譁<EFBDB1>ョコ譁<EFBDBA>シ伜<EFBDBC>逕ィNougat
  if (language === 'english') {
    try {
      const nougatResult = await extractionClient.extractPdf(
        pdfBuffer, filename, 'nougat'
      );
      
      if (nougatResult.quality > 0.8) {
        return {
          method: 'nougat',
          text: nougatResult.text,
          format: 'markdown',
          structured: true  // 箝?蜈ウ髞ョ莨伜漢
        };
      }
    } catch (error) {
      console.warn('Nougat螟ア雍・<E99B8D>碁剄郤ァ蛻ーPyMuPDF');
    }
  }
  
  // Step 3: 荳ュ譁<EFBDAD>ョコ譁<EFBDBA><E8AD81>Nougat螟ア雍・<E99B8D>檎畑PyMuPDF
  const pymupdfResult = await extractionClient.extractPdf(
    pdfBuffer, filename, 'pymupdf'
  );
  
  return {
    method: 'pymupdf',
    text: pymupdfResult.text,
    format: 'plaintext',
    structured: false  // 髴€´LM隸<4D>悪扈捺桷
  };
}

1.2 笨?12蟄玲ョオ蛻<EFBDB5>ョオ謠仙叙<E4BB99>磯∩蜈広ost in the Middle<6C>?

譬ク蠢<EFBFBD>琉鬚<EFBFBD><EFBFBD><EFBFBD>譁?0K tokens荳€谺。諤ァ蝟らサ儉LM<4C>御クュ髣エ遶<EFBDB4>闃ゆソ。諱ッ驕玲シ冗紫鬮倩セセ33%

隗」蜀ウ譁ケ譯<EFBFBD><EFBFBD>壽潔蟄玲ョオ螳壼髄謠仙叙逶ク蜈ウ遶<EFBFBD><EFBFBD>

// 12蟄玲ョオ謠仙叙霍ッ逕ア陦?
const FIELD_EXTRACTION_ROUTES = {
  '遐皮ゥカ隶セ隶。': {
    sections: ['abstract', 'methods'],
    maxTokens: 3000,
    priority: 'high'
  },
  '遐皮ゥカ莠コ鄒、': {
    sections: ['methods', 'results'],
    maxTokens: 3500,
    priority: 'high',
    lookForTables: true  // Table 1: Baseline
  },
  '蟷イ鬚<EFBDB2>蒔譁ス': {
    sections: ['methods', 'results'],
    maxTokens: 3000,
    priority: 'high'
  },
  '蟇ケ辣ァ謗ェ譁ス': {
    sections: ['methods', 'results'],
    maxTokens: 2500,
    priority: 'high'
  },
  '扈灘ア€<C280><E8AC96><EFBFBD>': {
    sections: ['methods', 'results'],
    maxTokens: 4000,
    priority: 'high',
    lookForTables: true  // Results tables
  },
  '髫乗惻蛹匁婿豕?: {
    sections: ['methods', 'figures'],
    maxTokens: 2500,
    priority: 'critical',  // 蜈ウ髞ョ蟄玲ョオ
    keywords: ['randomization', 'allocation', 'sequence', 'CONSORT']
  },
  '逶イ豕<EFBFBD>': {
    sections: ['methods'],
    maxTokens: 2000,
    priority: 'critical'
  },
  '譬キ譛ャ驥剰ョ。邂?: {
    sections: ['methods'],
    maxTokens: 2000,
    priority: 'medium'
  },
  '蝓コ郤ソ蜿ッ豈疲€?: {
    sections: ['results', 'tables'],
    maxTokens: 3000,
    priority: 'high',
    specificTable: 'Table 1'
  },
  '扈捺棡螳梧紛諤?: {
    sections: ['results', 'figures'],
    maxTokens: 4000,
    priority: 'critical',
    keywords: ['ITT', 'per-protocol', 'missing data', 'dropout']
  },
  '騾画叫諤ァ謚・蜻?: {
    sections: ['methods', 'results', 'supplementary'],
    maxTokens: 3000,
    priority: 'medium',
    checkTrialRegistry: true  // 蟇ケ豈疲ウィ蜀梧婿譯<E5A9BF>
  },
  '蜈カ莉門¥蛟?: {
    sections: ['methods', 'discussion', 'supplementary'],
    maxTokens: 3000,
    priority: 'medium'
  }
};

// 蛻<>ョオ蟷カ陦梧署蜿<E7BDB2>
async function extractAllFields(sections: ParsedSections) {
  const extractionTasks = Object.entries(FIELD_EXTRACTION_ROUTES).map(
    ([fieldName, config]) => ({
      field: fieldName,
      task: extractFieldWithEvidence(fieldName, sections, config)
    })
  );
  
  // 蟷カ陦梧鴬陦鯉シ磯剄菴主サカ霑滂シ<E6BB82>
  const results = await Promise.all(
    extractionTasks.map(t => t.task)
  );
  
  return results;
}

莨伜漢<EFBFBD>?

  • 笨?驕ソ蜈堺クュ髣エ菫。諱ッ驕玲シ擾シ亥㊥遑ョ邇<EFBDAE> 70% 竊?90%<25>?
  • 笨?Token豸郁€鈴剄菴?0%<25>?0K 竊?12K<32>?
  • 笨?蟷カ陦梧署蜿厄シ悟サカ霑滄剄菴?0%
  • 笨?豈丈クェ蟄玲ョオLLM豕ィ諢丞鴨譖エ髮<EFBDB4>クュ

1.3 笨?蜿梧ィ。蝙倶コ、蜿蛾ェ瑚ッ?

讓。蝙狗サ<EFBFBD><EFBFBD>咼eepSeek-V3 + Qwen3-Max<61><EFBFBD>譛ャ蜿句・ス<EFBDA5><EFBDBD>

// 蜿梧ィ。蝙句ケカ陦瑚ー<E7919A><EFBDB0>?
async function dualModelExtraction(
  fieldName: string,
  relevantContent: string,
  prompt: string
) {
  const [resultA, resultB] = await Promise.all([
    llmService.chat('deepseek-v3', prompt, relevantContent),
    llmService.chat('qwen-max', prompt, relevantContent)
  ]);
  
  // 隗」譫千サ捺棡
  const assessmentA = parseFieldAssessment(resultA);
  const assessmentB = parseFieldAssessment(resultB);
  
  // 蜀イ遯∵」€豬?
  const hasConflict = assessmentA.level !== assessmentB.level;
  
  return {
    field: fieldName,
    modelA: {
      model: 'deepseek-v3',
      assessment: assessmentA.level,  // '螳梧紛'/'荳榊ョ梧<EFBDAE>?/'譌<>豕募愛譁ュ'
      evidence: assessmentA.evidence,
      confidence: assessmentA.confidence
    },
    modelB: {
      model: 'qwen-max',
      assessment: assessmentB.level,
      evidence: assessmentB.evidence,
      confidence: assessmentB.confidence
    },
    hasConflict,
    needReview: hasConflict || 
                assessmentA.confidence < 0.7 || 
                assessmentB.confidence < 0.7
  };
}

1.4 笨?蟄玲ョオ郤ァ蜀イ遯∵」€豬倶ク主<EFBDB8>郤ァ螟肴<E89E9F>

**荳肴弍邂€蜊慕噪"蜈ィ驛ィ蜀イ遯∝ーア莠コ蟾・螟肴<E89E9F>?<3F>€梧弍譬ケ謐ョ蟄玲ョオ驥崎ヲ∵€ァ蛻<EFBDA7>コ?*<2A>?

// 蟄玲ョオ驥崎ヲ∵€ァ蛻<EFBDA7>コ?
const FIELD_IMPORTANCE = {
  critical: ['髫乗惻蛹匁婿豕?, '逶イ豕<EFBFBD>', '扈捺棡螳梧紛諤?],      // 譬ク蠢<EFBDB8>¥蛟夐」朱<EFBDA3>?
  high: ['遐皮ゥカ隶セ隶。', '遐皮ゥカ莠コ鄒、', '蟷イ鬚<EFBDB2>蒔譁ス', '扈灘ア€<C280><E8AC96><EFBFBD>', '蝓コ郤ソ蜿ッ豈疲€?],
  medium: ['譬キ譛ャ驥剰ョ。邂?, '騾画叫諤ァ謚・蜻?, '蜈カ莉門¥蛟?]
};

// 譎コ閭ス蛻<EFBDBD><EFBFBD>
function prioritizeReview(conflicts: FieldConflict[]): ReviewQueue {
  const queue = {
    urgent: [],      // 蜈ウ髞ョ蟄玲ョオ蜀イ遯<EFBDB2> 竊?遶句叉莠コ蟾・螟肴<E89E9F>    important: [],   // 鬮倅シ伜<EFBDBC>郤ァ蟄玲ョオ蜀イ遯<EFBDB2> 竊?24蟆乗慮蜀<E685AE>、肴<EFBDA4>?
    normal: []       // 荳ュ遲我シ伜<EFBDBC>郤ァ蟄玲ョオ蜀イ遯?竊?48蟆乗慮蜀<E685AE>、肴<EFBDA4>?
  };
  
  for (const conflict of conflicts) {
    if (!conflict.hasConflict) continue;
    
    if (FIELD_IMPORTANCE.critical.includes(conflict.field)) {
      queue.urgent.push({
        ...conflict,
        reason: '蜈ウ髞ョ譁ケ豕募ュヲ蟄玲ョオ蜀イ遯<EFBDB2>シ悟スア蜩榊¥蛟夐」朱勦隸<E58BA6>シ?,
        deadline: new Date(Date.now() + 2 * 3600 * 1000) // 2蟆乗慮
      });
    } else if (FIELD_IMPORTANCE.high.includes(conflict.field)) {
      queue.important.push({
        ...conflict,
        reason: '鬮倅シ伜<EFBFBD>郤ァ蟄玲ョオ蜀イ遯<EFBFBD>',
        deadline: new Date(Date.now() + 24 * 3600 * 1000) // 24蟆乗慮
      });
    } else {
      queue.normal.push({
        ...conflict,
        reason: '荳€闊ャ蟄玲ョオ蜀イ遯?,
        deadline: new Date(Date.now() + 48 * 3600 * 1000) // 48蟆乗慮
      });
    }
  }
  
  return queue;
}

1.5 笨?蝓コ遑€隸∵紺體セ<E9AB94>亥次譁<E6ACA1>シ慕畑<E68595>?

MVP髦カ谿オ隕∵ア<EFBFBD><EFBFBD>壽ッ丈クェ蟄玲ョオ蠢<EFBFBD>。サ譛牙次譁<EFBFBD>シ慕畑

interface FieldEvidence {
  field: string;
  assessment: '螳梧紛' | '荳榊ョ梧<EFBDAE>? | '<EFBFBD>豕募愛譁ュ';
  
  // 箝?蠑コ蛻カ隕∵ア<E288B5>
  evidence: {
    quote: string;           // 蜴滓枚蠑慕畑<E68595>?00-300蟄暦シ<E69AA6>
    location: {
      section: string;       // "Methods"
      page?: number;         // 3<>亥ヲよ棡PDF譛蛾。オ遐<EFBDB5><EFBFBD>
      paragraph?: number;    // 2
      table?: string;        // "Table 1"
      figure?: string;       // "Figure 1"
    };
    highlightedKeywords: string[];  // 蜈ウ髞ョ菫。蜿キ隸?
  };
  
  reasoning: string;        // 蛻、譁ュ逅<EFBDAD><EFBFBD>?0-200蟄暦シ<E69AA6>
  confidence: number;       // 0.0-1.0
}

// 蜷主、<E4B8BB>炊鬪瑚ッ<E7919A>シ夂。ョ菫晄ッ丈クェ蟄玲ョオ驛ス譛芽ッ∵紺
function validateEvidence(result: ExtractionResult): ValidationReport {
  const errors = [];
  
  for (const [field, data] of Object.entries(result.fields)) {
    // 譽€譟?<3F>壼ソ<E5A3BC>。サ譛牙シ慕畑
    if (!data.evidence?.quote) {
      errors.push({
        field,
        type: 'missing_evidence',
        message: `蟄玲ョオ"${field}"郛コ蟆大次譁<E6ACA1>シ慕畑`
      });
    }
    
    // 譽€譟?<3F>壼シ慕畑荳崎<E88DB3>螟ェ遏ュ<E9818F>磯∩蜈肴聞陦搾シ?
    if (data.evidence?.quote && data.evidence.quote.length < 50) {
      errors.push({
        field,
        type: 'insufficient_evidence',
        message: `蟄玲ョオ"${field}"逧<>シ慕畑霑<E79591><EFBFBD><E6B492><50蟄暦シ会シ悟庄閭ス荳崎カウ莉・謾ッ謖∝愛譁ュ`
      });
    }
    
    // 譽€譟?<3F>壼ソ<E5A3BC>。サ譛我ス咲スョ菫。諱ッ
    if (!data.evidence?.location?.section) {
      errors.push({
        field,
        type: 'missing_location',
        message: `蟄玲ョオ"${field}"譛ェ譬<EFBDAA>ウィ蜴滓枚菴咲スョ`
      });
    }
  }
  
  return {
    isValid: errors.length === 0,
    errors,
    completeness: 1 - (errors.length / (Object.keys(result.fields).length * 3))
  };
}

莠後€?2蟄玲ョオ荳謎ク啀rompt讓。譚ソ<E8AD9A><EFBDBF>VP迚茨シ<E88CA8>

遉コ萓具シ夐囂譛コ蛹匁婿豕包シ亥<EFBFBD>髞ョ蟄玲ョオ<EFBFBD><EFBFBD>

# 蟄玲ョオ謠仙叙莉サ蜉。<E89C89>夐囂譛コ蛹匁婿豕<E5A9BF>

## 閭梧勹隸エ譏<EFBDB4>
<EFBFBD>譏ッ荳€菴榊セェ隸∝現蟄ヲ荳灘ョカ<EFBFBD>梧ュ」蝨ィ隸<EFBFBD>シー荳€遽⑲CT遐皮ゥカ逧<EFBFBD>婿豕募ュヲ雍ィ驥上€?
隸キ譬ケ謐ョCochrane蛛丞€夐」朱勦隸<E58BA6>シー蟾・蜈キ<E89C88><EFBDB7>oB 2.0<EFBFBD>臥噪譬<EFBFBD><EFBFBD>悟愛譁ュ隸・遐皮ゥカ逧<EFBFBD>囂譛コ蛹匁婿豕墓弍蜷ヲ蜈<EFBFBD><EFBFBD>縲?

## 蠕<><E8A095>譫仙<E8ADAB>螳?
莉・荳区弍隶コ譁<EFBFBD>噪Methods遶<EFBFBD>闃ょ柱逶ク蜈ウ蝗セ陦ィ<EFBFBD><EFBFBD>

${relevantContent}

## 蛻、譁ュ譬<EFBDAD>
### 螳梧紛<E6A2A7><E7B49B>ow risk of bias<61>?
髴€**蜷梧慮貊。雜ウ**莉・荳区擅莉カ<E88E89>?
1. 笨?譏守。ョ隸エ譏朱囂譛コ蠎丞<E8A08E>逕滓<E98095>譁ケ豕<EFBDB9>
   - 遉コ萓具シ喞omputer-generated random sequence, random number table, 
           central randomization, minimization
2. 笨?隸エ譏主<E8AD8F>驟埼嚼阯乗婿豕<E5A9BF>
   - 遉コ萓具シ嘖ealed opaque envelopes, central allocation, 
           pharmacy-controlled, IWRS (Interactive Web Response System)
3. 笨?譌<>騾画叫蛛丞€夂噪隸∵紺
   - 蝓コ郤ソ迚ケ蠕∝ケウ陦。
   -<>蠑ょクク逧<EFBDB8><E980A7><EFBFBD>慮髣エ讓。蠑<EFBDA1>

### 荳榊ョ梧紛<E6A2A7><E7B49B>igh/Unclear risk of bias<61>?
莉・荳区ュ蜀オ蛻、螳壻クコ荳榊ョ梧紛<EFBFBD>?
- 笶?莉<>署蛻?髫乗惻蛻<E683BB><EFBFBD>"菴<>裏蜈キ菴捺婿豕<E5A9BF>
- 笶?菴ソ逕ィ荳榊ス鍋噪髫乗惻蛹匁婿豕包シ域潔譌・譛溘€∽ス城劼蜿キ縲∽コ、譖ソ蛻<EFBDBF><E89BBB><EFBFBD><EFBFBD>
- 笶?譌<><EFBFBD><E89BBB>髫占酪謌門<E8AC8C>驟埼嚼阯丈ク榊ス難シ亥シ€謾セ蛻<EFBDBE><E89BBB>陦ィ<E999A6>?
- 笶?蝓コ郤ソ蟄伜惠譏セ闡嶺ク榊ケウ陦。荳疲裏隹<E8A38F><E99AB9>?
-<><E7AC9E><EFBFBD> 譁ケ豕墓緒霑ー讓。邉奇シ梧裏豕募愛譁ュ蜈<EFBDAD><E89C88>諤?

### 譌<>豕募愛譁ュ<E8AD81><EFBDAD>nclear risk<73>?
- 隶コ譁<EFBDBA>ョ悟<EFBDAE>譛ェ謠仙所髫乗惻蛹匁婿豕<E5A9BF>
-<>惠蜈カ莉門慍譁ケ<E8AD81>亥ヲよウィ蜀梧婿譯茨シ画署蛻ー<E89BBB>御ス<E5BEA1>悽譁<E682BD>悴謠剰ソー

## 蜈ウ髞ョ菫。蜿キ隸?

**鬮倩エィ驥丈ソ。蜿キ<E89CBF>亥ョ梧紛<E6A2A7>?*<2A>?
- "computer-generated random sequence"
- "central randomization/allocation"
- "sealed opaque envelopes"
- "stratified randomization"
- "block randomization"
- "minimization"
- "allocation concealment"

**鬟朱勦菫。蜿キ<E89CBF>井ク榊ョ梧紛<E6A2A7>?*<2A>?
- "alternating allocation"
- "by date of birth"
- "by hospital number"
- "open allocation"
- "assigned by investigator"

## 謠仙叙謖<E58F99>
1. **莨伜<E88EA8>譟・謇セ菴咲スョ**<EFBFBD>?
   - Methods遶<73>闃ら<E99783>?Randomization"蟆剰鰍
   - Figure 1 (CONSORT豬∫ィ句<EFBDA8>?
   - Trial Registration菫。諱ッ
   - 陦・蜈<EFBDA5>攝譁呻シ<E591BB>upplementary Materials<6C>?

2. **莠、蜿蛾ェ瑚ッ<E7919A>**<EFBFBD>?
   - Methods謠剰ソー vs. Results荳ュ逧<EFBDAD>渕郤ソ謨ー謐ョ
   - 螢ー遘ー逧<EFBDB0>婿豕?vs. 螳樣刔逧<E58894>渕郤ソ蟷ウ陦。諠<EFBDA1><E8ABA0>?

3. **迚ケ谿頑ュ蜀オ**<EFBFBD>?
   - 螯よ棡謠仙芦"see protocol"謌?see trial registration"<22><EFBFBD><E6A2A7>ョー荳コ髴€隕∵衍髦<E8A18D>、夜Κ<CE9A><E8A58D>?
   - 螯よ棡譏ッ螟壻クュ蠢<EFBDAD><E8A0A2>皮ゥカ<EFBDA9>悟コ碑ッ・譛我クュ蠢<EFBDAD>囂譛コ蛹也ウサ扈?

## 霎灘<E99C8E>譬シ蠑擾シ井ク・譬シJSON<4F>?

{
  "assessment": "螳梧紛" | "荳榊ョ梧<EFBDAE>? | "譌<>豕募愛譁ュ",
  "evidence": {
    "quote": "蜴滓枚蠑慕畑<E68595>?00-300蟄暦シ悟桁蜷ォ蜈ウ髞ョ譁ケ豕墓緒霑ー<E99C91>?,
    "location": {
      "section": "Methods",
      "subsection": "Randomization",
      "page": 3,
      "paragraph": 2,
      "figure": "Figure 1 (CONSORT diagram)"
    },
    "highlightedKeywords": [
      "蜈ウ髞ョ隸?",
      "蜈ウ髞ョ隸?"
    ]
  },
  "reasoning": "蛻、譁ュ逅<EFBDAD><EFBFBD><EFBFBD>ケ謐ョ蜴滓枚蠑慕畑<E68595>瑚ッ・遐皮ゥ?..",
  "confidence": 0.95,
  "robAssessment": "Low risk" | "High risk" | "Unclear risk",
  "needsExternalVerification": false,
  "notes": "蜈カ莉冶ッエ譏趣シ亥庄騾会シ<E4BC9A>"
}

## 豕ィ諢丈コ矩。ケ

1. **荳・譬シ驕オ螳<EFBDB5>ochrane譬<65>㊥**<EFBFBD>壼ョ∝庄蛻、譁ュ荳コ"荳榊ョ梧<EFBDAE>?<3F>御ク崎ヲ∬ソ<E288AC>コ主ョス譚?
2. **蠑慕畑蠢<E79591>。サ蜈キ菴<EFBDB7>**<EFBFBD>壻ク崎ヲ∫ャシ扈溷慍隸?Methods遶<73>闃よ署蛻ー"<22>悟ソ<E6829F>。サ扈吝<E68988>蜈キ菴灘シ慕<EFBDBC>?
3. **鄂ョ菫。蠎ヲ隸壼ョ?*<2A>壼ヲよ棡菫。諱ッ荳肴ク<E882B4><EFBFBD>碁剄菴残onfidence蟷カ譬<EFBDB6>ョーneedsExternalVerification
4. **蛹コ蛻<EFBDBA>"譛ェ蛛<EFBDAA>"蜥?譛ェ謚・蜻?**<EFBFBD>?
   - 螯よ棡隶コ譁<EFBDBA><E8AD81>遑ョ隸?no randomization"<22>径ssessment="荳榊ョ梧<EFBDAE>?
   - 螯よ棡隶コ譁<EFBDBA>ョ悟<EFBDAE>譛ェ謠仙所<E4BB99>径ssessment="譌<>豕募愛譁ュ"

蜈カ莉<EFBFBD>11荳ェ蟄玲ョオ逧Пrompt讓。譚ソ<EFBFBD>夂アサ莨シ扈捺桷<EFBFBD><EFBFBD>ケ謐ョCochrane譬<EFBFBD>㊥隹<EFBFBD>紛蛻、譁ュ譬<EFBFBD>


荳峨€VP謌先悽鬚<EFBFBD><EFBFBD>

*蝨コ譎ッ<EFBFBD>?00遽<30><E981BD><EFBFBD>、咲ュ?

邇ッ闃<EFBFBD> Token豸郁€? 讓。蝙<EFBFBD> 謌先悽
Nougat謠仙叙 - 譛ャ蝨ー讓。蝙<EFBFBD> ツ・0
12蟄玲ョオ謠仙叙<EFBFBD>亥曙讓。蝙具シ? 12K テ<> 2 = 24K DeepSeek-V3 + Qwen3-Max ツ・0.06/遽?
蜀イ遯∝ュ玲ョオ莠コ蟾・螟肴<EFBFBD><EFBFBD>?0%<25>? - 莠コ蟾・ 2蛻<EFBFBD>帖/蟄玲ョオ
*100遽<EFBFBD>€サ謌先<EFBFBD>? - - ツ・6 + 莠コ蟾・謌先悽

蟇ケ豈<EFBFBD><EFBFBD>?

  • 蜈ィ譁<EFBFBD>€谺。諤ァ謠仙叙<EFBFBD>堋・10/100遽?
  • <EFBFBD>ョオ謠仙叙<EFBFBD>堋?/100遽?
  • *闃ら怐40%謌先悽 + 蜃<>。ョ邇<EFBDAE>署蜊?

蝗帙€VP鬪梧噺譬<EFBFBD>

<EFBFBD><EFBFBD><EFBFBD> 逶ョ譬<EFBFBD> 鬪瑚ッ∵婿豕<EFBFBD>
蟄玲ョオ謠仙叙螳梧紛邇? 竕?90% 12蟄玲ョオ驛ス譛臥サ捺棡<EFBFBD>磯撼"譌<>豕募愛譁ュ"<22>?
蜿梧ィ。蝙倶ク€閾エ邇<EFBFBD> 竕?75% 12蟄玲ョオ荳ュ閾ウ蟆?荳ェ荳€閾?
隸∵紺體セ螳梧紛諤? 100% 豈丈クェ蟄玲ョオ驛ス譛牙次譁<EFBFBD>シ慕畑蜥御ス咲ス?
莠コ蟾・螟肴<EFBFBD>ク髦溷<EFBFBD> 竕?30% €隕∽ココ蟾・莉句<EFBFBD><EFBFBD>枚迪ョ蜊<EFBFBD><EFBFBD>
Nougat謌仙粥邇? 竕?85% 闍ア譁<EFBFBD>ョコ譁<EFBFBD><EFBFBD>蜉滓署蜿匁ッ比セ<EFBFBD>
<EFBFBD>炊騾溷コヲ 竕?3蛻<33>帖/遽? 莉傘DF蛻ー扈捺棡逧<EFBFBD>€サ譌カ髟?

<EFBFBD>嶋 V1.0 髦カ谿オ<E8B0BF>? 蜻ィ<E89CBB><EFBDA8>

逶ョ譬<EFBFBD>ョ壻ス<EFBFBD>

  • **蜃<>。ョ邇<EFBDAE>岼譬?*<2A>壺翁 92%
  • **菫。諱ッ螳梧紛邇?*<2A>壺翁 95%
  • 謌先悽鬚<EFBFBD><EFBFBD><EFBFBD>壺王 ツ・0.08/遽<>シ域匱閭ス謌先悽莨伜喧<E4BC9C>?
  • 莠、莉俶<EFBFBD><EFBFBD><EFBFBD>夐ォ倩エィ驥剰セ灘<EFBFBD><EFBFBD>悟ョ梧紛隸∵紺體セ<EFBFBD>梧匱閭ス雍ィ驥乗而蛻?

€縲∬エィ驥乗署蜊<EFBFBD>ュ也<EFBFBD>?

1.1 笨?Cochrane譬<65>㊥Prompt蠅槫シコ

**蝨ィMVP蝓コ遑€荳雁「槫<EFBDA2>?*<2A>?

  1. Few-shot蛹サ蟄ヲ譯井セ<E4BA95><EFBFBD>域ッ丈クェ蟄玲ョ?-5荳ェ逵溷ョ樊。井セ具シ<E585B7>
## 蜿り€<E3828A>。井セ?

莉・荳区<E88DB3>?荳ェ逵溷ョ朿CT遐皮ゥカ逧<EFBDB6>囂譛コ蛹匁婿豕戊ッ<E6888A>シー譯井セ具シ悟クョ蜉ゥ菴<EFBDA9><EFBFBD>ァ」蛻、譁ュ譬<EFBDAD><EFBFBD>?

### 譯井セ<E4BA95>1<EFBFBD>夐ォ倩エィ驥蹴CT<43><54>EJM, 2023<32>?
**蜴滓枚蠑慕畑**<2A>?
"Randomization was performed with the use of a computer-generated sequence 
with stratification according to center and baseline NIHSS score (竕?0 or >10). 
Allocation was concealed through a central web-based system (IWRS)."

**隸<>シー扈捺棡**<EFBFBD>壼ョ梧<EFBFBD>?
**逅<>罰**<EFBFBD>?
1. 笨?譏守。ョ逧<EFBDAE>コ丞<EFBDBA>逕滓<E98095>譁ケ豕包シ<E58C85>omputer-generated<65>?
2. 笨?蛻<>アる囂譛コ蛹厄シ域署鬮伜ケウ陦。諤ァ<E8ABA4><EFBDA7>
3. 笨?荳ュ蠢<EFBDAD><E8A0A2>驟埼嚼阯擾シ<E693BE>WRS<52>?
4. 笨?蝓コ郤ソTable 1譏セ遉コ荳、扈<EFBDA4>ケウ陦。濶ッ螂ス<E89E82><EFBDBD>>0.05<EFBFBD>?
**RoB 2.0蛻、譁ュ**<2A>哭ow risk of bias

---

### 譯井セ<E4BA95>2<EFBFBD>夊エィ驥丈ク崎カウ<EFBDB6>域汾譛溷<E8AD9B>? 2020<32>?
**蜴滓枚蠑慕畑**<2A>?
"Patients were randomly assigned to receive either drug A or placebo 
in a 1:1 ratio. Randomization was performed by the study coordinator."

**隸<>シー扈捺棡**<EFBFBD>壻ク榊ョ梧紛
**逅<>罰**<EFBFBD>?
1. 笶?譛ェ隸エ譏主コ丞<EFBDBA>逕滓<E98095>譁ケ豕包シ井サ<E4BA95>ッエ"髫乗惻"<22>?
2. 笶?逕ア遐皮ゥカ蜊剰ー<E589B0>遭謇ァ陦碁囂譛コ蛹厄シ域裏蛻<E8A38F><E89BBB>髫占酪<E58DA0><E985AA>
3.<><E7AC9E><EFBFBD> Table 1譏セ遉コ蟇ケ辣ァ扈<EFBDA7>ケエ鮴<EFBDB4>¥螟ァ<E89E9F><EFBDA7>66.2 vs 62.1, P=0.04<EFBFBD>?
**RoB 2.0蛻、譁ュ**<2A>唏igh risk of bias
**髣ョ鬚<EFBDAE>**<EFBFBD>壼庄閭ス蟄伜惠騾画叫蛛丞€?

---

### 譯井セ<E4BA95>3<EFBFBD>夊セケ逡梧ュ蜀オ<E89C80><EFBDB5>ancet, 2021<32>?
**蜴滓枚蠑慕畑**<2A>?
"Randomization was done with sequentially numbered, opaque, sealed envelopes 
prepared by an independent statistician not otherwise involved in the trial."

**隸<>シー扈捺棡**<EFBFBD>壼ョ梧<EFBFBD>?
**逅<>罰**<EFBFBD>?
1. 笨?陌ス髱樔クュ蠢<EFBDAD>囂譛コ蛹厄シ御ス<E5BEA1>スソ逕ィ蟇<EFBDA8>ー∽ソ。蟆?
2. 笨?迢ャ遶狗ャャ荳画婿蜃<E5A9BF><EFBFBD>シ育サ溯ョ。蟶茨シ<E88CA8>
3. 笨?荳埼€<C280><E4B89E><EFBFBD>paque<75>我ク泌ッ<E6B38C><EFBFBD><EFBFBD>ealed<65>?
4. 笨?蝓コ郤ソ蟷ウ陦。濶ッ螂ス
**RoB 2.0蛻、譁ュ**<2A>哭ow risk of bias
**隸エ譏<EFBDB4>**<EFBFBD>夂ャヲ蜷<EFBFBD>ochrane譬<EFBFBD><EFBFBD>亥ッ<EFBFBD>ー∽ソ。蟆?+ 迢ャ遶句㊥螟<E38AA5>庄謗・蜿暦シ<E69AA6>

---

邇ー蝨ィ隸キ菴<EFBDB7>蜿り€<E3828A>サ・荳頑。井セ狗噪隸<E599AA>シー譁ケ蠑擾シ悟<EFBDBC>譫仙ス灘燕隶コ譁?..
  1. Chain of Thought謗ィ逅<EFBDA8>
## 霎灘<E99C8E>譬シ蠑擾シ亥「槫シコ迚茨シ?

{
  "assessment": "螳梧紛",
  
  // 箝?譁ー蠅橸シ夐€先ュ・謗ィ逅<EFBDA8>ソ<EFBFBD><EFBFBD>
  "reasoning_steps": {
    "step1_sequenceGeneration": {
      "finding": "隶コ譁<EFBDBA>署蛻ー'computer-generated random sequence'",
      "evaluation": "貊。雜ウ蠎丞<E8A08E>逕滓<E98095>譁ケ豕戊ヲ∵ア<E288B5> 笨?
    },
    "step2_allocationConcealment": {
      "finding": "菴ソ逕ィ'central web-based system (IWRS)'",
      "evaluation": "貊。雜ウ蛻<EFBDB3><E89BBB>髫占酪隕∵ア<E288B5> 笨?
    },
    "step3_baselineBalance": {
      "finding": "Table 1譏セ遉コ荳サ隕∫音蠕 ̄>0.05",
      "evaluation": "譌<>譏取仞騾画叫蛛丞€夊ッ∵<EFBDAF>?笨?
    },
    "step4_finalJudgment": {
      "conclusion": "荳蛾。ケ譬<EFBDB9>㊥蝮<E38AA5>サ。雜ウ<E99B9C>悟愛譁ュ荳?螳梧紛'",
      "confidence": 0.95
    }
  },
  
  "evidence": { ... },
  "robAssessment": "Low risk"
}

1.2 笨?蜈ィ譁<EFBDA8>コ、蜿蛾ェ瑚ッ<E7919A>シ磯亟驕玲シ擾シ?

**蝨ィ蛻<EFBDA8>ョオ謠仙叙蜷趣シ悟「槫刈蜈ィ譁<EFBDA8>ェ瑚ッ∫識闃?*<2A>?

// 髦カ谿オ1<EFBDB5><EFBFBD>谿オ謠仙叙<E4BB99>亥キイ螳梧<E89EB3><E6A2A7><EFBFBD>
const segmentedResults = await extractAllFieldsSegmented(sections);

// 箝?髦カ谿オ2<EFBDB5><EFBFBD><EFBFBD>コ、蜿蛾ェ瑚ッ<E7919A>シ域眠蠅橸シ?
async function crossValidateWithFullText(
  segmentedResults: FieldResult[],
  fullTextMarkdown: string
): Promise<ValidationReport> {
  
  // 鬪瑚ッ<E7919A>1<EFBFBD>壽」€譟・譏ッ蜷ヲ譛蛾貍丈ソ。諱ッ
  const missingInfoChecks = await Promise.all([
    checkForMissingInfo('髫乗惻蛹匁婿豕?, fullTextMarkdown, segmentedResults),
    checkForMissingInfo('逶イ豕<EFBFBD>', fullTextMarkdown, segmentedResults),
    // ... 蜈カ莉門<E88E89>髞ョ蟄玲ョオ
  ]);
  
  // 鬪瑚ッ<E7919A>2<EFBFBD>壽」€譟・譏ッ蜷ヲ譛臥泝逶セ菫。諱ッ
  const contradictionChecks = await checkContradictions(
    segmentedResults,
    fullTextMarkdown
  );
  
  // 鬪瑚ッ<E7919A>3<EFBFBD>壽」€譟・譏ッ蜷ヲ謠仙芦陦・蜈<EFBDA5>攝譁?
  const supplementaryCheck = checkSupplementaryMaterial(fullTextMarkdown);
  
  return {
    missingInfoAlerts: missingInfoChecks.filter(c => c.hasIssue),
    contradictions: contradictionChecks,
    needsSupplementary: supplementaryCheck.needsExternal,
    overallCompleteness: calculateCompleteness(...)
  };
}

// 遉コ萓具シ壽」€譟・驕玲シ丈ソ。諱?
async function checkForMissingInfo(
  field: string,
  fullText: string,
  extractedResult: FieldResult
): Promise<ValidationAlert> {
  
  // 螯よ棡蟾イ扈丞愛螳壻ク?螳梧紛"<22>瑚キウ霑?
  if (extractedResult.assessment === '螳梧紛') {
    return { field, hasIssue: false };
  }
  
  // 蝨ィ蜈ィ譁<EFBDA8>クュ謳懃エ「蜈ウ髞ョ隸?
  const keywords = FIELD_KEYWORDS[field];  // 鬚<>ョ壻ケ牙<EFBDB9>髞ョ隸崎。?
  const foundKeywords = keywords.filter(kw => 
    fullText.toLowerCase().includes(kw.toLowerCase())
  );
  
  // 螯よ棡蜈ィ譁<EFBDA8>クュ譛牙<E8AD9B>髞ョ隸搾シ御ス<E5BEA1>署蜿也サ捺棡譏ッ"譌<>豕募愛譁ュ"
  if (foundKeywords.length > 0 && extractedResult.assessment === '<EFBFBD>豕募愛譁ュ') {
    return {
      field,
      hasIssue: true,
      severity: 'warning',
      message: `蜈ィ譁<EFBDA8>クュ蜿醍鴫蜈ウ髞ョ隸阪€?{foundKeywords.join(', ')}縲托シ<E68998>
<>ュ玲ョ?${field}"蛻、譁ュ荳?譌<>豕募愛譁ュ"<22>悟庄閭ス蟄伜惠驕玲シ汁,
      suggestedAction: 'targeted_re_extraction',
      keywords: foundKeywords
    };
  }
  
  return { field, hasIssue: false };
}

謨域棡<EFBFBD>?

  • 驕玲シ丈ソ。諱ッ譽€蜃コ邇<EFBFBD>シ?% 竊?80%
  • <EFBFBD>。ョ邇<EFBFBD>署蜊<EFBFBD><EFBFBD>85% 竊?92%

1.3 笨?蛹サ蟄ヲ騾サ霎題ァ<E9A18C><EFBDA7>蠑墓梼

閾ェ蜉ィ譽€譟・蟶ク隗∫噪騾サ霎鷹漠隸ッ<EFBFBD>?

const MEDICAL_LOGIC_RULES = [
  {
    id: 'rule_001',
    name: 'RCT蠢<54>。サ譛蛾囂譛コ蛹<EFBDBA>',
    check: (data) => {
      const isRCT = data.遐皮ゥカ隶セ隶。.toLowerCase().includes('rct') ||
                    data.遐皮ゥカ隶セ隶。.includes('髫乗惻');
      const hasRandomization = data.髫乗惻蛹匁婿豕?!== '譌<>豕募愛譁ュ';
      return !isRCT || hasRandomization;
    },
    severity: 'error',
    message: '遐皮ゥカ螢ー遘ー譏ッRCT菴<54>悴謇セ蛻ー髫乗惻蛹匁婿豕墓緒霑?,
    action: 'flag_for_urgent_review'
  },
  
  {
    id: 'rule_002',
    name: '蜿檎峇遐皮ゥカ蠢<EFBFBD>。サ隸エ譏守峇豕<EFBFBD>',
    check: (data) => {
      const isDoubleBlind = data.遐皮ゥカ隶セ隶。.includes('蜿檎峇') ||
                            data.遐皮ゥカ隶セ隶。.includes('double-blind');
      const hasBlinding = data.逶イ豕<EFBDB2> !== '<EFBFBD>豕募愛譁ュ' && 
                          data.逶イ豕<EFBDB2> !== '荳榊ョ梧<EFBFBD>?;
      return !isDoubleBlind || hasBlinding;
    },
    severity: 'error',
    message: '螢ー遘ー蜿檎峇菴<E5B387>峇豕墓緒霑ー荳榊ョ梧紛',
    action: 'flag_for_review'
  },
  
  {
    id: 'rule_003',
    name: '譬キ譛ャ驥丈ク主渕郤ソ謨ー謐ョ荳€閾エ諤?,
    check: (data) => {
      const planned = extractNumber(data.譬キ譛ャ驥剰ョ。邂?;
      const enrolled = extractNumber(data.遐皮ゥカ莠コ鄒、);
      if (!planned || !enrolled) return true;  // 譌<>豕墓署蜿門<E89CBF>霍ウ霑?
      
      const deviation = Math.abs(planned - enrolled) / planned;
      return deviation < 0.3;  // 蛛丞キョ<30%
    },
    severity: 'warning',
    message: '隶。蛻呈<EFBFBD>キ譛ャ驥丈ク主ョ樣刔蜈・扈<EFBFBD>キョ蠑りセ<EFBFBD>、ァ(>30%)',
    action: 'add_note'
  },
  
  {
    id: 'rule_004',
    name: '蝓コ郤ソ荳榊ケウ陦。髴€隕∬ー<EFBFBD><EFBFBD>?,
    check: (data) => {
      const hasImbalance = data.蝓コ郤ソ蜿ッ豈疲€?includes('荳榊ケウ陦?) ||
                          data.蝓コ郤ソ蜿ッ豈疲€?includes('P<0.05');
      const hasAdjustment = data.扈灘ア€<C280><E8AC96><EFBFBD>.includes('<EFBFBD>') ||
                           data.扈灘ア€<C280><E8AC96><EFBFBD>.includes('adjusted');
      return !hasImbalance || hasAdjustment;
    },
    severity: 'warning',
    message: '蝓コ郤ソ蟄伜惠荳榊ケウ陦<EFBFBD>悴隗<EFBFBD>紛蛻<EFBFBD>',
    action: 'add_note'
  },
  
  {
    id: 'rule_005',
    name: 'ITT蛻<EFBFBD>梵螳梧紛諤?,
    check: (data) => {
      const hasDropout = extractNumber(data.扈捺棡螳梧紛諤? > 0;
      const hasITT = data.扈捺棡螳梧紛諤?toLowerCase().includes('itt') ||
                    data.扈捺棡螳梧紛諤?includes('intention-to-treat');
      return !hasDropout || hasITT;
    },
    severity: 'warning',
    message: '蟄伜惠螟ア隶ソ菴<EFBDBF>悴譏守。ョITT蛻<54>梵',
    action: 'flag_for_review'
  }
];

// 閾ェ蜉ィ鬪瑚ッ<E7919A>
function validateMedicalLogic(extractedData: ExtractionResult): LogicReport {
  const violations = [];
  
  for (const rule of MEDICAL_LOGIC_RULES) {
    try {
      const passed = rule.check(extractedData);
      if (!passed) {
        violations.push({
          ruleId: rule.id,
          ruleName: rule.name,
          severity: rule.severity,
          message: rule.message,
          action: rule.action
        });
      }
    } catch (error) {
      console.error(`隗<><E99A97>${rule.id}謇ァ陦悟、ア雍・:`, error);
    }
  }
  
  return {
    totalRules: MEDICAL_LOGIC_RULES.length,
    passedRules: MEDICAL_LOGIC_RULES.length - violations.length,
    violations,
    overallValidity: violations.filter(v => v.severity === 'error').length === 0
  };
}

1.4 笨?螳梧紛隸∵紺體セ<E9AB94>亥「槫シコ迚茨シ<E88CA8>

V1.0隕∵ア<EFBFBD><EFBFBD>壻ク堺サ<EFBFBD>怏蠑慕畑<EFBFBD>瑚ソ倩ヲ∵怏蜈キ菴灘ョ壻ス榊柱鬮倅コ?

interface EnhancedEvidence {
  field: string;
  assessment: string;
  
  evidence: {
    // 荳サ隕∬ッ∵紺
    primaryQuote: {
      text: string;              // 蜴滓枚蠑慕畑
      location: {
        section: string;         // "Methods"
        subsection?: string;     // "Randomization"
        page: number;            // 3
        paragraph: number;       // 2
        lineRange?: [number, number];  // [45, 52]
      };
      highlightedText: string;   // HTML鬮倅コョ迚域悽
      keywords: string[];        // 蜈ウ髞ョ隸榊<E99AB8>陦?
    };
    
    // 謾ッ謖∬ッ∵紺<E288B5>亥庄騾会シ<E4BC9A>
    supportingQuotes?: Array<{
      text: string;
      location: any;
      relation: string;  // "confirms" | "contradicts" | "complements"
    }>;
    
    // 陦ィ譬シ/蝗セ迚<EFBDBE>ッ∵紺
    tableEvidence?: {
      tableName: string;         // "Table 1"
      relevantCells: string[];   // 逶ク蜈ウ蜊募<E89C8A>譬シ蜀<EFBDBC>ョ?
      interpretation: string;    // 蟇ケ陦ィ譬シ逧<EFBDBC>ァ」隸サ
    };
    
    figureEvidence?: {
      figureName: string;        // "Figure 1"
      caption: string;
      relevantInfo: string;
    };
  };
  
  // 箝?譁ー蠅橸シ壼ョ梧紛謗ィ逅<EFBDA8>  reasoningChain: {
    cochraneCriteria: string[];  // 蠎皮畑逧Гochrane譬<65>    keyFindings: string[];       // 蜈ウ髞ョ蜿醍鴫
    assessment: string;          // 譛€扈亥愛譁?
    confidence: number;
    uncertainties?: string[];    // 荳咲。ョ螳壼屏邏?
  };
  
  // 箝?譁ー蠅橸シ壼庄霑ス貅ッ諤ァ蜈<EFBDA7>焚謐ョ
  metadata: {
    extractionTimestamp: string;
    modelUsed: string;
    promptVersion: string;
    processingTime: number;
  };
}

莠後€〃1.0謌先悽鬚<EFBFBD><EFBFBD>

*蝨コ譎ッ<EFBFBD>?00遽<30><E981BD><EFBFBD>、咲ュ?

邇ッ闃<EFBFBD> Token豸郁€? 讓。蝙<EFBFBD> 謌先悽
12蟄玲ョオ蛻<EFBFBD>ョオ謠仙叙<EFBFBD>亥曙讓。蝙具シ? 12K DeepSeek-V3 + Qwen3-Max ツ・0.06/遽?
蜈ィ譁<EFBFBD>コ、蜿蛾ェ瑚ッ<EFBFBD> 3K DeepSeek-V3 ツ・0.003/遽?
蜈ウ髞ョ蟄玲ョオ陦・蜈<EFBFBD>署蜿厄シ?0%<25>? 2K Qwen3-Max ツ・0.016/遽<>シ井サ?0%譁<><EFBFBD>?
*100遽<EFBFBD>€サ謌先<EFBFBD>? - - ツ・7.9

雍ィ驥乗署蜊<EFBFBD><EFBFBD>壼㊥遑ョ邇<EFBFBD> 85% 竊?92%
謌先悽蠅槫刈<EFBFBD>堋? 竊?ツ・8<EFBDA5>?33%<25>御ス<E5BEA1>エィ驥乗仞闡玲署蜊<E7BDB2>シ?


荳峨€〃1.0鬪梧噺譬<EFBFBD>

<EFBFBD><EFBFBD><EFBFBD> 逶ョ譬<EFBFBD> 鬪瑚ッ∵婿豕<EFBFBD>
<EFBFBD>。ョ邇<EFBFBD>シ井ココ蟾・謚ス譟・<EFBFBD>? 竕?92% 髫乗惻謚ス譟・50遽<EFBFBD>シ御ク灘ョカ隸<EFBFBD>シー
菫。諱ッ螳梧紛邇? 竕?95% 12蟄玲ョオ蝮<EFBFBD>怏譛画譜扈捺棡
隸∵紺體セ螳梧紛諤? 100% 豈丈クェ蟄玲ョオ譛芽ッヲ扈<EFBFBD>ッ∵紺蜥梧耳逅<EFBFBD><EFBFBD>?
驕玲シ丈ソ。諱ッ譽€蜃コ邇<EFBFBD> 竕?80% 莠、蜿蛾ェ瑚ッ∝書邇ー逧<EFBFBD>貍乗ッ比セ?
騾サ霎題ァ<EFBFBD><EFBFBD><EFBFBD>尠邇? 竕?80% <EFBFBD><EFBFBD>蠑墓梼譽€譟・騾夊ソ<EFBFBD><EFBFBD>?
莠コ蟾・螟肴<EFBFBD>ク髦溷<EFBFBD> 竕?25% €隕∽ココ蟾・莉句<EFBFBD><EFBFBD>枚迪ョ蜊<EFBFBD><EFBFBD>

<EFBFBD>醇 V2.0 髦カ谿オ<E8B0BF>? 蜻ィ<E89CBB><EFBDA8>

逶ョ譬<EFBFBD>ョ壻ス<EFBFBD>

  • **蜃<>。ョ邇<EFBDAE>岼譬?*<2A>壺翁 96%<25>亥現蟄ヲ郤ァ譬<EFBDA7><EFBFBD>?
  • **莠コ譛コ荳€閾エ諤?*<2A>咾ohen's Kappa 竕?0.90
  • 謌先悽鬚<EFBFBD><EFBFBD><EFBFBD>壽潔髴€驟咲スョ<EFBFBD>郁エィ驥丈シ伜<EFBFBD><EFBFBD><EFBFBD>
  • 莠、莉俶<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蜉ィ蛹冶エィ驥丞ョ。隶。<EFBFBD>檎ャヲ蜷<EFBFBD>ochrane蜿題。ィ譬<EFBFBD>

荳€縲∝現蟄ヲ郤ァ雍ィ驥丈ソ晞囿

1.1 笨?荳画ィ。蝙倶サイ陬∵惻蛻?

**蜈ウ髞ョ蟄玲ョオ蜀イ遯∵慮<E288B5>悟星逕ィ隨ャ荳画婿莉イ陬?*<2A>?

async function threeModelArbitration(
  conflict: FieldConflict,
  relevantContent: string
) {
  
  // 隨ャ荳画婿莉イ陬<EFBDB2>シ咾laude-4.5<EFBFBD>磯ォ倩エィ驥乗ィ。蝙具シ?
  const arbitrationPrompt = `
<EFBFBD>譏ッCochrane邉サ扈溯ッ<EFBFBD>サキ荳灘ョカ<EFBFBD>檎鴫譛我ク、荳ェAI讓。蝙句ッケ蜷御ク€蟄玲ョオ逧<EFBFBD>愛譁ュ蟄伜惠蜀イ遯<EFBFBD><EFBFBD>
隸キ菴<EFBFBD>莉主セェ隸∝現蟄ヲ逧<EFBFBD>ァ貞コヲ扈吝<EFBFBD><EFBFBD>ィ∝愛譁ュ縲?

縲仙<EFBFBD>遯∝ュ玲ョオ縲托シ<EFBFBD>${conflict.field}

縲先ィ。蝙帰蛻、譁ュ縲托シ<EFBFBD>${conflict.modelA.assessment}
隸∵紺<EFBFBD>?{conflict.modelA.evidence.quote}
<EFBFBD><EFBFBD>?{conflict.modelA.reasoning}
鄂ョ菫。蠎ヲ<EFBFBD><EFBFBD>${conflict.modelA.confidence}

縲先ィ。蝙毅蛻、譁ュ縲托シ<EFBFBD>${conflict.modelB.assessment}
隸∵紺<EFBFBD>?{conflict.modelB.evidence.quote}
<EFBFBD><EFBFBD>?{conflict.modelB.reasoning}
鄂ョ菫。蠎ヲ<EFBFBD><EFBFBD>${conflict.modelB.confidence}

縲仙次譁<EFBFBD>€托シ<EFBFBD>
${relevantContent}

縲蝉サイ陬∽ササ蜉。縲托シ<EFBFBD>
1. 譬ケ謐ョCochrane RoB 2.0譬<EFBFBD><EFBFBD>檎サ吝<EFBFBD><EFBFBD><EFBFBD>愛譁?
2. 蛻<>梵荳、荳ェ讓。蝙狗噪蛻、譁ュ<E8AD81>梧欠蜃コ蜩ェ荳ェ譖エ蜃<EFBDB4>。ョ<EFBDA1><EFBFBD>驛ス荳榊㊥遑ョ<E98191><EFBDAE>
3. 蠑慕畑Cochrane謇句<E8AC87>逶ク蜈ウ譚。谺セ謾ッ謖∽ス<E288BD><EFBFBD>愛譁ュ
4. 螯よ棡莉堺ク咲。ョ螳夲シ梧<EFBDBC>遑ョ謖<EFBDAE><E8AC96>€隕∽ココ蟾・螟肴<E89E9F>ク逧<EFBDB8>次蝗<E6ACA1>

縲占セ灘<EFBFBD>譬シ蠑上€托シ哽SON
  `;
  
  const arbitrationResult = await llmService.chat(
    'claude-4.5',
    arbitrationPrompt
  );
  
  return {
    field: conflict.field,
    arbitrator: 'claude-4.5',
    finalJudgment: arbitrationResult.assessment,
    analysis: {
      modelAAccuracy: arbitrationResult.modelA_correct,
      modelBAccuracy: arbitrationResult.modelB_correct,
      correctModel: arbitrationResult.agree_with,
      cochraneCitation: arbitrationResult.cochrane_reference
    },
    confidence: arbitrationResult.confidence,
    stillNeedsHumanReview: arbitrationResult.confidence < 0.9
  };
}

謌先悽謗ァ蛻カ<EFBFBD>?

  • <EFBFBD>惠蜈ウ髞ョ蟄玲ョオ蜀イ遯∵慮蜷ッ逕ィ<EFBFBD>磯「<EFBFBD>ョ。10-15%<25>?
  • 蜊墓ャ。莉イ陬∵<EFBFBD>譛ャ<EFBFBD>堋?.02<EFBFBD><EFBFBD>laude-4.5<EFBFBD>?
  • 100遽<EFBFBD>€サ鬚晏、匁<EFBFBD>譛ャ<EFBFBD>堋・2-3

1.2 笨?HITL譎コ閭ス蛻<EFBDBD><EFBFBD>

蝓コ莠手ァ<EFBFBD><EFBFBD><EFBFBD>匱閭ス莨伜<EFBFBD>郤ァ謗貞コ<EFBFBD><EFBFBD>?

function intelligentTriage(
  extractionResult: ExtractionResult,
  validationReport: ValidationReport,
  arbitrationResults?: ArbitrationResult[]
): TriageDecision {
  
  let priority = 0;
  let needReview = false;
  const reasons = [];
  
  // 隗<><E99A97>1<EFBFBD>壻ク画ィ。蝙倶サ堺ク堺ク€閾?竊?譛€鬮倅シ伜<EFBDBC>郤ァ
  if (arbitrationResults?.some(a => a.stillNeedsHumanReview)) {
    priority = 100;
    needReview = true;
    reasons.push('荳画ィ。蝙倶サイ陬∝錘莉榊ュ伜惠荳咲。ョ螳壽€?);
  }
  
  // 隗<><E99A97>2<EFBFBD><EFBFBD>髞ョ蟄玲ョオ雍ィ驥城琉鬚?竊?鬮倅シ伜<EFBDBC>郤ァ
  const criticalIssues = validationReport.violations.filter(v =>
    v.severity === 'error' && 
    FIELD_IMPORTANCE.critical.includes(v.field)
  );
  if (criticalIssues.length > 0) {
    priority = Math.max(priority, 90);
    needReview = true;
    reasons.push(`蜈ウ髞ョ蟄玲ョオ蟄伜惠雍ィ驥城琉鬚<E79089>: ${criticalIssues.map(i => i.field).join(', ')}`);
  }
  
  // 隗<><E99A97>3<EFBFBD>啌CT遐皮ゥカ 竊?荳ュ遲我シ伜<EFBDBC>郤ァ<E983A4>郁エィ驥剰ヲ∵アるォ假シ<E58187>
  if (extractionResult.遐皮ゥカ隶セ隶。.includes('RCT')) {
    priority = Math.max(priority, 70);
    // RCT螯よ棡鄂ョ菫。蠎ヲ菴取燕髴€隕∝、肴<EFBDA4>?
    if (extractionResult.overallConfidence < 0.9) {
      needReview = true;
      reasons.push('RCT遐皮ゥカ菴<EFBFBD>紛菴鍋スョ菫。蠎ヲ菴惹コ<EFBFBD>0.9');
    }
  }
  
  // 隗<><E99A97>4<EFBFBD><EFBFBD>髞ョ扈灘ア€<C280><E8AC96><EFBFBD>シ域ュサ莠。邇<EFBDA1>シ俄<EFBDBC> 鬮倅シ伜<EFBDBC>郤ァ
  if (extractionResult.扈灘ア€<C280><E8AC96><EFBFBD>.includes('豁サ莠。') || 
      extractionResult.扈灘ア€<C280><E8AC96><EFBFBD>.includes('mortality')) {
    priority = Math.max(priority, 80);
    if (extractionResult.扈捺棡螳梧紛諤?!== '螳梧紛') {
      needReview = true;
      reasons.push('蜈ウ髞ョ扈灘ア€<EFBFBD><EFBFBD><EFBFBD>シ域ュサ莠。邇<EFBFBD>シ我ス<EFBFBD>サ捺棡螳梧紛諤ァ譛蛾琉鬚<EFBFBD>');
    }
  }
  
  // 隗<><E99A97>5<EFBFBD>夐ォ倡スョ菫。蠎?+ 譌<>蜀イ遯?竊?閾ェ蜉ィ騾夊ソ<E5A48A>
  if (extractionResult.overallConfidence > 0.95 && 
      validationReport.violations.length === 0 &&
      !arbitrationResults) {
    priority = 10;
    needReview = false;
    reasons.push('鬮倩エィ驥乗署蜿厄シ梧裏髴€莠コ蟾・螟肴<EFBFBD>');
  }
  
  // 隗<><E99A97>6<EFBFBD>壼書陦ィ蝨ィ鬘カ郤ァ譛溷<E8AD9B> 竊?髯堺ス主、肴<EFBDA4>ク莨伜<E88EA8>郤?
  const topJournals = ['NEJM', 'Lancet', 'JAMA', 'BMJ'];
  if (topJournals.some(j => extractionResult.metadata.journal?.includes(j))) {
    priority = Math.max(0, priority - 20);
    reasons.push('蜿題。ィ蝨ィ鬘カ郤ァ譛溷<EFBFBD><EFBFBD>梧婿豕募ュヲ雍ィ驥城€壼クク霎<EFBFBD><EFBFBD>');
  }
  
  return {
    priority,
    needReview,
    reasons,
    estimatedReviewTime: estimateReviewTime(extractionResult, needReview),
    reviewDeadline: calculateDeadline(priority)
  };
}

1.3 笨?閾ェ蜉ィ雍ィ驥丞ョ。隶。

螳壽悄謇ケ驥乗歓譟・<EFBFBD>?0%<25>会シ瑚<EFBDBC>蜉ィ逕滓<E98095>雍ィ驥乗冠蜻<E586A0><EFBFBD>?

// 豈丞捉閾ェ蜉ィ螳。隶。
async function weeklyQualityAudit(
  startDate: Date,
  endDate: Date
): Promise<QualityAuditReport> {
  
  // 1. 闔キ蜿匁悽蜻ィ謇€譛画署蜿也サ捺<EFBDBB>?
  const weeklyExtractions = await db.fulltextScreeningResults.findMany({
    where: {
      createdAt: { gte: startDate, lte: endDate }
    }
  });
  
  // 2. 髫乗惻謚ス譬キ10%
  const sampleSize = Math.ceil(weeklyExtractions.length * 0.1);
  const sample = randomSample(weeklyExtractions, sampleSize);
  
  // 3. 莠コ蟾・螟肴<E89E9F>ク譬キ譛ャ
  const humanReviews = await requestHumanReview(sample);
  
  // 4. 隶。邂苓エィ驥乗欠譬<E6ACA0>
  const metrics = {
    <EFBFBD>。ョ邇? calculateAccuracy(sample, humanReviews),
    莠コ譛コ荳€閾エ諤? calculateCohenKappa(sample, humanReviews),
    <EFBFBD>亠諤ァ邇<EFBFBD>: calculateFalsePositiveRate(sample, humanReviews),
    <EFBFBD>亢諤ァ邇<EFBFBD>: calculateFalseNegativeRate(sample, humanReviews),
    
    // 蛻<>ュ玲ョオ蜃<EFBDB5>。ョ邇<EFBDAE>
    蟄玲ョオ蜃<EFBFBD>。ョ邇? FIELD_LIST.map(field => ({
      field,
      accuracy: calculateFieldAccuracy(field, sample, humanReviews)
    }))
  };
  
  // 5. 讓。蝙区€ァ閭ス蟇ケ豈<EFBDB9>
  const modelPerformance = {
    'deepseek-v3': analyzeModelPerformance('deepseek-v3', sample, humanReviews),
    'qwen-max': analyzeModelPerformance('qwen-max', sample, humanReviews),
    'claude-4.5': analyzeModelPerformance('claude-4.5', sample, humanReviews)
  };
  
  // 6. 髣ョ鬚伜<E9AC9A><EFBFBD>
  const issues = identifyCommonIssues(sample, humanReviews);
  
  // 7. 謾ケ霑帛サコ隶ョ
  const recommendations = generateRecommendations(metrics, issues);
  
  return {
    period: { start: startDate, end: endDate },
    totalExtractions: weeklyExtractions.length,
    sampledExtractions: sampleSize,
    metrics,
    modelPerformance,
    issues,
    recommendations,
    generatedAt: new Date()
  };
}

// 閾ェ蜉ィ隸<EFBDA8>悪蟶ク隗<EFBDB8>琉鬚<E79089>
function identifyCommonIssues(
  sample: Extraction[],
  humanReviews: HumanReview[]
): Issue[] {
  
  const issues = [];
  
  // 髣ョ鬚<EFBDAE>1<EFBFBD>壽汾荳ェ蟄玲ョオ髞呵ッッ邇<EFBDAF>ォ?
  for (const field of FIELD_LIST) {
    const fieldErrors = countFieldErrors(field, sample, humanReviews);
    if (fieldErrors / sample.length > 0.15) {  // 髞呵ッッ邇?15%
      issues.push({
        type: 'high_field_error_rate',
        field,
        errorRate: fieldErrors / sample.length,
        examples: getErrorExamples(field, sample, humanReviews, 3),
        recommendation: `莨伜喧蟄玲ョオ"${field}"逧Пrompt讓。譚ソ謌芳ew-shot譯井セ義
      });
    }
  }
  
  // 髣ョ鬚<EFBDAE>2<EFBFBD>夂音螳夂アサ蝙狗<E89D99>皮ゥカ髞呵ッッ邇<EFBDAF>ォ?
  const studyTypeErrors = analyzeByStudyType(sample, humanReviews);
  for (const [studyType, errorRate] of Object.entries(studyTypeErrors)) {
    if (errorRate > 0.15) {
      issues.push({
        type: 'high_study_type_error_rate',
        studyType,
        errorRate,
        recommendation: `蠅槫刈"${studyType}"邀サ蝙狗<EFBFBD>皮ゥカ逧Ёew-shot譯井セ義
      });
    }
  }
  
  // 髣ョ鬚<EFBDAE>3<EFBFBD>夂音螳壽ィ。蝙玖。ィ邇ー蟾ョ
  const modelErrors = analyzeByModel(sample, humanReviews);
  for (const [model, errorRate] of Object.entries(modelErrors)) {
    if (errorRate > 0.15) {
      issues.push({
        type: 'model_underperformance',
        model,
        errorRate,
        recommendation: `閠<>剔隹<E58994>紛讓。蝙<EFBDA1>"${model}"逧<>盾謨ー謌匁峩謐「讓。蝙義
      });
    }
  }
  
  return issues;
}

雍ィ驥乗冠陦ィ遉コ萓<EFBFBD><EFBFBD>?

# 蜈ィ譁<EFBDA8>、咲ュ幄エィ驥丞ョ。隶。謚・蜻<EFBDA5>

**螳。隶。蜻ィ譛<EFBDA8>**<EFBFBD>?025-11-15 閾?2025-11-22  
**諤サ謠仙叙謨ー**<EFBFBD>?48遽? 
**謚ス譬キ謨?*<2A>?5遽<35><EFBFBD>10.1%<25>?

## 謨エ菴楢エィ驥乗欠譬<E6ACA0>

| 謖<><E8AC96><EFBFBD> | 譛ャ蜻ィ | 荳雁捉 | 雜句漢 |
|------|------|------|------|
| 蜃<>。ョ邇?| 94.7% | 93.2% | 竊?+1.5% |
| Cohen's Kappa | 0.89 | 0.87 | 竊?+0.02 |
| 蛛<>亠諤ァ邇<EFBDA7> | 3.1% | 4.2% | 竊?-1.1% |
| 蛛<>亢諤ァ邇<EFBDA7> | 2.2% | 2.6% | 竊?-0.4% |

## 蛻<>ュ玲ョオ蜃<EFBDB5>。ョ邇<EFBDAE>

| 蟄玲ョオ | 蜃<>。ョ邇?| 迥カ諤?|
|------|--------|------|
| 遐皮ゥカ隶セ隶。 | 100% | 笨?莨倡ァ€ |
| 髫乗惻蛹匁婿豕?| 93.3% | 笨?濶ッ螂ス |
| 逶イ豕<EFBDB2> | 86.7% | 笞<><E7AC9E><EFBFBD>€謾ケ霑<EFBDB9> |
| 蝓コ郤ソ蜿ッ豈疲€?| 100% | 笨?莨倡ァ€ |
| 扈捺棡螳梧紛諤?| 93.3% | 笨?濶ッ螂ス |
| ... | ... | ... |

## 讓。蝙区€ァ閭ス蟇ケ豈<EFBDB9>

| 讓。蝙<EFBDA1> | 蜃<>。ョ邇?| 蟷ウ蝮<EFBDB3>スョ菫。蠎?| 螟<>炊譌カ髣エ |
|------|--------|-----------|----------|
| DeepSeek-V3 | 92.1% | 0.87 | 45s |
| Qwen3-Max | 94.5% | 0.91 | 38s |
| Claude-4.5<EFBFBD>井サイ陬<EFBFBD><EFBFBD> | 97.2% | 0.94 | 62s |

## 蜿醍鴫逧<E9B4AB>琉鬚?

1. **蟄玲ョオ"逶イ豕<EFBDB2>"髞呵ッッ邇<EFBDAF>¥鬮假シ<E58187>13.3%<25>?*
   - 蟶ク隗<EFBDB8>漠隸ッ<E99AB8>壼ー<E5A3BC>"蜊慕峇"隸ッ蛻、荳?螳梧紛"
   - 蜴溷屏蛻<E5B18F><EFBFBD>啀rompt譛ェ譏守。ョ蛹コ蛻<EFBDBA>黒逶?蜿檎峇逧<E5B387>エィ驥丞キョ蠑?
   - 謾ケ霑帛サコ隶ョ<E99AB6>壽峩譁ーPrompt<70>悟「槫<EFBDA2>?蜊慕峇騾壼クク荳崎カウ莉・髦イ豁「譽€豬句¥蛟?逧<>ッエ譏?

2. **髦溷<E9ABA6>遐皮ゥカ謠仙叙蜃<E58F99>。ョ邇<EFBDAE>ス惹コ山CT<43>?9% vs 96%<25>?*
   - 蜴溷屏蛻<E5B18F><EFBFBD>夐弌蛻礼<E89BBB>皮ゥカ逧<EFBDB6>婿豕募ュヲ謠剰ソー譖エ轣オ豢サ<E8B1A2><EFBFBD><E6A2A7>㊥蛹也ィ句コヲ菴?
   - 謾ケ霑帛サコ隶ョ<E99AB6>壼「槫<EFBDA2>?荳ェ髦溷<E9ABA6>遐皮ゥカ逧Ёew-shot譯井セ<E4BA95>

## 謾ケ霑帛サコ隶ョ

1. 笨?遶句叉謇ァ陦鯉シ壽峩譁?逶イ豕<EFBDB2>"蟄玲ョオPrompt讓。譚ソ
2. 笞?譛ャ蜻ィ蜀<EFBDA8>シ壼「槫刈髦溷<E9ABA6>遐皮ゥカFew-shot譯井セ句コ?
3. <20>套 荳句捉<E58FA5>夐㍾譁ー隸<EFBDB0>シ?逶イ豕<EFBDB2>"蟄玲ョオ蜃<EFBDB5>。ョ邇?

## 荳句捉逶ョ譬<EFBDAE>

-<>。ョ邇<EFBDAE>シ壺<EFBDBC>?95%
- Cohen's Kappa<70>壺翁 0.90
- "逶イ豕<EFBDB2>"蟄玲ョオ蜃<EFBDB5>。ョ邇<EFBDAE>シ壺<EFBDBC>?93%

1.4 笨?Prompt迚域悽邂。逅<EFBDA1>

Git邂。逅<EFBFBD>署遉コ隸肴ィ。譚ソ<EFBFBD>梧髪謖、/B豬玖ッ<E78E96><EFBFBD>?

backend/prompts/asl/fulltext_screening/
笏懌楳笏€ changelog.md
笏懌楳笏€ fields/
笏?  笏懌楳笏€ 髫乗惻蛹匁婿豕?
笏?  笏?  笏懌楳笏€ v1.0.0-basic.md
笏?  笏?  笏懌楳笏€ v1.1.0-with-examples.md
笏?  笏?  笏懌楳笏€ v1.2.0-cot.md
笏?  笏?  笏披楳笏€ v1.3.0-enhanced-cochrane.md  竊?蠖灘燕迚域悽
笏?  笏懌楳笏€ 逶イ豕<EFBDB2>/
笏?  笏?  笏懌楳笏€ v1.0.0-basic.md
笏?  笏?  笏懌楳笏€ v1.1.0-clarify-single-double.md  竊?謾ケ霑帷<E99C91>?
笏?  笏?  笏披楳笏€ ...
笏?  笏披楳笏€ ...
笏披楳笏€ tests/
    笏披楳笏€ benchmark_results.json

**謨ー謐ョ蠎楢ョー蠖?*<2A>?

model PromptVersion {
  id              String   @id @default(uuid())
  
  field           String   // "髫乗惻蛹匁婿豕?
  version         String   // "v1.3.0"
  content         String   @db.Text
  changelog       String   // "蠅槫シコCochrane譬<65>㊥謠剰ソー<EFBDBF>梧キサ蜉?荳ェFew-shot譯井セ<E4BA95>"
  
  // 諤ァ閭ス謖<EFBDBD><E8AC96><EFBFBD><EFBFBD>/B豬玖ッ慕サ捺棡<E68DBA>?
  accuracy        Float?   // 0.947
  usageCount      Int      @default(0)
  avgConfidence   Float?
  
  // 迥カ諤?
  isActive        Boolean  @default(false)
  isExperimental  Boolean  @default(false)
  
  createdAt       DateTime @default(now())
  deactivatedAt   DateTime?
  
  @@map("asl_prompt_versions")
}

A/B豬玖ッ<E78E96><EFBFBD>?

// 20%豬<>㍼菴ソ逕ィ譁ー迚<EFBDB0>rompt
async function extractFieldWithABTest(
  field: string,
  content: string
) {
  const isExperimentGroup = Math.random() < 0.2;
  
  const promptVersion = isExperimentGroup
    ? await getPromptVersion(field, 'experimental')
    : await getPromptVersion(field, 'stable');
  
  const result = await llmService.chat(
    'deepseek-v3',
    promptVersion.content,
    content
  );
  
  // 隶ー蠖穂スソ逕ィ
  await trackPromptUsage({
    field,
    version: promptVersion.version,
    isExperiment: isExperimentGroup,
    result
  });
  
  return result;
}

// 豈丞捉蛻<E68D89>梵A/B豬玖ッ慕サ捺棡
async function analyzeABTest(field: string): Promise<ABTestReport> {
  const stableResults = await getPromptUsageStats(field, 'stable');
  const experimentResults = await getPromptUsageStats(field, 'experimental');
  
  const improvement = {
    accuracy: experimentResults.accuracy - stableResults.accuracy,
    confidence: experimentResults.avgConfidence - stableResults.avgConfidence,
    processingTime: experimentResults.avgTime - stableResults.avgTime
  };
  
  // 扈溯ョ。譏セ闡玲€ァ譽€鬪?
  const isSignificant = performTTest(stableResults, experimentResults);
  
  return {
    field,
    stableVersion: stableResults.version,
    experimentVersion: experimentResults.version,
    sampleSize: {
      stable: stableResults.count,
      experiment: experimentResults.count
    },
    improvement,
    isSignificant,
    recommendation: isSignificant && improvement.accuracy > 0.02
      ? 'promote_to_stable'  // 謠仙合荳コ遞ウ螳夂沿
      : 'continue_testing'   // 扈ァ扈ュ豬玖ッ<E78E96>
  };
}

莠後€〃2.0謌先悽鬚<EFBFBD><EFBFBD>

蝨コ譎ッ<EFBFBD>?00遽<30><E981BD><EFBFBD>、咲ュ幢シ磯ォ倩エィ驥城。ケ逶ョ<E980B6><EFBDAE>

邇ッ闃<EFBFBD> Token豸郁€? 讓。蝙<EFBFBD> 謌先悽
12蟄玲ョオ蛻<EFBFBD>ョオ謠仙叙<EFBFBD>亥曙讓。蝙具シ? 12K DeepSeek-V3 + Qwen3-Max ツ・0.06/遽?
蜈ィ譁<EFBFBD>コ、蜿蛾ェ瑚ッ<EFBFBD> 3K DeepSeek-V3 ツ・0.003/遽?
蜈ウ髞ョ蟄玲ョオ荳画ィ。蝙倶サイ陬<EFBFBD><EFBFBD>15%<25>? 3K Claude-4.5 ツ・0.03/遽<>シ井サ?5%<25>?
雍ィ驥丞ョ。隶。<EFBFBD>?0%謚ス譟・<E8AD9F>? 2K 莠コ蟾・ 10蛻<EFBFBD>帖/遽?
*100遽<EFBFBD>€サ謌先<EFBFBD>? - - ツ・10 + 莠コ蟾・謌先悽

雍ィ驥乗署蜊<EFBFBD><EFBFBD>壼㊥遑ョ邇<EFBFBD> 92% 竊?96%
謌先悽蠅槫刈<EFBFBD>堋? 竊?ツ・10<31>?25%<25>御ス<E5BEA1>セセ蛻ー蛹サ蟄ヲ郤ァ譬<EFBDA7><EFBFBD><E38AA5>


荳峨€〃2.0鬪梧噺譬<EFBFBD>

<EFBFBD><EFBFBD><EFBFBD> 逶ョ譬<EFBFBD> 鬪瑚ッ∵婿豕<EFBFBD>
<EFBFBD>。ョ邇<EFBFBD>シ井ク灘ョカ隸<EFBFBD>シー<EFBFBD>? 竕?96% 莠コ蟾・謚ス譟・100遽?
莠コ譛コ荳€閾エ諤? Cohen's Kappa 竕?0.90 扈溯ョ。蛻<EFBFBD>
<EFBFBD>亠諤ァ邇<EFBFBD> 竕?3% 扈溯ョ。蛻<EFBFBD>
<EFBFBD>亢諤ァ邇<EFBFBD> 竕?2% 扈溯ョ。蛻<EFBFBD>
隸∵紺體セ螳梧紛諤? 100% 閾ェ蜉ィ譽€譟?
閾ェ蜉ィ蛹門ョ。隶? 豈丞捉1谺? 邉サ扈滓冠陦ィ
Prompt迚域悽邂。逅<EFBFBD> 100% Git蜴<EFBFBD>彰霑ス雕ェ
隨ヲ蜷<EFBFBD>ochrane譬<EFBFBD> 竕?95% 荳灘ョカ隶、隸<EFBFBD>

<EFBFBD>投 荳蛾亳谿オ蟇ケ豈疲€サ扈<EFBDBB>

扈エ蠎ヲ MVP V1.0 V2.0
*<EFBFBD>。ョ邇? 85% 92% 96%
譬ク蠢<EFBFBD>ュ也払 Nougat+蛻<>ョオ謠仙叙 +蜈ィ譁<EFBDA8>ェ瑚ッ<E7919A>+騾サ霎題ァ<E9A18C><EFBDA7> +荳画ィ。蝙倶サイ陬?螳。隶。
*隸∵紺體? 蝓コ譛ャ蠑慕畑 螳梧紛螳壻ス<EFBFBD> 螳。隶。郤ァ譌・蠢?
雍ィ驥乗而蛻カ 蜿梧ィ。蝙矩ェ瑚ッ? 蛹サ蟄ヲ騾サ霎大シ墓梼 HITL+閾ェ蜉ィ螳。隶。
*謌先悽/100遽? ツ・6 ツ・8 ツ・10
*蠑€蜿大捉譛? 3蜻? 5蜻? 8蜻?
騾ら畑蝨コ譎ッ 蠢ォ騾滄ェ瑚ッ? 蟶ク隗<EFBFBD>。ケ逶ョ Cochrane蜿題。ィ

<EFBFBD>売 螳樊命霍ッ蠕<EFBDAF>

髦カ谿オ1<EFBFBD>哺VP蠑€蜿托シ<EFBFBD>eek 1-3<>?

Week 1<EFBFBD>壼渕遑€譫カ譫<EFBFBD>

  • PDF蟄伜お譛榊苅<EFBFBD>亥キイ螳梧<EFBFBD><EFBFBD>俄怛
  • Nougat謠仙叙+遶<>闃りァ」譫<EFBDA3>
  • 12蟄玲ョオ霍ッ逕ア陦ィ隶セ隶?
  • 蝓コ遑€Prompt讓。譚ソ<EFBFBD>?2荳ェ蟄玲ョオ<EFBDAE><EFBDB5>

Week 2<EFBFBD><EFBFBD>ク蠢<EFBFBD>粥閭?

  • <EFBFBD>ョオ蟷カ陦梧署蜿<EFBFBD>
  • 蜿梧ィ。蝙玖ー<EFBFBD><EFBFBD>?
  • 蟄玲ョオ郤ァ蜀イ遯∵」€豬?
  • 蝓コ遑€隸∵紺體?

Week 3<EFBFBD>壼燕遶?豬玖ッ<E78E96>

  • 蜑咲ォッ蟾・菴懷<EFBFBD>?
  • 蜀イ遯∝ッケ豈碑ァ<EFBFBD>
  • 莠コ蟾・螟肴<EFBFBD>ク逡碁擇
  • 蜉溯<EFBFBD>豬玖ッ<EFBFBD>+蜃<>。ョ邇<EFBDAE><EFBFBD>シ?

髦カ谿オ2<EFBFBD>啖1.0蠅槫シコ<EFBFBD><EFBFBD>eek 4-8<>?

Week 4-5<EFBFBD>夊エィ驥乗署蜊?

  • Cochrane譬<EFBFBD>㊥Prompt蠅槫シコ
  • Few-shot蛹サ蟄ヲ譯井セ句コ難シ域ッ丞ュ玲ョ?-5荳ェ<E88DB3><EFBDAA>
  • CoT謗ィ逅<EFBFBD>「槫シコ

Week 6-7<EFBFBD>夐ェ瑚ッ∵惻蛻?

  • 蜈ィ譁<EFBFBD>コ、蜿蛾ェ瑚ッ<EFBFBD>
  • 蛹サ蟄ヲ騾サ霎題ァ<EFBFBD><EFBFBD>蠑墓梼
  • 螳梧紛隸∵紺體?

Week 8<EFBFBD>壻シ伜<EFBFBD>?譁<>。」

  • 諤ァ閭ス莨伜喧
  • A/B豬玖ッ<E78E96>
  • <EFBFBD>。」螳悟埋

髦カ谿オ3<EFBFBD>啖2.0螳悟埋<EFBFBD><EFBFBD>eek 9-16<31>?

Week 9-11<EFBFBD>夐ォ倡コァ蜉溯<EFBFBD>?

  • 荳画ィ。蝙倶サイ陬?
  • HITL譎コ閭ス蛻<EFBFBD><EFBFBD>
  • Prompt迚域悽邂。逅<EFBFBD>+A/B豬玖ッ<E78E96>

Week 12-14<EFBFBD>夊エィ驥丞ョ。隶?

  • 閾ェ蜉ィ螳。隶。邉サ扈<EFBFBD>
  • 雍ィ驥乗冠陦ィ
  • 蠑ょクク譽€豬?

Week 15-16<EFBFBD>壼現蟄ヲ荳灘ョカ鬪瑚ッ?

  • Cochrane荳灘ョカ隸<EFBFBD>ョ。
  • 蜈ィ驥乗オ玖ッ<EFBFBD>
  • 蜿大ク<EFBFBD>枚譯」

<EFBFBD>答 逶ク蜈ウ譁<EFBDB3>。」


譖エ譁ー譌・蠢<EFBFBD><EFBFBD>?

  • 2025-11-22: 蛻帛サコ譁<EFBDBA>。」<EFBDA1>悟ョ壻ケ牙<EFBDB9><EFBFBD>、咲ュ帑ク蛾亳谿オ雍ィ驥丈ソ晞囿遲也払
  • 蝓コ莠晒ougat扈捺桷蛹?蛻<>ョオ謠仙叙+蜈ィ譁<EFBDA8>ェ瑚ッ∫噪謚€譛ッ譁ケ譯?
  • 蜿り€イochrane RoB 2.0譬<EFBFBD>㊥隶セ隶。荳謎ク啀rompt讓。譚ソ
  • 蠑コ隹<EFBFBD>ョ梧紛隸∵紺體セ蜥悟庄霑ス貅ッ諤?