先聊一个现象。最近做企业级 AI 项目落地时,很多团队并不是卡在模型选型上,而是卡在“模型什么都懂,却解决不了业务实际问题”这个环节。大模型生成的答案看起来逻辑完整,放到真实业务流程里却很难直接用;推理能力很强,但缺少事实依据和上下文约束。与此同时,FDE 这个词在 AI 应用圈迅速升温,从 Palantir 的 AIP 产品实践,到腾讯研究院发布的《FDE 模式行业观察与实践》,再到各类 FDE 培训、FDE 工程师岗位,都指向一种新的工程方法论:从模型能力驱动转向事实与价值驱动。
如果你也在做 AI Agent、企业知识库、AI 应用开发,或者正在摸索大模型从 Demo 到生产的路径,本文会围绕 FDE 的核心理念、落地流程、代码示例和常见坑位展开,帮助你把 FDE 这套思路真正落到项目里。
1. FDE 是什么:从热词到工程方法论
1.1 一个热词背后的两种含义
FDE 在 AI 圈子里现在有两种常见的指代,需要先区分清楚。
一种是Forward Deployed Engineer,即“前线部署工程师”。这个词最早由 Palantir 带火,指的是驻扎在客户现场、直接理解业务需求并把平台能力转化成业务价值的工程师。这类工程师既要懂产品、懂行业,又要懂数据、懂工程,是连接“技术能力”和“业务场景”的关键角色。
另一种是Fact-Driven Engineering,即“事实驱动工程”。它强调软件开发和 AI 应用都应该以事实、数据、可验证的证据作为决策依据,而不是依赖直觉、拍脑袋或者模型幻觉。腾讯研究院在《FDE 模式行业观察与实践》中讨论的 FDE,更接近这种“面向语意的事实方法论”。
结合当前 AI 应用落地的背景,我认为更值得工程团队关注的是后者,以及前者背后共同指向的核心理念:让 AI 系统的每一个输出都有事实基础,让每一次模型调用都能对应上明确的业务价值。
1.2 FDE 要解决什么问题
过去一年,很多团队在尝试大模型应用时都会遇到几个典型问题:
- 模型回答“看起来合理”,但关键数据是编造的;
- 本地知识库接入后,检索结果不准确,导致回答质量不稳定;
- Prompt 调优只能在测试集上提升,到了线上环境指标立刻下降;
- 生成式 AI 做了不少功能,却没有一个能真正提升业务效率;
- 业务方和算法团队各说各话,需求评审会开了一轮又一轮,上线后依然无人使用。
FDE 的方法论想解决的,正是这些问题。它要求团队在开发 AI 功能之前,先定义好“事实是什么”和“价值是什么”,再选择模型方案。它强调用工程化手段把大模型变成可验证、可度量、可迭代的业务组件,而不是一个输出不可控的黑盒。
1.3 FDE 的核心工作方式
用一句话概括 FDE 模式:
站在业务现场,基于事实数据,通过快速迭代交付 AI 能力,并持续验证业务价值。
在实际项目中,FDE 模式通常包含以下特征:
| 特征 | 传统 AI 项目 | FDE 模式 |
|---|---|---|
| 起点 | 先选模型,再找场景 | 先定义业务问题与事实数据 |
| 输出 | 模型 API、指标报告 | 可运行的业务流程 + 可验证的业务结果 |
| 验证方式 | 离线评测集 | 线上业务指标 + 用户反馈闭环 |
| 团队角色 | 算法、后端、产品分头推进 | 工程师驻场,端到端负责价值交付 |
| 迭代速度 | 以周/月为单位 | 以天为单位,小步快跑 |
从这个表格能看出来,FDE 并不是一个“新算法”,也不是一个新的框架,而是一套更贴近业务价值的 AI 工程组织方式和落地流程。
1.4 为什么是现在火了
FDE 能火,很大程度是因为 AI 应用进入深水区。
早期大模型应用集中在文本生成、对话、摘要这些通用场景,模型本身的能力就够用。但现在大家开始做企业知识库、智能客服、AI Agent、行业决策辅助这类场景,模型只是其中一环。前面要接数据治理和知识工程,后面要接业务流程和决策闭环,旁边还要做好安全、权限和审计。这时候,单纯钻研模型已经不够,真正稀缺的是能把模型、数据、业务串起来的人才和方法。
Palantir 的 AIP(Artificial Intelligence Platform)产品可以作为一个参照。它的核心逻辑不是卖一个“更聪明的模型”,而是把模型接入客户自己的工作流,在真实的业务上下文里做决策辅助。这种产品和服务的交付方式,天然需要 FDE 这类角色。
所以 FDE 火起来,本质上反映了一个趋势:AI 竞争的焦点正在从“谁的模型更强”转向“谁能把模型用出真实业务价值”。
2. FDE 方法论核心:面向事实的 AI 工程原则
2.1 从“模型说什么”到“事实支撑什么”
在传统开发里,函数的输入输出是确定的,逻辑是显式的。但大模型不一样,它是概率生成,同一个 Prompt 可能输出不同结果。这意味着,如果我们把模型当成普通的函数直接接进业务流程,风险很高。
FDE 的原则是:任何模型输出都必须有事实支撑。具体来说,需要做到三件事:
- 明确回答所依赖的事实来源是什么(数据库、文档、实时接口、用户输入);
- 对模型输出做事实校验,无法通过校验的结果不能被业务直接使用;
- 当事实与模型输出冲突时,以事实为准,而不是以模型生成内容为准。
2.2 建立事实分层体系
在 FDE 模式下,我们会把系统中的事实拆分成不同层级,便于管理和校验。
| 层级 | 事实类型 | 示例 | 校验方式 |
|---|---|---|---|
| L0 | 用户输入 | 用户提交的工单内容、表单字段 | 格式校验、必填校验 |
| L1 | 结构化数据 | 数据库中的订单、客户、库存记录 | SQL 查询结果比对 |
| L2 | 非结构化知识 | 产品文档、技术手册、操作指南 | 检索匹配度 + 引用溯源 |
| L3 | 推导结论 | 模型基于上述事实生成的判断 | 人工审核 + 交叉验证 |
在设计 AI 功能时,先给每个输入、中间结果、最终输出都打上事实层级标签。哪一层允许模型自由发挥,哪一层必须严格约束,在实现前就要想清楚。
2.3 以“可验证”为第一原则
FDE 强调,一个没有验证路径的 AI 功能,本质上只是“有 AI 的样子”。
在开发时,可以给自己提几个问题:
- 如果这个回答错了,我能在日志里定位到是哪一步导致的错误吗?
- 模型引用了一篇文档,用户能回看这篇原文吗?
- 有没有办法针对单次输出做自动校验?例如用规则校验、用 SQL 反查、用另一个模型做交叉评估?
- 业务方用什么指标来判断这个 AI 功能是否有效?
如果这些问题回答不上来,说明功能还停留在“演示阶段”,离生产可用还有距离。
2.4 案例:一个智能问答的错误回答
来看一个典型场景。
假设我们正在做一个企业内部的运维知识库问答系统,用户问:“生产环境的 Redis 连接超时了,应该怎么排查?”
模型可能回答:
建议检查 Redis 的 maxclients 配置,如果超过连接数上限,可以通过
CONFIG SET maxclients调整。
这个回答本身没有错,但它没有结合企业的真实环境。比如,企业实际使用的是什么云数据库,是否允许动态修改配置,是否有网络白名单限制,监控平台上有什么具体告警。如果模型只是根据通用知识作答,这就不符合 FDE 原则。
FDE 模式下的回答应该像这样:
根据贵公司运维手册《Redis 故障排查指南》第 4.2 节,Redis 连接超时通常由三类原因引起:客户端连接数超限、网络策略拦截、慢查询阻塞。您当前环境最近 1 小时连接数已超过 maxclients 阈值的 80%,建议优先检查连接池配置。参考文档:运维手册第 128 页;相关异常日志:2025-06-01 14:30:22。
两者相比,后者虽然实现成本更高,但真正能帮助用户解决问题。
3. FDE 工程落地:完整流程与代码实战
接下来通过一个简化但不失真实性的案例,演示 FDE 模式下的 AI 应用开发流程。我们会构建一个“基于企业知识库的智能问答 + 事实校验”系统,使用 Python 实现,模拟 FDE 从业务定义到代码落地的完整路径。
3.1 项目结构
为了便于理解和扩展,我们把项目拆成清晰的分层结构:
fde-demo/ ├── data/ │ ├── docs/ # 原始知识文档 │ └── processed/ # 预处理后的知识库 ├── src/ │ ├── __init__.py │ ├── fact_source.py # 事实源管理 │ ├── retriever.py # 检索器 │ ├── validator.py # 事实校验器 │ ├── pipeline.py # 核心链路编排 │ └── config.py # 配置文件 ├── tests/ │ └── test_pipeline.py ├── requirements.txt └── README.md这里没有引入复杂的框架,重点是把 FDE 的流程用代码表达出来。实际生产项目可以在此基础上替换为 LangChain、LlamaIndex 或者自研流水线。
3.2 requirements.txt
openai>=1.0.0 pandas>=2.0.0 numpy>=1.24.0 pydantic>=2.0.0 python-dotenv>=1.0.0注意:示例代码以调用 OpenAI 兼容接口为例。如果你用的是阿里云百炼、DeepSeek、智谱或其他模型服务,只需要修改 base_url 和 model 名称即可。版本号请根据实际环境调整。
3.3 定义事实模型
在 FDE 模式下,第一步不是写 Prompt,而是定义“事实结构”。这里用 Pydantic 来管理。
# 文件路径:src/fact_source.py from pydantic import BaseModel, Field from typing import List, Dict, Any from enum import Enum class FactLevel(str, Enum): """事实层级""" L0_USER_INPUT = "user_input" L1_STRUCTURED = "structured_data" L2_DOCUMENT = "document" L3_DERIVED = "derived" class Fact(BaseModel): """一条事实""" fact_id: str = Field(..., description="事实唯一标识") content: str = Field(..., description="事实内容") source: str = Field(..., description="事实来源") level: FactLevel = Field(..., description="事实层级") meta: Dict[str, Any] = Field(default_factory=dict, description="附加元信息") class AnswerWithFacts(BaseModel): """带事实支撑的回答""" answer: str = Field(..., description="最终回答") facts: List[Fact] = Field(..., description="支撑该回答的事实列表") confidence: float = Field(..., description="置信度,范围 0-1") need_human_review: bool = Field(False, description="是否需要人工审核")这个结构保证了:最终返回的结果不仅仅是自然语言文本,还附带可追溯的事实列表。调用方可以根据 facts 里的 source 字段追查原文,也可以基于 confidence 判断是否直接展示给用户。
3.4 模拟知识库检索
为了演示整体流程,我们不引入复杂向量库,而是用一个内置文档集合模拟检索。实际项目可以替换为 Elasticsearch、Milvus、FAISS 或云向量数据库。
# 文件路径:src/retriever.py import json from typing import List, Tuple try: from .fact_source import Fact, FactLevel except ImportError: from fact_source import Fact, FactLevel class SimpleRetriever: """简化版检索器:基于关键词重叠度打分""" def __init__(self, docs_path: str): self.docs = self._load_docs(docs_path) def _load_docs(self, docs_path: str) -> List[Fact]: with open(docs_path, "r", encoding="utf-8") as f: raw_docs = json.load(f) facts = [] for idx, doc in enumerate(raw_docs): facts.append(Fact( fact_id=f"doc_{idx}", content=doc["content"], source=doc["source"], level=FactLevel.L2_DOCUMENT, meta={"title": doc.get("title", "")}, )) return facts @staticmethod def _score(query: str, document: str) -> float: """计算查询与文档的简单相关分""" query_words = set(query.lower().replace("?", "").replace("?", "").split()) doc_name = document.lower() hit = sum(1 for word in query_words if word in doc_name) return hit / max(len(query_words), 1) def retrieve(self, query: str, top_k: int = 3) -> List[Tuple[Fact, float]]: scored = [ (fact, self._score(query, fact.content)) for fact in self.docs ] scored.sort(key=lambda x: x[1], reverse=True) return scored[:top_k]这里的打分方法非常简单,只是用来演示流程。线上系统建议使用向量检索 + 关键词检索的混合召回策略,同时加入 rerank 模型提升排序质量。
3.5 编写事实校验器
事实校验是 FDE 的灵魂。校验器的职责包括:
- 检查模型输出中是否包含幻觉内容;
- 将模型输出中的关键信息与检索结果做比对;
- 无法通过校验时,拒绝生成或转人工。
# 文件路径:src/validator.py from typing import List, Dict try: from .fact_source import Fact, AnswerWithFacts except ImportError: from fact_source import Fact, AnswerWithFacts class FactValidator: """基于规则的校验器,用于演示""" def __init__(self, answer_result: AnswerWithFacts): self.answer_result = answer_result def validate(self) -> AnswerWithFacts: # 1. 必须有事实支撑 if not self.answer_result.facts: self.answer_result.need_human_review = True self.answer_result.confidence = 0.1 return self.answer_result # 2. 简单校验:回答长度与事实数量是否匹配 if len(self.answer_result.answer) < 10 and len(self.answer_result.facts) == 0: self.answer_result.need_human_review = True self.answer_result.confidence = 0.2 return self.answer_result # 3. 检查回答中是否包含事实来源中的关键词 # 这是非常极简的校验方式,生产环境应该使用更严谨的语义校验 fact_contents = " ".join([f.content for f in self.answer_result.facts]) key_points = [w for w in self.answer_result.answer.split() if len(w) >= 4] hit_count = sum(1 for k in key_points if k in fact_contents) hit_ratio = hit_count / max(len(key_points), 1) self.answer_result.confidence = hit_ratio if hit_ratio < 0.5: self.answer_result.need_human_review = True return self.answer_result这里我们用的是关键词覆盖度做校验,实用性有限。真实场景中,你可以采用以下更稳健的方案:
- 用大模型自身做“事实一致性打分”;
- 提取回答中的实体,与检索文档实体做对比;
- 对结构化数据类型,直接反查数据库。
3.6 核心 Pipeline 编排
接下来把整个流程串起来。Pipeline 是 FDE 代码架构的关键:它将检索、生成、校验、降级组合成一条稳定链路。
# 文件路径:src/pipeline.py import json import os from typing import Dict, Any try: from .retriever import SimpleRetriever from .validator import FactValidator from .fact_source import Fact, AnswerWithFacts, FactLevel except ImportError: from retriever import SimpleRetriever from validator import FactValidator from fact_source import Fact, AnswerWithFacts, FactLevel from openai import OpenAI class FDEPipeline: """ FDE 核心链路: 1. 接收用户问题 2. 检索事实 3. 基于事实生成回答 4. 校验回答 5. 输出结果 """ def __init__(self, docs_path: str, config: Dict[str, Any]): self.retriever = SimpleRetriever(docs_path) self.client = OpenAI( api_key=config.get("api_key", os.getenv("OPENAI_API_KEY")), base_url=config.get("base_url", "https://api.openai.com/v1"), ) self.model_name = config.get("model", "gpt-4o-mini") def _build_prompt(self, query: str, facts: list) -> str: """ 构造 Prompt,强制模型只基于给定事实回答 """ fact_lines = [] for idx, (fact, score) in enumerate(facts): fact_lines.append( f"[{idx}] 来源: {fact.source}\n" f"内容: {fact.content}\n" f"相关度: {score:.2f}" ) facts_text = "\n\n".join(fact_lines) prompt = f"""你是企业知识库助手,请严格依据给定事实回答用户问题。 ## 已知事实 {facts_text} ## 回答要求 1. 只能基于以上事实回答,禁止编造事实; 2. 如果事实中没有答案,直接回答"根据当前知识库,无法回答该问题"; 3. 回答时请引用对应事实编号,例如 [0]; 4. 保持简洁,不要输出多余内容。 ## 用户问题 {query} """ return prompt def run(self, query: str) -> AnswerWithFacts: # Step 1: 检索事实 retrieved_facts = self.retriever.retrieve(query, top_k=3) # Step 2: 生成回答 if not retrieved_facts: return AnswerWithFacts( answer="根据当前知识库,无法回答该问题。", facts=[], confidence=0.0, need_human_review=True, ) prompt = self._build_prompt(query, retrieved_facts) response = self.client.chat.completions.create( model=self.model_name, messages=[ {"role": "system", "content": "你是一个严格基于事实回答的助手。"}, {"role": "user", "content": prompt}, ], temperature=0.1, ) answer_text = response.choices[0].message.content # 将检索到的事实附加到回答结构中 answer = AnswerWithFacts( answer=answer_text, facts=[fact for fact, _ in retrieved_facts], confidence=1.0, need_human_review=False, ) # Step 3: 校验 validator = FactValidator(answer) validated_answer = validator.validate() return validated_answer这里的核心思想是:生成不是自由的,而是被检索结果约束的。即使模型自己知道更多信息,我们也不让它越界发挥。
3.7 模拟知识库数据
创建知识库文档,模拟企业内部运维手册内容。
// 文件路径:data/docs/knowledge_base.json [ { "title": "Redis 连接超时排查手册", "source": "运维知识库/Redis 故障排查指南 4.2 节", "content": "Redis 连接超时通常由客户端连接数超限、网络策略拦截、慢查询阻塞三类原因引起。" }, { "title": "Redis 连接池配置建议", "source": "运维知识库/性能优化规范", "content": "生产环境建议设置 maxclients 为 10000,并合理配置客户端连接池大小。" }, { "title": "网络白名单管理说明", "source": "安全中心/网络策略管理", "content": "跨环境访问 Redis 必须提前配置安全组白名单,否则会出现连接超时。" }, { "title": "Kafka 消费延迟排查", "source": "运维知识库/消息队列专题", "content": "Kafka 消费延迟可以从消费者组状态、分区分配、消费速度三方面排查。" } ]3.8 编写主程序入口
# 文件路径:main.py import json from src.pipeline import FDEPipeline def main(): config = { "api_key": "your-api-key", # 替换为你的 API Key "base_url": "https://api.openai.com/v1", "model": "gpt-4o-mini", } pipeline = FDEPipeline( docs_path="data/docs/knowledge_base.json", config=config, ) question = "Redis连接超时怎么办" result = pipeline.run(question) print("=== 回答 ===") print(result.answer) print("\n=== 支撑事实 ===") for fact in result.facts: print(f"- {fact.source}: {fact.content}") print(f"\n=== 置信度: {result.confidence:.2f} ===") print(f"=== 需要人工审核: {result.need_human_review} ===") if __name__ == "__main__": main()运行后,预期输出大致如下:
=== 回答 === 根据运维知识库《Redis 故障排查指南》4.2 节,Redis 连接超时通常由客户端连接数超限、网络策略拦截、慢查询阻塞三类原因引起。[0] 建议检查当前连接数是否达到 maxclients 上限,并确认安全组白名单是否已配置。[2] === 支撑事实 === - 运维知识库/Redis 故障排查指南 4.2 节: Redis 连接超时通常由客户端连接数超限、网络策略拦截、慢查询阻塞三类原因引起。 - 运维知识库/性能优化规范: 生产环境建议设置 maxclients 为 10000,并合理配置客户端连接池大小。 - 安全中心/网络策略管理: 跨环境访问 Redis 必须提前配置安全组白名单,否则会出现连接超时。 === 置信度: 0.80 === === 需要人工审核: false ===3.9 一个更完整的验证思路
上面的置信度计算比较简单,实际工程中可以引入一个“评估模型”对生成结果打分。
常见的做法是,在生成后用另一个 Prompt 让模型判断“回答是否完全基于给定事实”。示例如下:
def evaluate_answer_with_llm(self, query: str, answer: str, facts: list) -> float: """ 用 LLM 评估回答与事实的一致性,返回 0-1 分数 """ fact_text = "\n".join([f.content for f in facts]) eval_prompt = f"""请判断以下回答是否完全基于给定事实生成。 ## 给定事实 {fact_text} ## 用户问题 {query} ## 模型回答 {answer} 请输出一个 JSON,格式为: {{"score": 0.0, "reason": "简短说明"}} score 取值 0-1,1 表示完全基于事实,0 表示严重幻觉。""" response = self.client.chat.completions.create( model=self.model_name, messages=[{"role": "user", "content": eval_prompt}], temperature=0.0, response_format={"type": "json_object"}, ) try: result = json.loads(response.choices[0].message.content) return float(result.get("score", 0.0)) except Exception: return 0.0这种“用模型评估模型”的方式虽然不能保证百分之百准确,但配合规则校验、人工抽检,可以形成可落地的质量保障体系。
4. 从 Demo 到生产:FDE 落地时的关键模块
4.1 事实数据治理
FDE 项目里,最花时间的往往不是模型调用,而是数据治理。
在进入开发前,需要完成以下工作:
- 盘点业务涉及的数据源,包括数据库、接口、文档、表格等;
- 清洗数据,去除重复、过期、错误内容;
- 建立知识文档的版本管理,避免模型引用旧版本;
- 对敏感信息做脱敏,并设计权限边界;
- 为重要事实建立唯一标识,方便追溯和审计。
如果企业已经有完善的知识管理系统,可以直接对接;如果没有,FDE 工程师的第一个任务往往就是帮业务方梳理数据资产。
4.2 检索增强生成
检索增强生成是 FDE 落地的技术底座。
在实现 RAG 系统时,有几个容易被忽略的细节:
| 环节 | 常见问题 | 建议 |
|---|---|---|
| 文档切分 | 切得太碎丢失上下文,切得太大检索不准 | 按章节切分,保留标题层级信息 |
| 向量化 | 选用新模型,但 embedding 版本未对齐 | 确保入库和查询使用同一个 embedding 模型 |
| 检索召回 | 只依赖向量相似度,同义词效果差 | 增加关键词检索做混合召回 |
| 排序 | top_k 固定,无法适配不同问题类型 | 引入 rerank 模型动态调整 |
| 引用溯源 | 用户不知道答案来自哪里 | 返回事实列表,带原始链接和页码 |
4.3 模型输出约束
让模型严格基于事实输出,不只是靠 Prompt,还需要工程手段配合。
常用的方法包括:
- 结构化输出:使用 Pydantic 或 JSON Schema 约束输出格式,方便下游解析;
- 低温度采样:在知识库问答场景,temperature 建议设置为 0.0~0.2,减少随机性;
- Few-shot 示例:在 Prompt 中提供符合业务要求的输入输出示例;
- 输出后校验:对关键字段做正则、枚举、SQL 反查等校验,不合格时直接拦截。
4.4 人机协同与降级机制
FDE 强调“事实驱动”,也就意味着系统要承认自己能力的边界。生产环境必须设计降级机制:
- 当检索结果不足时,拒绝回答,而不是强行生成;
- 当置信度低于阈值时,进入人工审核队列;
- 当用户连续追问但知识库中缺少相关信息时,应引导用户联系人工支持;
- 重要业务场景保留“人审后发布”的环节。
5. FDE 常见问题与排查思路
5.1 模型回答出现幻觉
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 回答内容不在知识库中 | 检索召回不准确,模型被链路外知识影响 | 检查检索内容、提高 top_k、增加 rerank |
| 回答内容与知识库冲突 | Prompt 约束不足 | 在 Prompt 中强调“只能基于事实”,并且严格拒绝无关问题 |
| 回答内容看似合理但数据错误 | 模型对数字敏感度低 | 对数字型回答做规则校验,或直接结构化查询 |
5.2 知识库检索不到内容
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 用户问题表述与文档不一致 | 缺少同义词扩展 | 引入混合检索或查询改写模块 |
| 文档切分后语义断裂 | 切分策略不合理 | 按章节切分,保留上下文信息 |
| 新文档入库后检索不到 | 索引未更新或向量未同步 | 检查 embedding 版本入库一致性 |
5.3 线上效果不如测试集
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 测试集准确率高,线上回答差 | 测试集覆盖有限 | 建立线上回流样本,定期构建评测集 |
| 线下评测与线上指标不一致 | 评测口径不同 | 统一评测标准,使用与业务指标一致的评估方法 |
| 新模型上线后效果回退 | 模型版本变化 | 上线前用固定评测集回归测试 |
5.4 业务方不认可 AI 功能价值
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 功能上线了但没人用 | 没有嵌入真实工作流 | 调整交互入口,减少使用成本 |
| 效果指标无法衡量 | 没有定义业务指标 | 与业务方共同确定可量化指标 |
| 回答需要人工二次修改 | 模型输出与业务规范有差异 | 引入业务规则约束,增加后处理环节 |
6. FDE 工程师需要具备的能力
FDE 模式的出现,让“AI 应用工程师”这个角色的能力模型变得更加清晰。
6.1 技术能力
- 熟悉大模型 API 调用与 Prompt 工程;
- 掌握 RAG 相关组件,包括向量库、embedding、rerank;
- 具备后端开发能力,能独立完成接口开发与部署;
- 了解基本的数据工程,包括 SQL、ETL、数据清洗;
- 掌握模型评测方法,能构建离线评测集和线上监控。
6.2 业务理解能力
- 能快速理解行业术语和业务流程;
- 能与业务方共同定义问题,而不是等需求文档;
- 能将业务指标转化为技术指标;
- 具备项目沟通能力,能管理干系人预期。
6.3 交付与迭代能力
FDE 强调小步快跑。一个 FDE 工程师通常会在两周内完成一个从问题定义到可用 Demo 的闭环,再用数周时间迭代到生产可用。这要求工程师具备很强的结果导向意识,不能陷入“研究模型”而不是“解决问题”的节奏。
7. 如何在现有团队中推行 FDE 模式
不是每个团队都有条件设置专职的 FDE 岗位,但可以把 FDE 的方法论融入现有研发流程中。
7.1 在项目启动阶段引入事实定义
传统 AI 项目启动时,团队会花大量时间讨论模型选型和架构。FDE 模式要求增加一个环节:事实梳理工作坊。
这个工作坊需要业务方、工程师、数据负责人一起参与,产出以下内容:
- 业务问题清单;
- 每个问题对应的事实来源;
- 事实质量评估结果;
- 可量化的业务指标;
- 上线后的验证计划。
7.2 建立“事实-模型-业务”三层评审
在需求评审时,不要只问“这个功能怎么实现”,还要问:
- 这个功能依赖哪些事实?
- 事实目前是否可得?质量如何?
- 模型输出错误时,业务影响是什么?
- 有没有办法自动校验?
- 业务方如何感知到价值?
7.3 建设回流评测集
FDE 模式下的模型评测不能停留在一次性测试集上。更推荐的做法是:
- 从线上日志中抽样用户真实问题;
- 对每个问题标注标准答案和事实来源;
- 每次模型或 Prompt 修改后,跑一遍回归评测;
- 将评测结果同步给业务方,建立信任感。
7.4 用小项目验证,再逐步扩张
推行 FDE 模式时,不建议一开始就做大型平台改造。可以选一个痛点明确、数据基础好、业务方配合度高的场景,用 FDE 流程交付一个闭环功能。当这个项目的业务指标跑出来后,再复制经验到其他场景。
8. 一次 FDE workshop 的参考流程
如果你想在团队内部组织一次 FDE 工作坊,可以参考以下流程。这个流程吸收了多家企业实践 FDE 时的常见设计,目的是在一天内完成一个 AI 应用从问题定义到可运行 Demo 的闭环。
8.1 上午场:问题定义与事实梳理
- 09:30 - 10:00:FDE 理念介绍;
- 10:00 - 10:45:业务方提出痛点,工程师拆解问题;
- 10:45 - 12:00:梳理事实来源,绘制“问题-事实-决策”关系图。
核心产出:一份事实清单,包含每个事实的数据源、负责人、更新频率。
8.2 下午场:快速原型实现
- 13:30 - 14:00:确定技术方案和分工;
- 14:00 - 16:00:搭建 RAG 或 Agent 原型;
- 16:00 - 16:45:业务方试用,反馈问题;
- 16:45 - 17:30:迭代一轮,整理后续计划。
这种工作坊的价值不在于一天内完成一个完美系统,而在于让团队和业务方共同体验一次“事实驱动”的快速交付过程。
9. 最佳实践与工程建议
9.1 让事实成为一等公民
在代码架构中,不要把事实当作模型的“临时上下文”。应该把事实抽象成一个独立的数据结构,贯穿检索、生成、校验、日志、审计全流程。这样,系统的每一步输出都能回答“依据是什么”这个问题。
9.2 建立 AI 应用的可观测性
AI 应用与普通后端应用不一样,除了监控接口延迟和报错率,还要监控:
- 每次回答的置信度分布;
- 检索命中文档的来源分布;
- 模型引用了哪些文档,用户是否点击查看;
- 人工审核的比例和结论;
- 用户对回答的反馈(点赞/点踩)。
这些指标可以帮助团队持续优化系统,而不是上线后变成“黑盒”。
9.3 安全与权限边界
FDE 模式强调事实驱动,但也意味着系统会接触到大量企业数据。生产环境必须遵循最小权限原则:
- 模型能访问的数据,不能超过当前用户权限范围;
- 文档检索时要过滤无权限文档;
- 日志中避免明文记录敏感字段;
- 用户口令、密钥等敏感信息绝不进入 Prompt 上下文;
- 模型输出内容在正式使用前要经过合规审查。
9.4 不要让模型承担超出事实范围的责任
FDE 模式有一个重要边界:模型只负责“基于事实生成内容”,不负责“判断事实是否可信”。事实的可信度管理应该由数据治理体系承接。工程师要避免让模型在事实缺失或矛盾时自行脑补,而是应该设计冲突检测和升级机制。
9.5 性能与成本优化
AI 应用的 token 成本是长期关注点。以下实践可以在不牺牲效果的前提下降低成本:
- 对常见问题设置缓存,避免重复调用模型;
- 使用小模型处理简单任务,大模型只处理复杂推理;
- 控制 Prompt 中注入的数量,检索结果按相关度截断;
- 对日志和调用链路做采样监控,而不是全量记录;
- 合理设置模型超时和重试策略,避免无效调用。
9.6 回归测试与持续集成
AI 应用的 CI/CD 比传统应用更复杂。建议在流水线中增加以下步骤:
- 代码提交后运行单元测试;
- 有模型或 Prompt 变更时,运行离线评测集;
- 评测指标低于阈值时阻止合并;
- 上线后观察 24 小时线上指标,支持快速回滚。
10. 总结与后续学习路线
这篇文章从 FDE 热词出发,梳理了 FDE 的核心概念、工程方法和落地方案。重点包括:
- FDE 既代表 Forward Deployed Engineer,也代表 Fact-Driven Engineering,共同指向“事实驱动、价值导向”的 AI 工程路径;
- AI 应用落地最大的风险来自不可验证的模型输出;
- FDE 模式强调先定义事实,再构建模型应用;
- 通过检索增强、事实校验、人机协同、指标闭环,可以让 AI 功能从 Demo 走向生产;
- FDE 工程师需要同时具备技术、业务和交付能力,是当前 AI 应用阶段的高价值角色。
如果你想把 FDE 方法论真正落地,建议按这个顺序继续学习:
- 先掌握 RAG 的完整实现,包括文档切分、向量检索、重排序;
- 学习模型评测方法,理解精确率、召回率、幻觉率等指标;
- 选择一个具体业务场景,完成一个带事实校验的 AI 应用;
- 研究 LangChain、LlamaIndex 等工具的实现原理,搭建更复杂的 Agent 应用;
- 结合企业真实数据,实践数据治理与权限控制。
记住一个核心原则:AI 应用的价值不在模型的智能程度,而在它能为业务交付多少可验证的结果。FDE 模式就是为此而生的一套工程实践路径。