用 Ollama + Python 搭建完全离线的 AI 面试模拟工具。支持多轮问答、实时评分、简历分析。隐私安全,零成本,告别花钱买面试培训。
投简历投到手软,面试邀约却一个都没有。好不容易约了面试,准备的东西现场全忘光,答得磕磕巴巴。
我去年找工作的时候,报了一个面试培训,花了两千多。回来一想,那些问题 AI 都能模拟,自己在家练不香吗?
后来我用 Ollama 搭了一个本地面试模拟助手。把简历喂给它,设定岗位,它就开始扮演面试官。练完还有评分和反馈,比花两千块划算多了。
现在每次面试前,我都能对着它练三遍。
项目背景
面试准备最大的问题是:没人跟你实战练习。
看书看面经,都是单向输入。你看完还是不会答,到了真面试还是紧张。
AI 面试模拟的好处是:
- 可以反复练习,不限次数
- 问题会根据你的回答追问,跟真实面试一样
- 每次回答后给出评分和改进建议
- 完全本地运行,简历和回答内容不外传
这个项目用 Ollama + Python 搭建,零成本,隐私安全。
技术选型
| 组件 | 选型 | 理由 |
|---|---|---|
| 语言 | Python 3.10+ | 简单直接 |
| LLM | Ollama + Qwen2.5-7B | 中文表达自然,面试对话能力强 |
| 交互方式 | 终端对话 | 轻量,无需浏览器 |
| 简历解析 | 手动粘贴 | 避免引入额外依赖 |
不需要 Flask、Streamlit,终端跑起来最快。
实现步骤
第一步:安装 Ollama 和模型
# 安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh
# 拉取模型,qwen2.5:7b 对话能力强,面试模拟效果好
ollama pull qwen2.5:7b
内存够的话用 7B,内存紧用 3B。
第二步:项目结构
interview-simulator/
├── interview.py # 主脚本
├── resume.txt # 你的简历内容
└── config.json # 岗位配置
第三步:简历文件
新建 resume.txt,粘贴你的简历内容:
姓名:张三
学历:XX大学 计算机科学 本科
经验:
- 2023.06-至今:ABC科技公司 后端工程师
- 负责订单系统重构,日均处理10万笔订单
- 使用 Go 重构微服务,接口响应时间降低60%
- 2021.07-2023.05:DEF公司 初级开发
- 参与电商平台开发,负责支付模块
技术栈:Go、Python、MySQL、Redis、Docker
第四步:岗位配置文件
新建 config.json:
{
"position": "高级后端工程师",
"company": "某大厂",
"focus_areas": ["分布式系统", "高并发", "Go语言", "系统设计"],
"difficulty": "hard"
}
第五步:面试模拟脚本
新建 interview.py:
#!/usr/bin/env python3
"""本地 AI 面试模拟助手"""
import json
import sys
import time
from pathlib import Path
import ollama
# ============ 配置 ============
BASE_DIR = Path(__file__).parent
RESUME_PATH = BASE_DIR / "resume.txt"
CONFIG_PATH = BASE_DIR / "config.json"
def load_config():
"""加载岗位配置"""
if not CONFIG_PATH.exists():
print("⚠️ 未找到 config.json,使用默认配置")
return {
"position": "后端工程师",
"company": "某科技公司",
"focus_areas": ["Python", "数据库", "API设计"],
"difficulty": "medium"
}
with open(CONFIG_PATH) as f:
return json.load(f)
def load_resume():
"""加载简历"""
if not RESUME_PATH.exists():
print("❌ 未找到 resume.txt,请先创建简历文件")
sys.exit(1)
return RESUME_PATH.read_text(encoding="utf-8")
def get_difficulty_prompt(difficulty):
"""根据难度返回提示"""
prompts = {
"easy": "问题简单,以基础概念和自我介绍为主,帮助用户建立信心。",
"medium": "问题适中,涵盖技术基础、项目经验和常见场景。",
"hard": "问题深入,涉及系统设计、性能优化、故障排查等高阶话题。"
}
return prompts.get(difficulty, prompts["medium"])
def ask_question(model: str, resume: str, config: dict, history: list) -> str:
"""让 AI 出面试题"""
focus = "、".join(config["focus_areas"])
diff_prompt = get_difficulty_prompt(config["difficulty"])
system_prompt = f"""你是一位{config['position']}岗位的资深面试官,在{config['company']}负责技术面试。
岗位要求:{focus}
难度要求:{diff_prompt}
面试规则:
1. 每次只问一个问题,等待用户回答后再问下一个
2. 根据用户回答可以追问,模拟真实面试流程
3. 问题要结合实际项目经验,不要只问概念
4. 保持专业但友好的语气
5. 当用户说"结束面试"或回答满8个问题后,给出整体评估和评分
6. 评分维度:技术深度(30分)、表达清晰度(20分)、项目理解(25分)、问题解决(25分)
请用中文提问,简洁明了。"""
context = f"""【候选人简历】\n{resume}
【面试开始】
请作为面试官,开始第一个问题。只问问题,不要输出其他内容。"""
messages = [{"role": "system", "content": system_prompt}] + history + [{"role": "user", "content": context}]
response = ollama.chat(model=model, messages=messages, stream=False)
return response["message"]["content"]
def evaluate_interview(model: str, resume: str, config: dict, history: list) -> str:
"""面试结束后给出评估"""
diff_prompt = get_difficulty_prompt(config["difficulty"])
system_prompt = f"""你是一位经验丰富的技术面试官,请对刚才的面试进行总结评估。
【候选人简历】\n{resume}
【面试主题】{config['position']}岗位,重点考察:{', '.join(config['focus_areas'])}
【难度】{config['difficulty']}
请输出:
1. 整体表现评价(2-3句话)
2. 各维度评分(满分100):技术深度、表达清晰度、项目理解、问题解决
3. 做得好的地方(2-3点)
4. 需要改进的地方(2-3点)
5. 3个建议重点复习的知识点
格式简洁,不要废话。"""
messages = [{"role": "system", "content": system_prompt}] + history
response = ollama.chat(model=model, messages=messages, stream=False)
return response["message"]["content"]
def run_interview():
"""运行面试模拟"""
config = load_config()
resume = load_resume()
model = "qwen2.5:7b"
print("=" * 50)
print(f"🎯 面试模拟:{config['position']} @ {config['company']}")
print(f"📋 重点方向:{', '.join(config['focus_areas'])}")
print(f"💪 难度:{config['difficulty']}")
print("=" * 50)
print("\n提示:回答 '结束面试' 可以提前结束并获取评估\n")
history = []
question_count = 0
max_questions = 8
while question_count < max_questions:
try:
question = ask_question(model, resume, config, history)
print(f"\n👨💼 面试官:{question}")
history.append({"role": "assistant", "content": question})
# 用户输入
answer = input("\n👤 你:").strip()
if not answer:
print("(未回答,跳过)")
continue
if "结束面试" in answer or "退出" in answer or "ok" in answer.lower():
print("\n📝 正在生成面试评估...")
break
history.append({"role": "user", "content": answer})
question_count += 1
except KeyboardInterrupt:
print("\n\n👋 面试已中断")
break
except Exception as e:
print(f"\n❌ 出错了:{e}")
break
# 面试评估
print("\n" + "=" * 50)
print("📝 面试评估报告")
print("=" * 50)
try:
evaluation = evaluate_interview(model, resume, config, history)
print(f"\n{evaluation}")
except Exception as e:
print(f"⚠️ 无法生成评估:{e}")
print(f"\n✅ 共回答 {question_count} 个问题")
print("💡 提示:把评估结果复制保存,复习改进建议")
if __name__ == "__main__":
run_interview()
第六步:requirements.txt
ollama
pip install ollama
第七步:运行
python3 interview.py
终端会进入交互模式,AI 扮演面试官提问,你回答,问完 8 题或说"结束面试"后,AI 给出评估报告。
运行效果
==================================================
🎯 面试模拟:高级后端工程师 @ 某大厂
📋 重点方向:分布式系统、高并发、Go语言、系统设计
💪 难度:hard
==================================================
提示:回答 '结束面试' 可以提前结束并获取评估
👨💼 面试官:请用2分钟做个自我介绍,重点讲讲你最近的项目。
👤 你:(输入自我介绍...)
👨💼 面试官:你说订单系统日均处理10万笔,如果现在要扩展到100万笔,你会怎么设计?
👤 你:(输入回答...)
...(继续问答)...
==================================================
📝 面试评估报告
==================================================
【整体表现】
技术基础扎实,对项目经验描述清晰,但在系统设计方面有些浅尝辄止。
【各维度评分】
- 技术深度:72/100
- 表达清晰度:85/100
- 项目理解:78/100
- 问题解决:70/100
- 综合评分:81/100
【做得好的地方】
1. 对 Go 并发模型的理解到位,能清晰解释 goroutine 和 channel
2. 表达流畅,回答问题逻辑清晰
3. 对项目难点有真实体会,不是背答案
【需要改进的地方】
1. 分布式系统设计经验不足,缓存一致性策略回答较泛
2. 高并发场景下的数据库优化思考不够深入
3. 故障排查思路可以更有条理
【建议重点复习】
1. 分布式缓存方案:Redis 集群、缓存穿透/击穿/雪崩
2. 消息队列选型:Kafka vs RabbitMQ 的适用场景
3. 数据库分库分表策略和迁移方案
优化方向
- 多岗位模板:预制前端、数据、算法等岗位配置,换 config.json 就能切场景
- 简历上传:支持解析 PDF/Word 简历,自动提取内容填充
- 语音输入:接
speech_recognition,模拟真实面试的口头回答 - 面试记录导出:把问答记录存成 Markdown 文件,方便回顾
- 计时模式:给每个问题限时,模拟真实面试的紧迫感
- STAR 法则反馈:评估时按 STAR 格式检查回答结构是否完整
最实用的还是多岗位模板这个——换行命令就能切场景,今天练大厂后端,明天练外企技术面。
把简历喂进去,半小时就能模拟一轮。找工作季每天练一轮,比看十篇面经管用。
这篇文章对你有帮助吗?