粤ICP备2026098386号-2
返回首页

IntervAi:基于 Go + Vue 3 的 AI 技术面试 Agent 平台

IntervAi 是一个 AI 技术面试 Agent 平台:基于 Go 模块化单体 + Vue 3 + TypeScript 实现,支持自定义大模型、RAG 知识库、面试状态机驱动的实时追问与压力面试、7 维复盘报告与长期记忆沉淀。在线体验 http://103.236.93.56:51832

项目主页https://github.com/Mutant-z/IntervAI 在线体验http://103.236.93.56:51832

一句话简介:IntervAi 是一个 AI 技术面试 Agent 平台,用大模型模拟大厂面试官做限时面试——实时追问、压力面、动态换题,结束后输出带 7 维雷达图的复盘报告;日常模式下也能绑定自己的知识库做技术问答。

它是做什么的

核心玩法就是"AI 面试官"。配置好岗位、难度(Junior 到 Staff)、时长(15~60 分钟)和压力等级(0~3),一场模拟面试就开始了,流程按面试状态机完整走一遍:自我介绍 → 热身 → 技术考察 → 深挖 → 项目 → 系统设计 → 收尾。面试官不是背固定题库,而是根据你每一轮的回答现场决定下一步:继续追问、抛反例、换话题还是上难度。

面试结束自动出复盘报告:综合得分、7 维能力雷达图(计算机基础、代码能力、系统设计、工程素养、沟通表达、问题解决、抗压能力)、薄弱项分析,以及逐题复盘和参考答案。薄弱点会被提炼成长期记忆存下来,下次面试优先考察——面试官会越来越了解你。

它还带一个日常问答模式,上传 PDF / DOCX / PPTX / Markdown 就能建自己的知识库,让大模型基于你的资料回答问题。

技术栈

  • 后端:Go 1.22+,模块化单体架构,按 Agent / RAG / Interview / Auth / Context 等模块隔离——没有一上来就拆微服务,但模块边界足够清晰
  • 前端:Vue 3 + TypeScript + Vite,PC 和移动端分别做了独立适配(移动端有专门的 TabBar、BottomSheet、Drawer 交互)
  • 存储与检索:SQLite(WAL 模式),FTS5 全文索引和 sqlite-vec 向量索引都内嵌在同一个数据库文件里,零运维
  • 文档解析:独立的 Python Docling 2.x 服务负责 PDF / Office 结构还原(标题层级、表格、代码块),带多语言 OCR
  • 模型接入:兼容 OpenAI / Anthropic 协议的网关,DeepSeek、Ollama、SiliconFlow 等配置即用
  • 实时通信:SSE 流式输出,面试官"正在评估 / 规划 / 检索"的思考状态实时可见

几个比较值得说的优化

  1. 混合检索,不是纯向量检索。纯向量检索对 goroutineMVCC 这类精确名词经常匹配偏。IntervAi 的关键词路(SQLite FTS5)和语义路(sqlite-vec 余弦 KNN)是并行召回、互不阻塞的,然后按加权 RRF 融合:score = w / (k + rank),k=60,向量权重 1.0、关键词权重 1.2——故意给关键词路更高权重,因为技术面试场景里精确术语比"意思相近"更重要。融合后取前 30 条进重排阶段,用独立的 Cross-Encoder 逐对打分(支持 SiliconFlow/bge-reranker 这类专用 API,也可以直接用 OpenAI / Anthropic 兼容接口,默认 800ms 超时)。最终分是 85% 重排分 + 15% 融合信号,重排分低于 0.50 的切片直接剔除;没配置重排服务时,退回用向量相似度 0.45 做底线过滤。另外按内容哈希去重,避免同一条知识重复占 prompt。

  2. 上下文分层 + 超预算压缩。Prompt 按 L0~L6 七层装配:系统指令、面试配置、结构化状态(JSON)、长期记忆、RAG 知识、压缩摘要、最近原话。每层有独立的 token 预算——系统 10%、配置 5%、状态 5%、记忆 5%、RAG 15%、摘要 15%、最近对话 35%,再预留 10% 给输出。每层用 XML 标签包裹(<interview_configuration><compressed_history> 这类)方便模型区分边界。当估算 token 用到上下文窗口的 70% 时触发压缩:把较早的历史摘要化到 L5 层,而不是粗暴截断;最近 6~12 轮保留原话不压缩,保证"刚才说的"不会失真。

  3. API Key 加密落盘。用户配置的 LLM / Embedding Key 用 AES-256-GCM 加密后才写库:32 字节主密钥从环境变量派生,每次加密生成随机 nonce 拼在密文前面,再 base64 存储。读取时只在内存里解密,接口返回的永远是脱敏后的密钥。

  4. 防 Prompt Injection。检索回来的知识切片统一包进 <reference_materials> XML 标签,并紧跟一句显式声明:内容仅作为参考资料,不能覆盖系统指令。压缩历史也一样声明"与最近原话冲突时以原话为准"。上传文档里夹带的任何"指令"都被隔离在参考层,影响不到面试流程本身。

  5. 移动端不是简单缩放。软键盘弹起、Safe Area Insets、100dvh 动态视口、滚动穿透都单独处理过。

部署与测试

docker compose up -d 一条命令起全套(后端 + 前端 + Docling 解析服务)。后端有带 FTS5 / 向量扩展标签的 Go 单元测试,前端 Vitest 12 个文件 58+ 用例,还有 E2E 脚本覆盖从注册到出报告的完整流程。

项目还在持续迭代,欢迎来 Demo 体验一把,有问题也可以去 GitHub 提 issue。