鱼皮AI导航
鱼皮AI导航
  • 主页
  • 社区
  • AI工具
  • AI知识库
  • AI提示词
  • MCP
  • Skills
  • AI学习资源
  • AI资讯
  • GitHub开源
登录/注册
站长:程序员鱼皮 老鱼简历 商务合作 增值电信业务经营许可证
2026 鱼皮AI导航 | 沪ICP备19026706号-6
7
4
10

历时 3 个月,我从 0 上线了一个证据约束型 AI 求职助手:简喵

Ryan
Ryan
2026-07-03 17:25
阅读 1611
Ryan
2026-07-03 17:25
阅读 1611

项目名:简喵 在线体验地址:jianmiao.yanxai.com 个人技术博客:yanxai.com GitHub仓库Readme: RyanCoreAI/AIResume

简喵不是泛简历生成器,而是一个证据约束型 AI 求职助手,围绕真实简历和目标 JD,帮助用户完成简历编辑、目标岗位分析、岗位竞争力诊断、投递文案生成和 PDF 导出。

桌面端截图:

image.png image.png 移动端截图:

image.png

1.为什么做这个项目

这得从我第一次写简历开始,我自己用Office、WPS试过效果不太好,也用过网上的免费写简历产品,当时花了不少时间找个好模板填写我的简历然后最后一步导出的时候居然提示我要充钱,我换过其它的简历产品,结果不是付费就是导出的时候加上了水印,当时就给我气炸了。说好的免费简历,我花了这么多时间选择模板填写简历结果卡在我导出的时候说要付费,这不是付费的问题是严重伤害了用户的信任。当时我就在想要是我有能力做出来一个免费的简历产品给自己用和身边的朋友用就好了,这就埋下了一个种子,在我现在有能力后终于实现第一次写简历那时候一直想做却没有能力做的事。我自己明确知道什么事情最伤害用户信任,我是在为像以前一样被伤害过用户信任和无数个我而付费,是为爱发电的项目,如果我的项目能帮助到哪怕只有一两个人,这也是我做这个项目的意义。

其次是项目层面,我最开始只是想做一个“不在最后一步卡 PDF 导出”的简历工具,但是我发现做了一个泛泛的简历生成器和PDF导出那也没有价值,市面上到处都是。我发现大多数人真正困难的地方是不是没有经历,而是不知道怎么把已有经历翻译成岗位语言。又还有就是现在大多数的简历工具是一个简历评分器等或者直接帮用户“润色”成看起来很强的表达,但用户不一定知道这句话有没有依据,甚至用户在面试的时候被面试官问穿,这是个很严重的问题。 简喵想解决的不是“把简历写得更夸张”,而是帮助用户分清楚:

  • 哪些内容可以直接写;
  • 哪些内容需要补证据;
  • 哪些 JD 要求暂时不能硬写;
  • 哪些表达可以保守降级;
  • 最终投递前应该怎么整理。 这也是我把它叫做 证据约束型 AI 求职助手 的原因。

相关竞品也已经很强,而简喵解决的问题就是:从真实经历到目标岗位之间,缺一个证据约束的整理过程。

2.简喵的目标岗位分析和岗位竞争力诊断有什么用?

我现在拿一份示例简历进行项目真实验证: image.png

岗位填写:AI应用开发 (JD粘贴见文章末尾部分)

目标岗位分析结果如下:

image.png

image.png

image.png

image.png

目标岗位分析结果只有59分评分,结果显示这份简历缺少Agent 工作流 / RAG / Embedding / 向量检索等相关的证据,然后防幻觉 / 证据链能力未在简历中显性表达, 可以主打LLM API / Prompt / JSONMySQL / Redis权限安全。 应该重写表达:Docker / Nginx / 云部署Java / Spring Boot / REST APIToken 消耗统计防幻觉 / 证据链 / AI 质量控制。 需要补真实项目 / 补口径:Agent 工作流RAG / Embedding / 向量检索。 不能直接硬写:Agent 工作流RAG / Embedding / 向量检索。 当前简历已有 AI 工程化相邻证据,但还没把证据约束、风险降级、质量控制写成主线。 优先改写项目表达,突出结构化输出校验、证据约束和风险降级。 还给出了7天补强计划:

  1. 第 1 天:选一个小型知识库场景,整理 5-10 篇 Markdown / PDF 文档。
  2. 第 2-3 天:实现文档解析、文本切分和 Embedding 入库,优先用 pgvector / Milvus 其中一种。
  3. 第 4-5 天:完成相似度检索、召回排序、上下文拼接和引用来源展示。
  4. 第 6 天:补充防幻觉边界,包括无证据拒答、引用缺失提示和日志记录。
  5. 第 7 天:整理 README、架构图和可演示截图,再决定是否写入简历。
  6. 本周优先补 RAG;Agent 工作流作为下一阶段补强,不建议同周同时做,避免 Demo 过散。

这么看59分也算合理.....

岗位竞争力诊断结果:

image.png

image.png 这里看到一个点它提出了一个风险点就是简历写了将单次模型评分成本控制在约 ¥0.012 - ¥0.02,有面试追问风险:你这个成本是怎么算出来的? 说明这是基于模型单价和典型评分请求长度估算的单次成本区间,不是营收指标;没有完整口径时不保留具体金额。数字越具体,越容易被追问 token 单价、输入输出长度、缓存命中和估算公式。其次,这份诊断还根据简历的项目提出了面试追问的风险点。

