FastPosition技术介绍

一份简历为您筛选全网最合适的岗位!

先安装ollama:Ollama,选择模型:Ollama

这里以qwen3.5:4b和qwen-embedding3:4b进行学习

既然要学习大模型应用那就直接用大模型应用来完成大模型应用,这里选用codex+trea双Vibe Coding工具进行开发,推荐安装MySQL和web research的MCP;

GitHub: hepingan11/FastPosition

数据爬取

整个最难的就是职位的数据爬取,目前利用的是Playwright + LLM +接口匹配度算法 实现的

Playwright 很好说,因为职位信息网站里的数据大多都是动态的,爬取整个HTML太消耗token且定位不准,而Playwright 能直接定位查询接口获取完整的json数据;

大致流程:

  1. Playwright 打开页面并监听所有 JSON 响应, 代码在 fetch_page_payload()。它会:

    • 打开招聘页
    • 滚动页面
    • 尝试翻页/加载更多
    • 用 page.on(“response”, handle_response) 收集候选接口
  2. 规则初筛
    代码在:

    • is_rejected_api()

    • score_job_api_candidate()

    • URL 含 job/position/campus/recruit 才进候选

    • dictionary/city/workcities/family/filter 这类直接降权或排除

    • searchposition、/position/search 这类优先加分

  3. 结构判定
    代码在:

    • extract_positions_from_json()
    • normalize_job_item()
    • looks_like_real_job_list()

    它不会只看接口名,而是尝试从 JSON 里抽职位字段:

    • name/title/positionName/postName
    • location/city
    • salary
    • jd/description
    • link/id

    如果只能抽出“城市名/分类名”这种枚举项,没有职位特征,就判定不是职位接口。

  4. LLM 复判
    代码在 review_api_candidates_with_llm()。 它会把前几个候选接口的:

    • URL
    • 规则分
    • JSON 样本
      交给 LLM 判断是不是职位接口,再做二次调分。 目前是“规则主导,LLM辅助”,不是完全交给 LLM。

最后如果 API 还是不可靠,才回退:

DOM 片段提取LLM 从页面片段里抽职位代码在 extract_positions() 和 prepare_crawl_result()。

你问“能不能让 LLM 先分析哪个是职位获取接口,再让 Playwright 去抓”,可以,但不建议放在第一步。 原因是 LLM 在不知道页面真实发了哪些请求前,根本没有足够信息判断。更合理的是现在这种顺序:

先用 Playwright 把页面真实请求抓出来,再让 LLM 在这些候选接口里做判断 ,也就是“LLM 选已发生的候选接口”,而不是“LLM 凭空猜接口”。

“职位获取接口匹配算法”主要在 app/services/job_crawler_service.py

职位匹配

用户上传 PDF 简历PDF 解析 + AI 提取简历结构化信息简历 / 职位特征向量化数据库相似度检索AI 深度匹配分析前端展示高匹配职位(带匹配度 + 分析理由)

层级 技术选型 核心优势 & 适用场景
PDF 解析 PyMuPDF(fitz)+ pdfplumber 轻量无依赖,解析速度快,能提取 PDF 文本 / 格式,适配各类简历 PDF(扫描件除外)
AI 信息提取 本地 Ollama(qwen2:7b/llama3:8b) 全程本地运行,无 API 费用,精准提取简历结构化信息,适配不同简历排版
向量检索 Chroma DB(轻量)/ Milvus(进阶) Chroma 免部署、单文件运行,适合小体量数据;Milvus 适合后续职位数据量超 10 万条的场景
大模型嵌入 Ollama 自带 Embedding(bge-small) 复用本地模型,一键生成文本向量,无需额外部署嵌入模型,和匹配分析模型统一
数据库 原有 MySQL(存原始数据)+ 向量库 MySQL 保留职位 / 简历原始信息,向量库做相似度检索,分工明确
后端接口 FastAPI(首选)/ Flask FastAPI 轻量、自动生成接口文档,异步性能好,和 Python 大模型 / 爬虫模块完美兼容
前端展示 Streamlit(极简)/ Vue+ElementUI Streamlit5 行代码做前端,无需前端知识,适合快速落地;Vue 适合后续做可视化升级
AI 匹配分析 本地 Ollama(同提取模型) 基于简历 + 职位信息做深度分析,输出匹配度 + 匹配理由 + 待提升点,比纯向量检索更精准