本文面向希望从软件工程转向 AI Engineer 的开发者,解释 AI 应用工程中常见概念的关系:LLM、SLM、Prompt、Context Engineering、RAG、Embeddings、Agent、Guardrails、Human-in-the-loop、Evaluation、Observability、Vibe Coding 等。
这篇文档重点讨论"如何构建 AI 应用",不是"如何训练大模型"。
一、AI 应用工程关系图
AI 应用工程可以拆成两条链路理解:一条是用户使用产品时发生的运行链路,另一条是工程师构建和迭代产品时发生的开发链路。两者有关联,但不应该混为一谈。
1. AI 应用运行链路
#mermaid-svg-kjvglIINpoE2fF2V{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kjvglIINpoE2fF2V .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kjvglIINpoE2fF2V .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kjvglIINpoE2fF2V .error-icon{fill:#552222;}#mermaid-svg-kjvglIINpoE2fF2V .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kjvglIINpoE2fF2V .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kjvglIINpoE2fF2V .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kjvglIINpoE2fF2V .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kjvglIINpoE2fF2V .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kjvglIINpoE2fF2V .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kjvglIINpoE2fF2V .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kjvglIINpoE2fF2V .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kjvglIINpoE2fF2V .marker.cross{stroke:#333333;}#mermaid-svg-kjvglIINpoE2fF2V svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kjvglIINpoE2fF2V p{margin:0;}#mermaid-svg-kjvglIINpoE2fF2V .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kjvglIINpoE2fF2V .cluster-label text{fill:#333;}#mermaid-svg-kjvglIINpoE2fF2V .cluster-label span{color:#333;}#mermaid-svg-kjvglIINpoE2fF2V .cluster-label span p{background-color:transparent;}#mermaid-svg-kjvglIINpoE2fF2V .label text,#mermaid-svg-kjvglIINpoE2fF2V span{fill:#333;color:#333;}#mermaid-svg-kjvglIINpoE2fF2V .node rect,#mermaid-svg-kjvglIINpoE2fF2V .node circle,#mermaid-svg-kjvglIINpoE2fF2V .node ellipse,#mermaid-svg-kjvglIINpoE2fF2V .node polygon,#mermaid-svg-kjvglIINpoE2fF2V .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kjvglIINpoE2fF2V .rough-node .label text,#mermaid-svg-kjvglIINpoE2fF2V .node .label text,#mermaid-svg-kjvglIINpoE2fF2V .image-shape .label,#mermaid-svg-kjvglIINpoE2fF2V .icon-shape .label{text-anchor:middle;}#mermaid-svg-kjvglIINpoE2fF2V .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kjvglIINpoE2fF2V .rough-node .label,#mermaid-svg-kjvglIINpoE2fF2V .node .label,#mermaid-svg-kjvglIINpoE2fF2V .image-shape .label,#mermaid-svg-kjvglIINpoE2fF2V .icon-shape .label{text-align:center;}#mermaid-svg-kjvglIINpoE2fF2V .node.clickable{cursor:pointer;}#mermaid-svg-kjvglIINpoE2fF2V .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kjvglIINpoE2fF2V .arrowheadPath{fill:#333333;}#mermaid-svg-kjvglIINpoE2fF2V .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kjvglIINpoE2fF2V .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kjvglIINpoE2fF2V .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kjvglIINpoE2fF2V .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kjvglIINpoE2fF2V .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kjvglIINpoE2fF2V .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kjvglIINpoE2fF2V .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kjvglIINpoE2fF2V .cluster text{fill:#333;}#mermaid-svg-kjvglIINpoE2fF2V .cluster span{color:#333;}#mermaid-svg-kjvglIINpoE2fF2V div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kjvglIINpoE2fF2V .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kjvglIINpoE2fF2V rect.text{fill:none;stroke-width:0;}#mermaid-svg-kjvglIINpoE2fF2V .icon-shape,#mermaid-svg-kjvglIINpoE2fF2V .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kjvglIINpoE2fF2V .icon-shape p,#mermaid-svg-kjvglIINpoE2fF2V .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kjvglIINpoE2fF2V .icon-shape .label rect,#mermaid-svg-kjvglIINpoE2fF2V .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kjvglIINpoE2fF2V .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kjvglIINpoE2fF2V .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kjvglIINpoE2fF2V :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户需求
AI 产品
产品交互
后端服务
AI 交互体验
AI 输出展示
人工确认与接管
AI 应用编排层
Prompt
Context Engineering
RAG
Agent
Guardrails / Safety
Evaluation
模型输入
System / User / Context / Tool Results
LLM / SLM
模型响应
知识库 / 数据库 / 文档
解析 / 清洗 / 切分
Embeddings
关键词索引
向量索引或向量数据库
Retriever
过滤 / 权限校验 / 重排序
Tools / APIs
Memory / State
人工反馈
Observability
日志 / Trace / 成本 / 延迟
2. AI 应用开发链路
#mermaid-svg-7gzA0HCkMCBp5IAf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7gzA0HCkMCBp5IAf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7gzA0HCkMCBp5IAf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7gzA0HCkMCBp5IAf .error-icon{fill:#552222;}#mermaid-svg-7gzA0HCkMCBp5IAf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7gzA0HCkMCBp5IAf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7gzA0HCkMCBp5IAf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7gzA0HCkMCBp5IAf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7gzA0HCkMCBp5IAf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7gzA0HCkMCBp5IAf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7gzA0HCkMCBp5IAf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7gzA0HCkMCBp5IAf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7gzA0HCkMCBp5IAf .marker.cross{stroke:#333333;}#mermaid-svg-7gzA0HCkMCBp5IAf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7gzA0HCkMCBp5IAf p{margin:0;}#mermaid-svg-7gzA0HCkMCBp5IAf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7gzA0HCkMCBp5IAf .cluster-label text{fill:#333;}#mermaid-svg-7gzA0HCkMCBp5IAf .cluster-label span{color:#333;}#mermaid-svg-7gzA0HCkMCBp5IAf .cluster-label span p{background-color:transparent;}#mermaid-svg-7gzA0HCkMCBp5IAf .label text,#mermaid-svg-7gzA0HCkMCBp5IAf span{fill:#333;color:#333;}#mermaid-svg-7gzA0HCkMCBp5IAf .node rect,#mermaid-svg-7gzA0HCkMCBp5IAf .node circle,#mermaid-svg-7gzA0HCkMCBp5IAf .node ellipse,#mermaid-svg-7gzA0HCkMCBp5IAf .node polygon,#mermaid-svg-7gzA0HCkMCBp5IAf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7gzA0HCkMCBp5IAf .rough-node .label text,#mermaid-svg-7gzA0HCkMCBp5IAf .node .label text,#mermaid-svg-7gzA0HCkMCBp5IAf .image-shape .label,#mermaid-svg-7gzA0HCkMCBp5IAf .icon-shape .label{text-anchor:middle;}#mermaid-svg-7gzA0HCkMCBp5IAf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7gzA0HCkMCBp5IAf .rough-node .label,#mermaid-svg-7gzA0HCkMCBp5IAf .node .label,#mermaid-svg-7gzA0HCkMCBp5IAf .image-shape .label,#mermaid-svg-7gzA0HCkMCBp5IAf .icon-shape .label{text-align:center;}#mermaid-svg-7gzA0HCkMCBp5IAf .node.clickable{cursor:pointer;}#mermaid-svg-7gzA0HCkMCBp5IAf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7gzA0HCkMCBp5IAf .arrowheadPath{fill:#333333;}#mermaid-svg-7gzA0HCkMCBp5IAf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7gzA0HCkMCBp5IAf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7gzA0HCkMCBp5IAf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7gzA0HCkMCBp5IAf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7gzA0HCkMCBp5IAf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7gzA0HCkMCBp5IAf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7gzA0HCkMCBp5IAf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7gzA0HCkMCBp5IAf .cluster text{fill:#333;}#mermaid-svg-7gzA0HCkMCBp5IAf .cluster span{color:#333;}#mermaid-svg-7gzA0HCkMCBp5IAf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7gzA0HCkMCBp5IAf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7gzA0HCkMCBp5IAf rect.text{fill:none;stroke-width:0;}#mermaid-svg-7gzA0HCkMCBp5IAf .icon-shape,#mermaid-svg-7gzA0HCkMCBp5IAf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7gzA0HCkMCBp5IAf .icon-shape p,#mermaid-svg-7gzA0HCkMCBp5IAf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7gzA0HCkMCBp5IAf .icon-shape .label rect,#mermaid-svg-7gzA0HCkMCBp5IAf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7gzA0HCkMCBp5IAf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7gzA0HCkMCBp5IAf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7gzA0HCkMCBp5IAf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 开发者 / AI Engineer
Vibe Coding
AI IDE / 编程助手
生成 / 修改 / 解释 / 重构代码
人工审查
测试与验证
发布 / 部署
AI 产品
需求理解 / 架构设计
离线评估 / 回归评估
线上反馈 / 监控数据
二、先建立整体认知
AI 应用不是简单地把用户问题转发给模型。一个可用的 AI 产品通常需要处理模型选择、上下文组织、知识检索、工具调用、权限控制、人工确认、日志监控和效果评估。
更准确地说:
text
AI Engineer 以 LLM 或 SLM 为能力核心,
用 Prompt 和 Context Engineering 控制输入,
用 RAG 连接外部知识,
用 Agent 和 Tools 执行多步骤任务,
用 Guardrails 控制安全边界,
用 Human-in-the-loop 控制高风险环节,
用 Evaluation 持续衡量和优化效果,
用 Observability 追踪线上质量、成本和故障,
用 Vibe Coding 提升开发效率。
三、核心名词解释
1. AI Engineer
AI Engineer 是把模型能力工程化、产品化的人。
这个角色通常不从零训练基础大模型,而是负责把模型、数据、工具、业务流程和用户体验组合成稳定可用的 AI 系统。
AI Engineer 需要理解:
- 模型能力边界:什么适合交给模型,什么不适合;
- Prompt 与上下文:如何让模型获得正确输入;
- RAG:如何把私有知识接入模型;
- Agent 与工具调用:如何让 AI 执行任务;
- 评估与监控:如何判断 AI 系统是否真的有效;
- 安全与合规:如何处理权限、隐私、越权访问和高风险操作。
- 可观测性:如何追踪一次 AI 请求从输入、检索、工具调用到输出的完整链路。
对工程师来说,AI Engineer 最现实的切入点是 AI 应用开发,而不是模型训练。
2. LLM
LLM 是 Large Language Model,大语言模型,例如 GPT、Claude、Gemini、Llama、Qwen、DeepSeek 等。
LLM 擅长理解和生成语言,也能完成总结、翻译、代码生成、信息抽取、文档问答、结构化输出和任务推理。
但 LLM 不是可靠数据库,也不是自动执行系统。它可能不知道私有数据,可能产生幻觉,也可能因为上下文不足给出错误答案。即使模型支持工具调用,真正的执行仍然依赖外部系统、权限控制和工程编排。
因此,生产级 AI 应用通常不会只依赖一次 LLM 调用,而会结合 RAG、工具调用、人工确认和评估体系。
3. SLM
SLM 是 Small Language Model,小语言模型。
SLM 通常更小、更快、更便宜,也更容易本地部署。它不一定适合复杂推理,但适合明确、固定、低成本或低延迟任务,例如意图识别、文本分类、简单问答、内容审核、边缘设备推理和企业内网部署。
简单理解:
text
LLM:泛化能力强,适合复杂任务,成本和延迟更高。
SLM:成本低、速度快,适合边界清晰的任务。
现代 AI 系统里,LLM 和 SLM 可以组合使用:复杂任务交给 LLM,简单判断或本地隐私任务交给 SLM。
选择模型时,不应只看"模型强不强",还要看任务复杂度、上下文长度、响应延迟、调用成本、结构化输出能力、工具调用能力、部署环境、数据隐私和吞吐量要求。生产系统里常见做法是按任务分层:高复杂度任务使用强模型,简单分类、路由、改写、审核任务使用更便宜或更快的模型。
4. Prompt
Prompt 是给模型的输入指令。它不只是用户输入的一句话,还可能包含角色、任务、约束、上下文、输出格式和示例。
一个 Prompt 通常回答这些问题:
- 模型应该扮演什么角色;
- 当前任务是什么;
- 可参考的信息有哪些;
- 有哪些限制和安全要求;
- 输出应该是什么格式。
示例:
text
你是一个资深代码审查助手。
请审查以下 TypeScript 模块,重点检查边界条件、性能、可维护性和类型安全。
请按照"严重问题 / 一般问题 / 优化建议"的结构输出。
Prompt 可以影响模型行为,但不能替代数据、权限、评估和业务逻辑。
5. Prompt Engineering
Prompt Engineering 是系统性地设计、测试和优化 Prompt。
它关注如何通过输入设计提高输出稳定性,例如明确角色、拆解任务、提供示例、约束输出格式、要求引用来源、使用结构化输出或 JSON Schema。
需要注意的是,Prompt Engineering 不是"玄学咒语",也不是 AI 工程的全部。复杂系统更依赖上下文工程、数据质量、检索质量、工具边界和评估闭环。
6. Context Engineering
Context Engineering 是上下文工程,关注模型在生成答案前应该看到什么信息、以什么顺序看到、看到多少,以及哪些信息不应该进入上下文。
上下文可能包括:
- 用户当前问题;
- 历史对话;
- 用户身份与权限;
- 业务数据;
- RAG 检索结果;
- 工具调用结果;
- 系统规则;
- 输出格式约束。
对工程师来说,可以把 Context 类比为应用状态。软件模块的行为依赖配置、状态、接口数据和运行环境;模型输出依赖 Prompt、用户输入、历史消息、检索结果和工具结果。
上下文工程是 AI 应用稳定性的核心之一。很多"模型答错"的问题,本质上是上下文给错、给少、给多或排序不合理。
7. Embeddings
Embeddings 是向量嵌入,用一组数字表示文本、代码、图片等内容的语义特征。
例如下面几句话字面不同,但语义接近:
text
系统接口响应慢如何排查?
服务延迟过高应该怎么优化?
如何降低请求耗时和提升吞吐量?
通过 Embedding 模型转换后,它们在向量空间中的距离会更近。这样系统就可以做语义搜索,而不是只依赖关键词匹配。
Embeddings 常用于语义搜索、RAG、代码搜索、推荐、聚类和去重。
8. 向量索引与向量数据库
向量数据库用于存储和检索 Embeddings,常见选择包括 FAISS、Chroma、Milvus、Pinecone、Weaviate、pgvector 等。
严格来说,RAG 不一定必须使用"向量数据库"。小规模场景可能只需要本地向量索引;复杂场景也可能使用关键词检索、向量检索、混合检索、知识图谱或数据库查询组合。
向量数据库解决的是"如何快速找到语义相关内容"的问题,但它不是 RAG 质量的全部。文档切分、元数据、权限过滤、重排序和评估同样重要。
9. RAG
RAG 是 Retrieval-Augmented Generation,检索增强生成。
它的目标是让模型在回答前先拿到外部知识,减少"凭空编造",并让答案可以基于可追溯的资料。
RAG 通常分为两个阶段。
离线索引阶段:
- 收集和清洗文档;
- 将文档切分成适合检索的片段;
- 提取标题、来源、权限、时间等元数据;
- 建立关键词索引、向量索引或混合索引。
在线检索阶段:
- 接收用户问题;
- 必要时进行查询改写;
- 从索引或数据库中检索候选内容;
- 对结果进行权限过滤、去重、重排;
- 把可信资料注入上下文;
- 让模型基于资料生成回答,并尽量给出引用来源。
核心公式:
text
用户问题 + 检索资料 + 上下文组织 + 模型生成 = 更可靠的回答
RAG 适合企业知识库、产品文档助手、客服机器人、内部制度查询、合同分析和代码库问答。
RAG 的难点不是"接一个向量库",而是检索质量、文档结构、权限控制、引用准确性和评估体系。
10. Retriever
Retriever 是检索器,负责从知识库、数据库或搜索索引中找到与用户问题相关的内容。
一个好的 Retriever 通常不只做向量搜索,还可能组合:
- 关键词检索;
- 向量检索;
- 混合检索;
- 元数据过滤;
- 权限过滤;
- 查询改写;
- 重排序。
在 RAG 中,检索质量决定回答上限。模型只能基于拿到的上下文回答,如果检索内容错了,回答也很容易错。
11. Agent
Agent 是能围绕目标进行多步骤处理的 AI 系统。它通常会结合模型、工具、状态和控制逻辑。
普通模型调用是:
text
用户输入 -> 模型输出
Agent 更接近:
text
目标 -> 规划 -> 调用工具 -> 观察结果 -> 调整下一步 -> 输出结果
不过 Agent 不是一个严格统一的技术标准。不同团队对 Agent 的定义不同:有的强调自主规划,有的强调工具调用,有的强调长任务执行和状态管理。
Agent 的关键挑战包括任务边界、工具选择、错误恢复、权限控制、成本控制、防止循环和人工确认。
需要注意:不是所有 AI 应用都需要 Agent。如果业务流程清晰、步骤固定、风险较高,通常更适合使用确定性的工作流,把 LLM 作为其中一个节点,而不是让模型自由规划。Agent 更适合目标明确但步骤不完全固定、需要多轮观察和工具调用的场景。
12. Tools / Tool Calling
Tools 是模型或 Agent 可调用的外部能力,例如搜索、数据库、文件系统、业务 API、浏览器、代码执行器、GitHub、Jira、Slack 等。
Tool Calling 让 AI 可以从"生成文本"扩展到"读取信息或执行操作"。但模型通常只是决定调用哪个工具、传什么参数;真正的执行、权限、安全和审计仍然由工程系统负责。
高风险工具必须有保护措施,例如参数校验、权限校验、操作日志、限流、回滚方案和人工确认。
13. Memory / State
Memory 是记忆,State 是状态。它们用于保存对话历史、用户偏好、任务进度、工具调用结果和中间分析。
需要区分两类信息:
- 短期状态:当前对话、当前任务步骤、工具返回结果;
- 长期记忆:用户偏好、项目背景、历史经验。
长期记忆不是越多越好。它涉及隐私、授权、过期、删除和错误记忆污染。生产系统需要明确"记什么、为什么记、记多久、如何删除"。
14. Guardrails / Safety
Guardrails 是 AI 系统中的安全护栏,用来限制模型输入、输出和工具调用的风险。
常见 Guardrails 包括:
- 输入检查:识别 prompt injection、越权请求、恶意指令;
- 权限控制:确保用户只能检索和操作自己有权限的数据;
- 输出检查:过滤敏感信息、违规内容、危险建议和不合规表达;
- 工具保护:限制可调用工具、校验参数、阻止高风险操作;
- 结构校验:验证 JSON、schema、类型和必填字段;
- 人工确认:在删除、支付、提交代码、发送消息等操作前要求确认。
Guardrails 不是单一工具,而是一组工程策略。它应该贯穿模型调用前、检索阶段、工具调用阶段和输出返回前。
15. Human-in-the-loop
Human-in-the-loop 是人在环路中,指在 AI 系统关键节点引入人工确认、审核、修正或接管。
常见场景包括:
- AI 发送邮件、提交代码、执行支付、删除数据前需要确认;
- AI 输出医疗、法律、金融等高风险建议前需要专家审核;
- AI 不确定或置信度不足时转人工;
- 人工修正 AI 输出并形成反馈数据。
Human-in-the-loop 的价值是降低风险、提升信任,并把真实反馈带回评估和优化流程。
16. Evaluation
Evaluation 是评估体系,用来判断 AI 系统是否真的有效。
AI 输出具有不确定性,不能只依赖传统单元测试。评估通常关注:
- 答案是否正确;
- 是否基于检索资料;
- 是否有幻觉;
- 是否符合格式;
- 是否符合业务规则;
- 是否安全;
- 响应速度和成本是否可接受;
- 用户是否满意。
常见方法包括人工评估、黄金数据集、自动评分、LLM-as-a-Judge、A/B 测试、用户反馈、日志分析、检索召回率和引用准确率评估。
评估结果应该反向优化 Prompt、Context、RAG、Retriever、Agent 和产品交互。
工程上可以把 Evaluation 分成几类:
- 离线评估:用固定测试集评估 Prompt、模型、RAG 和 Agent 变更;
- 在线评估:通过用户反馈、转化率、人工接管率和线上日志观察真实效果;
- 检索评估:关注召回率、命中率、重排质量和引用准确性;
- 生成评估:关注正确性、完整性、格式、幻觉、安全和语气;
- 回归评估:每次更换模型、Prompt、索引或工具逻辑后,确认旧问题没有被重新引入。
没有 Evaluation 的 AI 应用很难稳定迭代,因为你无法判断一次修改到底是变好还是变差。
17. Observability
Observability 是可观测性,用来追踪 AI 系统运行时发生了什么。
生产级 AI 应用至少应该记录:
- 请求 ID 和用户会话;
- 使用的模型、Prompt 版本和参数;
- 检索命中的文档、分数和引用来源;
- 工具调用的输入、输出、耗时和错误;
- token 使用量、成本和延迟;
- Guardrails 拦截记录;
- 用户反馈和人工接管记录;
- Evaluation 结果。
可观测性的价值是定位问题、控制成本、分析质量、复现线上故障,并为后续优化提供依据。没有日志和 trace,AI 系统出现错误时往往很难判断是模型问题、检索问题、上下文问题还是工具问题。
18. AI 输出与产品体验
AI 输出不只是模型生成的一段文字,也可能是代码、JSON、表格、摘要、建议、任务执行结果或可编辑草稿。
AI 产品需要特别关注:
- 流式输出;
- 停止生成;
- 重新生成;
- 引用来源;
- 复制和编辑;
- 用户反馈;
- 人工接管;
- 错误恢复;
- 版本对比;
- trace id 展示;
- 请求取消和超时处理;
- 消息状态机;
- 重试和降级;
- 错误边界;
- SSE、WebSocket 或流式接口处理。
这正是工程师转 AI Engineer 的优势:你不仅理解模型输出,还能把输出设计成用户能理解、能控制、能信任的交互。
19. Vibe Coding
Vibe Coding 是一种借助 AI 编程助手进行开发的方式。开发者用自然语言描述目标,AI 辅助生成、修改、解释和重构代码,开发者负责审查、验证和决策。
典型流程:
text
描述需求 -> AI 生成方案或代码 -> 人工审查 -> 运行测试 -> 继续迭代 -> 上线
Vibe Coding 可以提高开发效率,尤其适合原型开发、代码解释、样板代码生成、Prompt 草稿、RAG 流程搭建、Agent 工具定义、测试用例和文档整理。
但它不是 AI 应用运行时的一部分,也不等于"不懂代码也能开发"。越是复杂系统,越需要开发者具备架构判断、测试意识、安全意识和代码审查能力。
Vibe Coding 的常见风险包括:
- 生成不存在或不适合当前项目的 API;
- 引入过度抽象;
- 忽略边界条件;
- 缺少测试;
- 误读上下文;
- 引入安全漏洞;
- 生成看似合理但实际不可维护的代码。
因此,Vibe Coding 更适合作为效率放大器,而不是质量保证器。开发者仍然要负责需求拆解、架构判断、代码审查、测试验证和上线风险。
四、工程师如何迁移理解
可以用软件工程经验这样类比:
- Prompt:类似组件或业务逻辑的行为说明;
- Context:类似 props、state、store、接口数据和路由参数;
- RAG:类似带语义检索能力的数据查询层;
- Embeddings:类似语义索引;
- Agent:类似可调用多个 API 的自动化工作流;
- Tools:类似外部接口和系统能力;
- Human-in-the-loop:类似确认弹窗、审批流和人工接管;
- Guardrails:类似权限校验、表单校验、安全拦截和操作保护;
- Evaluation:类似测试、监控、埋点和质量分析;
- Observability:类似日志、性能监控、链路追踪和错误排查;
- Vibe Coding:类似 AI 结对编程。
工程师的优势在于理解用户体验、状态管理、异步请求、错误处理和产品落地。这些能力在 AI 应用中同样重要。
五、建议学习路线
从软件工程转 AI Engineer,可以按下面顺序学习:
- LLM API:messages、system prompt、streaming、structured output、tool calling。
- Prompt 与 Context:角色、任务、约束、上下文压缩、历史消息管理。
- Embeddings 与 RAG:文档切分、索引、混合检索、重排序、引用来源。
- Agent 与 Tools:工具定义、任务状态、错误恢复、权限控制、人工确认。
- Guardrails:prompt injection 防护、权限过滤、参数校验、敏感信息保护。
- AI 产品体验:流式输出、停止生成、重试、反馈、引用展示、可编辑输出。
- Evaluation:测试集、人工评分、自动评分、幻觉检测、召回率、回归评估。
- Observability:日志、trace、token 成本、延迟、工具调用链路、错误分析。
- 工程化:缓存、限流、模型降级、安全策略、隐私保护、发布回滚。
六、总结
AI Engineer 的核心不是"会问模型问题",而是"把模型能力变成稳定、可控、可评估的产品能力"。
Prompt、Context、RAG、Embeddings、Agent、Tools、Guardrails、Human-in-the-loop、Evaluation 和 Observability 构成 AI 应用工程的主要模块。Vibe Coding 是开发这些模块时的 AI 辅助开发方式。
对工程师来说,最现实的转型方向是:
text
AI 产品交互
+ LLM API
+ Prompt / Context Engineering
+ RAG
+ Agent / Tool Calling
+ Guardrails / Safety
+ Evaluation
+ Observability
+ 工程化能力
这条路线能最大程度复用已有工程经验,也最贴近真实业务中的 AI 应用开发。