brief-rule-patterns-smoke.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/env node
  2. const { CASE_PATTERNS, PATTERN_LIBRARY, extractPatternHits } = require('../mcp/src/features/tihao-sourcing/brief-rule-patterns');
  3. const { parseBrief } = require('../mcp/src/features/tihao-sourcing/brief-parser');
  4. function main() {
  5. // 13 个真实案例结构化
  6. assert(CASE_PATTERNS.length === 13, `应有 13 个真实案例,实际 ${CASE_PATTERNS.length}`);
  7. assert(CASE_PATTERNS.some(item => item.id === 'case-2-dha'), '应包含 DHA 案例');
  8. assert(CASE_PATTERNS.some(item => item.id === 'case-6-zelimei'), '应包含泽立美案例');
  9. assert(CASE_PATTERNS.every(item => item.caseName && item.accountTypes), '每个案例应有 caseName 和 accountTypes');
  10. // 规则模式库
  11. assert(PATTERN_LIBRARY.cpc && PATTERN_LIBRARY.cpv && PATTERN_LIBRARY.recentPlays, '应包含 CPC/CPV/近3条播放模式');
  12. assert(PATTERN_LIBRARY.ipMustBe && PATTERN_LIBRARY.sameProvince, '应包含地域硬约束模式');
  13. assert(PATTERN_LIBRARY.underAgeRatio && PATTERN_LIBRARY.interestTags, '应包含低龄占比/兴趣标签模式');
  14. // 模式提取
  15. const dha = extractPatternHits('女性25-44岁占比70%以上,兴趣前三标签含2个:母婴/萌娃/记录生活,CPE≤3,阅读中位数≥4000,预估阅读单价≤1.0');
  16. assert(dha.some(item => item.key === 'interestTags'), '应识别兴趣标签模式');
  17. assert(dha.some(item => item.key === 'ageRatio'), '应识别年龄占比模式');
  18. const region = extractPatternHits('达人ip必须为宁夏');
  19. assert(region.some(item => item.key === 'ipMustBe'), '应识别达人IP硬约束');
  20. // parseBrief 端到端识别真实案例表达
  21. const dhaBrief = parseBrief({ briefText: '产品DHA,账号类型干货科普营养师妈妈。CPE≤3,阅读中位数≥4000,CPC≤0.8,近3条视频平均播放>30万,女性25-44岁占比70%以上,兴趣前三标签含2个,达人ip必须宁夏' });
  22. assert(dhaBrief.performanceRequirements.some(item => /CPE≤3/.test(item)), '应解析 CPE≤3');
  23. assert(dhaBrief.performanceRequirements.some(item => /CPC≤0.8/.test(item)), '应解析 CPC≤0.8');
  24. assert(dhaBrief.performanceRequirements.some(item => /近3条平均播放>30万/.test(item)), '应解析近3条播放');
  25. assert(dhaBrief.performanceRequirements.some(item => /25-44岁占比70%以上/.test(item)), '应解析年龄占比');
  26. assert(dhaBrief.performanceRequirements.some(item => /兴趣前三标签含2个/.test(item)), '应解析兴趣标签');
  27. assert(dhaBrief.performanceRequirements.some(item => /达人IP必须宁夏/.test(item)), '应解析达人IP');
  28. assert(Array.isArray(dhaBrief.briefRulePatterns) && dhaBrief.briefRulePatterns.length > 0, '应输出 briefRulePatterns');
  29. console.log(JSON.stringify({
  30. ok: true,
  31. caseCount: CASE_PATTERNS.length,
  32. patternCount: Object.keys(PATTERN_LIBRARY).length,
  33. parsedRequirementCount: dhaBrief.performanceRequirements.length,
  34. matchedPatternCount: dhaBrief.briefRulePatterns.length
  35. }, null, 2));
  36. }
  37. function assert(condition, message) {
  38. if (!condition) throw new Error(message);
  39. }
  40. if (require.main === module) main();