3.投递文案是什么?PDF导出真实能用吗?

先看一下投递文案的质量:

image.png

这里有一个很重要的点就是它确实真实依据岗位要求和现有的简历证据给出一个尽可能表达符合岗位要求的投递文案,不会编造不存在的事实。这个投递文案可以当作一个参考,真实投递还得微调不能盲目复制。

再来从WPS Office看看PDF导出的质量:

image.png

4.分享链接是什么?有什么用?

分享链接就是将这份编辑好的简历用短链接的形式发送出去可以让别人预览你的简历,支持微信、QQ等多平台发送,可以手动设置密码和过期时间,现在我当场设置一个短链接有效期30天(8月1日过期): https://jianmiao.yanxai.com/s/97d7411c687d4351bbf2

点击短链接效果:

image.png 这里的PDF导出是浏览器导出,效果不好不建议在这个页面导出正式PDF

分享链接还可以统计链接的数据:

image.png

5.AI调用怎么计算?执行时遇到网络问题会不会直接扣除体验次数?

image.png 在我的AI额度这个位置有记录历史的AI调用历史,如果AI任中断没有完整生成会退回点数,只有任务完成才会扣除响应的点数,点数的意义是为了保护AI接口防烂刷。

除以上功能外还有其它投递跟进、项目复盘、offer对比等功能不再展示,可以点击项目链接真实体验。

6.如何注册登录?支持Github登录吗?

用邮箱注册登录即可,注册成功过后你会收到邮件:

image.png 或者使用Github进行登录

image.png

7.简喵为什么强调“证据约束”

因为 AI 简历产品有一个很大的风险: 生成得越流畅,越容易让用户误以为它是对的。 尤其是求职场景,AI 很容易把 JD 要求包装成用户经历。 这会带来两个问题。 第一,用户投出去的简历可能失真。 第二,面试官一追问就穿。

所以简喵在设计上坚持几个规则:

  1. JD 是岗位要求,不是候选人事实;
  2. 简历是候选人事实来源;
  3. 没有证据的内容只能标为缺口或建议;
  4. AI 可以帮你组织表达,但不能替你编经历;
  5. 投递前必须由用户确认。 这也是我觉得简喵和普通“AI 优化简历”最大的区别。

8.这个项目做了什么防护?我的简历信息是否会泄露?

简喵当前的安全设计核心是:用户简历默认私有、账号内隔离;富文本和 AI 输出进入系统前后都做净化;分享和 PDF 使用受控 token;AI 调用、PDF 渲染、文件上传这些高风险链路都有边界控制。

image.png

(1)简历富文本XSS攻击防护

层级防护
前端使用 DOMPurify 净化富文本
后端使用 ResumeContentSanitizer 再次净化
落库前草稿、版本、分享快照、AI 改写内容都会经过服务端 sanitizer
渲染前简历模板、预览页、分享页只渲染净化后的 HTML
浏览器侧CSP 限制脚本来源,禁止 object/frame 等危险能力

(2) 越权访问防护

资源防护方式
简历按 userId + resumeId 查询
简历版本校验版本所属简历,简历所属当前用户
岗位会话校验 session 属于当前用户
体检结果绑定用户、简历版本、岗位会话
PDF 任务校验 task / version / user 关系
分享撤销只有创建者可以撤销
投递/面试/Offer按当前用户隔离

(3)登录态 / CORS / CSRF / Cookie防护

项目当前设计
登录态JWT 放 HttpOnly Cookie
防 JS 窃取AccessToken / RefreshToken 设置 HttpOnly
HTTPS生产要求 Secure Cookie
CSRF双提交 token,XSRF-TOKEN 可被前端读取但不承载登录态
CORS生产只应允许正式域名
NginxAPI no-store,减少缓存用户接口响应风险

(4)头像上传防护

