daily-q:基于 LLM 的每日一题面试练习 CLI

发布时间:2026/8/3 11:43:43
daily-q:基于 LLM 的每日一题面试练习 CLI 一个用 Rust 写的「每日一题」命令行工具每天出一道针对你薄弱点的面试题 → 编辑器作答 → AI 评分反馈 → 后台分析薄弱点 → 明天的题自动偏向薄弱点。一、要解决的问题面试准备最大的痛点是「不知道练什么」刷题不针对通用题库按知识点随机出反复练自己已经会的练完没反馈写完答案没人告诉你答得怎么样、差在哪薄弱点靠感觉全凭印象判断自己哪里弱没有数据支撑刷题要不显眼在职准备跳槽的人浏览器里开着刷题页面一眼就暴露意图终端窗口和日常敲代码毫无差别工作间隙也能自然练习daily-q 面向后端/数据方向的程序员把「出题 → 作答 → 评判 → 复盘」闭环进一个命令行工具核心循环每天出 1 道题 → 作答 → AI 评分反馈 → 后台分析薄弱点 → 下次出题自动偏向薄弱点典型场景在职后端程序员想跳槽午休或工作间隙在终端敲下dq就能完成一整套练习——出题、作答、评分都在一个黑框里看起来和日常写代码没有任何区别不必背着同事偷偷打开浏览器刷题。实际运行效果隔离环境 mock LLM可复现$ dq# 今日无题LLM 按画像薄弱点动态出题今日题目 TCP 三次握手 medium 请描述TCP三次握手的过程 $ dq answer# 编辑器作答AI 评判请在编辑器中作答保存并退出(难度: medium)得分75反馈 整体正确细节不足 参考答案 SYN -SYN-ACK -ACK[summary]完成 —1个薄弱项已更新答完题dq stats能直接看到掌握度数据谁强谁弱一目了然$ dq stats 掌握度统计[~]TCP1/2(50%)[一般][]三次握手1/1(100%)[掌握]最新总结 薄弱知识点 TCP 建议 - 多练习传输层二、解决方案项目与技术架构定位单文件 CLI零运维数据全部在本地~/.daily-q/。技术栈Rust SQLite LLMOpenAI 兼容/v1/chat/completions协议可接国内任意兼容服务商。数据流用户执行 dq │ ▼ quiz::get_or_create_question() ├─ 今天已有题? ──YES──► 直接返回 ▼ NO llm::generate_question() ◄── 薄弱知识点、规则、画像 ▼ db.insert_question() ──► SQLite ▼ 显示题目 ◄── 用户执行 dq answer ▼ 编辑器作答 → llm::judge_answer() → 评分反馈标签 ▼ db.insert_answer() ──► 更新 topic_mastery ▼ summary::spawn_background_summary()后台线程 ▼ llm::summarize_history() → 薄弱点/关联/建议 ──► summary_cache模块职责模块职责行数main.rsCLI 入口clap 命令路由~419config.rs配置读写 7 个服务商预设~251db.rsSQLite 5 张表增删改查~385llm.rsLLM 调用出题/评判/总结 JSON 提取~264quiz.rs出题/评判/统计业务逻辑~247summary.rs后台线程触发 LLM 总结~49profile.rs交互式画像引导~139models.rs数据结构定义~109lang.rs中文文案texts! 宏~187display.rs终端颜色输出~38四个关键设计取舍1. 选 CLI 而不是网页 / GUI刷题工具的主流形态是网页端或 Appdaily-q 刻意反着来终端即界面dq一个命令走完出题、作答、评分、复盘全流程启动快、可进 shell 历史、可脚本化。最重要的是不显眼——终端窗口和日常开发毫无差别在职准备面试时不引人注意这是 CLI 形态对一个「在职跳槽」用户最实在的价值。得到启动快、可脚本化、界面隐蔽、数据全本地、零运维放弃可视化图表、鼠标点选。交互短板用prompt_select()交互式问答画像、服务商配置弥补2. 无本地题库全由 LLM 动态出题放弃维护题库出题完全交给 LLM把「画像 薄弱知识点 自定义规则 难度」拼进 prompt每次生成一道针对性的题。得到个性化、零题库维护成本放弃题库的稳定性与可离线依赖 LLM 可用性可接受的代价3. 后台线程做 LLM 总结但必须 join答完题后让 LLM 分析全部历史是异步任务几百毫秒到十几秒。用std::thread::spawn 独立tokio current_threadruntime 不阻塞终端但 CLI 进程在 main 返回后立即退出detach 线程会被杀死导致总结丢失所以答题流程末尾必须join()等落库。得到作答反馈即时返回总结不丢放弃完全异步的「零等待」进程生命周期决定必须同步收尾4. 配置「一键 测试通过才保存」配置三要素api_key / base_url / model缺一不可还容易填错。dq config ai一键完成选服务商 → 输 Key → 自动带出 base_url 与默认模型 → 调 LLM 连通性测试 →通过才保存配错不落盘马上重来。内置 7 家 OpenAI 兼容服务商$ dq config base-url list 常用 API 服务商1. deepseek https://api.deepseek.com/v1默认模型deepseek-v4-flash2. siliconflow https://api.siliconflow.cn/v1默认模型Qwen/Qwen2.5-72B-Instruct3. openai https://api.openai.com/v1默认模型gpt-4o-mini4. moonshot https://api.moonshot.cn/v1默认模型moonshot-v1-8k5. zhipu https://open.bigmodel.cn/api/paas/v4默认模型glm-4-flash6. qwen https://dashscope.aliyuncs.com/compatible-mode/v1默认模型qwen-turbo7. ollama http://localhost:11434/v1默认模型qwen2.5存储与 LLM 交互存储SQLite 单文件 5 张表数据在~/.daily-q/表作用questions每日一题date 唯一约束一天一条answers作答记录 score topic_tagsJSON 字符串topic_mastery知识点掌握度total / correct / last_practicedsummary_cache最新学习总结薄弱点 / 关联 / 建议rules用户自定义出题规则LLM 交互统一为 JSONllm.rs的chat_jsonT直接反序列化为结构体// 出题{topic:TCP 三次握手,difficulty:medium,question:...,reference_answer:...}// 评判{score:75,feedback:整体正确细节不足,topic_tags:[TCP,三次握手]}// 总结{weak_topics:[TCP],related_weaknesses:[...],suggestions:[多练习传输层]}三、期间面临的挑战1. 后台总结线程被进程退出杀死背景std::thread::spawn启动总结线程后 main 返回怎么错的进程退出直接杀掉 detach 线程summary_cache永远写不进去本地快速跑好像没问题真实使用总是丢总结结论CLI 进程退出会杀死所有后台线程。spawn_background_summary()返回 JoinHandle答题流程末尾join()等落库2. mock 掩盖的真实 bugLLM 不按格式返回背景本地用 mock server固定返回 JSON测试 38 条全绿怎么错的换真实 LLM 后三个 system prompt 没写「只返回 JSON」约束LLM 自由发挥返回了题目数组 / 夹杂文本反序列化直接失败结论mock 的固定返回是测试盲区。测试全绿 ≠ 上线没问题必须在真实环境跑一遍端到端同时把 JSON schema 写进 system prompt 显式约束3. LLM 输出天生不靠谱JSON 要逐级兜底背景LLM 可能把 JSON 包在 json 代码块里、前后带废话、括号嵌套怎么错的直接from_str解析经常失败结论写多级兜底的extract_json——先找 json 代码块 → 找普通代码块 → 从第一个{/[按括号匹配截取 → 原样 trimmax_tokens提到 4096避免长输出截断把 JSON 切碎4. 配置步骤太多用户根本走不完背景早期配置拆三步手动填 base_url还容易填错多打/v1后缀、记错服务商地址怎么错的从安装到能用要对着文档抄 URL摩擦巨大结论dq config ai一键配置 内置服务商预设 测试通过才保存配错不落盘、马上重来5. 本地零警告CI 却红背景本地 Rust 1.88 下clippy -D warnings零警告怎么错的GitHub stable 是 1.97新版 clippy 新增collapsible-if/useless-borrows-in-formatting两个 lintCI 直接 5 处报错结论本地工具链旧不代表 CI 过。CI 用stable时把「版本漂移」当常态失败后按 lint 建议升级代码即可四、经验收获每个技术决策都写下「放弃了什么」决策记录里每条都列了备选方案与否决理由日后不反复纠结也方便别人 review。mock 全绿只是起点真实环境端到端必跑mock 的确定性会掩盖 LLM 的不确定性固定响应是测试的死角。CLI 的进程生命周期是隐性约束后台线程、异步任务在进程退出时会失效设计时就要想好「进程没了怎么办」。对 LLM 输出做最坏假设显式 JSON schema 多级解析兜底 足够大的 max_tokens缺一不可。工具要「从安装到第一次用」零摩擦一键配置、默认值、测试通过才保存决定一个工具能不能被真的用起来。把发布交给流水线打v*标签 → macOS x64/arm、Windows 32/64 四平台制品 checksums 自动构建上传发版成本趋近于零。五、代码与安装仓库https://github.com/Angryshark128/daily-q MIT依赖Rust ≥ 1.88# 方式一GitHub Releases 下载对应平台压缩包macOS x64/arm、Windows 32/64# https://github.com/Angryshark128/daily-q/releases# 方式二源码编译gitclone https://github.com/Angryshark128/daily-qcddaily-qcargobuild--release# 产物target/release/dq建议加入 PATH# 使用dq config ai# 一键配置 AI选服务商 → 输 Key → 测试通过后保存dq profile setup# 设置面试画像dq# 出今天的题dq answer# 作答 AI 评分dq stats# 掌握度与学习建议当前状态v0.1.0 已发布出题 / 评判 / 后台总结已通过真实 LLMDeepSeek端到端验证发布流水线覆盖 macOS x64/arm 与 Windows 32/64 四平台。后续方向是完善掌握度算法与更多自定义规则。