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 走向生产时最缺的工程化能力。
目录
速览卡是工具类内容的固定首屏模块: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 后执行创建命令:
python -m venv .venvsource .venv/bin/activate # Windows 用 .venv\Scripts\activatepip install promptflow promptflow-tools
pf versionpf --help
$schema: https://azuremlschemas.azureedge.net/promptflow/latest/OpenAIConnection.schema.jsontype: open_ainame: open_ai_connectionapi_key: "<你的API Key>"
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。
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
System:You are a helpful assistant. User:{{question}}
pf flow validate --flow ./myflowpf flow test --flow ./myflow --inputs question="什么是 Microsoft Azure?"
# 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>
pf flow serve --flow ./myflow --port 8080curl -X POST http://localhost:8080/score -H "Content-Type: application/json" -d '{"question": "hello"}'
| 维度 | Promptflow | LangChain | Semantic Kernel | Dify |
|---|---|---|---|---|
| 定位 | 提示词工作流编排、评估与部署平台 | LLM 应用通用编排框架 | 跨语言企业级 AI 编排框架 | 低代码 LLM 应用平台 |
| 编排范式 | DAG 图 + YAML/代码双写,以流为单位 | 链/图式代码编排 | 链 + 规划器,内核/技能分层 | 可视化拖拽编排 |
| 类型约束 | 标准流 / 聊天流 / 评估流三类 | 链与代理类型自由组合 | 内核 / 技能 / 插件分层 | 按应用类型(聊天/Agent/工作流)划分 |
| 学习曲线 | 中等:需掌握 YAML 图与 Python 节点 | 较低:纯 Python,上手快 | 中等:概念分层较多 | 低:可视化为主 |
| 生态集成 | Azure AI Foundry 深度绑定,VS Code 扩展 | 数百第三方集成,厂商中立 | 微软生态(Azure/.NET) | 自托管,多模型多向量库 |
| 生产部署 | Azure 在线端点 / 批量运行,一键发布 | 自带无部署,借云平台容器 | Azure / 微服务容器 | Docker Compose 自部署 |
| License | MIT | MIT | MIT | Apache 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.x | 2023-05 | 公开预览 | 作为 Azure ML 功能推出,建立 DAG 流与连接的雏形 |
| v0.9.x | 2024-03 | 预览收尾 | 统一 flow 定义与 CLI 规范,补齐 tracing 基础能力 |
| v1.0.0 | 2024-07 | GA 正式版 | API 稳定;CLI 重组为 pf flow / pf run / pf connection / pf trace;全新 Tracer |
| v1.1.0 | 2024-09 | 可观测性增强 | 完善 trace 采集与本地调试体验 |
| v1.2.0 | 2024-11 | 稳定性维护 | 提升批量运行与流验证的稳定性与性能 |
| v1.3.0 | 2025-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 应用流程?
- A.顺序执行的链式管道
- B.有向无环图(DAG)流← 正确答案
- C.事件驱动的消息总线
- D.树状的递归调用树
答案:B。Promptflow 将流程建模为有向无环图,节点是工具,边是 ${node.output} 引用,且不允许循环依赖。链式管道是 LangChain 的典型形态,并非 Promptflow 的核心抽象。
Q2. 安装 Promptflow 核心运行时的命令是?
- 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 中,节点输出的引用语法是?
- A.$(llm.output)
- B.${llm.output}← 正确答案
- C.{{llm.output}}
- D.@{llm.output}
答案:B。Promptflow 用 ${节点名.输出名} 引用上游输出,如 ${llm.output}。{{ }} 是 Jinja2 模板变量语法,只出现在 .jinja2 模板文件内,二者不能混用。
Q4. Promptflow 中管理 API Key 等敏感信息的机制是?
- A.Connection 连接对象← 正确答案
- B.YAML 的 config 字段
- C.项目下 .env 文件
- D.节点内硬编码变量
答案:A。Connection 统一封装 api_key 与端点,flow 只引用连接名,密钥不落入代码并可经 Key Vault 注入。.env 是通用 Python 实践,但不是 Promptflow 的官方密钥机制。
Q5. 下列哪一项不是 Promptflow 内置的连接类型?
- A.Azure OpenAI 连接
- B.OpenAI 服务连接
- C.Serp API 搜索连接
- D.MySQL 数据库连接← 正确答案
答案:D。内置连接包括 Azure OpenAI、OpenAI、Serp API 与自定义连接等;MySQL 没有官方内置类型,需要访问数据库时应使用自定义连接在 Python 节点中自行实现。
Q6. 以下哪些是 Promptflow 1.x 的 CLI 子命令?
- 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 评分服务,正确的是?
- 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 的流类型,说法正确的是?
- A.标准流适用于单轮问答与 RAG← 正确答案
- B.聊天流自动维护多轮上下文← 正确答案
- C.评估流可给运行结果打分← 正确答案
- D.数据流用于实时流式管道
答案:ABC。官方三类流为标准流、聊天流、评估流。聊天流按规范处理 chat_history;评估流接收其他运行结果输出指标。D 的「数据流」不是 Promptflow 官方流类型。
Q9. 在本地对 100 条样本做批量回归测试,应使用?
- 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 的生产部署与监控,说法正确的是?
- A.可部署到 Azure 在线端点并采集监控← 正确答案
- B.可本地容器化与批处理运行← 正确答案
- C.部署后无法再查看调用链路
- D.非 Azure 环境完全不可用
答案:AB。同一份 flow 目录既能发布为 Azure 在线端点,也能本地 serve 或批量运行;tracing 在本地与线上均可采集。C、D 与事实相反:部署后仍可回放调用链路,且全程不依赖 Azure 也能运行。
参考来源
- webpage官方示例集RAG、Agent、评估等示例流