🚀

用 Ollama 搭一个本地面试模拟助手,求职季必备,隐私安全零成本

用 Ollama + Python 搭建完全离线的 AI 面试模拟工具。支持多轮问答、实时评分、简历分析。隐私安全,零成本,告别花钱买面试培训。

👁️ - 次阅读

投简历投到手软,面试邀约却一个都没有。好不容易约了面试,准备的东西现场全忘光,答得磕磕巴巴。

我去年找工作的时候,报了一个面试培训,花了两千多。回来一想,那些问题 AI 都能模拟,自己在家练不香吗?

后来我用 Ollama 搭了一个本地面试模拟助手。把简历喂给它,设定岗位,它就开始扮演面试官。练完还有评分和反馈,比花两千块划算多了。

现在每次面试前,我都能对着它练三遍。

项目背景

面试准备最大的问题是:没人跟你实战练习。

看书看面经,都是单向输入。你看完还是不会答,到了真面试还是紧张。

AI 面试模拟的好处是:

  • 可以反复练习,不限次数
  • 问题会根据你的回答追问,跟真实面试一样
  • 每次回答后给出评分和改进建议
  • 完全本地运行,简历和回答内容不外传

这个项目用 Ollama + Python 搭建,零成本,隐私安全。

技术选型

组件选型理由
语言Python 3.10+简单直接
LLMOllama + 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 格式检查回答结构是否完整

最实用的还是多岗位模板这个——换行命令就能切场景,今天练大厂后端,明天练外企技术面。

把简历喂进去,半小时就能模拟一轮。找工作季每天练一轮,比看十篇面经管用。

这篇文章对你有帮助吗?