防护说明
大小限制头像限制 500KB
magic bytes不只信任 Content-Type
重新编码服务端重新编码为 JPG,去掉潜在脚本/EXIF
随机文件名使用 UUID,不使用用户原始文件名
独立路径只暴露 /files/avatars/**
不接收 SVGSVG 这类可执行载荷应拒绝

(5)文件导入防护

防护说明
文件大小限制限制 5MB
类型检查PDF / DOC / DOCX / TXT
magic bytes检查真实文件头
DOCX 解压检查防 zip slip
可疑条目过滤避免路径穿越和异常文件结构

(6)PDF导出、Puppeteer防护

防护说明
不允许用户提交任意 URLURL 由后端构造
host 白名单Puppeteer 只访问允许的 host
阻断危险协议阻断 file、ws、ftp 等
阻断 metadata IP阻断 169.254.169.254 等
容器隔离Puppeteer 独立服务
任务校验PDF task 与用户/版本绑定

image.png

(7)分享链接防护

防护说明
长随机 token后端真实 token 足够长
短链接只是展示前端展示短 token,后端仍可保留长 token
密码分享可选密码保护
访问限流token + IP 限制
撤销分享创建者可以撤销
快照净化分享内容创建前经过 sanitizer
no-store密码分享不应被缓存

(8)AI调用防护

防护说明
功能限流额度、每日/月度限制
任务队列避免重复创建相同 AI 任务
输出校验JSON 修复、schema、fallback
证据边界JD 是岗位要求,不是候选人事实
AI 输出净化进入简历/页面/PDF 前走 sanitizer
缓存隔离cache key 应包含 user/session/version/scenario
审计日志记录 trace、状态、失败原因
部分脱敏对手机号、邮箱等敏感字段做处理

image.png

(9)Nginx / 浏览器侧防护

防护说明
CSP限制脚本、对象、frame、连接域名
HSTS强制 HTTPS
X-Frame-Options防点击劫持
API no-store防止用户接口被代理缓存
assets 长缓存只缓存静态构建产物
connect-src 白名单只允许必要 API/AI 域名

(10)简历自动保存防护

image.png

场景是否会被其他普通用户看到是否会离开你自己的服务器说明
保存草稿/版本默认不会不会,除非备份/运维访问存在数据库和服务器信任边界
简历预览默认不会不会登录态内访问
PDF 导出默认不会不会发第三方,但会进入 Puppeteer 内部服务PDF 文件需要清理和权限控制
AI 诊断/体检/投递文案默认不会公开提交前过滤敏感字段仅必要字段进入AI调用链路隐私说明已中明示
分享链接持链者可看不一定用户主动分享,风险来自链接转发
头像头像 URL 可公开访问不一定不应上传敏感图片
GitHub 登录不会公开简历会走 GitHub OAuth用于登录身份,不等于公开简历

说明: 简喵默认不会公开你的简历。你的简历草稿、版本、岗位诊断、体检结果和 PDF 导出记录均绑定当前账号访问。 为了防止脚本注入,系统会在前端和后端同时净化简历富文本内容;为了防止越权访问,核心资源接口会校验当前用户与简历、版本、岗位会话、导出任务之间的归属关系。 当使用目标岗位分析、岗位竞争力诊断或岗位投递文案功能时,系统会将完成该功能所需的简历片段和 JD 内容发送给模型服务进行处理。AI 结果只作为建议,不代表录用概率,也不会自动替你写入无证据经历。 当主动创建分享链接时,持有链接的人可以访问对应分享快照。请不要在分享版本中保留不希望公开的信息。头像会作为公开头像资源展示,请不要上传身份证、证件照、银行卡截图等敏感图片。 简喵会对上传、分享、AI 调用、PDF 导出等高风险入口进行限流、校验、日志审计和错误兜底,但任何线上系统都不存在绝对零风险。建议不要在简历中填写非求职必要的敏感信息。

9.PDF导出并发怎么处理?服务器能承受压力吗

(1)异步 PDF 队列
用户点“导出 PDF”后,后端不是同步卡住请求直接渲染,而是创建一个 pdf_export 异步任务。

流程是:

▼
text
复制代码
用户点击导出 → 后端校验用户是否拥有这份简历和版本 → 创建 pdf_export 任务 → 写入数据库 async_tasks → 推入 Redis 队列 → 后台 worker 取任务 → 调 Puppeteer 服务生成 PDF → 保存 PDF 文件 → 前端轮询任务状态并下载

(2)用户/IP 限流
PDF 导出入口有多层限流,防止一个用户或一个 IP 疯狂点导出。

▼
text
复制代码
防止一个账号连续狂点 防止同一设备/同一出口刷接口 防止短时间批量消耗资源 防止免费用户长期滥用

(3)Puppeteer 白名单隔离
PDF 导出最危险的地方不是“生成 PDF”,而是“让一个无头浏览器访问 URL”。如果不限制,攻击者可能尝试让 Puppeteer 访问:

▼
text
复制代码
云服务器 metadata 地址 内网服务 本地文件 file:// Redis/MySQL 内网地址 任意外部 URL 恶意 HTML 页面

当前项目做了两层白名单。

第一层在后端 PuppeteerClient:

后端只允许自己构造的预览 URL,要求满足:

▼
text
复制代码
必须和 app.base-url 或 pdf-preview-base-url 同源 路径必须以 /preview/ 开头 必须带 token 必须带 versionId

也就是说,用户不能提交一个任意 URL 让服务器帮他转 PDF。

第二层在 puppeteer-service:

Node 服务也会检查:

▼
text
复制代码
只允许 http/https 拒绝 metadata IP,例如 169.254.169.254、100.100.100.200 host 必须在 ALLOWED_HOSTS localhost 端口必须在允许列表 非白名单资源请求会被 request interception 拦截

部署上还有容器隔离:

▼
text
复制代码
Puppeteer 不暴露公网端口 Docker Compose ports: [] read_only: true /tmp 使用 tmpfs 容器资源有限制

所以它不是“浏览器随便打开网页”,而是“只能打开内部预览页,并且页面里的外链资源也受控”。

(4)失败兜底
PDF 生成链路很复杂,可能失败的点很多:

▼
text
复制代码
预览 token 过期 versionId 不存在 Puppeteer 无法访问 preview URL 页面分页溢出 Chromium 超时 服务器内存/CPU 繁忙 队列已满 生成结果不是有效 PDF

第一层:任务状态兜底。 前端不会假装成功,而是轮询 如果任务成功,再下载 如果任务还在 pending/processing,下载接口不会直接返回坏文件,而是返回等待状态。

第二层:PDF 内容校验。

后端拿到 Puppeteer 返回结果后,会检查 PDF 文件头是否是 %PDF。如果不是有效 PDF,直接判定失败,不会把坏文件给用户下载。

第三层:错误归因。 前端会把错误分成几类:

▼
text
复制代码
RATE_LIMITED:导出过于频繁 SERVICE_BUSY:导出队列已满 GENERATE_FAILED:生成失败 TIMEOUT:导出超时 NETWORK:服务不可用

这比统一显示“服务器异常”要好,用户至少知道是频繁、排队、超时还是生成失败。

第四层:浏览器导出兜底。

服务端 PDF 失败时,产品上应该保留浏览器打印/导出路径。代码里 PdfExportHandler 明确是 maxRetry = 0,设计意图是“失败快速返回,由前端使用浏览器打印兜底”。因为 Puppeteer 挂了不代表用户完全不能导出。

10、技术选型与边界

▼
text
复制代码
前端:Vue 3 + TypeScript + Vite 后端:Spring Boot 数据库:MySQL + Flyway 缓存 / 限流 / 任务状态:Redis PDF 导出:Puppeteer 部署:Docker Compose + 阿里云 ECS + Cloudflare AI:DeepSeek / 智谱等模型 provider

AI 应用里最容易忽略的不是 Prompt,而是边界。 很多人做 AI 应用时,第一反应是调 Prompt。 Prompt 当然重要,但上线后更重要的是:

  • 输出能不能解析;
  • 解析失败怎么办;
  • 生成内容能不能直接进入数据库;
  • 能不能被展示为 HTML;
  • 会不会被 Prompt Injection 诱导;
  • 会不会把用户输入当系统指令;
  • 会不会把 JD 要求写成用户事实;
  • 会不会产生用户无法识别的幻觉。

所以简喵里我做了几层限制:

  1. Prompt 里明确区分“简历事实”和“JD 要求”;
  2. 输出要求结构化;
  3. JSON 解析失败要兜底;
  4. AI 输出不能直接作为 HTML 渲染;
  5. 投递文案必须清理 Markdown、重复问候和异常空行;
  6. 没有证据的 JD 要求只能进入“缺口”或“建议”。

11、上线过程中踩过的坑

1. PDF 预览两页,导出变一页

这是最影响信任的问题之一。 用户看到预览是两页,但导出 PDF 后变成一页,或者第二页内容被挤掉,体验会非常差。 最后我把原则定为:

▼
text
复制代码
编辑器预览页数 = 独立预览页页数 = PDF 导出前确认页数 = 最终 PDF 页数

移动端只允许视觉缩放,不应该影响分页计算。

2. 移动端比想象中难

桌面端简历编辑器可以左右分栏。 移动端不行。 用户在手机上需要:

  • 看简历;
  • 改模块;
  • 调顺序;
  • 保存版本;
  • 做 AI 分析;
  • 导出 PDF。 如果把桌面端按钮硬塞到移动端,只会变成一团乱。 后来我把移动端改成:
▼
text
复制代码
底部:模块 / 预览 / 编辑 顶部:保存 / 版本 / AI 功能 / GitHub / 预览 / 导出 模块:半屏抽屉 编辑:半屏 + 上拉全屏书写

这个过程改了很多轮。

3. 任务状态比按钮状态复杂

AI 任务不是点击按钮马上返回。 它可能处于:

  • 创建中;
  • 排队中;
  • 执行中;
  • 成功;
  • 失败;
  • 超时;
  • 退款;
  • 已有相同任务。 一开始只做前端 loading 很容易出错。 后来必须以后端任务状态为准,前端只是展示。

4. Docker Compose 上线不是一句命令

上线时也遇到过:

  • 后端冷启动时间长;
  • health check 先失败后恢复;
  • MySQL 初始化和 Flyway 状态不一致;
  • Cloudflare 代理下真实 IP 获取;
  • HTTPS 和 Cookie 配置;
  • CORS / CSRF 本地端口不一致;
  • 服务器和本地代码分支不一致。

这类问题没有捷径,只能看日志、看容器状态、看真实请求。


12、为什么我没有一上来做 RAG / Agent / 向量库

很多 AI 项目喜欢一开始就上 RAG、Agent、向量数据库。 但简喵当前阶段不需要。 因为当前核心输入只有两类:

▼
text
复制代码
一份简历 一个目标 JD

它们的数据规模很小。 真正难点不是检索,而是:

  • 证据边界;
  • 输出结构;
  • 失败兜底;
  • 用户路径;
  • PDF 交付;
  • 移动端体验;
  • AI 成本控制。

如果现在引入 RAG / Agent / 向量库,更多是技术自嗨,不一定能提升用户价值。 我更愿意先把一个岗位准备链路做扎实。


13、和现有产品相比,简喵的差异在哪里

我不认为简喵现在能在模板、ATS、生态上打过成熟产品。 简喵目前唯一值得打的差异点是: 证据约束。 也就是:

▼
text
复制代码
不是帮你把 JD 要求都写进简历, 而是告诉你哪些能写、哪些需要证据、哪些不能写。

这个差异很小,但我认为它真实。

简喵的现有问题

  1. 模板数量还不够;
  2. 非技术岗位的示例还需要补;
  3. AI 结果质量还要继续调;
  4. 移动端编辑体验仍然可以优化;
  5. PDF 导出还需要更多边界测试;
  6. GitHub 登录、分享、反馈入口等还需要打磨;
  7. 隐私边界会继续在现有边界进行优化

我不想把它包装成“已经完美解决求职问题”的产品。 但它已经能完成完整链路:

▼
text
复制代码
注册 / 登录 创建简历 编辑简历 保存版本 粘贴 JD 目标岗位分析 岗位竞争力诊断 生成投递文案 导出 PDF 分享链接

这对我来说,是第一阶段最重要的事情。


14.域名绑定和监控

用CloudflareDNS进行服务器端口绑定对应主域名下的子域名,同时开启代理云

image.png

部署到Cloudflare域名jianmiao.yanxai.com进行页面资源访问请求的监控

image.png

后续会记录服务器上线和域名绑定的过程和经验分享

15、后续计划

接下来我会优先做这些:

1. 补行业模板

尤其是非技术岗位:

  • 运营;
  • 行政;
  • 机械;
  • 财务;
  • 人事;
  • 销售;
  • 新媒体;
  • 教育;
  • 产品助理。 很多用户并不是技术岗。后续需要补充

2. 优化岗位分析质量

尤其是低证据、弱匹配场景。 不能只显示一堆空结果。 就算用户简历很弱,也应该给出可执行建议:

  • 哪些经历还能挖;
  • 哪些表达要保守;
  • 哪些内容需要补;
  • 先改哪一段最划算。

3. 强化投递文案

投递文案要更像人写的,不要像技术清单。 不同场景应该有不同语气:

  • Boss 开聊要短;
  • 官网备注要稳;
  • 邮件正文要完整;
  • 内推文案要自然。

4. 面试追问

这部分我很想继续做。 因为如果简历里写了某个项目,面试官大概率会追问:

  • 你具体负责什么;
  • 为什么这么设计;
  • 遇到什么问题;
  • 怎么验证效果;
  • 如果重做会怎么改。

这和“证据约束”是一条线。 简历不是写完就结束,面试追问才是验证真实性的地方。

5. 更明确的隐私说明

简历数据很敏感。 后续需要把数据存储、AI 调用、分享链接、删除机制写得更清楚。


16、最后

做这个项目最大的感受是: 真正难的不是接入 AI,而是让 AI 在一个真实产品里可靠、克制、可解释地工作。

调用模型 API 很简单。 难的是:

  • 不让它乱写;
  • 不让它污染行业;
  • 不让它把 JD 当事实;
  • 不让它输出不可解析内容;
  • 不让它给用户制造面试风险;
  • 不让它在失败时把产品体验拖垮。 简喵现在还很早期,但它已经上线了。 如果你正在找实习、校招、社招,或者只是想整理一份更清楚的简历,可以试试看: jianmiao.yanxai.com

如果你需要某个行业模板,或者发现某个岗位分析不准,也欢迎反馈给我。 我会继续迭代。 为爱发电。 绝不伤害用户信任,PDF 导出不会卡在最后一步。

后续我会写技术复盘文章包括 架构设计 技术选型 AI完整功能链路 功能防护 上线前打包部署 服务器选择和上线 移动端适配 域名绑定 进行一个详细的技术复盘。

测试的JD粘贴如下:

▼
text
复制代码
# AI 应用开发工程师(Java / LLM / RAG / Agent 方向) ## 岗位描述 我们正在建设面向企业知识管理、智能问答、内容生成、流程自动化和智能决策辅助的 AI 应用平台。你将参与大模型应用的后端研发、RAG 检索增强、Prompt 工程、结构化输出校验、Agent 工作流编排、AI 任务调度与效果评估等核心模块建设,推动大模型能力在真实业务场景中的稳定落地。 该岗位更关注 AI 应用工程化能力,而不是单纯调用模型接口。我们希望你既具备扎实的 Java 后端开发能力,也能理解大模型应用中的上下文构建、证据检索、防幻觉、成本控制、响应稳定性和用户体验闭环。 ## 岗位职责 1. 参与 AI 应用平台的后端研发,包括用户、项目、知识库、AI 任务、历史记录、权限控制、文件解析、结果管理等核心模块。 2. 基于 Java / Spring Boot 构建稳定的业务接口,负责接口设计、数据建模、异常处理、日志追踪、权限校验和性能优化。 3. 接入 OpenAI、Claude、DeepSeek、通义千问等大模型 API,完成模型调用封装、Prompt 模板管理、超时控制、失败重试、模型降级和调用成本统计。 4. 参与 RAG 检索增强系统建设,包括文档解析、文本切分、向量化、Embedding 存储、相似度检索、召回排序、上下文拼接和答案引用。 5. 设计和优化 Prompt 工作流,使模型输出更符合业务目标,包括结构化 JSON 输出、结果校验、字段补全、风险提示和多轮追问。 6. 参与 Agent 工作流能力建设,包括任务拆解、工具调用、状态流转、执行日志、人工确认节点和异常回退机制。 7. 参与 AI 输出质量控制,降低幻觉风险,避免模型编造事实、夸大用户能力、生成不可验证内容或输出不符合业务边界的结果。 8. 与产品、前端和算法同学协作,将 AI 能力封装为可复用的业务功能,例如智能简历优化、岗位匹配分析、智能问答、知识库助手、面试准备、报告生成等。 9. 建设 AI 调用可观测能力,包括请求日志、TraceId、Token 消耗、响应时间、错误分类、模型命中率、用户反馈和质量评估指标。 10. 参与系统上线、接口联调、测试用例编写、灰度发布和线上问题排查,保障 AI 应用在真实用户场景下稳定运行。 ## 任职要求 1. 计算机、软件工程、人工智能、信息管理等相关专业本科及以上学历,接受优秀应届生、实习生或初级开发者。 2. 熟悉 Java 语言和 Spring Boot 开发,理解 Controller、Service、Repository/Mapper、DTO、异常处理、参数校验等常见后端分层设计。 3. 熟悉 MySQL、Redis 等常用中间件,能够完成基本的数据表设计、索引设计、缓存设计和常见查询优化。 4. 熟悉 RESTful API 设计,理解前后端分离开发流程,能够与 Vue / React 等前端框架进行接口联调。 5. 了解大模型 API 的基本使用方式,熟悉 Prompt 编写、上下文组织、结构化输出、模型响应解析和异常处理。 6. 了解 RAG 基本流程,包括文档解析、文本切片、Embedding、向量检索、召回排序和上下文增强。 7. 具备较强的问题拆解能力,能够将一个 AI 产品需求拆解为后端接口、数据结构、AI 调用链路和异常处理流程。 8. 有良好的工程意识,重视代码可读性、测试覆盖、日志可追踪性、边界条件处理和线上稳定性。 9. 对 AI 应用落地有持续兴趣,愿意主动研究 LLM、Agent、RAG、Prompt Engineering、防幻觉、AI 评估等方向。 ## 加分项 1. 有完整 AI 应用项目经验,例如智能简历优化、AI 面试、知识库问答、AI 客服、文档问答、Agent 自动化工具、AI 写作助手等。 2. 熟悉 LangChain、LlamaIndex、Spring AI、Dify、Coze、Flowise、n8n 等任一 AI 应用开发框架或平台。 3. 有向量数据库使用经验,例如 Milvus、Pinecone、Weaviate、Qdrant、pgvector、Elasticsearch 向量检索等。 4. 熟悉大模型输出校验、防幻觉、证据链、引用溯源、Claim Verification、结构化输出验证等工程实践。 5. 有 AI 成本控制、Token 统计、模型降级、多模型路由、流式响应、异步任务队列等实践经验。 6. 熟悉 Docker、Linux、Nginx、CI/CD、云服务器部署,有独立上线项目经验。 7. 有 GitHub 项目、技术博客、开源贡献、真实用户使用反馈或完整产品 Demo 者优先。 ## 技术栈 后端:Java、Spring Boot、MyBatis / JPA、Spring Security 数据库:MySQL、Redis AI 能力:LLM API、Prompt Engineering、RAG、Embedding、Agent Workflow 工程化:Docker、Linux、Nginx、GitHub Actions、日志追踪、接口测试 前端协作:Vue / React、RESTful API、SSE / WebSocket 可观测:TraceId、调用日志、Token 消耗、错误分类、用户反馈 ## 你将参与的项目方向 1. 企业知识库问答系统 2. AI 简历优化与岗位匹配系统 3. 智能客服与自动化问答系统 4. AI 面试准备与候选人能力分析 5. 文档解析、摘要生成与报告生成系统 6. Agent 工具调用与业务流程自动化平台 ## 我们希望你具备的特质 1. 不满足于“能调通模型”,而是关注 AI 输出是否可靠、可解释、可追踪、可复用。 2. 能从真实业务流程出发设计 AI 功能,而不是堆砌模型能力。 3. 对工程质量有要求,愿意写测试、补日志、处理异常、优化用户体验。 4. 能持续学习新技术,并把新技术转化为稳定可用的产品能力。

我是Ryan,一个专注于可信AI应用工程的开发者,研究如何让AI生成从“外观”走向“有证据、可追溯、可验证”。

AI
求职
7
10
分享
操作

相关专栏

GitHub原创项目

GitHub原创项目

本专栏记录我的原创项目从想法、设计、开发、上线到复盘的完整过程,重点包括 AI 应用开发、开源工具、后端工程、产品定位、技术选型、架构设计、部署上线和项目复盘。 这里不会只展示项目结果,而是拆解每个项目背后的真实取舍:为什么做、解决什么问题、用了哪些技术、遇到哪些坑、如何优化,以及这个项目如何沉淀为 GitHub 作品集和求职工程证据。

评论
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片

目录

🔥 热门文章
1
离谱,DeepSeek 崩了 5 小时,大家却喊:梁圣恩情还不完??
430
2
DeepSeek 全新模型发布,性价比最高的一集!
380
3
B 站上 DeepSeek 闹鱼灾了,我发起《大肥鱼清除计划》!
370
4
自己学习ai,直接买cursor 的套餐,还是买gpt 或者claude 的套餐?
360
5
又一个国产版 Codex 神器,也来卷办公了!
330
6
day3-如何写出一个高质量的 Skill(组内分享) 高质量 Skill 不是“一个调得很顺的巨型 Prompt”,而是一个可验证、可回归、可维护的能力包。 先定义“什么算好”,再实现“怎么做好”。评估体系先于 Skill 本身成型。 下面用“故障诊断 Markdown 转 YAML”作为例子,但方法是通用的。 --- 一、先想清楚:Skill 到底是什么 一个 Skill 至少包含四部分: 部分 作用 接口 输入什么、输出什么、边界在哪 流程 分几步做,每步的产物是什么 规则 硬约束、经验规则、失败模式 降级策略 不确定时怎么办,而不是硬编一个看似合理的结果 高质量 Skill 的共同点:职责单一、接口清晰、规则可定位、输出可验证。 反例:把几十条经验全塞进一个主 Prompt,改一条规则要重调整个 Prompt,评估时也不知道是哪条规则退化。 --- 二、核心方法:先建评估,再写 Skill 不要先写转换器再补测试。正确顺序是: 1. 定义输出契约:什么算合法、什么算合格; 2. 建金标准集:一小批人工认可“可放行”的样本; 3. 先写评估 Skill:让它在金标准集上跑出基线; 4. 再迭代生成 Skill:每次修改跑同一套评估,无退化且目标维度提升才算正向。 这就是评估驱动开发:评估是 Skill 的单元测试,金标准集是回归锚点。 --- 三、评估 Skill:三层门禁,逐层递进 前一层不过,后一层不跑。每层留可追溯证据。 第 1 层:确定性硬门禁 用解析器、Schema、校验器完成,不消耗模型成本。 · 输出可解析; · 必填字段齐全,类型/枚举合法; · 引用目标存在,无悬空引用、无不可达节点; · 关键路径至少有一条能到达预期出口。 不通过直接打回。 第 2 层:语义断言 用脚本 + 结构遍历检查“逻辑对不对”,仍然保持确定性。 通用检查项: · 覆盖率:源材料里的关键步骤、分支、条件,输出里是否都有对应? · 完整性:每个判断节点是否都有明确出口?有没有死胡同? · 可达性:每条路径是否都能到达预期终点?有没有无出口循环? · 顺序与依赖:有先后依赖的操作,是否保留了顺序?有没有被拍平成无序列表? 例子:故障诊断转换中,检查“每个判断项是否有是/否/异常出口”“每条路径是否能到根因”。 第 3 层:LLM-as-Judge 只处理解析器表达不了的维度:忠实度、完整性、可执行性。 但 Judge 会漂移,不能单独放行,必须建立在第 1、2 层之上。Judge 的 Prompt、rubric、模型版本都要版本化,换模型必须用金标准集重新校准。 通用 Judge 维度: 维度 问什么 忠实度 输出是否忠实源材料意图?有没有自行发明内容? 完整性 关键步骤、条件、证据是否保留?隐式知识有没有被压成空话? 收敛性 输出是否仍指向原目标,而不是发散? 可执行性 下游不依赖源材料能否直接使用? --- 四、金标准集:回归测试的锚点 不需要一开始就标注几百份。用已认可的样本当种子,扩到 15~30 份,覆盖失败模式而非随机抽样: · 完整正例:典型流程; · 边界/异常分支:异常路径、循环、前置失败回退; · 已知易错模式:实际踩过的坑; · 留出集:不参与调优,只用于最终验收,防过拟合。 金标准不需要完美,只需要当前标准下认可可放行。 回归指标:关键路径用 pass^k(k 次全过),稳定性用 pass@k。 --- 五、工程约束:让批量产出可重放 · 幂等:同输入 + 同 Skill 版本 + 同规则 → 输出一致,否则无法判断变好是 Skill 改了还是随机波动; · 隔离不阻断:单份失败进隔离队列,记录失败层和原因,不阻塞其余; · 版本绑定:规则、rubric、金标准集进 Git;每份报告绑定“源版本 + 生成 Skill 版本 + 评估 Skill 版本 + Judge 模型版本”; · 抽样人工复核:Judge 临界样本 + 易错模式,人工抽检结果反过来校准 rubric。 --- 六、Skill 本身怎么写 · SKILL.md 控制篇幅,写清:输入约定、输出契约、分步流程、硬规则、降级策略; · 经验规则放 references/ 或 rules/,按失败模式分类,不要全塞进主 Prompt; · 不确定时标 needs_review: true,不要硬编看似合理的结果; · 迭代由评估报告驱动:报告告诉你哪层挂了、哪类失败模式,你改对应规则文件,而不是漫无目的调 Prompt。 --- 七、落地顺序(不要反过来) 1. 固化输出契约:Schema + 结构约束; 2. 建金标准集:从已认可的 + 最易出错的样本开始; 3. 先写评估 Skill:跑出基线报告; 4. 再迭代生成 Skill:每次修改对比逐项通过率,无退化且目标提升才算正向; 5. 批量运行 + 隔离回放:失败进队列,结束后人工抽检; 6. 评估 Skill 自身版本化:换 Judge 模型必须重新校准。 --- 八、给组员的三条硬要求 1. 不许凭感觉说“变好了”:每次修改必须附评估报告对比,逐项通过率说话。 2. 不许跳过确定性门禁直接看 Judge 分数:前两层挂了,Judge 分数没有意义。 3. 不许把规则堆进主 Prompt:规则按失败模式分文件,评估报告要能定位到具体文件。 --- 一句话收尾 生成 Skill 决定“能不能做”,评估 Skill 决定“敢不敢用”。 先让评估体系站稳,再让生成器迭代。这样交付的不是一堆“看起来还行”的产出,而是一套可证明、可回归、可交接的 Skill 质量体系。
310
7
AI 越强,被它拒绝的代价就越大 我有时候会想:AI 越来越厉害之后,有些事情,会不会反而越来越难做? 这个想法看起来有点矛盾。AI 明明在降低门槛,让不会写代码的人做出软件,让不会画画的人生成图片,让一个人完成过去需要整支团队才能完成的工作。但今天用 Codex 的时候,AI 拒绝帮我编写 SQL 注入的请求体,而那还是我有源码、在本地跑测试的情况。那么,往后是否只会更难? 我们假设某一天,AI 说:「这个请求违规,我不能帮助你。」到那个时候,你还有多少能力,能绕过它,把事情做完? 这里的「违规」需要打个引号。平台的规则、模型的判断、法律的要求,以及一件事实际有没有造成伤害,彼此之间并不总是画得上等号。一个请求可能确实危险,也可能只是缺少上下文被误判,或者恰好落在某家公司的限制范围里。 无论是哪种情况,随着我们越来越依赖 AI,这句拒绝都可能变得越来越贵。 今天,一个程序员让 AI 帮忙写代码,AI 拒绝了,他大概率还有别的办法:查文档、找开源项目、问同行,或者自己写。麻烦一点,慢一点,但路还在。 可如果十年之后,大部分程序都由 AI 完成,情况就不一样了。 很多人从接触编程的第一天起,就习惯了描述需求、等待生成、运行结果、继续迭代。他们能做出相当复杂的产品,却未必经历过独立处理底层问题的训练。平时,这种能力结构完全够用,效率甚至更高。只有 AI 拒绝的时候,他们才会发现:平常被省掉的那段学习过程,恰好是此刻最需要的东西。 到那时,一次拒绝的成本,可能就从「今晚多花两个小时」,变成「先花半年学会这门技术」。 拿 SQL 注入举个稍显极端的例子:往后,连真正理解这类攻击如何发生、能够独立构造测试的人,会不会也越来越少? 这里也包括那些有正当需求的人。一个开发者想检查自己的旧系统,一个经过授权的安全研究员想复现漏洞,假如 AI 识别到危险模式就拒绝,而使用者又只熟悉「让 AI 帮我检查」,这项原本可以独立完成的工作,就这样卡住了。 但是安全专家不会因此消失,但这类技能可能越来越集中在少数人手里。你仍然可以找专家,只是要付出更多的钱、更多的时间,以及更高的沟通成本。 类似的困境,未必只发生在网络安全领域。 你想从一个停止维护的软件里取回自己的数据,需要解析它的旧文件格式。AI 判断这涉及规避保护措施,拒绝继续。你拥有这些数据,却没有能力把它们读出来。 你买了一台设备,厂商停止提供服务。你想修改程序让它继续运转,过程中需要处理某种访问限制。AI 不愿协助,而你所掌握的维修方式,早已只剩下「把报错发给 AI」。 你想给常用的网站写一个辅助工具,减少重复操作。平台将此归入自动化限制,AI 也据此拒绝。过去会写脚本的人可以自己判断、自己处理;未来的使用者,可能连从哪里开始都不知道。 这些例子有一个共同点:当工具同时承担了「执行工作」和「传授知识」的角色,它的拒绝就不只是挡住了一次任务,也挡住了获得这种能力的机会。 更麻烦的是,这种依赖往往是我们主动选择的,而且每一步都很合理。 既然 AI 几秒钟就能做好,为什么还要花几个月学习?既然公司可以采购成熟的 AI 服务,为什么还要养一支负责基础工作的团队?既然市场上已经很少有人手写这些东西,学校为什么还要花大量时间教? 对个人、公司和学校来说,这些选择都有现实依据。但叠加起来,整个社会保留的独立能力就可能越来越少。等到某项能力突然受到限制,我们才发现,备用方案早已在追求效率的过程中被一点点削掉了。 所以,「AI 越强,做事越便宜」可能只描述了未来的一半。 另一半是:被允许的事情越来越便宜,被拒绝的事情依然需要人工完成,却要面对更少的人才、更高的报价,以及越来越难获得的知识。两边的成本差距,会越拉越大。 有人会说,可以换一个模型,或者用本地模型。这确实是重要的选项。只要工具之间还有充分竞争,开放模型还足够可用,限制就未必能形成真正的门槛。 但备用方案也需要维护。它需要硬件、知识、软件生态,以及一群仍然理解这些系统的人。如果大多数人已经习惯了最方便的商业服务,那么「理论上还有别的办法」和「普通人实际用得起、用得明白」,之间仍然可能隔着很远。 我担心的,正是这段距离。 我不指望 AI 对任何请求都照单全收。对明显会伤害他人的行为设置限制,有充分的理由。但我们也需要关心:限制由谁定义,误判有没有申诉渠道,用户能不能换工具,以及脱离这个工具之后,还剩下多少独立行动的能力。 保留这些能力,平时看起来甚至有点低效,明明可以自动生成,还要理解原理;明明可以一键完成,还要知道手动怎么做。 但这些看似多余的知识,会在工具拒绝、失效、涨价或改变规则的那一刻,成为真正的选择权。 AI 越强,我们可能越需要留意它说「不」的那一刻。 因为那句话的分量,最终取决于:它拒绝之后,我们还能做什么。
310
8
什么是LLM
300
9
WorkBuddy 本地 API 桥 + dsh 插件:把你的 WorkBuddy 额度,变成手边随手可用的模型
290
10
Vibe Coding 实战:从零构建现代专业级 AI 搜索引擎
270
🔥热门工具
朱雀AI检测朱雀AI检测
朱雀AI检测助手朱雀AI检测助手
LovartLovart
老鱼简历老鱼简历
WritePass官网WritePass官网
面多多面多多
CursorCursor
星月写作星月写作
零感AI零感AI
墨得问题墨得问题