设置向导之后:调整你收到的内容
先从这里开始:在项目目录运行 docker compose up -d --build,打开 http://127.0.0.1:3000;设置向导(/setup)会问你语言、市场、画像、目标、来源、AI 和 Telegram,并替你写好文件(见 setup.zh.md)。这份指南用在向导之后:按页面讲同样的设置,方便你以后调整。每一步都写了在哪个页面、填什么、怎么确认生效。示意图用的是示例值(柏林 / 德国的设置);你自己的会显示你的市场、城市和货币。
它怎么工作
默认工作日 07:00、17:00,周末 09:00,按你配置的时区(schedule.yaml)自动跑一轮。每一轮依次经过 6 个环节,你设的每一项条件只作用在其中一个环节。点方块可以跳到对应的设置步骤。
职位需求和筛选条件在哪里设?
分成两类,最容易搞混的是前两张卡片:「搜什么」决定去网站上抓哪些岗位;「要什么」决定抓回来以后哪些留下、怎么打分。
我的画像 → 我要什么 /me
- 目标职位(也用于打分)
- 地点、工作方式、Remote 范围、资历
- 年薪底线、合同类型
- 排除学生岗、排除公司、排除关键词
设置 → 搜索 /settings
- 关键词组(每组 OR 合并成一次查询)
- 城市(每组按城市各查一次)、远程范围
- 每轮回看多少小时、每组每城市最多几条
我的画像 → 关于我 /me
- 语言和等级、技能和年限、工作年限
- 所在城市、是否需要签证担保、给 AI 的简介
感兴趣清单 + 推送 /interests /settings
- 薪酬 / 福利信号词和加分权重、关注公司
- 推送门槛(默认 70,带薪资或股权信号 60)、静默时段
- 保存的筛选视图(今日页顶部切换)
1打开网页,确认系统健康
- 浏览器打开
http://127.0.0.1:3000(手机先打开 Tailscale App 连上,再打开 Tailscale 地址)。左侧导航:今日、岗位、收藏、申请、来源、统计、设置、我的画像、感兴趣清单。 - 在项目目录下跑一次体检,看最后一行汇总:
cd <你的项目目录>
pnpm run doctor
注意要写 pnpm run doctor,不要只写 pnpm doctor(后者是 pnpm 自带的命令)。doctor 只读,不发消息、不调用 AI、不花钱。网页上的 来源 页能看到同样的信息:每个通道的状态、用量、最近运行,以及 runner 和 ai-worker 的心跳。
2写「关于我」——AI 打分的依据
这部分会以摘要形式发给 AI 打分。至少要填技能或简介,否则打分会暂停(今日页顶部会出现提示横幅)。
3写「我要什么」——职位需求和筛选条件
这里的条件决定硬过滤(不符合的直接过滤,不打分不推送),目标职位还占预打分的 40%。
每一项怎么起作用
| # | 条件 | 不符合时 | 建议 |
|---|---|---|---|
| 1 | 目标职位 | 不过滤,只影响分数 | 把同义的叫法都列上(AI Engineer / Applied AI Engineer…) |
| 2–4 | 地点、工作方式、Remote 范围 | 过滤,原因如"地点不在目标范围内" | 只想看远程就去掉"现场""混合";完全不看远程选"不接受" |
| 5 | 资历 | 过滤,原因"级别不符" | 不确定就留"不限",交给 AI 判断 |
| 6 | 年薪底线 | 只有写明上限且低于底线才过滤 | 德国大多数 JD 不写薪资,所以不会误杀 |
| 7 | 合同类型 | "排除"的直接过滤;不在"接受"里的也过滤;JD 没写明合同类型的保留 | 对中介派遣(Temp agency)选"排除" |
| 8 | 学生岗、公司、关键词黑名单 | 过滤 | 关键词按整词匹配职位名和正文,慎用太宽的词 |
pnpm refilter --dry-run 先看前后对比,确认后去掉 --dry-run 再跑一次(不抓取、不调用 AI)。4设定搜索条件——去哪里、搜什么
查询次数怎么算
每个通道每轮的查询数 ≈ 关键词组数 × 城市数(远程再加一次)。3 组 × 2 城 = 6 次。组越多越全,但付费通道花得越多、免费网站越容易限流。
保存后什么时候生效
保存时用和 runner 相同的规则校验;runner 几秒内热加载,按钮旁显示"runner 已加载"。下一轮采集用新条件,不需要重启。
5确认采集通道——从哪些网站抓
通道就是数据来源。在 /settings → 通道 开关和设预算;在 /sources 看每个通道的状态并测试。
| 类型 | 通道 | 要准备什么 |
|---|---|---|
| 官方 API 和公开的公司数据源,默认开 | Greenhouse、Lever、Ashby、Personio、SmartRecruiters;劳工局(仅德国市场) | 不用做什么;把你关心的公司加到 ats_boards |
| 抓取类,默认关 | Indeed、StepStone(德国包)、LinkedIn guest、XING | 它们的服务条款可能禁止自动访问。读过抓取一节再打开;向导和 /sources/registry 会要你确认 |
| 付费(有月预算) | LinkedIn Bright Data、Apify、JSearch | 把 key 写进项目目录下的 .env,在 /settings 设月预算;不想用就关掉 |
| 发现新公司 | Tavily(默认)/ Brave | TAVILY_API_KEY,每月免费 1000 次 |
| 需要登录 | LinkedIn 登录态(默认关,使用你自己的账号)、Gmail 提醒邮件 | 见 LinkedIn 登录态、Gmail 提醒 手册,可选 |
.env 填上,保存后运行 docker compose up -d runner 让 runner 读到新值。.env 不进 git,不要把 key 发到聊天里。6设好推送——什么样的岗位推到手机
推到 Telegram 的每条岗位长这样,按钮直接写进申请记录:
Example GmbH · Berlin · 混合
T1 €85–100k英语岗
匹配:LLM 应用经验、客户交付…
TELEGRAM_BOT_TOKEN 和 TELEGRAM_CHAT_ID 填进 .env;然后在 /settings → 手动操作 点 发送 Telegram 测试消息,手机收到即配置成功。7调排序:信号加分、关注公司、视图
💶 信号词表和权重
JD 里出现这些说法就加分:T1 写明金额、T2 股权 / 期权、T3 薪资描述、T4 其他。可调每档权重和加分封顶,保存后排序值立刻重算,不调用 AI。
👀 关注公司
添加你特别想去的公司。它们一有新岗位就单独推送,不受分数门槛和过滤限制。还没出现在库里的公司也可以先加。
👁️ 保存的视图
在 /jobs 设好筛选(分数、城市、远程、德语要求…)后点"保存当前筛选为视图",今日页顶部就能一键切换;可设一个默认视图。
8手动跑一轮,看结果
- 在 /settings → 手动操作 点 立即跑一轮(可以只勾几个通道)。按钮下面实时显示进度:"第 N 轮:x / y 个查询已结束,抓取 z 条"。也可以在终端运行
pnpm cycle:run。 - 采集完以后 ai-worker 开始打分,一般几分钟内陆续出分。
- 打开 今日:新岗位按排序值排列,顶部是各来源条数。
- 点标题进 详情:JD 原文 / 中文翻译、AI 匹配理由和差距、薪酬信号、德语要求、“查看原帖”链接(想标记已申请时点“标为已申请”,打开原帖不会改状态)。
- 想投就点"感兴趣",到 申请 看板里拖动状态。
结果不对时怎么查
| 现象 | 先看哪里 |
|---|---|
| 某个想要的岗位没出现 | /jobs 打开"显示已过滤",搜它:详情页顶部写着过滤原因(例如"地点不在目标范围内")。可以点"仍然保留",或回到第 3 步放宽条件 |
| 压根没抓到这类岗位 | 第 4 步的关键词组里有没有这个叫法;第 5 步通道是否正常 |
| 分数一直是空的 | /me 有没有填技能或简介;pnpm run doctor 的「AI 没有积压」「ai-worker 心跳新鲜」两项 |
| 分数都偏低 | 第 2 步的简介和技能写得够不够具体;第 3 步目标职位是否覆盖常见叫法 |
| 手机没收到推送 | 是否在静默时段;排序值是否够门槛;/settings 发一条 Telegram 测试消息 |
✓之后每天
- 什么都不用启动:按部署指南配置好主机之后,Docker 和 ai-worker 会开机自动运行,每天 3 轮自动跑。
- 看 Telegram:合格的新岗位逐条推来,👍 / 🚫 直接处理;想先存着的点 ⭐ 收藏。
- 有空打开 今日 或 岗位 浏览没推送的;申请 看板跟进进度,超时没回复会提醒。
- 周一看看 /interests 里的 AI 调整建议,批准或拒绝。
- 觉得不对劲时跑
pnpm run doctor;出问题 Telegram 也会主动告警(通道熔断、预算到 80%、ai-worker 掉线等)。