feat: verify analysis citations against source text
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
const fields=new Set(['itemsAndSpecs','documentChecklist','qualificationCriteria','criticalRequirements','risksAndPenalties','criticalDetails','disqualificationRisks','deadlines','roadmap']);
|
||||
export function verifyAnalysisCitations(result,source) {
|
||||
const evidence=[];
|
||||
for(const citation of Array.isArray(result.citations)?result.citations:[]) {
|
||||
const match=/^([A-Za-z]+)\.(\d+)$/.exec(String(citation?.path || ''));
|
||||
if(!match || !fields.has(match[1]) || !Array.isArray(result[match[1]]) || Number(match[2])>=result[match[1]].length)continue;
|
||||
const quote=String(citation.quote || '').trim();
|
||||
if(quote.length<12 || quote.length>1500)continue;
|
||||
const start=source.indexOf(quote);
|
||||
evidence.push({path:citation.path,quote,status:start<0?'not_found':source.indexOf(quote,start+1)>=0?'ambiguous':'located',
|
||||
start:start<0?null:start,end:start<0?null:start+quote.length});
|
||||
}
|
||||
const missing=[];
|
||||
for(const field of fields)for(let i=0;i<(Array.isArray(result[field])?result[field].length:0);i++)
|
||||
if(!evidence.some(e=>e.path===`${field}.${i}` && e.status==='located'))missing.push(`${field}.${i}`);
|
||||
return {evidence,missing};
|
||||
}
|
||||
Reference in New Issue
Block a user