Promptflow 是微软开源的提示词工作流管理工具,目标是把 LLM 应用从「改 prompt、人工验证、上线靠猜」推进到工程化:一个应用的全部流程被建模为一张有向无环图(DAG),节点是 LLM 调用、Python 脚本或内置工具(Embedding、Serp 搜索等),节点之间用 ${node.output} 显式引用,整张图用 flow.dag.yaml 描述,纳入 git 管理。在此基础上,同一份流定义可以本地调试、批量评估、以 HTTP 服务运行,并一键发布到 Azure AI Foundry 在线端点。2024 年 7 月发布的 1.0 完成 CLI 重组与 Tracer 重写,是当前所有新项目的基线。本篇按「工具速览 → 安装配置 → 快速上手 → 核心能力 → 生产部署 → 选型对比 → 版本脉络 → 避坑与面试」的顺序组织,目标是让你在本机 30 分钟内跑通第一个流并理解生产化路径。

岗位关联

掌握 Promptflow,你就同时获得提示词工程、批量评估与一键部署三件套,这是 LLM 应用从 demo 走向生产时最缺的工程化能力。

目录
  1. 为什么需要 Promptflow:提示词迭代不可控 → 全链路可评估可部署
  2. 安装与环境配置:3 步就绪
  3. 快速上手:10 分钟跑通第一个流
  4. 核心能力详解:4 大支柱
  5. 生产部署与监控:从上线到运维
  6. 版本迭代
  7. AI 应用场景
  8. 常见误区
  9. 面试题
  10. 参考来源
工具类型
提示词工作流编排与评估平台(开源)
开发商
Microsoft(微软)
开源协议
MIT License(可商用)
GitHub Stars
无
主要语言
Python
当前版本
1.3.x(2025-01,持续迭代中)
安装方式
pip install promptflow
上手难度
★★★☆☆(中等)
适合人群
LLM 应用工程师、MLOps 工程师、Azure AI 用户
同类工具
LangChain、Semantic Kernel、Dify

速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。

为什么需要 Promptflow:提示词迭代不可控 → 全链路可评估可部署

传统 LLM 应用开发的主要问题不是「调一个 API」,而是「改一轮 prompt」。一次提示词调整会连锁影响下游输出,团队靠人工逐条看对话结果判断好坏,改几轮就说不清哪一版更好;代码里 model 名、api_key、prompt 模板混在一起,本地跑通和线上部署是两套东西,上线后一次调用到底经过哪些节点、耗在哪里,只能靠猜。

Promptflow 把这些问题压进同一条链路:prompt 模板、工具节点、输入输出定义全部沉淀到一个 flow 目录,用 YAML 描述 DAG、用 Python/Jinja2 写节点逻辑。一次 pf run create 就能在相同测试集上批量跑多个候选版本并对比结果;pf flow serve 把同一个流变成 HTTP 服务;VS Code 里调试的流目录,原样部署到 Azure AI Foundry。从原型到生产,用的是同一份定义。

它与同类工具的气质差异在于「可校验的资产化」:节点引用、输入输出 schema、连接对象全部显式声明,flow 定义可被校验、可批量评估、可审计,这使它更适合要上线、要评测、要对齐规范的工程团队,而不是「快速写段脚本调模型」的原型场景。

安装与环境配置:3 步就绪

步骤一:创建独立虚拟环境并安装核心包。要求 Python 3.9+。promptflow 是运行时与 CLI,promptflow-tools 提供 LLM、Embedding、Serp 等内置节点,两个都要装。

步骤二:验证 CLI。输出版本号即安装成功。VS Code 用户可额外安装官方「Prompt flow」扩展,在扩展中图形化编辑与调试 flow.dag.yaml——扩展只是入口,核心资产仍是目录下的 YAML 与 Python 文件。

步骤三:创建连接(使用 LLM 节点前的必做项)。连接(Connection)统一封装 API Key 与端点,flow 里只写连接名,密钥不进代码仓库。新建 openai.yaml 后执行创建命令:

bash3 行
python -m venv .venvsource .venv/bin/activate      # Windows 用 .venv\Scripts\activatepip install promptflow promptflow-tools
bash2 行
pf versionpf --help
yaml4 行
$schema: https://azuremlschemas.azureedge.net/promptflow/latest/OpenAIConnection.schema.jsontype: open_ainame: open_ai_connectionapi_key: "<你的API Key>"
bash2 行
pf connection create --file openai.yamlpf connection list      # 确认连接已存在

