
1. 从“一次性瞎蒙”到“分步骤通关”Harness Engineering 里的 Prompt Chain 到底解决什么问题如果你正在做 AI Agent大概率遇到过这种场景把一份“写商业计划书”的复杂需求直接丢给 GPT-4o Mini它要么给你一份十页套话大纲要么财务预测里的数字前后矛盾要么市场分析引用了一个根本不存在的报告页码。你追问数据来源它还能一本正经地编一个“2024年某权威机构第127页”。这不是模型不行而是单次推理窗口根本扛不住多约束、多依赖的复杂任务。Harness Engineering智能体线束工程要解决的就是这件事把不可控的 LLM 变成像程序一样可拆解、可追踪、可修正的 Agent。而 Prompt Chain 是其中最关键的一环——它把“写商业计划书”拆成市场分析、产品路线图、财务预测、团队介绍、融资需求拆解等子任务每个子任务有独立的 Prompt 模板、输入输出约束和验证逻辑前一个子任务的输出作为后一个的输入形成一条可解释的工作流。本文面向正在用 Python LangChain 搭建 Agent 的开发者手把手带你跑通一个 DIVE-CHECK-REFINE 框架下的 Prompt Chain 商业计划书生成器。重点不是讲概念而是把每个子任务的 Prompt 模板、状态追踪、验证逻辑、自我修正逻辑都写成可复制的代码。同时我会把 LLM 调用的 Key 和 Base URL 统一换成 TaoToken这样整条 Prompt Chain 里的所有子任务共用一把 Key不用再维护多套模型凭据。适合谁读已经了解 LangChain 基础、想从“单 Prompt 调 API”进阶到“多子任务 Agent 工作流”的开发者正在做 Harness Engineering 相关项目、需要可落地 Prompt Chain 参考实现的人以及被“Agent 规划混乱、子任务遗漏、自我修正跑不起来”困扰的团队。2. 前置准备用 TaoToken 统一 Prompt Chain 的模型调用通道在开始写 Prompt Chain 之前先把模型调用通道固定下来。原文用 OpenAI GPT-4o Mini 做子任务推理部署时需要拿 OpenAI 官方 Key。现在改为打开https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end创建 TaoToken Key然后把 LangChain 里 ChatOpenAI 的base_url配成https://taotoken.net/api。这样 Prompt Chain 里的市场分析、产品路线图、财务预测等每个子任务都会通过 TaoToken 统一通道消耗 Token验证逻辑链和自我修正逻辑也能继续跑同一把 Key。具体操作分三步。第一步访问 TaoToken 官网创建 Key拿到形如sk-xxxx的凭据。第二步在项目环境变量里写入export TAOTOKEN_API_KEYsk-你的TaoTokenKey export TAOTOKEN_BASE_URLhttps://taotoken.net/api第三步在 LangChain 初始化模型时显式指定 base_url。这里有个容易踩的坑LangChain 的ChatOpenAI默认会读OPENAI_API_KEY和OPENAI_BASE_URL如果你环境里还留着旧的 OpenAI 官方配置可能会覆盖掉 TaoToken 的设置。建议在代码里直接传参不依赖环境变量隐式读取。import os from langchain_openai import ChatOpenAI llm ChatOpenAI( modelgpt-4o-mini, api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL], temperature0.3, max_tokens2048, )这样配置后Prompt Chain 里每个子任务调用llm.invoke()时请求都会走 TaoToken 的/v1/chat/completions兼容接口。你不需要为市场分析、财务预测分别准备不同的 Key也不需要担心某个子任务因为凭据问题中断整条链。如果你还想在浏览器里直接验证模型对话是否正常可以打开 TaoToken 的模型对话页面发一条测试消息确认通道可用后再回到代码里跑 Prompt Chain。3. DIVE-CHECK-REFINE 框架把商业计划书拆成可执行的 Prompt ChainDIVE-CHECK-REFINE 是我在 Harness Engineering 实践里总结的一套 Prompt Chain 设计框架对应三个阶段DIVE拆解任务、CHECK验证输出、REFINE自我修正。下面直接给可复制的实现。3.1 DIVE 阶段任务拆解与子任务 Prompt 模板DIVE 的核心是把总目标拆成逻辑独立、输入输出清晰的子任务。以商业计划书为例拆成五个子任务市场分析、产品路线图、财务预测、团队介绍、融资需求拆解。每个子任务用一个 Prompt 模板模板里包含角色设定、任务目标、输入占位符、输出格式和约束条件。from langchain_core.prompts import ChatPromptTemplate SUBTASK_PROMPTS { market_analysis: ChatPromptTemplate.from_messages([ (system, 你是一位有10年硅谷投资经验的风险投资家专注 AI SaaS 早期投资。), (human, 基于以下产品信息撰写市场分析部分。 产品信息{product_info} 要求 1. 包含3年全球趋势数据必须来自2023-2024年权威机构报告 2. 提炼20页用户调研报告的核心结论 3. 不少于800字风格专业、简洁、有说服力。 输出格式Markdown二级标题为“市场分析”。), ]), product_roadmap: ChatPromptTemplate.from_messages([ (system, 你是一位资深产品总监擅长从 MVP 到 V1.0 的路线图设计。), (human, 基于以下产品信息和市场分析结论撰写产品路线图。 产品信息{product_info} 市场分析结论{market_analysis} 要求 1. 覆盖 MVP、Beta、V1.0 三个里程碑 2. 每个阶段说明技术栈选型验证方式 3. 不少于600字。 输出格式Markdown二级标题为“产品路线图”。), ]), financial_forecast: ChatPromptTemplate.from_messages([ (system, 你是一位熟悉 GAAP 的财务分析师。), (human, 基于以下产品信息和路线图撰写36个月财务预测。 产品信息{product_info} 产品路线图{product_roadmap} 要求 1. 包含36个月现金流模型 2. 符合 GAAP 合规损益表结构 3. 给出用户 LTV/CAC 计算逻辑并验证 4. 不少于800字。 输出格式Markdown二级标题为“财务预测”。), ]), }这里的关键是子任务之间的依赖关系product_roadmap依赖market_analysis的输出financial_forecast依赖product_roadmap的输出。这种依赖关系用有向无环图描述执行时按拓扑顺序逐个调用。3.2 CHECK 阶段验证逻辑链CHECK 阶段负责验证每个子任务的输出是否符合要求。验证逻辑本身也是一次 LLM 调用但 Prompt 里要明确列出验证规则并要求返回结构化的通过/失败结果。VALIDATION_PROMPT ChatPromptTemplate.from_messages([ (system, 你是一个严格的输出验证器只返回 JSON。), (human, 请验证以下子任务输出是否满足要求。 子任务名称{subtask_name} 输出内容{output} 验证规则 {rules} 返回格式{{passed: true/false, reason: 失败原因或通过说明}}), ]) def validate_subtask(llm, subtask_name, output, rules): chain VALIDATION_PROMPT | llm result chain.invoke({ subtask_name: subtask_name, output: output, rules: \n.join(f- {r} for r in rules), }) import json return json.loads(result.content)以市场分析为例验证规则可以设为包含3年全球趋势、数据来自权威报告、不少于800字、风格专业。如果验证失败就进入 REFINE 阶段。3.3 REFINE 阶段自我修正逻辑REFINE 阶段根据验证失败的反馈调整 Prompt 模板后重新执行当前子任务。修正逻辑的核心是把失败原因注入到下一次调用的 Prompt 里形成“验证-反馈-重试”的闭环。REFINE_PROMPT ChatPromptTemplate.from_messages([ (system, 你是一位擅长根据反馈修正输出的专家。), (human, 上一次输出未通过验证请根据失败原因修正。 原始任务{original_task} 上一次输出{last_output} 失败原因{failure_reason} 修正要求针对失败原因逐条改进保持原有格式。), ]) def refine_subtask(llm, original_task, last_output, failure_reason): chain REFINE_PROMPT | llm return chain.invoke({ original_task: original_task, last_output: last_output, failure_reason: failure_reason, }).content把 DIVE、CHECK、REFINE 串起来就是一个完整的 Prompt Chain 执行器。状态追踪模块用一个字典记录当前子任务 ID、已完成子任务输出、重试次数。重试次数建议设上限为2避免无限循环消耗 Token。4. 验证请求跑通整条 Prompt Chain 并检查成功结果配置和代码写完后用一段主流程把整条链跑起来。下面是一个简化版的执行入口你可以直接复制到main.py里运行。import os, json from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate llm ChatOpenAI( modelgpt-4o-mini, api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL], temperature0.3, ) product_info 产品赛道AI驱动的企业内部文档智能检索与问答系统 产品名称DocAI QA 创始人团队CTO 前 Google Search 核心工程师CEO 前 Salesforce 产品总监COO 前 Dropbox 运营总监 种子轮融资500万美金 付费试点客户10家 ARR20万美金 state {outputs: {}, retries: {}} def run_subtask(name, prompt_template, inputs, rules): chain prompt_template | llm output chain.invoke(inputs).content check validate_subtask(llm, name, output, rules) retries state[retries].get(name, 0) while not check[passed] and retries 2: output refine_subtask(llm, str(inputs), output, check[reason]) check validate_subtask(llm, name, output, rules) retries 1 state[retries][name] retries state[outputs][name] output return output market run_subtask( market_analysis, SUBTASK_PROMPTS[market_analysis], {product_info: product_info}, [包含3年全球趋势, 数据来自权威报告, 不少于800字, 风格专业], ) roadmap run_subtask( product_roadmap, SUBTASK_PROMPTS[product_roadmap], {product_info: product_info, market_analysis: market}, [覆盖MVP/Beta/V1.0, 每阶段有技术栈验证, 不少于600字], ) finance run_subtask( financial_forecast, SUBTASK_PROMPTS[financial_forecast], {product_info: product_info, product_roadmap: roadmap}, [包含36个月现金流, 符合GAAP结构, 有LTV/CAC计算逻辑, 不少于800字], ) print(市场分析长度, len(market)) print(产品路线图长度, len(roadmap)) print(财务预测长度, len(finance)) print(重试记录, state[retries])运行后如果控制台输出三个子任务的文本长度都在要求范围内且重试记录里没有超过2次的项说明整条 Prompt Chain 跑通了。成功结果的特征是每个子任务的输出都通过了验证逻辑链市场分析里引用的数据来自你提供的检索结果财务预测里的 LTV/CAC 计算逻辑前后一致没有出现“编造报告页码”的情况。如果你想进一步验证模型对话通道是否稳定可以在 TaoToken 的模型对话页面手动发一条“请用一句话总结 DocAI QA 的市场定位”对比代码输出和页面输出是否一致。这一步能帮你排除 base_url 配置错误导致的静默失败。5. 本篇常见错排查Prompt Chain 跑不通时先看这几个地方5.1 报错AuthenticationError: Incorrect API key provided这个报错通常不是 Key 本身错了而是 LangChain 读到了旧的OPENAI_API_KEY环境变量。检查你的 shell 里是否还残留OPENAI_API_KEY如果有在代码里显式传api_key参数覆盖它。另外确认base_url末尾没有多加/v1TaoToken 的兼容接口地址是https://taotoken.net/apiLangChain 会自动拼接/v1/chat/completions。5.2 子任务输出被截断验证一直失败GPT-4o Mini 的max_tokens默认值可能不够。在ChatOpenAI初始化时把max_tokens设为 2048 或更高。如果某个子任务要求“不少于800字”而输出只有300字就结束了先检查max_tokens再检查 Prompt 里是否明确写了字数要求。验证逻辑链里的规则要和 Prompt 里的约束条件保持一致否则会出现“Prompt 没要求但验证器要求”的矛盾。5.3 自我修正逻辑陷入死循环重试次数上限必须设。上面的代码里retries 2就是硬上限。如果两次修正后仍未通过建议把当前输出标记为“待人工复核”并继续执行后续子任务而不是卡死整条链。另外修正 Prompt 里要把失败原因逐条列出不要让 LLM 自己猜哪里错了否则修正效果很差。5.4 状态追踪丢失后一个子任务拿不到前一个的输出检查state[outputs]的写入时机。必须在验证通过后再写入而不是在第一次调用后就写入。如果验证失败进入修正修正后的输出要覆盖原始输出。另外子任务依赖关系要按拓扑顺序执行不要并行调用有依赖关系的子任务否则后一个子任务会拿到空输入。5.5 Token 消耗过快Prompt Chain 的 Token 消耗主要来自三部分子任务推理、验证调用、修正重试。如果发现消耗过快先检查验证 Prompt 是否太长可以把验证规则精简成3-5条核心规则。其次检查修正重试次数超过2次的重试收益很低。最后如果某个子任务的输出很长可以在传给下一个子任务前做一次摘要压缩减少上下文长度。6. 把 Prompt Chain 接入你的 Harness Engineering 工作流到这里你已经有了一个可运行的 DIVE-CHECK-REFINE Prompt Chain五个子任务共用一把 TaoToken Key验证逻辑和自我修正逻辑跑在同一条通道上。接下来可以做的扩展把状态追踪模块换成 LangGraph 的 StateGraph获得更清晰的状态流转把验证逻辑链拆成独立的评估节点用结构化输出强制返回 JSON把子任务 Prompt 模板存到配置中心方便不同项目复用。如果你正在做长期编码或 Agent 项目建议把 TaoToken 的 Coding Plan 也配到开发环境里这样写 Prompt Chain 代码和跑 Agent 调试可以共用同一套凭据体系。接入文档里有 LangChain、OpenAI SDK、curl 三种调用方式的完整示例排障时可以直接对照。整条链跑通后你会发现 Agent 的规划能力不再依赖“一次性瞎蒙”而是每一步都有输入、有输出、有验证、有修正——这才是 Harness Engineering 里 Prompt Chain 真正值钱的地方。