Hacker-job 技术架构解析从数据抓取到 AI 解析的全流程实现【免费下载链接】hacker-jobPlay with hackernews who is hiring项目地址: https://gitcode.com/gh_mirrors/ha/hacker-jobHacker-job 是一个开源的数据工程与AI解析项目专门处理Hacker News的Who is Hiring?招聘帖子。这个项目通过智能化的数据管道将非结构化的招聘信息转化为结构化的可搜索数据为开发者提供精准的招聘趋势分析和职位搜索功能。本文将深入解析Hacker-job的技术架构从数据抓取到AI解析的全流程实现。 项目概述与核心价值Hacker-job 解决了技术招聘领域的一个痛点Hacker News每月发布的Who is Hiring?帖子包含数百条自由文本的招聘信息这些信息难以搜索、比较和分析。通过AI驱动的结构化解析项目将这些杂乱的信息转化为标准化的数据格式让开发者能够 按技术栈、地点、薪资等条件筛选职位 分析招聘市场趋势和技术需求变化 发现远程工作机会和全球招聘趋势 了解不同地区和职位的薪资水平项目的独特之处在于它完全基于文件系统存储无需数据库通过Git提交实现数据持久化这使得部署和维护变得极其简单。️ 整体架构设计Hacker-job 采用无数据库架构将数据管道与前端应用完全解耦。这种设计带来了几个关键优势数据层架构data/ # 数据集已提交—— 单一数据源 jobs/month.json # 每月一个JSONL文件原始HN文本 AI提取的字段 jobs/index.json # 可用月份的清单衍生数据 trends.json # 薪资 关键词时间序列衍生数据 pending.jsonl # 等待AI分析的帖子队列 hackers.json # GitHub赞助者信息应用层架构scripts/ # Node/TS 数据管道抓取 → 分析 → 存储 frontend/ # Vite React TS 应用前端应用在运行时从data/*目录获取数据这意味着数据更新无需重新构建应用实现了数据与应用的完全分离。 数据管道四步处理流程第一步数据抓取低成本操作数据抓取流程位于 scripts/fetchJobs.ts负责从Hacker News API获取最新的招聘帖子识别当前线程通过Hacker News API找到最新的Who is Hiring?帖子获取所有评论提取帖子下的所有评论作为原始招聘信息去重处理跳过已存储或已在队列中的帖子入队等待将新帖子添加到data/pending.jsonl队列// 关键代码片段 const story await latestHiringStory(); const month story.created_at.slice(0, 7); const posts await fetchThreadPosts(story.objectID); const fresh posts.filter(p !stored.has(p.id) !queued.has(p.id));第二步AI解析智能提取AI解析是项目的核心技术位于 scripts/extract.ts。它使用LLM将自由文本转换为结构化数据提示工程项目设计了专门的提示词模板指导AI提取标准字段const PROMPT Extract structured job info from this HN job post. Return JSON only: { company: string, roles: string[], location: string | null, remote_type: remote | onsite | hybrid | null, remote_regions: string[] | null, salary_min: number | null, salary_max: number | null, salary_currency: USD | EUR | GBP | null, tech_stack: string[], job_type: full-time | part-time | contract | intern | null, visa: boolean | null };LLM配置灵活性支持本地LM Studio服务器和云端APIconst client new OpenAI({ baseURL: process.env.LLM_BASE_URL || http://127.0.0.1:1234/v1, apiKey: process.env.LLM_API_KEY || lm-studio, });第三步数据存储无数据库设计数据存储逻辑在 scripts/store.ts 中实现采用文件系统作为数据存储每月文件存储每个月的职位数据存储在单独的JSONL文件中原子操作写入操作是原子的确保数据一致性增量更新只更新当前月份的文件保持Git差异最小化第四步衍生数据生成衍生数据生成在 scripts/derive.ts 中处理索引生成创建data/jobs/index.json清单文件趋势分析计算薪资趋势和关键词频率生成data/trends.json实时更新数据更新后自动重新计算衍生数据 AI解析的智能实现智能字段提取策略Hacker-job 的AI解析器能够从各种格式的自由文本中提取结构化信息公司名称识别从帖子开头或签名中提取公司名称职位角色解析识别多个职位角色如Senior Frontend Engineer薪资范围提取处理各种薪资格式$100k-150k、€80k-100k等技术栈分析从描述中提取技术关键词工作类型分类识别全职、兼职、合同、实习等类型容错与重试机制AI解析设计了完善的容错机制失败重试解析失败的帖子保留在队列中下次运行时重试部分解析即使某些字段解析失败其他字段仍可保存并发控制通过p-limit库控制并发请求避免API限制 前端应用架构技术栈选择前端应用采用现代Web技术栈构建工具Vite - 快速的开发服务器和构建工具框架React TypeScript - 类型安全的组件开发路由React Router - 单页面应用路由管理图表xkcd风格图表 - 增加数据可视化的趣味性数据加载策略前端数据加载采用懒加载策略清单文件优先首先加载data/jobs/index.json获取可用月份按需加载用户选择月份时加载对应的JSONL文件缓存机制浏览器缓存已加载的数据提升用户体验用户界面设计前端提供三个主要页面职位搜索页面按技术栈、地点、薪资等条件筛选职位趋势分析页面展示薪资趋势和技术需求变化赞助者页面展示项目赞助者和贡献者 自动化工作流GitHub Actions 自动化项目通过GitHub Actions实现完全自动化工作流功能描述触发条件update.yml每日抓取分析提交数据更新每日13:00 UTCderive.yml重新生成趋势数据和清单推送到main分支时refresh-github-data.yml更新赞助者信息手动触发deploy.yml构建前端并部署到GitHub Pages推送到main分支时环境配置灵活性项目支持多种LLM后端配置# 使用本地LM Studio服务器 LLM_BASE_URLhttp://127.0.0.1:1234/v1 LLM_API_KEYlm-studio # 使用OpenAI API LLM_BASE_URLhttps://api.openai.com/v1 LLM_API_KEYyour-openai-key LLM_MODELgpt-4o-mini 数据结构设计职位数据模型项目的核心数据模型定义在 scripts/types.tsexport interface Job { id: number; // Hacker News评论ID author: string | null; // 发布者 ts: number; // 创建时间戳 company: string; // 公司名称 roles: string[]; // 职位角色数组 location: string | null; // 工作地点 remote_type: string | null; // 远程类型 remote_regions: string[]; // 远程工作地区 salary_min: number | null; // 最低薪资 salary_max: number | null; // 最高薪资 salary_currency: string | null;// 货币类型 tech_stack: string[]; // 技术栈 job_type: string | null; // 工作类型 visa: number | null; // 签证支持 text: string; // 原始文本 }趋势数据分析趋势数据包含三个维度的分析职位数量趋势每月发布的职位数量变化薪资趋势平均薪资和薪资范围的变化关键词趋势技术栈关键词的出现频率变化️ 开发与部署本地开发环境项目提供简单的本地开发设置# 克隆仓库 git clone https://gitcode.com/gh_mirrors/ha/hacker-job.git # 启动前端开发服务器 cd frontend npm install npm run dev # 安装数据管道依赖 cd .. npm install开发服务器将仓库根目录的data/目录映射到/data/*路径实现实时数据访问。生产部署策略生产部署采用GitHub Pages GitHub Actions的自动化流程数据更新每日自动运行数据管道前端构建数据更新后自动构建前端应用静态部署将构建结果部署到GitHub Pages自定义域名通过frontend/public/CNAME支持自定义域名 技术亮点与创新1. 无数据库架构的优势Hacker-job 的无数据库设计带来了显著优势简化部署无需数据库服务器降低运维复杂度版本控制通过Git实现数据版本管理数据可移植性数据文件可轻松备份和迁移成本效益无需数据库托管费用2. AI与人类协作的数据管道项目实现了AI与人类协作的智能数据处理AI负责提取处理重复性、模式化的信息提取任务人类负责验证通过原始文本保留实现人工验证渐进式改进AI模型可逐步改进提升提取准确率3. 实时与批量处理的平衡数据管道在实时性和批量处理之间找到平衡增量更新每日只处理新增帖子降低计算成本批量分析使用并发处理提高AI解析效率离线计算趋势分析在后台批量计算不影响用户体验 实际应用场景技术招聘市场分析Hacker-job 的数据为技术招聘市场提供了宝贵洞察技术趋势预测通过技术栈频率变化预测技术发展趋势薪资基准分析为求职者和招聘方提供薪资参考远程工作趋势分析远程工作的发展趋势和地区分布个人职业规划开发者可以利用Hacker-job数据进行职业规划技能匹配分析了解市场需求与个人技能的匹配度地区机会发现发现不同地区的技术职位机会薪资谈判参考获取市场薪资数据作为谈判参考 性能优化策略数据存储优化JSONL格式使用JSON Lines格式每行一个完整记录按月份分割避免单个文件过大提高读取效率Gzip压缩GitHub Pages自动启用压缩减少传输大小前端性能优化代码分割按路由进行代码分割减少初始加载时间懒加载数据只在需要时加载特定月份的数据客户端缓存利用浏览器缓存减少重复请求 挑战与解决方案挑战1AI解析的准确性问题自由文本格式多样AI解析可能出错解决方案设计详细的提示词模板实现字段验证逻辑保留原始文本供人工验证失败重试机制挑战2数据一致性问题多步骤数据处理可能导致数据不一致解决方案原子文件操作事务性写入数据完整性检查自动回滚机制挑战3可扩展性问题数据量增长可能导致性能问题解决方案按月份分割数据文件增量更新策略衍生数据预计算客户端分页加载 总结与展望Hacker-job 项目展示了现代数据工程的最佳实践将AI能力与传统数据处理技术相结合构建高效、可靠的数据管道。项目的技术架构具有以下显著特点简洁性无数据库设计降低了系统复杂度可维护性清晰的模块分离和类型安全可扩展性支持多种LLM后端和部署环境实用性解决真实世界的技术招聘数据问题随着AI技术的不断发展Hacker-job 的架构为类似的数据处理项目提供了可复用的模板。无论是技术招聘数据分析还是其他领域的非结构化数据处理这种AI驱动的数据管道模式都具有广泛的应用前景。项目的开源特性也鼓励社区参与和改进共同构建更加智能、准确的技术招聘数据分析平台。通过持续的数据积累和算法优化Hacker-job 有望成为技术招聘领域的重要参考工具。Hacker-job数据流程架构图展示了从Hacker News抓取到前端展示的完整数据处理流程【免费下载链接】hacker-jobPlay with hackernews who is hiring项目地址: https://gitcode.com/gh_mirrors/ha/hacker-job创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考