feat: 市场调研落地——趋势AI人话解读(plainExplain/takeAway,采集自动生成+SSR+小程序卡)+ 首页今日知识卡
This commit is contained in:
@@ -189,6 +189,33 @@ async function callAI(messages, maxTokens = 1024) {
|
||||
return '';
|
||||
}
|
||||
|
||||
/** 人话解读:每条趋势生成"一句话说清 + 对普通人意味着什么"(治 AI 焦虑的核心价值层) */
|
||||
async function explainItems(items) {
|
||||
const targets = items.filter(i => i.title && !i.plainExplain).slice(0, 14);
|
||||
if (targets.length === 0) return items;
|
||||
console.log(` → 生成人话解读 ${targets.length} 条...`);
|
||||
for (const item of targets) {
|
||||
const prompt = `你是"维度精灵",帮普通上班族看懂 AI 新闻。基于下面这条资讯,输出 JSON(只输出 JSON):
|
||||
{"plainExplain":"用一句大白话说清这条资讯讲的是什么,30字内,不用术语","takeAway":"这对普通人意味着什么/该注意什么,一句行动向的话,30字内"}
|
||||
|
||||
资讯标题:${item.title}
|
||||
${item.summary ? '摘要:' + String(item.summary).slice(0, 200) : ''}`;
|
||||
const out = await callAI([{ role: 'user', content: prompt }], 300);
|
||||
const m = out.match(/\{[\s\S]*?\}/);
|
||||
if (m) {
|
||||
try {
|
||||
const j = JSON.parse(m[0]);
|
||||
if (j.plainExplain) item.plainExplain = String(j.plainExplain).slice(0, 60);
|
||||
if (j.takeAway) item.takeAway = String(j.takeAway).slice(0, 60);
|
||||
} catch (e) { /* 解析失败留空,前端回退只显示标题 */ }
|
||||
}
|
||||
await new Promise(r => setTimeout(r, 300));
|
||||
}
|
||||
const ok = items.filter(i => i.plainExplain).length;
|
||||
console.log(` ✓ 人话解读完成 ${ok}/${targets.length}`);
|
||||
return items;
|
||||
}
|
||||
|
||||
/** 翻译英文内容到中文 */
|
||||
async function translateItems(items) {
|
||||
const needTranslate = items.filter(i => !hasChinese(i.title));
|
||||
@@ -342,6 +369,9 @@ async function main() {
|
||||
console.log(` ✓ 中文保底补充: ${need} 条`);
|
||||
}
|
||||
|
||||
// AI 人话解读(失败不阻断采集,字段留空前端自动回退)
|
||||
try { await explainItems(items); } catch (e) { console.log(' ⚠ 人话解读失败:', e.message); }
|
||||
|
||||
// 全量刷新:清空旧数据(避免残留英文 / 测试数据)
|
||||
await Trend.deleteMany({});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user