AI Agent 工程师求职文档
AI Agent 工程师 8 周突击学习计划
适用对象:有 10 年 C#/.NET 后端经验、每周可投入 30 小时以上、希望在 2 个月内完成 AI 应用工程岗位准备的开发者。
文档定位
这份计划不是泛泛的“AI 学习路线图”,而是围绕 AI Agent 工程师 岗位要求整理的一份求职导向文档。核心目标只有一个:在 8 周内做出一个能演示、能讲交付、能讲优化、能讲部署与稳定性的项目,让你的既有后端经验顺利迁移到 AI 应用工程场景。
计划刻意避开大而散的学习方式,不追求覆盖所有 AI 概念,而是沿着 Prompt 调优、RAG、Agent 工作流、工程化交付 这条高频岗位主线推进。每一周都要求有可见的交付物,这样学习结果才能自然转化为作品集、简历项目和面试回答。
默认前提为:以 Python 为主,向量库采用 PostgreSQL + pgvector,知识源采用 上市公司公告 + 交易所规则文档。这条路线兼顾岗位匹配度、落地速度与面试可讲述性。
路线判断
从当前市面上的 AI 应用工程岗位看,最常见的服务端主线仍然是 Python 生态,尤其是 FastAPI、LangChain、LangGraph、向量检索和部署调试相关能力。虽然 .NET 也能做 AI 应用,但如果目标是提高岗位覆盖面和面试命中率,以 Python 为主更稳妥。
向量库部分,这份计划不走“只选最炫技术”的思路,而是选 pgvector。它足够主流,学习和部署成本低,又能和你原本的数据库、索引、性能调优经验自然衔接。面试时你不仅能讲“会用”,还能讲表结构、检索链路、存储设计和性能治理。
知识源之所以选公告和规则文档,是因为它们公开、真实、结构复杂,既能体现文档解析与 RAG 质量治理能力,又能贴近金融/证券类岗位偏好。这样的项目不会像纯 Demo 一样轻飘,面试官也更容易相信它具备真实业务迁移价值。
你的优势不在于重新做一个初级 Python 开发,而在于把 10 年后端经验迁移到 AI 应用工程里:服务治理、稳定性、边界控制、排障能力、数据建模和交付意识,都是这个岗位真正缺的东西。
技术主线
这类岗位通常不要求候选人训练基础模型,但会非常看重能否把大模型能力做成一个可交付、可观测、可迭代、可上线的应用。你需要重点补的不是传统服务端基础,而是 AI 应用开发特有的几个薄弱环节:检索增强、Prompt 版本治理、工具调用、评测与回归、引用溯源和故障兜底。
| 能力方向 | 推荐技术 | 在项目中的体现 |
|---|---|---|
| 服务端骨架 | FastAPI |
接口、流式输出、异常处理、健康检查、配置治理 |
| RAG 基础 | LangChain + pgvector |
文档导入、切分、向量检索、引用返回 |
| Agent 编排 | LangGraph |
Plan → Retrieve/Tool → Check → Final 的工作流 |
| 缓存与状态 | Redis |
会话、缓存、限流、短期上下文管理 |
| 文档解析 | PyMuPDF、unstructured |
PDF 内容提取、页码与来源保留 |
| 可观测性 | OpenTelemetry + 结构化日志 |
traceId、模型耗时、token 用量、工具调用链路 |
| 部署交付 | Docker Compose |
本地一键起服务、数据库、缓存和向量扩展 |
| 测试与回归 | pytest |
接口测试、Prompt 回归、RAG 评测 |
八周总览
整套计划采用高强度单主线推进方式。每周建议投入 30 到 36 小时,保持“开发新能力、修 badcase、补工程化、写复盘”四件事并行,不要把所有时间都用来堆功能。
| 周次 | 核心目标 | 本周产出 | 验收标准 |
|---|---|---|---|
| W1 | Python 工程地基 + LLM 服务骨架 | 基础 API、流式输出、结构化输出、README v0 | 本地启动稳定,接口可跑,日志完整 |
| W2 | 会话、缓存、可观测、配置治理 | session、Redis 缓存、trace、统一响应规范 | 服务像样,能看日志、能看链路、能处理超时 |
| W3 | RAG v1:入库、切分、检索、引用 | 导入脚本、检索接口、问答接口、首批知识源 | 回答附带来源,至少导入 30 份真实文档 |
| W4 | RAG v2:混合检索、重排、评测 | 评测脚本、优化记录、badcase 列表 | 能量化展示优化前后差异 |
| W5 | Agent v1:工具调用与工作流 | 2 个工具、LangGraph 工作流、执行轨迹 | 问题能触发正确工具,链路可回放 |
| W6 | Agent v2:回归、结构校验、兜底 | Prompt 回归、拒答策略、结构化校验 | 改 Prompt 有测试,错误输出有拦截 |
| W7 | 容器化、压测、稳定性治理 | Compose、压测报告、部署文档 | 能部署、能压测、能说明排障方法 |
| W8 | 作品集与面试表达收口 | README 成品、Demo 脚本、简历项目描述 | 10 分钟内能完整讲清项目价值和决策 |
逐周执行
下面把 8 周计划细化为“可勾选”的待办清单,并按 每周 6 天 × 每天 5 个小时块 组织(合计约 30h)。你可以把 H1~H5 理解为 5 个 60 分钟专注段,具体在一天中的哪个时间段由你自己安排。
勾选状态默认保存在当前浏览器本地(localStorage)。如果你希望在多设备之间同步,可用“导出进度/导入进度”把进度文件带走。
W1:Python 工程地基 + LLM 服务骨架
目标:把 FastAPI 服务壳、日志、异常、流式与结构化输出打牢
0/0
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 创建仓库与目录结构(app/prompts/tests/docs 等) | |
| H2 | 建立 Python 环境与依赖管理(pyproject/requirements 二选一并固定) | |
| H3 | 加入格式化/静态检查(ruff/black 或等价组合)并形成统一命令 | |
| H4 | 配置分层:env → config 模块 → 运行时注入(本地/生产) | |
| H5 | 建立结构化日志骨架(统一 traceId 字段,先打通写日志) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 创建 FastAPI 应用入口、路由模块与依赖注入骨架 | |
| H2 | 实现统一响应结构(success/error),定义错误码枚举 | |
| H3 | 实现异常处理中间件:捕获异常、记录日志、输出统一错误 | |
| H4 | 实现 /health 与 /version(包含 git commit、构建时间等) | |
| H5 | 补一轮“本地一键启动”命令(Makefile/justfile/脚本均可) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 封装 LLM Client:模型名、baseUrl、API key、超时参数 | |
| H2 | 定义消息结构(role/content)与会话请求 schema(Pydantic) | |
| H3 | 实现 /chat(非流式)并打日志:traceId、latency、token | |
| H4 | 加入基础重试(仅网络/超时类)与指数退避 | |
| H5 | 手动跑通 10 个样例问题,记录 3 个失败样例 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 定义流式响应协议(SSE 或 chunked),统一字段(delta、done、error) | |
| H2 | 实现 /chat/stream,支持断开连接时中止生成 | |
| H3 | 补超时与最大输出长度控制(避免长输出拖垮服务) | |
| H4 | 记录流式关键指标:首 token 时间、总耗时、token 数 | |
| H5 | 用 Postman/curl/简单前端脚本验证流式体验与异常路径 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 定义 1 个结构化任务:从问题里提取意图/检索关键词/输出 JSON | |
| H2 | 实现 JSON schema/Pydantic 校验(不合法则重试一次) | |
| H3 | 把 prompt 抽到 prompts/(yaml 或 txt),实现加载器与版本号 | |
| H4 | 实现 /extract-intent(或等价)接口,输出结构化 JSON | |
| H5 | 准备 20 条结构化用例(输入→期望字段),作为回归基础 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 写 5~10 条接口测试(health、chat、extract-intent 等) | |
| H2 | 补 README:启动方式、配置项、接口示例、常见错误 | |
| H3 | 整理日志字段清单(traceId、latency、token、model、errorCode) | |
| H4 | 做一次“从零启动”演练:清缓存/新环境启动并跑通接口 | |
| H5 | 复盘:记录 3 个踩坑与修复(写进 docs/ 或 README) |
W2:会话、缓存、可观测、配置治理
目标:服务化升级,让一次请求可追踪、可降级、可复盘
0/0
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 定义 session 模型:sessionId、消息列表、创建/更新时间 | |
| H2 | 实现上下文裁剪策略:最大消息数/最大 token 估算 | |
| H3 | 实现 /sessions 创建、读取、清空(最小实现即可) | |
| H4 | 将 /chat 支持 sessionId(服务端拼上下文) | |
| H5 | 用 2 个对话场景验证裁剪是否影响回答(记录差异) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 接入 Redis 客户端并抽象 cache service | |
| H2 | 设计缓存 key:model + promptVersion + inputHash + sessionSliceHash | |
| H3 | 实现 /chat 缓存命中与 TTL(仅对确定性场景启用) | |
| H4 | 日志记录 cacheHit/cacheKeyPrefix/cacheTtl | |
| H5 | 验证 10 次请求的命中率与 token 成本下降(写一段结论) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 定义“可重试错误”范围(网络/超时/限流),避免逻辑错误重试 | |
| H2 | 实现统一超时控制(请求级、模型调用级) | |
| H3 | 实现降级策略:主模型失败→备用模型/简化 prompt/返回可解释错误 | |
| H4 | 为降级路径单独打日志字段(fallbackUsed、fallbackReason) | |
| H5 | 模拟失败:断网/超时/429,验证服务表现与错误信息质量 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 确定日志字段标准:traceId、sessionId、route、latency、token、model、errorCode | |
| H2 | 实现 traceId 注入(请求头/生成),并贯穿到 LLM 调用层 | |
| H3 | 对 /chat、/chat/stream、/extract-intent 补关键日志点 | |
| H4 | 补“请求摘要日志”:入参摘要、输出长度、cacheHit、fallbackUsed | |
| H5 | 写一段“如何用日志定位问题”的小 runbook(docs/) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 实现 token 统计(prompt/completion/total)并记录到日志 | |
| H2 | 增加基本 metrics:请求数、错误数、P95(可先用日志聚合代替) | |
| H3 | 接入 OpenTelemetry(最小实现:span 包住模型调用) | |
| H4 | 把“检索/工具调用/生成”预留成独立 span 名称(为后续做准备) | |
| H5 | 跑一轮对比:缓存前后 token 成本与延迟变化(写结论) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 整理配置项清单(模型、超时、缓存、日志等级、trace 开关) | |
| H2 | 整理错误码与错误信息规范(对调用方友好) | |
| H3 | 补 5 条集成测试覆盖 session/cache/fallback 路径 | |
| H4 | 重构:把 LLM、日志、配置、API 层边界清晰化 | |
| H5 | 复盘:写 1 页“W2 交付说明”(能直接用于面试表达) |
W3:RAG v1(入库、切分、向量检索、引用溯源)
目标:把公告/规则文档导入 pgvector,并实现“回答必须带引用”
0/0
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 确定知识源范围:20~30 份公告 + 5~10 份规则(先小批量) | |
| H2 | 制定文件命名与来源元数据规范(source、ticker、date、docType) | |
| H3 | 建立 raw_docs/ 存放策略与校验(重复文件、空文件、编码问题) | |
| H4 | 整理 20 个典型问题清单(后续用作 RAG 手工验收) | |
| H5 | 把规范写进 docs/:数据源说明、命名规则、元数据字段表 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 实现 PDF 提取(PyMuPDF):按页提取文本并保留 pageNo | |
| H2 | 实现文本标准化:去页眉页脚/多空格/换行断句(先规则版) | |
| H3 | 将解析结果落盘为 JSON(pages[]),便于调试与回放 | |
| H4 | 加入解析质量检查:空页比例、总字符数、异常文档列表 | |
| H5 | 选 3 份文档人工对照:页码与文本是否一致(记录问题) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 定义 chunk schema:chunkId、docId、pageNo、text、tokenEstimate、sectionTitle | |
| H2 | 实现切分:按标题/段落优先,兜底按长度切(避免过碎) | |
| H3 | 实现 chunk 质量统计:长度分布、空 chunk、重复 chunk | |
| H4 | 用 10 个问题做检索试验:topK 里是否出现关键段落(记录) | |
| H5 | 把切分策略写进 docs/(为面试解释做准备) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 设计表:documents、chunks(含 vector 字段)、ingest_jobs | |
| H2 | 为 pgvector 启用扩展与索引(IVFFlat/HNSW 任选其一先跑通) | |
| H3 | 实现 embedding 管道:批量生成向量、失败重试、写入 DB | |
| H4 | 实现 /ingest:触发导入任务并返回 jobId(异步可后做) | |
| H5 | 导入首批文档并核对:documents 数、chunks 数、索引是否生效 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 实现 /retrieve:query→embedding→topK chunks(返回分数与元数据) | |
| H2 | 实现 citations 结构:docTitle、pageNo、chunkText、sourceUrl/filename | |
| H3 | 增加去重策略:同一 doc 相邻 chunk 合并或只保留最相关片段 | |
| H4 | 日志打点:retrievalTopK、retrievalLatency、retrievalDocDiversity | |
| H5 | 用 10 个问题验证:引用是否“真的来自文档”而不是胡编 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 实现 /ask:检索→拼上下文→生成(回答必须带 citations[]) | |
| H2 | 在 prompt 中加入“只能基于引用回答/没有依据就说不知道”约束 | |
| H3 | 补 20 条手工验收:记录好例/坏例/缺失引用的例子 | |
| H4 | 修 2 个最明显 badcase(切分/检索/topK 调参任选) | |
| H5 | 写一页“RAG v1 交付说明”(可以直接面试讲) |
W4:RAG v2(混合检索 + 重排 + 评测)
目标:能“量化证明”优化有效,并能解释取舍
0/0
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 为 chunks 增加 tsvector 字段与 GIN 索引(中文分词先简化) | |
| H2 | 实现 keyword search:query→tsquery→topK(返回 rank) | |
| H3 | 为关键词检索做去噪:停用词/短词过滤/同义词(先小集合) | |
| H4 | 补对比用例:同一问题分别跑向量/关键词,记录差异 | |
| H5 | 把检索结果结构统一:scoreVector/scoreKeyword/scoreFinal |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 实现融合:向量 topK 与关键词 topK 合并、去重、归一化 | |
| H2 | 确定融合公式(如 weighted sum / rank fusion)并写成可配置 | |
| H3 | 增加 doc 多样性:限制单文档最大 chunk 数,提升覆盖面 | |
| H4 | 记录融合参数:kVector/kKeyword/alpha;写入日志 | |
| H5 | 用 20 个问题跑 A/B:纯向量 vs 混合(保留对比结果) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 选择 rerank 方案(API 或轻量模型)并封装成 Reranker | |
| H2 | 实现 rerank:对融合后的候选做重排并返回 scoreRerank | |
| H3 | 限制 rerank 成本:候选数上限、超时、失败回退(不影响可用性) | |
| H4 | 对比 10 个问题:重排前后 top3 引用片段变化(截图记录) | |
| H5 | 把 rerank 的开关与参数写进配置与日志 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 按类别整理问题:公告问答、规则问答、对比问答、计算/校验问答 | |
| H2 | 为每条问题补 expected:关键引用文档/页码/关键词(可粗略) | |
| H3 | 定义评测输出结构:retrieval hits、citation precision、refusal rate | |
| H4 | 把评测集存为 JSONL(便于扩展/回归)并写说明 | |
| H5 | 抽样 10 条做人工校验:expected 是否合理(修正) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 实现 eval runner:逐条问题调用 /ask 并收集输出与日志 | |
| H2 | 计算基础指标:hit@k、citation precision、空答率/拒答率 | |
| H3 | 输出报告(Markdown/CSV):按类别分组 + Top badcase 列表 | |
| H4 | 跑 2 组配置对比:纯向量 vs 混合 vs 混合+重排 | |
| H5 | 把评测命令写进 README(保证可复现) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 挑 3 类 badcase:召回缺失/引用错位/过度发挥(分类) | |
| H2 | 对每类 badcase 找根因:切分/检索/融合/提示词/重排哪个环节 | |
| H3 | 修复并回归:至少让 10 条 badcase 指标变好(记录) | |
| H4 | 写优化报告:改了什么、指标怎么变、典型案例截图 | |
| H5 | 把“取舍点”写成面试话术:成本/延迟/质量三角 |
W5:Agent v1(工具调用 + LangGraph 工作流)
目标:Plan-Act-Check 形成闭环,工具可控、链路可回放
0/0
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 定义工具白名单与调用规则(哪些问题必须走工具) | |
| H2 | 实现计算工具:输入表达式/参数 → 输出数值(含异常处理) | |
| H3 | 为计算工具定义 JSON schema(参数类型、范围、必填) | |
| H4 | 为工具增加幂等键/重试策略(避免重复副作用) | |
| H5 | 写 10 条工具测试用例(含错误入参) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 选一个规则:如公告必备字段校验/违规条款匹配/日期有效性 | |
| H2 | 实现规则校验工具:输入文本/结构→输出命中条款与解释 | |
| H3 | 定义工具 schema 与返回结构(matchedRules[]、confidence、notes) | |
| H4 | 加失败兜底:规则库缺失/解析失败时返回可解释错误 | |
| H5 | 写 10 条规则测试用例(含边界情况) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 定义状态:Plan、Retrieve、Tool、Check、Final、Fail | |
| H2 | 定义状态输入输出 schema(保证可追踪与可回放) | |
| H3 | 实现 Plan:判定是否需要 RAG/工具、选择工具、生成行动计划 | |
| H4 | 实现 Act:执行检索或调用工具(加超时、重试、参数校验) | |
| H5 | 写 5 个端到端场景跑通:工具/检索/混合 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 定义最终输出 schema(回答 + 引用 + 结构化结论) | |
| H2 | 实现 Check:JSON 校验、引用存在性校验、工具结果一致性校验 | |
| H3 | 实现 Repair:校验失败→补充检索/重试/切换模板(一次即可) | |
| H4 | 把每一步输入输出记录为“执行轨迹”对象(便于回放) | |
| H5 | 为轨迹加 traceId 并写日志(Plan/Act/Check 分开计时) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 定义工具失败分类:参数错/超时/外部故障/规则库缺失 | |
| H2 | 实现失败策略:可重试→重试;不可重试→降级为纯 RAG 或拒答 | |
| H3 | 为失败输出统一解释字段:reason、nextStep、traceId | |
| H4 | 补 10 个异常用例(工具失败/无引用/JSON 不合法等) | |
| H5 | 写一页“Agent v1 交付说明”(能复述清楚链路) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 准备 3 个演示场景:纯检索问答、工具计算、规则校验 | |
| H2 | 为每个场景写“提问脚本 + 期望输出点 + 引用来源” | |
| H3 | 录一段 10 分钟 demo(先自测,不需要完美) | |
| H4 | 补 README:如何跑 demo、如何看轨迹、如何复现失败 | |
| H5 | 复盘:写“我为什么这样做工具边界”的面试话术 |
W6:Agent v2(质量门禁 + Prompt 回归 + 拒答兜底)
目标:改 Prompt 不靠感觉,靠回归;无依据不强答
0/0
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 为 prompts 建立版本号与目录结构(v1/v2 或日期版本) | |
| H2 | 实现 prompt loader:按版本加载并写入请求日志(promptVersion) | |
| H3 | 写 prompts/CHANGELOG:每次修改记录目的与影响范围 | |
| H4 | 制定“必须回归”的变更类型:输出结构/工具 schema/拒答策略 | |
| H5 | 把版本策略写进 README(面试加分点) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 整理回归集:结构化输出样例 + RAG 样例 + 工具样例(各 10~20) | |
| H2 | 实现 regression runner:对每条样例调用接口并保存结果 | |
| H3 | 断言规则:必须字段、JSON schema、引用数量、是否拒答 | |
| H4 | 输出回归报告:通过/失败列表 + 失败原因摘要 | |
| H5 | 把回归命令加入 CI(可先本地脚本,后续上 GitHub Actions) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 实现 JSON schema 校验器:不合法直接标记失败 | |
| H2 | 实现自动修复策略:用“修复 prompt”重试一次(只修结构) | |
| H3 | 对工具调用输出也做 schema 校验(参数错直接拒绝执行) | |
| H4 | 把校验失败原因写入日志(validationError、repairTried) | |
| H5 | 用回归集跑一轮:统计修复成功率与失败类型 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 定义拒答触发条件:无 citations/相似度低/超范围/敏感内容 | |
| H2 | 实现 groundedness check(简版):最少引用数 + 相似度阈值 | |
| H3 | 拒答返回结构:reason、建议补充信息、traceId | |
| H4 | 补 15 条“必须拒答”的测试用例(写进 regression) | |
| H5 | 复盘:整理 5 条最容易误答的问题类型与防线 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 实现工具调用超时与并发限制(避免拖垮主线程) | |
| H2 | 实现熔断/降级:连续失败 N 次→短时间禁用该工具 | |
| H3 | 为熔断加日志与指标:toolDisabled、coolDownSeconds | |
| H4 | 补 10 条“工具异常”回归用例(让系统输出可解释失败) | |
| H5 | 写一页“质量门禁说明”:上线前必须满足哪些指标 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 跑一次全量回归:结构化 + RAG + Agent + 拒答 | |
| H2 | 修复 5 个最不稳定用例(提示词/参数/阈值) | |
| H3 | 整理“可复现失败案例”:输入、输出、日志、修复提交 | |
| H4 | 把质量门禁与回归流程写进 README(面试亮点) | |
| H5 | 复盘:写 10 条“面试追问→你的项目证据”映射 |
W7:交付与稳定性(Docker + 压测 + 观测)
目标:新机器按文档能启动,能压测,能排障
0/0
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 编写应用 Dockerfile(瘦身、分层缓存、只拷贝必需文件) | |
| H2 | 编写 docker-compose:app + postgres(pgvector) + redis | |
| H3 | 把配置全部通过 env 注入(禁止写死在镜像里) | |
| H4 | 补 healthcheck:数据库连通、redis 连通、模型连通(可选) | |
| H5 | 从零 compose up 演练:确保一键启动成功并能 /health |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 实现启动自检:pgvector 扩展/表存在/索引存在/版本一致 | |
| H2 | 实现最小迁移脚本(init.sql 或 alembic 任选) | |
| H3 | 对 ingest/ask/agent 路径加超时上限与并发控制(先简单) | |
| H4 | 实现限流(按 IP 或 API key):防止被刷爆成本 | |
| H5 | 写“启动失败排查”说明:最常见 5 类错误及修复 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 把检索/重排/工具调用/生成分成独立 span 并记录耗时 | |
| H2 | 为关键步骤记录参数:topK、alpha、rerankCandidates、toolName | |
| H3 | 把一次请求的“执行轨迹”落到日志(可按 traceId 聚合) | |
| H4 | 增加成本字段:token、估算费用(可先粗估) | |
| H5 | 写“如何定位慢请求”流程(从日志/trace 到根因) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 选择压测工具(k6/locust 任一)并写最小脚本(/ask) | |
| H2 | 压测 3 组并发:1/5/10(记录 P50/P95/错误率) | |
| H3 | 拆解耗时:检索 vs 生成 vs 工具(用 trace 验证) | |
| H4 | 做 1 个优化:缓存/连接池/topK/并发限制(选最明显的) | |
| H5 | 形成压测报告:数据、结论、瓶颈与下一步 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 演练:模型不可用(超时/5xx)→降级输出与告警日志 | |
| H2 | 演练:数据库慢/断开 → 友好失败与重试策略 | |
| H3 | 演练:Redis 不可用 → 缓存降级(不中断主链路) | |
| H4 | 为每类故障补 runbook:症状、定位、缓解、永久修复 | |
| H5 | 把 runbook 写进 docs/ 并在 README 链接(面试亮点) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 写部署步骤:从零到可用(含 .env 示例与注意事项) | |
| H2 | 写数据导入说明:样本文档放哪、如何 ingest、如何验证 | |
| H3 | 写“常见问题”FAQ:5~10 条(复制粘贴可解决) | |
| H4 | 整理交付物清单:compose、脚本、评测、runbook、demo | |
| H5 | 复盘:形成“上线后最可能出的问题”与对策列表 |
W8:作品集与面试冲刺(表达收口)
目标:10 分钟讲清“需求→方案→取舍→评测→上线问题→复盘”
0/0
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | README 结构定稿:背景/能力/架构/运行/评测/部署/排障 | |
| H2 | 补“为什么这样选技术栈”的一页解释(Python、pgvector、LangGraph) | |
| H3 | 补快速开始:5 分钟跑起 demo(含样本文档) | |
| H4 | 补评测结果展示:表格/截图(前后对比) | |
| H5 | 补“常见问题”与“排障入口”(把 W7 runbook 链接上) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 画一张系统架构图:API→RAG→Agent→Tools→DB/Redis/LLM | |
| H2 | 画一张时序图:一次 /ask 或 /agent 的步骤与耗时点 | |
| H3 | 画一张状态图:Plan-Act-Check-Repair 的转移条件 | |
| H4 | 为每张图写 3 句解释(面试时直接照讲) | |
| H5 | 把图嵌入 README 或 docs/ 并确保链接正常 |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 写 Demo 结构:背景 1min→能力 6min→稳定性 2min→Q&A | |
| H2 | 准备 3 个问题:引用溯源、工具调用、拒答/兜底(含预期) | |
| H3 | 准备 1 个故障演示:工具失败/模型超时,系统如何解释并降级 | |
| H4 | 录屏/截图:作为作品集附件(可选) | |
| H5 | 对着脚本讲 2 遍:把卡壳点改掉(文字化优化) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 整理 20 个问题:RAG、评测、工具、稳定性、成本、安全 | |
| H2 | 每题写“结论一句话 + 项目证据 + 取舍说明” | |
| H3 | 准备 5 个追问:为什么 topK 这么选、为什么拒答阈值这么定等 | |
| H4 | 把问答库写进 docs/ 并能快速检索(目录/锚点) | |
| H5 | 做一轮自测:随机抽 10 题限时回答(补短板) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 写简历项目条目:一句话业务价值 + 技术栈 + 结果指标 | |
| H2 | 补“关键贡献”3~5 条:评测、优化、稳定性、部署、排障 | |
| H3 | 准备 STAR 故事 3 个:badcase 修复、线上故障演练、性能优化 | |
| H4 | 整理作品集链接(GitHub/Pages),确保无敏感信息与 key | |
| H5 | 准备投递版本 README(简洁版)与面试版本(完整版) |
| 小时 | 任务 | 完成 |
|---|---|---|
| H1 | 全量自测:demo 走一遍、回归跑一遍、compose 起一遍 | |
| H2 | 清理仓库:删除大文件/日志/临时数据,确保可公开 | |
| H3 | 最终部署到 Cloudflare Pages(或更新部署) | |
| H4 | 把“导出进度”文件保存一份(防止浏览器清理导致丢失) | |
| H5 | 做一轮 mock:按 JD 提问自己并记录答案(查漏补缺) |
主项目设计
主项目建议命名为 证券/金融文档问答 Agent。它不需要做复杂前端,也不需要一上来做多 Agent 协作。重点是用一条完整链路把你在岗位里最可能被问到的能力串起来:知识源导入、RAG 检索、引用溯源、工具调用、结构化输出、日志链路、回归和部署。
| 模块 | 建议范围 | 这样设计的原因 |
|---|---|---|
| 知识源 | 上市公司公告、交易所规则 PDF | 公开可获取、结构真实、贴近岗位偏好 |
| RAG | 向量检索 + 关键词检索 + 引用溯源 | 足够体现检索质量与工程能力 |
| 工具 | 计算工具、规则校验工具 | 简单但贴近金融规则场景 |
| 输出 | 自然语言回答 + 结构化结论 | 便于展示结构化输出与二次消费能力 |
| 质量控制 | 拒答、引用校验、回归、异常兜底 | 体现“能上线”而不是“会跑 Demo” |
| 运维 | 容器化、trace、压测、限流 | 把后端稳定性优势迁移进 AI 项目 |
前 8 周不建议做复杂前端、多 Agent 协作、长链外部工具集成或 K8s 级别的发布体系。求职阶段最重要的是把单项目做深,把质量、解释能力和交付感做出来。
项目结构
下面这套目录结构足够支撑你从 W1 一直用到 W8,不会随着功能增加而失控。它的核心思想是把服务骨架、RAG、Agent、Prompt、测试和评测分开,让后期做回归和排障时更轻松。
ai-agent-app/
├─ app/
│ ├─ api/ # FastAPI 路由
│ ├─ core/ # 配置、日志、异常、依赖注入
│ ├─ llm/ # 模型调用封装
│ ├─ rag/
│ │ ├─ ingest/ # 文档导入与切分
│ │ ├─ retrieve/ # 检索、融合、重排
│ │ └─ citations/ # 引用组装
│ ├─ agent/
│ │ ├─ graphs/ # LangGraph 工作流
│ │ ├─ tools/ # 工具定义
│ │ └─ guards/ # 拒答、结构校验、兜底
│ ├─ schemas/ # Pydantic 模型
│ └─ services/ # 业务编排
├─ prompts/ # Prompt 模板与版本
├─ scripts/ # 导入、初始化、评测脚本
├─ tests/
│ ├─ unit/
│ ├─ integration/
│ └─ regression/
├─ eval/ # 评测集与结果
├─ docs/ # README、架构图、优化记录
├─ docker/
├─ docker-compose.yml
└─ README.md
第一周开工清单
如果现在就开始动手,第一周不需要再继续搜集大量资料。最好的做法是边搭骨架边学,先把项目跑起来,再用真实问题倒逼你补缺口。下面是一份可以直接执行的开工顺序。
- 建立项目目录和
FastAPI基础应用。 - 完成环境配置、日志初始化和异常处理中间件。
- 封装模型调用,先只做一个
chat方法。 - 实现
/chat与/chat/stream。 - 增加一个结构化输出接口,例如“提取问题意图”。
- 把 Prompt 抽到
prompts/目录中。 - 写 5 条基础接口测试。
- 补 README 的启动说明与当前能力说明。
本地可以稳定启动;模型接口能通;流式输出能返回;至少一个接口输出结构化 JSON;测试能跑;README 写清楚如何启动。只要这 6 件事完成,第一周就算合格。
面试表达重点
后续每一周复盘时,都建议围绕固定问题整理笔记。这样第八周就不需要临时拼凑话术,项目过程本身就会沉淀成面试材料。
- 为什么选择 Python 主线,而不是继续把 .NET 当主语言。
- 为什么选择
pgvector,它在项目里承担了什么角色。 - 你如何证明 RAG 优化真的有效,而不是主观感觉更好。
- 工具调用失败或没有依据时,系统如何拒答和兜底。
- 如果部署在客户环境,最容易先出什么问题,如何定位和缓解。
只要你能围绕这 5 个问题,把项目中的设计、取舍、指标、坏例子和故障处理讲顺,岗位匹配度就会非常高。对你来说,真正的竞争力不是“我也学过 AI”,而是“我能把 AI 应用做成一个可交付、可排障、可迭代的工程系统”。