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%)
42 KiB
蜈ィ譁<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>?
- 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>譫仙ス灘燕隶コ譁?..
- 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>遲幄エィ驥丈ソ晞囿遲也払
- [蜈ィ譁<EFBDA8>、咲ュ帛シ蜿題ョ。蛻綻(../04-蠑蜿題ョ。蛻?04-蜈ィ譁<EFBDA8>、咲ュ帛シ蜿題ョ。蛻?md)
- 謨ー謐ョ蠎楢ョセ隶。
- API隶セ隶。隗<EFBFBD>激
- 莠大次逕溷シ蜿題ァ<EFBFBD>激
譖エ譁ー譌・蠢<EFBFBD><EFBFBD>?
- 2025-11-22: 蛻帛サコ譁<EFBDBA>。」<EFBDA1>悟ョ壻ケ牙<EFBDB9>譁<EFBFBD>、咲ュ帑ク蛾亳谿オ雍ィ驥丈ソ晞囿遲也払
- 蝓コ莠晒ougat扈捺桷蛹?蛻<>ョオ謠仙叙+蜈ィ譁<EFBDA8>ェ瑚ッ∫噪謚譛ッ譁ケ譯?
- 蜿りイochrane RoB 2.0譬<EFBFBD>㊥隶セ隶。荳謎ク啀rompt讓。譚ソ
- 蠑コ隹<EFBFBD>ョ梧紛隸∵紺體セ蜥悟庄霑ス貅ッ諤?