Files
aurak/server/scripts/batch-add-questions.cjs
T

148 lines
15 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const D = require('better-sqlite3'), p = require('path');
const db = new D(p.join(__dirname, '../data/metadata.db'));
const { randomUUID } = require('crypto');
const BANK = '984632e0-b35d-486d-9a19-27a14845db37';
const insert = db.prepare(`INSERT INTO question_bank_items (id, bank_id, question_text, questionType, options, correctAnswer, key_points, difficulty, dimension, status, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, 'STANDARD', ?, 'PUBLISHED', datetime('now'), datetime('now'))`);
function sa(q, dim, kp) {
return { questionText: q, questionType: 'SHORT_ANSWER', dimension: dim, options: null, correctAnswer: null, keyPoints: kp };
}
function mcTF(q, ans, dim) {
return { questionText: q, questionType: 'MULTIPLE_CHOICE', dimension: dim, options: ['TRUE', 'FALSE'], correctAnswer: ans, keyPoints: [] };
}
const questions = [
// ====== IDE题库 ======
// 一、GitHub Copilot — 智能代码补全
mcTF('看到 Copilot 给出的灰色补全建议后,按 Tab 键可以接受建议。', 'TRUE', 'IDE'),
mcTF('看到 Copilot 给出的补全建议后,按 Esc 键可以拒绝这个建议。', 'TRUE', 'IDE'),
mcTF('写函数开头后,Copilot 会自动逐行补全后续逻辑。', 'TRUE', 'IDE'),
sa('小张用Copilot智能补全生成了一段代码,看起来功能正常。在正式使用这段代码前,他应该先做什么?', 'IDE', ['审查代码逻辑', '确认没有语法错误或逻辑漏洞', 'AI生成的代码需要人工审核']),
// 二、GitHub Copilot — Chat 三种模式
sa('小张接手了一个老项目,打开OrderService.java发现有段逻辑看不太懂。他应该用Copilot Chat的哪种模式(Ask/Plan/Agent)?', 'IDE', ['Ask模式', 'Ask只回答问题不修改代码']),
sa('小李需要在三个文件中新增一个批量删除用户的功能,希望AI直接帮他完成。应该用Copilot Chat的哪种模式?', 'IDE', ['Agent模式', 'Agent可以自动跨文件修改代码']),
sa('小赵想在项目中新增一个功能,但不知道涉及哪些文件,想让AI先扫描整个项目给出方案。应该用哪种模式?', 'IDE', ['Plan模式', 'Plan只出方案不动代码']),
mcTF('Ask模式下Copilot只会回答问题,不会修改用户的代码。', 'TRUE', 'IDE'),
mcTF('Agent模式下Copilot可以跨多个文件修改代码。', 'TRUE', 'IDE'),
// 三、GitHub Copilot — CLI 使用
sa('小刘想用Copilot CLI重构一个Python脚本,过程中要多次对话逐步调优。应该用交互模式还是非交互模式?', 'IDE', ['交互模式', '交互模式支持多轮对话']),
sa('小钱想用Copilot CLI快速解释一下git diff的结果,不想进入交互式对话。应该用哪种方式?', 'IDE', ['非交互模式', 'copilot -p指令适合一次性任务']),
sa('小赵在Copilot CLI交互模式中,想清空当前对话上下文重新开始。应该用哪个命令?', 'IDE', ['/clear命令']),
// 四、Claude Code — 交互方式
mcTF('在Claude Code中输入@src/utils.js可以让AI读取该文件。', 'TRUE', 'IDE'),
mcTF('在Claude Code中输入/clear可以清空当前对话。', 'TRUE', 'IDE'),
mcTF('在Claude Code中输入!git status可以查看Git状态。', 'TRUE', 'IDE'),
mcTF('在Claude Code中所有操作都必须用特殊符号,自然语言输入不能完成任何功能。', 'FALSE', 'IDE'),
mcTF('在Claude Code中输入!npm run dev可以启动开发服务器。', 'TRUE', 'IDE'),
mcTF('在Claude Code中输入/help可以查看所有可用命令。', 'TRUE', 'IDE'),
// 五、Claude Code — 模型选择
sa('Claude Code的三个模型:Sonnet(日常编码)、Haiku(快速简单)、Opus(复杂难题)。修复复杂系统架构Bug该用哪个?', 'IDE', ['Opus', 'Opus处理最复杂的难题']),
sa('日常CRUD接口开发该用Claude Code的哪个模型?', 'IDE', ['Sonnet', 'Sonnet是日常编码首选']),
sa('快速查一下某个JavaScript数组方法的语法,该用Claude Code的哪个模型?', 'IDE', ['Haiku', 'Haiku响应快成本低']),
// 六、Claude Code — CLI 命令
sa('小赵的Claude Code会话意外关闭了,想接着刚才的对话继续。该用哪个命令?', 'IDE', ['claude --continue', '或claude -c恢复上次会话']),
sa('小钱想用Claude Code快速解释git diff结果,不想进入交互式对话。该用哪个命令?', 'IDE', ['claude -p指令', '-p参数用于一次性任务']),
mcTF('claude --resume可以从历史会话列表中选择恢复。', 'TRUE', 'IDE'),
// 七、OpenCode — 整体认知
mcTF('OpenCode可以直接读取项目文件、修改代码、执行命令。', 'TRUE', 'IDE'),
mcTF('传统AI像远程顾问给你建议但需要你动手;OpenCode可以直接帮你操作。', 'TRUE', 'IDE'),
sa('小周想用OpenCode读取包含客户个人信息的代码文件让AI优化。这种做法合适吗?为什么?', 'IDE', ['不合适', '客户信息是敏感数据不能输入公共AI', '应先脱敏处理']),
// 八、OpenCode — 安装与使用方式
sa('OpenCode有终端版/桌面应用/IDE扩展/Web版四种方式。新手不想用命令行的该选哪个?', 'IDE', ['桌面应用', '界面直观适合新手']),
sa('用VS Code写代码希望不离开编辑器用OpenCode该选哪种?', 'IDE', ['IDE扩展', '深度绑定编辑器']),
sa('需要在远程服务器上开发只能通过命令行操作该选哪种?', 'IDE', ['终端版', '轻量启动快适合有基础的用户']),
mcTF('在终端中输入opencode可以启动OpenCode。', 'TRUE', 'IDE'),
// 九、OpenCode — Plan/Build 模式
sa('小周接手新项目想先让OpenCode分析结构,还不想修改任何文件。该选Plan还是Build', 'IDE', ['Plan模式', 'Plan只能读取文件不会修改代码']),
sa('小周确认了修改方案想让OpenCode开始实际修改代码。该选Plan还是Build', 'IDE', ['Build模式', 'Build可以编辑文件和执行命令']),
mcTF('Plan模式下AI只能读取文件,不会修改任何代码。', 'TRUE', 'IDE'),
mcTF('Build模式下AI可以编辑文件和执行命令。', 'TRUE', 'IDE'),
sa('小周让OpenCode在Build模式下修改了多个文件。修改完成后他应该先做什么?', 'IDE', ['审查AI修改的代码', '确认逻辑正确后再使用', 'AI代码不能直接部署到生产']),
// 十、OpenCode — 常用命令
sa('小周用OpenCode修改代码后发现改错了想撤销。该用哪个命令?', 'IDE', ['/undo']),
sa('小周撤销后又觉得还是刚才改得好想恢复回来。该用哪个命令?', 'IDE', ['/redo']),
sa('小周想在新项目目录中创建AGENTS.md让OpenCode了解项目结构。该用哪个命令?', 'IDE', ['/init']),
sa('小周想看看OpenCode当前有哪些可用的斜杠命令和快捷键。该用哪个命令?', 'IDE', ['/help']),
sa('小周想切换OpenCode正在使用的AI模型。该用哪个命令?', 'IDE', ['/models']),
// 十一、OpenCode — 模型选择
mcTF('OpenCode内置多款免费模型,启动后可直接选择使用,无需配置API密钥。', 'TRUE', 'IDE'),
mcTF('使用第三方LLM提供商需要自行承担API费用。', 'TRUE', 'IDE'),
// 十二、Debug — 调试助手
sa('小吴代码报错了不知道问题在哪,想用Copilot Chat定位和解决Bug。该用哪个命令?', 'IDE', ['/debug', '专用于定位和解决Bug']),
sa('小吴知道问题在哪了,想让Copilot直接修复选中的代码。该用哪个命令?', 'IDE', ['/fix', '用于自动修复代码问题']),
mcTF('在Copilot Chat中输入/tests可以生成选中代码的单元测试。', 'TRUE', 'IDE'),
mcTF('在Copilot Chat中输入/explain可以让AI解释选中代码的逻辑。', 'TRUE', 'IDE'),
mcTF('/debug命令可以帮助定位和解决Bug。', 'TRUE', 'IDE'),
sa('小吴用/fix让Copilot自动修复了代码。修复完成后他应该先做什么?', 'IDE', ['审查修复后的代码', '确认修改正确逻辑无误后再使用']),
sa('小吴想把包含数据库连接串的配置文件贴到Copilot Chat中用/debug分析。这种做法合适吗?', 'IDE', ['不合适', '数据库连接串是敏感信息', '应该用脱敏数据替代']),
// ====== PROMPT补全 ======
// 基于提示词工程.md
sa('小王用AI写邮件时只写了"写一封邮件给客户",AI反复追问细节。他在Prompt中缺少哪些要素?', 'PROMPT', ['缺少角色、背景和执行要求', '好的Prompt应包含六要素']),
mcTF('Prompt越长越详细越好,不存在过长的问题。', 'FALSE', 'PROMPT'),
sa('小李在Prompt中用了"非常好""很专业"这类模糊描述,AI的输出总是不符合预期。问题出在哪?', 'PROMPT', ['模糊描述导致AI理解偏差', '应使用具体可量化的要求', '如字数限制/格式要求/示例参考']),
sa('小赵写了一篇很长的Prompt,但AI只关注了前半部分。这是什么原因?', 'PROMPT', ['上下文压缩', '长Prompt中尾部信息可能被忽略', '关键要求应放在Prompt开头']),
sa('小张在Prompt中写了"不要使用过期API",但AI还是用了。问题可能出在哪?', 'PROMPT', ['否定指令容易被AI忽略', '应正面表述要做什么', '改为"使用最新稳定版API"']),
mcTF('给AI设定角色身份可以帮助AI更准确地理解任务。', 'TRUE', 'PROMPT'),
sa('小刘想让AI输出表格数据,但AI每次格式都不一样。他应该在Prompt中加什么?', 'PROMPT', ['明确指定输出格式', '给出表格示例', '使用输出格式约束']),
sa('小陈和AI对话了10轮后发现AI开始偏离最初的任务。这是为什么?怎么避免?', 'PROMPT', ['长对话中AI会模糊最初目标', '定期重申核心任务', '必要时开新窗口重写Prompt']),
mcTF('发现AI偏离任务时,最好的做法是在当前对话中纠正它。', 'FALSE', 'PROMPT'),
sa('小周想让AI修改一段代码,但AI只能看到当前对话的内容。他应该怎么做才能让AI充分理解项目背景?', 'PROMPT', ['提供项目相关上下文', '描述代码所在模块的功能', '给出完整的需求说明']),
sa('小吴的Prompt总是很长,他发现AI回复质量随着Prompt长度增加而下降。最可能的原因是什么?', 'PROMPT', ['上下文窗口有限', '过长信息会被压缩或丢弃', '应精简Prompt保留关键信息']),
mcTF('在Prompt中使用分隔符(如===、---)可以帮助AI更好地理解结构。', 'TRUE', 'PROMPT'),
// ====== LLM补全 ======
// 基于大语言模型入门.md + AI安全使用指南.md
sa('小赵让AI分析公司年度财报,AI给出了详细的分析报告。有什么安全问题需要注意?', 'LLM', ['财报属于公司机密', '不应输入公共AI工具', '应使用脱敏后的模拟数据']),
mcTF('AI的工作原理是根据上文猜下文,不是查资料找答案。', 'TRUE', 'LLM'),
sa('小孙问AI一个关于最新API的问题,AI回答得很详细但用的API版本已经过时了。为什么?', 'LLM', ['AI的知识截止于训练日期', '不知道训练后发生的新事件', '应提供最新的API文档给AI']),
sa('小李让AI同一道题回答了三遍,每次答案都不一样。这是正常的吗?为什么?', 'LLM', ['正常', 'AI是概率模型每次生成有随机性', '设置低temperature可让输出更稳定']),
mcTF('AI的输出完全正确可靠,不需要人工验证。', 'FALSE', 'LLM'),
sa('小钱让AI生成了一份产品需求文档,AI写得很专业但引用了一些不存在的市场数据。这是什么问题?', 'LLM', ['AI产生了幻觉', 'AI会编造看似合理但不存在的內容', '应要求AI只基于提供的数据回答']),
sa('小周把客户数据库导出为CSV后上传给AI让它做数据分析。这个做法有什么风险?', 'LLM', ['客户数据不能输入公共AI', '可能造成数据泄露', '应使用脱敏数据']),
mcTF('AI的"幻觉"是指AI会编造看似合理但实际错误的内容。', 'TRUE', 'LLM'),
sa('小吴让AI翻译一份合同,AI翻译得很好但保留了原文中的客户签名信息。这有什么问题?', 'LLM', ['签名信息属于敏感数据', '不应输入公共AI工具', '应在输入前先脱敏']),
sa('小郑想让AI基于公司内部培训材料出一份试题。但培训材料中包含未公开的产品计划。能直接把材料给AI吗?', 'LLM', ['不能', '未公开的产品计划属于公司机密', '应使用虚拟场景代替']),
mcTF('AI训练数据的截止日期意味着AI不知道之后发生的事件。', 'TRUE', 'LLM'),
// ====== DEV_PATTERN补全 ======
// 基于开发范式与个人实践指南.md
sa('小王用AI快速写完了一个功能,比预期快了3天。他应该把这3天用在做什么?', 'DEV_PATTERN', ['做更充分的测试', '审查AI代码质量', '优化代码结构']),
mcTF('AI时代开发速度加快,质量保证流程也可以相应省略。', 'FALSE', 'DEV_PATTERN'),
sa('小李的同事说"既然有AI写代码了,测试就不用写了吧"。你怎么回应?', 'DEV_PATTERN', ['AI时代测试更重要', 'AI生成代码更需要测试验证', '测试是保证质量的最后防线']),
sa('小赵在瀑布式项目中用AI辅助开发,发现AI优化了原有设计。他能直接按AI的方案改吗?', 'DEV_PATTERN', ['不能直接改', '瀑布模式不鼓励中途变更方案', '应走正式变更流程']),
mcTF('AI辅助开发中,花时间明确需求比直接让AI写代码更高效。', 'TRUE', 'DEV_PATTERN'),
sa('小张用AI生成了核心功能的代码并合入了主分支。他的做法有什么问题?', 'DEV_PATTERN', ['AI代码应经审查后再合入', '直接合入可能引入质量问题', '应建立AI代码审查流程']),
sa('团队引入AI后,项目经理说交付周期可以缩短一半。你认同吗?', 'DEV_PATTERN', ['AI能提高效率但不能简单减半', '审查测试等流程不能省略', 'AI更适合辅助而不是替代']),
mcTF('使用AI辅助开发时,开发者对最终代码质量仍然负有全部责任。', 'TRUE', 'DEV_PATTERN'),
sa('小刘用AI生成了原型代码拿去给客户演示,客户很满意要求直接部署上线。小刘应该怎么做?', 'DEV_PATTERN', ['原型代码不能直接部署', '需要整理代码通过质量检查', '补充测试和文档后再上线']),
sa('小陈用AI探索一种新的技术方案,不确定能否成功。在瀑布模式下这么做有什么风险?', 'DEV_PATTERN', ['瀑布模式变更成本高', '探索性做法适合敏捷开发', '应在调研阶段验证而非开发阶段']),
mcTF('用AI写的代码,出了问题责任在AI工具公司。', 'FALSE', 'DEV_PATTERN'),
];
let ok = 0;
for (const q of questions) {
const id = randomUUID();
try {
insert.run(id, BANK, q.questionText, q.questionType, q.options ? JSON.stringify(q.options) : null, q.correctAnswer || null, JSON.stringify(q.keyPoints || []), q.dimension);
ok++;
} catch (e) { console.log('FAIL:', e.message.substring(0, 60)); }
}
const r = db.prepare("SELECT dimension, questionType, COUNT(*) c FROM question_bank_items WHERE bank_id=? GROUP BY dimension, questionType ORDER BY dimension, questionType").all(BANK);
const t = db.prepare("SELECT COUNT(*) c FROM question_bank_items WHERE bank_id=?").get(BANK);
console.log('Added:', ok, 'Total:', t.c);
r.forEach(i => console.log(' ' + i.dimension + ' ' + i.questionType + ': ' + i.c));
db.close();