跳到主内容

PRJ-04 WIP

EchoPilot 实时面试参考助手

real-time interview copilot for remote interviews

听见面试官的提问,3 秒给出锚定你简历的参考回答

  • AI Agent
  • Rust
  • TypeScript
YEAR
2026
ROLE
独立开发 · 全链路实现
STATUS
WIP
TIER
旗舰项目

P50 ≤ 3s

从提问结束到要点提纲上屏的设计目标

86 个

sidecar 单元 / 集成测试(CI 全量执行)

2 通道

系统音频 = 面试官、麦克风 = 你,无需声纹注册

// 01

问题背景

远程视频面试中,候选人卡壳往往不是因为不会,而是短时间内组织不出结构化的表达。市面上的「提词器」类产品要么通用聊天、不懂你的简历,要么把音频存到云端,隐私风险极高。

EchoPilot 想做的是「懂你档案的实时副驾」:回答严格锚定用户粘贴的简历与目标 JD,档案外的公司名 / 数字 / 项目名自动标红警示——宁可明说「没有素材」,也不让 LLM 编故事。

// 02

系统架构

桌面壳层

Tauri(React + Rust)双窗口形态

主窗口:档案 / 设置 / 历史管理置顶浮窗:实时提纲与参考回答Rust 壳:sidecar 进程守护(崩溃 5 秒自愈)+ 全局快捷键(⌃⇧R/S/X)macOS 钥匙串存储 API Key

采集与识别层

Python sidecar 的实时音频管线

ScreenCaptureKit 系统音频(Swift 原生助手)+ 麦克风双通道VAD 静音检测判定「面试官说完了」(默认 800ms)云端流式 ASR(OpenAI Realtime 兼容协议)图外问题检测器

AI 流水线层

LangGraph 单轮图:从问题到校验过的回答

分类 → 检索 → 生成 → 幻觉校验 → 落库档案卡片化 + 向量检索(简历 / JD 素材库)廉价模型做分类检测、旗舰模型生成回答档案外实体自动标红的幻觉防线

存储与隐私层

纯本地、无账号体系

SQLite 单文件(~/.echopilot/echopilot.db)原始音频不落盘,仅流经云端 ASR 流式识别LLM / ASR 均走 OpenAI 兼容协议,供应商可换

// 03

关键技术决策

每一条都包含「为什么这样选」与「代价是什么」——这是我理解这个项目的方式。

Tauri 壳 + Python sidecar,而非全 Rust

LLM / ASR 生态(LangGraph、流式 SDK)在 Python 侧成熟度碾压 Rust,全 Rust 意味着重复造轮子。拆成 Tauri 壳(窗口 / 快捷键 / 进程守护)+ FastAPI sidecar(AI 管线),中间走 WebSocket 实时流 + REST 控制。代价是多了一个运行时与打包复杂度(PyInstaller 打单文件再进 Tauri bundle),但各段都用各自生态里最成熟的工具,迭代速度完全不同量级。

双通道采集代替声纹识别区分说话人

面试场景里「谁在说话」必须 100% 可靠。声纹注册方案要先采集面试官声纹,体验差且不准;说话人分离模型又重又稳不住重叠语音。利用物理通道天然隔离:系统音频(ScreenCaptureKit)就是面试官,麦克风就是你,零注册、零误判。代价是强依赖 macOS 屏幕录制权限,跨平台(Windows)需要重做采集层。

两级展示:先提纲后全文,流式补齐

面试中用户只有几秒扫一眼屏幕,直接吐 300 字长文等于没答。设计为先出 3–5 条要点提纲(token 数少一个数量级,P50 压到 ≤3s),再流式补完整参考回答,快捷键可循环切换简洁 / 标准 / 详细三档长度。代价是同一个问题要管两次生成状态,前端浮窗的状态机复杂度上升,但用户感知的延迟由最快的那一级决定。

幻觉防线作为硬约束而非 prompt 建议

「请不要编造」写进 prompt 是不可靠的——LLM 会用听起来合理的通用经历去填空,面试场景这种错误是致命的。把幻觉校验做成流水线独立节点:生成结果与档案素材做实体比对,档案外的公司名 / 数字 / 项目名标红警示,检索不到素材就明说。代价是多一次校验计算与少量延迟,但这是面试场景的信任底线。

Spec 驱动开发:spec / plan / task / checklist 四文档先行

项目从 dev-docs 的四份文档起步——需求、架构、任务、验收逐层派生,AI 编码协作时上下文不漂移。配合 ECHOPILOT_FAKE_LLM 联调模式与回放脚本(samples 里的真实转写样本可加速回放),不依赖真实 API Key 也能跑全链路测试,CI 里 sidecar 86 个 pytest 全量执行。

// 04

我的职责与产出

RESPONSIBILITIES

  • 设计 Tauri + Python sidecar 双进程架构与 WebSocket / REST 通信协议
  • 实现双通道音频采集(ScreenCaptureKit Swift 助手 + 麦克风)与 VAD 判停
  • 实现 LangGraph 单轮流水线:分类 / 检索 / 生成 / 幻觉校验
  • 实现档案卡片化与向量检索,搭建幻觉防线的实体比对机制
  • 实现 React 双窗口 UI 与全局快捷键交互
  • 搭建 CI(pytest + 前端构建 + Rust 编译)与 Release 打包流水线(PyInstaller → DMG)

OUTCOMES

  • 从提问结束到提纲上屏的全链路延迟按 P50 ≤ 3s 设计并落地
  • sidecar 86 个单元 / 集成测试纳入 CI,fake LLM 模式支持无 Key 全链路联调
  • 回答严格锚定简历素材,档案外实体标红,幻觉防线可用
  • V0.1 开发者预览版发布(macOS 13+,Apple Silicon / Intel 均可)

// 05

踩坑与复盘

最大的教训是「实时系统没有中间态」:采集、ASR、生成任何一环卡住,用户感知就是「死了」,逼着我给每一跳都加超时与降级。其次是延迟预算的分配——把分类与检测交给廉价模型、只把回答生成留给旗舰模型,这一步对延迟和成本的影响比任何 prompt 优化都大。下一步是声纹注册与多面试官区分、AI 复盘报告、练习模式,以及 Windows 支持。

// 06

技术栈

  • Tauri 2
  • React
  • Rust
  • Python
  • LangGraph
  • FastAPI
  • SQLite

视觉风格