快速上手:10 分钟跑通第一个流

思路:用 CLI 初始化一个标准流模板,把默认节点改造成 LLM 节点,校验后单测,再从控制台进入本地 trace 页面查看调用详情。标准流(Standard flow)是最通用的形态:输入 question,经一个节点,输出 answer。

1. 初始化:pf flow init --folder ./myflow --type standard,生成 flow.dag.yaml 与一个 Python 工具文件;随后 pf flow validate --flow ./myflow 校验图结构。

2. 确认连接:执行 pf connection list,若列表为空,按上一节创建 open_ai_connection。

3. 改造为 LLM 节点:将 flow.dag.yaml 替换为下面内容,并在同目录新建 llm.jinja2 模板文件。jinja2 文件即 prompt 模板,{{question}} 在运行时被替换为输入值。

4. 校验并测试:

控制台会打印答案,并输出一个本地 trace 链接(形如 http://localhost:port/)。浏览器打开可查看该次调用的节点耗时、实际发送给模型的 prompt 与返回内容。结果符合预期后,这个目录就是后续部署的同一份产物。

进阶:如需接入自有逻辑,新建 Python 工具节点——文件内用 @tool 装饰函数,DAG 里加 type: python 节点,source.path 指向该文件,输入引用 ${llm.output},改完重新 validate + test。

yaml17 行
inputs:  question:    type: stringoutputs:  answer:    type: string    reference: ${llm.output}nodes:- name: llm  type: llm  source:    type: code    path: llm.jinja2  inputs:    connection: open_ai_connection    model: gpt-4o-mini    temperature: 0.7
jinja5 行
System:You are a helpful assistant. User:{{question}}
bash2 行
pf flow validate --flow ./myflowpf flow test --flow ./myflow --inputs question="什么是 Microsoft Azure?"
python7 行
# my_tool.pyfrom promptflow import tool @tooldef count_chars(text: str) -> int:    """统计输入字符数,供 DAG 中 python 节点调用。"""    return len(text)

核心能力详解:4 大支柱

支柱一·三类流与 DAG 编排。标准流处理单轮输入输出,适合 RAG 与工具调用;聊天流(Chat flow)按规范维护 chat_history 字段,开箱即用多轮对话;评估流(Evaluation flow)接收其他流的一次运行结果,产出合格率、相关性等指标。节点类型覆盖 LLM、Python 与内置工具(Embedding、向量索引、Serp 搜索),节点间用 ${node_name.output} 连接,图结构即 flow.dag.yaml,天然可做代码评审与版本回溯。

支柱二·Tracing 可观测性。1.0 重写的 Tracer 在每次 flow 测试或运行时自动记录各节点输入、输出、耗时与 LLM 调用明细,本地以 trace 链接查看;对非 flow 的任意 Python 程序,可用 from promptflow import start_trace 接入,让脚本里的 LLM 调用同样落进追踪。线上异常时能按 run id 回放一次对话的完整执行路径。

支柱三·批量评估。评估不是「跑一遍看看」,而是用同一份测试集对多个 prompt 版本并行执行。pf run create --flow ./myflow --data eval.jsonl --column-mapping 'question="${data.question}"' 对每条样本跑一次完整流,结果落成 jsonl;再配合一个评估流计算指标,即可量化对比不同版本的好坏,替代人工抽查。

支柱四·连接与环境抽象。Connection 封装 api_key、端点与版本号,flow 只引用连接名,密钥不落代码;团队环境切换只换连接对象。自定义连接(Custom Connection)可塞任意键值供 Python 节点使用,便于接入企业内网服务,实现代码与外部依赖解耦。

生产部署与监控:从上线到运维

方式一·本地服务化。用 pf flow serve 把流启动为 HTTP 服务,端点默认 POST /score,用于集成测试、压测前验证,也是容器化打包的基础。

方式二·Azure AI Foundry 在线端点。把本地 flow 目录注册/上传到工作区(通过 VS Code 扩展的发布入口或 azure-ai-ml SDK),创建在线端点并选择 promptflow-runtime 基础镜像,即可获得带鉴权与自动扩缩容的 REST 端点;部署单元就是本地那份 flow 目录,从源头消除「本地行、线上不行」的环境漂移。离线大文件场景改用批量运行模式。

方式三·离线批处理。定时任务与大规模评估用 pf run create 在本地或云端跑 batch,输出 jsonl 便于审计与追溯,适合每轮发版前的回归测试。

可观测性:生产环境建议把 tracing 接入 Application Insights / Azure Monitor,按流名、节点维度看耗时、token 消耗与错误率;线上端点日志记录每次请求输入输出,可叠加评估集做持续回归。本地开发期,pf flow test / pf run 自动输出的 trace 链接已能覆盖绝大多数问题定位。

<p class="para-label">避坑清单:</p>

<ul class="dash-list"><li>0.x 与 1.x 命令不兼容:1.0 GA 是 breaking change,CLI 参数从 --source 改为 --flow,并新增 pf run / pf trace 子命令,网上存量 0.x 教程照抄会直接报错,动手前先看官方 1.x 文档并核对 pf --help。</li><li>只装 promptflow 找不到内置 LLM 节点:内置工具在 promptflow-tools 包里,两个包必须一起装,否则 flow 校验时报 tool not found。</li><li>连接未建就校验:LLM 节点的 connection 字段必须指向已存在连接,先 pf connection list 确认;API Key 写在连接对象里而不是 YAML 明文,带 key 的 yaml 文件要加进 .gitignore。</li><li>引用语法写错:节点间引用是 ${节点名.输出名},不是 $() 也不是 {{}};{{ }} 只出现在 jinja2 模板文件内,混用会导致校验失败且报错信息不直观。</li><li>依赖冲突:promptflow 对 openai SDK、protobuf 等依赖版本较敏感,与 LangChain 等框架共用环境易起冲突,建议为 promptflow 单独建虚拟环境。</li></ul>

bash2 行
pf flow serve --flow ./myflow --port 8080curl -X POST http://localhost:8080/score -H "Content-Type: application/json" -d '{"question": "hello"}'
维度PromptflowLangChainSemantic KernelDify
定位提示词工作流编排、评估与部署平台LLM 应用通用编排框架跨语言企业级 AI 编排框架低代码 LLM 应用平台
编排范式DAG 图 + YAML/代码双写,以流为单位链/图式代码编排链 + 规划器,内核/技能分层可视化拖拽编排
类型约束标准流 / 聊天流 / 评估流三类链与代理类型自由组合内核 / 技能 / 插件分层按应用类型(聊天/Agent/工作流)划分
学习曲线中等:需掌握 YAML 图与 Python 节点较低:纯 Python,上手快中等:概念分层较多低:可视化为主
生态集成Azure AI Foundry 深度绑定,VS Code 扩展数百第三方集成,厂商中立微软生态(Azure/.NET)自托管,多模型多向量库
生产部署Azure 在线端点 / 批量运行,一键发布自带无部署,借云平台容器Azure / 微服务容器Docker Compose 自部署
LicenseMITMITMITApache 2.0
适合谁需批量评估的 LLM 团队、Azure 用户Python 工程师快速原型企业多语言多框架团队运营 / 非工程师团队

选型建议:如果你深度使用 Azure 且需要「prompt 迭代 → 批量评估 → 一键部署」的闭环,Promptflow 综合成本最低;纯 Python 快速原型选 LangChain;企业级跨 .NET/Python 统一框架选 Semantic Kernel;非工程师团队快速出应用选 Dify。

版本迭代

Promptflow 从 2023 年作为 Azure Machine Learning 的提示词功能公开预览起步,经历 0.x 预览期,于 2024 年 7 月以 1.0.0 GA 完成 CLI 重组与 Tracer 重写;此后以月度小版本迭代为主,重心落在可观测性、稳定性与部署链路完善(截至训练数据,可能已有更新版本)。

版本时间变化提升
v0.1.x2023-05公开预览作为 Azure ML 功能推出,建立 DAG 流与连接的雏形
v0.9.x2024-03预览收尾统一 flow 定义与 CLI 规范,补齐 tracing 基础能力
v1.0.02024-07GA 正式版API 稳定;CLI 重组为 pf flow / pf run / pf connection / pf trace;全新 Tracer
v1.1.02024-09可观测性增强完善 trace 采集与本地调试体验
v1.2.02024-11稳定性维护提升批量运行与流验证的稳定性与性能
v1.3.02025-01链路完善强化评估流与部署链路,适配更新的模型版本
结论

1.0 GA 是分水岭——0.x 的教程、CLI 与 API 均不适用于 1.x 新项目。此后的迭代重心不在新范式,而在把「写流 → 评估 → 上线 → 监控」这条链路做稳做透,这与它面向生产团队的定位一致。Promptflow 是开发工具而非模型,没有 MMLU 类公开基准分数,版本间差异以功能与稳定性演进为主,选型判断依据是是否使用 1.x、是否配套 Azure AI Foundry。

AI 应用场景

场景一:RAG 问答系统的提示词回归评估

阶段:提示词工程与评估

解决的问题:RAG 提示词一改,答案质量牵一发动全身,人工逐条核对耗时且标准不一。Promptflow 将检索、拼接、生成写成标准流,再用批量运行在同一测试集上对比多个 prompt 版本。

具体案例:知识库问答团队维护 3 个候选提示词,用 200 条测试集批量运行并配合评估流输出命中率与失败样本,一轮回归由数小时人工核对缩短到分钟级,且结论可复现。

场景二:客服助手的调用链路定位

阶段:Agent 编排与可观测性

解决的问题:机器人答错时难以判断是意图识别、检索还是生成环节的问题。将流程拆成多节点流后,tracing 可按 run id 回放单次对话的完整链路。

具体案例:售后问答机器人把意图识别、文档检索、生成三个环节落成 3 节点流,接入 tracing 后故障定位从「翻多段日志猜」变为直接看节点输入输出与耗时,平均定位时间从小时级降到分钟级。

场景三:从本地原型到云端在线端点

阶段:模型部署与发布

解决的问题:本地调试与服务封装、部署是两套工程,重复造轮子且环境不一致。Promptflow 用同一份 flow 目录完成两端。

具体案例:原型团队在 VS Code 中开发聊天流,验证通过后将同一目录发布为 Azure AI Foundry 在线端点,省去手写 HTTP 服务与鉴权逻辑,发布周期从按天计缩短到按小时计。

常见误区

误区看演示视频都是画布连线,以为像低代码平台那样基本不用写代码,点点鼠标就能完成应用。

正解Promptflow 的核心资产是 flow.dag.yaml 与 Python / Jinja2 文件,图形画布只是编排可视化外壳;节点逻辑、评估脚本、自定义工具都要写代码。正确用法是把它当「图形化 + 代码」双模工具:图形编辑 DAG 结构,代码写节点逻辑。

为何常见:官方宣传图以图形界面为主,容易让人忽略底层是代码文件这一事实。

误区觉得 Promptflow 是 Azure 云产品,本地装不了或者装了也没法跑。

正解pip 安装后即可完全本地使用:本地连接、本地 flow test、本地 serve 都不需要 Azure 账号;Azure AI Foundry 只是托管部署与云端监控的可选增强。绝大多数开发调试在纯本地环境即可完成。

为何常见:官方资料大量出现在 Azure 文档体系下,名字也容易让人联想起云服务。

误区搜到的教程写 pf flow test --source .,照抄后发现命令行直接报错,以为是环境问题。

正解1.0 GA 是一次破坏性升级:CLI 参数 --source 改为 --flow,命令族重组为 pf flow / pf run / pf connection / pf trace,部分 Python API 也重命名。使用前先确认文档对应的版本号,以 pf --help 的实际输出为准。

为何常见:存量 0.x 教程量大且与 1.x 界面相似,版本差异不显眼,很容易被忽略。

误区图省事把 api_key 写进 flow.dag.yaml 的连接配置里,或者以为创建连接就是把 key 放在本地明文文件、提交 git 也没关系。

正解密钥必须放在 Connection 对象中,flow 只引用连接名;连接定义文件要加进 .gitignore,生产环境建议经 Key Vault 注入。YAML 明文写 key 会随仓库泄露,属于高危操作。

为何常见:连接机制多一层学习成本,新手倾向于跳过直接填 key,恰好踩中密钥管理红线。

面试题

Q1. Promptflow 用什么结构描述一次 LLM 应用流程?

单选题 · easy

  • A.顺序执行的链式管道
  • B.有向无环图(DAG)流← 正确答案
  • C.事件驱动的消息总线
  • D.树状的递归调用树

答案:B。Promptflow 将流程建模为有向无环图,节点是工具,边是 ${node.output} 引用,且不允许循环依赖。链式管道是 LangChain 的典型形态,并非 Promptflow 的核心抽象。

Q2. 安装 Promptflow 核心运行时的命令是?

单选题 · easy

  • A.pip install promptflow← 正确答案
  • B.npm install promptflow
  • C.pip install ms-prompt-flow
  • D.conda install azure-promptflow

答案:A。Promptflow 是 Python 工具链,官方安装方式是 pip install promptflow,并建议同时安装 promptflow-tools 获取内置节点。npm 与列表中的 conda 包名均不存在。

Q3. 在 flow.dag.yaml 中,节点输出的引用语法是?

单选题 · easy

  • A.$(llm.output)
  • B.${llm.output}← 正确答案
  • C.{{llm.output}}
  • D.@{llm.output}

答案:B。Promptflow 用 ${节点名.输出名} 引用上游输出,如 ${llm.output}。{{ }} 是 Jinja2 模板变量语法,只出现在 .jinja2 模板文件内,二者不能混用。

Q4. Promptflow 中管理 API Key 等敏感信息的机制是?

单选题 · mid

  • A.Connection 连接对象← 正确答案
  • B.YAML 的 config 字段
  • C.项目下 .env 文件
  • D.节点内硬编码变量

答案:A。Connection 统一封装 api_key 与端点,flow 只引用连接名,密钥不落入代码并可经 Key Vault 注入。.env 是通用 Python 实践,但不是 Promptflow 的官方密钥机制。

Q5. 下列哪一项不是 Promptflow 内置的连接类型?

单选题 · mid

  • A.Azure OpenAI 连接
  • B.OpenAI 服务连接
  • C.Serp API 搜索连接
  • D.MySQL 数据库连接← 正确答案

答案:D。内置连接包括 Azure OpenAI、OpenAI、Serp API 与自定义连接等;MySQL 没有官方内置类型,需要访问数据库时应使用自定义连接在 Python 节点中自行实现。

Q6. 以下哪些是 Promptflow 1.x 的 CLI 子命令?

多选题 · mid

  • A.pf flow、pf run、pf connection← 正确答案
  • B.pf flow、pf trace、pf run← 正确答案
  • C.pf connection、pf trace、pf flow← 正确答案
  • D.pf deploy、pf cloud、pf export

答案:ABC。1.x 的 pf 命令族为 flow、run、connection、trace。D 中的 deploy/cloud/export 均非 pf 子命令;部署动作由 Azure 侧工具(az ml)或托管平台完成。

Q7. 在本机把写好的流启动为 HTTP 评分服务,正确的是?

单选题 · single

  • A.使用 pf flow serve 并访问 /score← 正确答案
  • B.使用 pf flow deploy 发布到云端
  • C.使用 python 直接执行 flow.dag.yaml
  • D.使用 pf run batch 启动常驻服务

答案:A。pf flow serve 基于本地 flow 启动评分服务,端点默认 POST /score,是集成测试与容器化的基础。flow.dag.yaml 是声明文件不能直接执行;云端发布走 Azure 侧工具。

Q8. 关于 Promptflow 的流类型,说法正确的是?

多选题 · hard

  • A.标准流适用于单轮问答与 RAG← 正确答案
  • B.聊天流自动维护多轮上下文← 正确答案
  • C.评估流可给运行结果打分← 正确答案
  • D.数据流用于实时流式管道

答案:ABC。官方三类流为标准流、聊天流、评估流。聊天流按规范处理 chat_history;评估流接收其他运行结果输出指标。D 的「数据流」不是 Promptflow 官方流类型。

Q9. 在本地对 100 条样本做批量回归测试,应使用?

单选题 · mid

  • A.用 pf run create 指定数据集执行← 正确答案
  • B.用 pf flow test 循环调用 100 次
  • C.用 pf flow serve 并发发送请求
  • D.用 pf connection test 批量联调

答案:A。pf run create --flow X --data Y 将流在数据集上批量执行并落盘结果,供版本对比与评估流消费;pf flow test 只做单次调试,serve 面向在线服务,均无批量评估语义。

Q10. 关于 Promptflow 的生产部署与监控,说法正确的是?

多选题 · extreme

  • A.可部署到 Azure 在线端点并采集监控← 正确答案
  • B.可本地容器化与批处理运行← 正确答案
  • C.部署后无法再查看调用链路
  • D.非 Azure 环境完全不可用

答案:AB。同一份 flow 目录既能发布为 Azure 在线端点,也能本地 serve 或批量运行;tracing 在本地与线上均可采集。C、D 与事实相反:部署后仍可回放调用链路,且全程不依赖 Azure 也能运行。

参考来源