这次我们直接聊一个 2026 年越来越热的岗位方向:AI 大模型 FDE,也就是前沿部署工程师。很多同学目前还在纠结“学了大模型 API 之后干什么”“Agent 项目怎么做才不像玩具”“Skills 到底是不是新概念”,说实话,这些问题背后其实是一整套工程技术栈。FDE 的定位就是把这些零散能力串起来:从模型选型、本地部署、推理调优,到 Agent 开发、Skills 沉淀、API 封装、批量任务落地,再到生产环境的监控和排错,全部都是这个岗位的工作范围。
这篇文章不搞虚的,我会把 FDE 这条学习路线拆开讲清楚,重点围绕 Agent、Skills、AI 大模型部署三个方向展开,并给出一套可落地的验证流程:环境准备、服务启动、接口调用、批量任务、性能观察、问题排查。无论你是算法想转工程,还是后端想切入大模型应用,都可以照着这份思路自己动手跑一遍。强调一下,文中的命令和代码属于通用模板,具体版本和路径要以你实际使用的工具仓库为准,不要直接抄完就上生产。
1. FDE 核心能力速览
先把岗位和技术栈放到一张表里,方便你快速判断这个东西适不适合自己看下去。
| 维度 | 说明 |
|---|---|
| 岗位方向 | AI 大模型 FDE(前沿部署工程师),国内招聘中也会叫大模型部署工程师、AI 应用交付工程师 |
| 核心职责 | 模型选型与部署、推理服务调优、Agent 落地、Skills 沉淀、API 开发、批量任务、稳定性保障 |
| 编程语言 | Python 为主,部分场景需要 Node/Go 或 Shell 脚本 |
| 关键概念 | AI大模型、Agent、Skills、RAG、Function Calling、量化、推理加速 |
| 常用工具 | Ollama、vLLM 等推理运行时;FastAPI 等 Web 框架;LangChain 类框架或直接调用 OpenAI 兼容接口 |
| 推荐硬件 | 有 NVIDIA 显卡优先,显存大小决定模型规模;没有显卡可以先走 CPU + 小模型路径 |
| 启动方式 | 命令行启动推理服务,再通过 WebUI 或 API 去访问 |
| 接口能力 | 多数主流本地推理服务提供 OpenAI 兼容接口,可直接用 requests 或 openai SDK 调用 |
| 批量任务 | 可以通过脚本循环、消息队列、任务调度方式实现 |
| 适合人群 | 后端开发、运维、算法工程师、准备切入 AI 应用开发的在校学生 |
从材料看,FDE 并不是单纯的算法岗,也不完全是运维岗,它更接近“模型、应用、基础设施”三者的交叉地带。2026 年企业里已经不太缺能“调一个 API 出结果”的人,缺的是能把模型稳定部署成服务、能让 Agent 在生产环境不崩、能把零散技能封装成团队资产的人。
2. FDE 岗位解读与适用场景
2.1 FDE 到底做什么
一个典型的企业落地流程是这样的:业务方提出需求,比如“给客服做一个知识库问答助手”;算法或产品选好大模型;到了这一步,谁来把模型部署到服务器、谁来写调用接口、谁来处理并发和显存不足、谁来把 Agent 的工具调用和业务系统打通?这些都是 FDE 的工作。
具体拆开,FDE 日常涉及的事情大概有四块。
第一块是部署和推理优化。包括在本地或云服务器上启动大模型推理服务,选择合适的量化等级,调整并发数,观察显存和延迟,保证在多用户同时调用时服务不被打挂。这里涉及的工具包括 Ollama、vLLM、llama.cpp 等,它们提供各自的启动参数,但判断标准是一致的:首 token 延迟、生成速度、峰值显存、错误率。
第二块是 Agent 工程化。Agent 不是简单地把大模型 API 用起来,而是要处理规划、工具调用、记忆、结果校验。实战中你会发现,模型经常“想做的事”和“实际能做的事”对不上,任务执行到一半报错,或者工具参数生成错误。FDE 要做的是把这些异常暴露出来、记录日志、设计重试和降级策略。
第三块是 Skills 沉淀。Skills 可以理解成给 Agent 准备的“技能包”,把某类任务的操作方法、脚本、提示词封装成一个可复用的模块。团队里谁写了一个 PDF 解析技能,其他人可以直接复用;谁踩过一个 LLM 生成 JSON 解析失败的坑,可以把它写进技能文档。久而久之,Skills 库就是团队的工程资产。
第四块是接口和交付。把模型能力封装成 HTTP API,对接企业内部系统,做权限校验、限流、审计日志,最后交付给业务方。FDE 写代码的工程量并不少,只是代码大多围绕“怎么让模型服务稳定运行”展开。
2.2 适合什么场景,不适合什么场景
适合的场景包括:企业内部知识库问答、文档解析与结构化、审批和客服等流程自动化、代码审查辅助、批量内容生成、模型统一接入网关。这类任务链路长、环节多,不是调一个 API 就能结束,正好需要 FDE 来做整体落地。
不太适合的场景包括:核心算法研究、从零预训练模型、极高并发的互联网 C 端产品底层推理引擎自研。这些方向更偏算法研究员和系统工程师,FDE 的重点是把已有模型和能力用起来。
使用边界也要提前说清楚。Agent 在调用外部工具时会操作文件、发送网络请求、执行命令,所以必须限制 Agent 的权限范围,不能拿一个测试环境的脚本直接扔到生产系统上跑。涉及客户数据、个人隐私、版权素材时,必须先确认授权,再进模型、进日志。Skills 里如果装了第三方脚本,要先检查代码内容,避免把不安全的命令带入企业环境。
3. Agent、Skills、AI 大模型的关系
这三个词放一起容易让人困惑。简单理解:AI 大模型是“大脑”,Agent 是“会用大脑的助理”,Skills 是“助理脑子里预装好的操作手册”。
3.1 Agent 的核心组件
一个工程上可用的 Agent 至少包含四个东西。
- 模型底座:负责理解任务、生成计划和回复。
- 工具调用:模型输出结构化的调用参数,程序解析后执行具体动作,比如查数据库、读文件、发请求。
- 记忆:短期记忆保存当前会话上下文,长期记忆保存历史偏好或业务知识。
- 反馈循环:工具执行完返回结果,模型根据结果判断是继续、修正还是结束。
实际开发中,反馈循环是 Agent 工程化最花时间的部分。模型生成一个错误的工具参数,程序执行报错,Agent 是否能把错误信息带回去重新生成?如果连续三次失败,是重试还是转人工?这些都需要 FDE 在代码层面做明确设计。
3.2 Skills 是什么
Skills 是在 Agent 基础上演化出的能力封装方式。它的核心思想是:不要把提示词和调用逻辑混在一起写死在业务代码里,而是把“什么时候用、怎么用、用什么脚本”打包成一个独立模块。
在 Claude Code Skills、OpenCode Skills、Codex 这几种生态里,Skills 通常由一个包含SKILL.md说明文件的目录构成,必要时带scripts脚本子目录。模型遇到任务时先读取 Skills 说明,决定是否调用,再执行对应脚本。
这样做的好处有三点:第一,技能可复用,团队内部不用重复造轮子;第二,提示词和模型解耦,换模型时可以保留技能库;第三,可审计,Agent 调用过哪些技能、执行过哪些脚本,日志一查便知。
3.3 从 API 调用到 Agent 再到 Skills 的学习顺序
建议的学习路径是:先学会直接调用大模型 API,把 prompt、temperature、流式输出这些基础概念吃透;然后加 Function Calling,尝试让模型返回结构化参数并调用外部函数;接着把多轮工具调用组合起来,形成简单的 Agent 循环;最后把稳定的任务过程封装成 Skills,供团队复用。
很多人一上来就急着看各种花哨框架,其实基础 API 调用没练熟,后面遇到的报错都很难定位。FDE 的实战课程里,Agent 和 Skills 模块之前通常会安排大量的 API 集成练习,原因就在这里。
4. 环境准备与本地部署
开始动手前,先过一遍环境清单。下面这些不是某个特定项目的硬性要求,而是本地部署 AI 大模型常见的检查项。
4.1 系统与运行环境检查
操作系统不挑,Windows、Linux、macOS 都能做开发验证。生产部署建议使用 Linux 服务器,最稳妥。
Python 版本建议 3.10 及以上,部分推理框架对 3.11、3.12 的支持已经很好。检查命令:
python --version有 NVIDIA 显卡时,先确认驱动和 CUDA 是否可用:
nvidia-smi如果显示显卡型号和驱动版本,说明驱动正常。这里注意,nvidia-smi 显示的 CUDA 版本是驱动支持的版本,不一定是 PyTorch 实际使用的版本,具体要看推理框架和 PyTorch 的安装要求。
无显卡环境下也可以部署小模型,走 CPU 推理,速度会慢很多,但学习 Agent 和 Skills 的链路不受影响。
磁盘方面,模型文件占用都很大。几个 G 到几十个 G 都很常见,建议预留至少 50G 空间做实验。部署前用 df 看一下磁盘状况:
df -h4.2 推理服务启动思路
本地部署大模型的工具很多,Ollama 适合快速上手,vLLM 适合高吞吐生产场景,llama.cpp 适合低资源设备。这里以 Ollama 为例说明通用流程,因为它启动简单,而且原生提供 OpenAI 兼容接口,适合后面做 API 测试。
安装完成后,用以下命令下载模型并启动服务:
# 拉取模型,模型名按实际可用的版本填写 ollama pull qwen2.5:7b # 以服务方式运行,默认监听 11434 端口 ollama serve有些系统上 Ollama 安装后会自动注册为后台服务,不需要手动执行ollama serve。启动后在浏览器打开:
http://127.0.0.1:11434如果能看到响应,说明服务已经起来了。
除了 Ollama,vLLM 也是企业级部署的高频选择,它更适合处理高并发、长文本推理。启动方式通常是:
# 通用示例,实际参数以 vLLM 官方文档为准 python -m vllm.entrypoints.openai.api_server \ --model /path/to/model \ --port 8000这里有几个容易踩的坑。第一,模型路径必须写对,本地模型目录下要有模型权重文件;第二,端口不要和已有服务冲突,启动前先检查端口占用:
# Windows netstat -ano | findstr 8000 # Linux / macOS lsof -i :8000第三,首次启动会加载模型到显存,显存不足会直接报 CUDA out of memory,这个后面专门讲。
5. 用代码验证一条完整的调用链路
服务启动之后,最重要的不是反复刷新网页,而是把 API 链路跑通。大多数本地推理服务都兼容 OpenAI 接口格式,这意味着你可以用一套代码同时对接本地模型和云端模型。
5.1 安装依赖
pip install openai requests fastapi uvicorn5.2 通过 OpenAI SDK 调用本地模型
from openai import OpenAI # base_url 指向本地推理服务,api_key 按服务实际要求填写 client = OpenAI( base_url="http://127.0.0.1:11434/v1", api_key="ollama", ) resp = client.chat.completions.create( model="qwen2.5:7b", # 换成你下载的模型名 messages=[ {"role": "system", "content": "你是 FDE 部署助手,回答语言保持简洁。"}, {"role": "user", "content": "请解释 RAG 和微调的区别。"}, ], temperature=0.3, ) print(resp.choices[0].message.content)判断成功的标准很简单:控制台能输出一段完整文字。如果返回 404,说明base_url路径不对;如果返回模型不存在,说明 model 名字写错;如果长时间不返回,先降低模型规模或检查显存。
5.3 用 requests 调用,方便嵌入业务系统
import requests payload = { "model": "qwen2.5:7b", "messages": [ {"role": "user", "content": "用三句话介绍 Agent 开发的核心难点。"} ], "stream": False, } resp = requests.post( "http://127.0.0.1:11434/v1/chat/completions", json=payload, timeout=60, ) print(resp.status_code) print(resp.json()["choices"][0]["message"]["content"])如果你的业务代码不需要引入额外的 SDK,用 requests 就足够了。这里建议把服务地址、模型名、超时时间都配置成环境变量,避免写死。
5.4 验证流式输出
真实的产品交互里,流式输出体验更好。把stream参数改成True,然后逐块读取:
from openai import OpenAI client = OpenAI( base_url="http://127.0.0.1:11434/v1", api_key="ollama", ) stream = client.chat.completions.create( model="qwen2.5:7b", messages=[{"role": "user", "content": "写一段 FDE 的岗位介绍。"}], stream=True, ) for chunk in stream: delta = chunk.choices[0].delta if delta and delta.content: print(delta.content, end="", flush=True)流式接口能直观反映服务的生成速度和首 token 延迟。如果感觉首 token 很慢,可以考虑换更小的模型、减少上下文长度,或开启推理加速相关配置。
6. Skills 机制实战
Skill 的封装方式在不同 Agent 工具里略有差异,但核心思想一致:一个技能目录加一份说明文件。这里用通用目录结构演示,具体字段要以你使用的 Agent 平台规范为准。
6.1 目录结构示例
skills/ └── pdf-parse/ ├── SKILL.md └── scripts/ └── parse_pdf.pySKILL.md是技能的说明文件,负责告诉 Agent“这个技能是干什么的、什么时候调用、怎么调用”。一个最小可用的示例:
--- name: pdf-parse description: 解析 PDF 文件,提取文本内容并输出 Markdown。适用于用户提供 PDF 路径并要求提取内容的场景。 --- # pdf-parse 当用户需要解析 PDF 时使用此技能。 ## 输入 - input_path: PDF 文件路径 ## 输出 - 提取出的文本内容,格式为 Markdown ## 使用方法 执行 scripts 目录下的脚本: ```bash python skills/pdf-parse/scripts/parse_pdf.py --input /path/to/file.pdf如果解析失败,请检查文件路径是否正确。
### 6.2 技能脚本示例 ```python import argparse import sys def parse_pdf(path: str) -> str: # 实际解析需要引入 pypdf、pdfplumber 等库 # 这里只做框架示例 raise NotImplementedError("请根据实际 PDF 解析库补充实现") if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--input", required=True, help="PDF 文件路径") args = parser.parse_args() try: content = parse_pdf(args.input) print(content) except Exception as exc: print(f"解析失败: {exc}", file=sys.stderr) sys.exit(1)6.3 实际测试步骤
先准备一个测试 PDF,然后手动执行脚本,确认脚本本身能跑通:
python skills/pdf-parse/scripts/parse_pdf.py --input ./samples/sample.pdf脚本没问题后,再在 Agent 环境里注册技能目录,让 Agent 在需要时读取SKILL.md并尝试调用。判断成功的标准是:输入 PDF 路径,Agent 能自动选择 pdf-parse 技能,并回传解析后的文本。如果 Agent 完全不调用技能,大概率是技能描述写得太模糊,或者技能目录没有正确生效。
这里要特别提醒:从网上下载的 Skills 不能直接扔进企业环境。先读一遍脚本代码,确认没有反弹 shell、没有外传数据等危险操作,再小范围测试。Skills 本质上是可执行代码,风险控制和权限隔离必须做到位。
7. 企业级 API 封装与批量任务
把模型能力封装成稳定的内部接口,是 FDE 区别于普通脚本工程师的重要能力。
7.1 用 FastAPI 暴露一个统一接口
from fastapi import FastAPI from pydantic import BaseModel from openai import OpenAI app = FastAPI() client = OpenAI( base_url="http://127.0.0.1:11434/v1", api_key="ollama", ) class ChatItem(BaseModel): prompt: str system: str = "" max_tokens: int = 512 @app.post("/chat") def chat(item: ChatItem): messages = [] if item.system: messages.append({"role": "system", "content": item.system}) messages.append({"role": "user", "content": item.prompt}) resp = client.chat.completions.create( model="qwen2.5:7b", messages=messages, max_tokens=item.max_tokens, ) return {"reply": resp.choices[0].message.content}启动服务:
uvicorn app:app --host 0.0.0.0 --port 8001启动后用 curl 验证:
curl -X POST http://127.0.0.1:8001/chat \ -H "Content-Type: application/json" \ -d '{"prompt": "你好,简单介绍下自己。", "system": "你是 FDE 助教。"}'接口能通之后,还要考虑鉴权。不要直接把没有任何校验的接口暴露到公网,至少加一个 token header,再配合内网白名单使用。
7.2 批量任务设计
批量任务的核心是目录管理和失败重试。建议把输入、输出、日志分开:
batch/ ├── inputs/ │ ├── 001.txt │ └── 002.txt ├── outputs/ └── logs/批量处理脚本示例:
import json import logging import time from pathlib import Path from openai import OpenAI client = OpenAI( base_url="http://127.0.0.1:11434/v1", api_key="ollama", ) logging.basicConfig( filename="logs/batch.log", level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s", ) input_dir = Path("batch/inputs") output_dir = Path("batch/outputs") output_dir.mkdir(parents=True, exist_ok=True) for file in sorted(input_dir.glob("*.txt")): text = file.read_text(encoding="utf-8") try: resp = client.chat.completions.create( model="qwen2.5:7b", messages=[{"role": "user", "content": f"总结以下内容:\n{text}"}], timeout=60, ) result = resp.choices[0].message.content out_file = output_dir / f"{file.stem}.md" out_file.write_text(result, encoding="utf-8") logging.info("%s 处理成功", file.name) except Exception as exc: logging.error("%s 处理失败: %s", file.name, exc) time.sleep(1)更严格的批量任务应该加失败次数限制和人工复核机制,比如同一个文件失败三次就跳过,并在日志里标记。对于大批量任务,建议先把任务列表写进队列系统,而不是直接在循环里逐个调用,不然中途断掉很难恢复。
7.3 任务结果的可视化与人工抽检
批量任务跑完之后,不要直接信任所有输出。抽检规则可以这样设计:每个批次的输出按 10% 比例抽检,重点关注格式错误、内容重复、敏感信息泄露三类问题。如果是文本分类、信息抽取这类任务,建议把模型输出的置信度或原始输入同时保存,方便回溯。
8. 资源占用与性能观察
本地部署最容易被忽略的就是性能观察。很多新手只看输出结果,不看显存和延迟,结果一上生产就崩。
8.1 实时观察显存
推理服务运行中,另开一个终端执行:
watch -n 1 nvidia-smi这样每秒钟刷新一次显存使用情况。重点观察:模型加载后空闲显存占用、请求处理时的峰值显存、多路并发时显存是否溢出。如果没有 NVIDIA 显卡,观察 CPU 内存可以用:
htop8.2 CPU 推理和 GPU 推理的差异
CPU 推理的优势是兼容性好,任何电脑都能跑,缺点是速度慢。GPU 推理速度快很多,但显存容量限制了模型规模。同一个 7B 模型,用 GPU 跑可能几十秒能生成完整回答,用 CPU 可能要几分钟。对于 FDE 学习阶段来说,CPU 足够验证代码链路;对于企业生产来说,GPU 是标配。
8.3 降低显存占用的通用手段
第一,使用量化模型。4bit 量化比 16bit 模型大幅降低显存占用,代价是生成质量略微下降。第二,控制并发请求数,防止多个请求同时挤占显存。第三,设置合理的max_tokens,避免模型长时间生成导致显存持续占用。第四,清理不再使用的模型,一次只加载一个模型。第五,如果服务端支持,开启流式输出,边生成边释放。
8.4 磁盘和日志膨胀问题
推理服务运行时间长了,模型缓存和日志文件会越来越大。建议给日志目录挂独立磁盘,并配置按大小或天数滚动清理。镜像环境里尤其要注意,日志写满小磁盘会导致服务直接异常,这类问题排查起来非常隐蔽。
9. 常见问题与排查方法
把部署和开发过程中最常遇到的问题整理成一张表,方便你按图索骥。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 推理服务启动后 HTTP 访问无响应 | 服务未监听预期端口 / 端口被占用 | 检查启动日志;lsof -i :11434查端口 | 更换端口或重启服务 |
| nvidia-smi 正常但 PyTorch 报 CUDA 不可用 | PyTorch 版本和驱动支持的 CUDA 版本不匹配 | python -c "import torch;print(torch.cuda.is_available())" | 安装与驱动匹配的 PyTorch 版本 |
| 请求时报 CUDA out of memory | 模型过大或并发过高 | watch -n 1 nvidia-smi观察显存 | 换更小模型 / 开启量化 / 降低并发 |
| API 返回 404 | base_url 路径或接口路径写错 | 查看服务文档确认路径 | 修正 base_url 和 endpoint |
| 返回“model not found” | 模型名与已下载模型不一致 | ollama list查看已安装模型 | 修改 model 字段为正确名称 |
| 请求超时 | 模型生成慢 / 内存不足导致卡死 | 先小 prompt 测试;看 CPU/内存占用 | 减少 max_tokens / 换小模型 / 增加超时时间 |
| Agent 不调用 Skills | 技能描述不清晰或目录未注册 | 查看 Agent 日志中是否读取过 SKILL.md | 改写 description / 检查技能目录路径 |
| 批量任务中途停止 | 单条任务异常未捕获 / 磁盘写满 | 查看 logging 输出的日志文件 | 增加异常处理 / 清理磁盘 / 加失败重试 |
| 下载模型中断后无法启动 | 模型文件不完整 | 检查模型目录文件大小和哈希 | 删除未完成文件重新拉取 |
排查问题的基本顺序是:先看日志,再查资源,最后看配置。不要一上来就怀疑代码逻辑,很多问题都是环境问题。
10. 学习路线与最佳实践
在职场上,FDE 学习路线可以分成四个阶段,每个阶段都有明确的交付物。
10.1 阶段一:API 集成
掌握 prompt 设计、上下文管理、temperature 调节、流式接口、Function Calling。交付一个能处理多轮对话的问答服务。这一阶段不需要买显卡,用云端 API 就足够。
10.2 阶段二:本地部署
掌握模型下载、推理服务配置、量化、显存观测。交付一个能稳定运行的本地推理服务,并封装成 HTTP API。这一阶段建议从 7B 级别模型开始,显存不够就用 CPU 或量化。
10.3 阶段三:Agent 与 Skills
掌握工具调用循环、任务规划、异常反馈、日志追踪。把日常重复任务封装成 Skills,建立自己的技能库。交付一个能实际完成某一业务场景的 Agent 原型,比如文档问答 Agent、SQL 查询 Agent。
10.4 阶段四:企业级交付
掌握鉴权、限流、批量任务队列、监控报警、性能调优。交付一个能支撑内部使用的完整服务,并输出部署文档和运维手册。
10.5 实战建议
第一,第一次跑通用最小方案。先单文件、小模型、单一接口,跑通后再加复杂度。第二,保留一套最小可运行配置。换电脑、换环境时能快速恢复,不用从头踩坑。第三,模型文件、输入素材、输出结果、日志严格分目录管理,不然后面排查问题会非常痛苦。第四,批量任务一定要加日志和失败重试,否则任务跑一半断掉,前功尽弃。第五,涉及人脸、声音、版权素材时先确认授权,企业内部数据要明确脱敏规则,不要拿客户隐私数据直接灌进模型。
课程体系部分也需要提醒一句:任何承诺“学完即就业”的说法都过于绝对。FDE 能不能就业,取决于你能否在项目中真正解决部署和交付问题,而不是课程名称。建议把注意力放在阶段交付物上,能拿出可演示的 Agent 项目、能讲清楚部署参数和排查思路,比空有简历关键词有用得多。
11. 总结与下一步
FDE 最值得投入的点在于,它把 AI 大模型从“能聊天”推向“能干活”。Agent 解决的是任务自动化,Skills 解决的是能力沉淀和复用,部署和接口解决的是交付问题。这三块组合起来,就是一个完整的企业级落地链路。
如果你现在刚入门,第一步先不要碰复杂框架,直接部署一个本地模型服务,写一个最简单的 chat 接口,跑通第一轮调用。然后给这个服务加上批量任务目录,尝试让代码循环处理多个文件。等这条链路稳定了,再去研究 Agent 和 Skills,你的理解会快很多。
最容易踩的坑就三个:模型名写错、端口被占、显存不足。这三个坑可以提前用日志、nvidia-smi 和端口检查排除掉。接下来把文章里给的代码模板保存下来,搭一套自己的最小实验环境,动手跑一遍,比看十篇教程都管用。