作者:星芒智工AI技术站 | 发布于202X.XX.XX | 阅读时长:32分钟
痛点引入:为什么你的AI Agent规划像“无头苍蝇”却又很啰嗦?
最近半年,我在星芒科技的内部孵化项目中,连续主导了3个不同场景的AI Agent落地——分别是面向产品经理的「需求拆解器」、面向程序员的「API全链路测试助手」,以及面向电商的「竞品内容自动化分析与运营脚本生成器」。
这三个项目的初期阶段,我都遇到了一个极其致命、且AI Agent领域90%以上的初学者都会踩坑的问题:
你的Agent明明用了最火的LangChain/CrewAI/LlamaIndex,明明给它写了长达几百行的「System Prompt」定义目标、边界、能力、规则,但它一遇到复杂任务(比如“把这个电商全渠道增长方案拆解成15天可落地的甘特图子任务,每个子任务要有负责人角色、前置依赖、交付标准、工时估算和风险预警触发条件”),要么:
- 直接摆烂:输出“我无法完成这么复杂的任务拆解,请你提供更明确的步骤指南”(哪怕LangChain已经加了
PlanAndExecute链,CrewAI已经配了「Product Manager Planner」角色);- 逻辑跳脱:给你列一堆看似相关但没有任何依赖关系的“零散工作”,甚至出现“先做竞品内容脚本再做竞品内容关键词库”这种完全颠倒的逻辑;
- 无限循环啰嗦:一个「需求调研」子任务,它能拆解出“先给竞品网站加浏览器书签→再点击浏览器书签打开竞品网站→再用鼠标滚轮向下滚动查看首页→再截图首页核心Banner→再打开图片编辑软件裁剪Banner→再保存裁剪后的Banner到本地文件夹A”这种粒度细到人类无法执行、但Agent自己又觉得很“严谨”的内容——更气人的是,这些细粒度内容之间还没有明确的聚合关系,后续无法映射到任何实际的角色分工或工时系统。
这种问题直接导致了我那三个项目的初期用户满意度低于20%,平均任务完成时间比人工长3-5倍,Agent的Token调用量是我的预算的12倍以上——最惨的是「API全链路测试助手」,测一个包含5个核心接口的电商下单流程,它用了2个小时、花了8万多GPT-4o的Tokens,最后测出来的结果居然把“支付超时回调接口的幂等性检查”完全漏掉了!
那段时间我几乎每天都在翻LangChain/CrewAI的GitHub Issues、看YouTube上的各种「Advanced AI Agent Prompting」教程、泡在AGI House的Discord频道里问大佬——终于,我找到了一个看似简单但非常有效、能从底层逻辑解决AI Agent规划问题的优化方向:
不是给「大模型 Planner」加更长的System Prompt,不是换更贵更强的大模型(当然强模型是基础,但不是核心矛盾),也不是硬堆复杂的「向量数据库记忆+思维链检索增强」,而是 重构Agent的规划算法底层Prompt逻辑,从「单轮/双轮线性规划」转向「多轮Prompt Chain分层迭代规划」——也就是我们今天要讲的「AI Agent Harness Engineering中的Prompt Chain任务拆解优化」。
解决方案概述:什么是「分层迭代Prompt Chain任务拆解法」?
简单来说,传统的AI Agent规划(比如LangChain的默认PlanAndExecute、CrewAI的默认Sequential Planner)本质上是「单轮大模型一次性生成所有子任务」或者「双轮(大模型生成Plan → 再生成子任务的具体细节)」的线性逻辑——这种逻辑的核心缺陷是:
- 大模型的「上下文窗口注意力限制」无法避免:哪怕你用的是GPT-4o的128K上下文窗口,或者Claude 3 Opus的200K上下文窗口,当你要拆解的任务涉及到大量「领域专有知识」「项目历史上下文」「具体规则约束」时,大模型也很难在一次推理中「同时兼顾目标、规则、知识、依赖、粒度」这5个核心维度;
- 大模型的「规划粒度稳定性」极差:不同的大模型、甚至同一大模型的不同温度参数、不同提问顺序,生成的子任务粒度可能天差地别——要么太粗要么太细,根本无法统一应用到实际的项目管理或执行系统中;
- 大模型的「规划逻辑可解释性」几乎为零:当Agent生成一个有问题的Plan时,你根本不知道它为什么会这么想——只能通过“修改System Prompt”这种“黑盒测试”的方式不断试错,效率极低;
- 没有「反馈迭代机制」:传统的Plan生成后,要么直接执行,要么只是简单地让大模型“检查一下Plan是否有问题”——这种“无结构化反馈”的检查方式,根本无法发现Plan中的隐藏缺陷(比如依赖关系缺失、风险预警触发条件不合理、工时估算完全脱离实际)。
而我在落地项目中总结出来的「分层迭代Prompt Chain任务拆解法」,本质上是把「一次搞定所有规划」的复杂问题,拆解成「N个独立的、有明确输入输出边界的Prompt子任务」,然后通过「结构化的Prompt Chain串联+每个子任务的结构化反馈迭代」,最终生成一个「逻辑严谨、粒度统一、可解释性强、可直接映射到执行系统」的高质量Plan——它的核心逻辑可以用一句话概括:
“先定「方向」,再定「边界」,再定「模块」,再定「子任务」,最后定「子任务的所有细节」——每一步都要有明确的「输入约束」「输出格式」「质量检查规则」「结构化反馈修正机制」,每一步的输出都是下一步的严格输入”。
在优化了我的三个项目的规划算法后,效果非常显著:
这些数据不是我编的——是我从三个项目的内部监控面板(用Prometheus+Grafana搭建的)里直接截图统计出来的(截图我会放在文章的「常见问题FAQ」部分的第一个问题里)。
最终效果展示:优化后的「竞品内容分析与脚本生成器」的一次完整规划过程
为了让大家有一个更直观的感受,我先展示一下优化后的「电商全渠道增长方案拆解甘特图」的完整输出过程的核心截图(文字版压缩)——完整的规划过程视频我会放在B站的「星芒智工AI技术站」账号上,链接也会在「常见问题FAQ」的第一个问题里。
用户输入任务(Raw Input)
请帮我把这个「618期间XX美妆品牌天猫京东小红书全渠道增长30%」的方案拆解成15天可落地的甘特图子任务,要求:
- 覆盖「天猫京东小红书」三个核心渠道
- 每个子任务要有明确的负责人角色(运营专员A/B/C/D、美工、文案、数据分析师、天猫小二对接人、京东小二对接人、小红书MCN对接人)
- 每个子任务要有明确的前置依赖(用子任务编号表示)
- 每个子任务要有明确的交付标准(可量化、可验证)
- 每个子任务要有明确的工时估算(以「0.5天」为最小单位)
- 每个子任务要有明确的风险预警触发条件(至少1条)
- 最终输出可以直接导入Microsoft Project或飞书多维表格甘特图视图
Prompt Chain Step 1:任务边界与核心约束提取(输入:Raw Input → 输出:结构化约束JSON)
核心输出片段(JSON格式,经过结构化验证):
{ “task_goal”: “618期间XX美妆品牌天猫京东小红书全渠道GMV/UV/转化率/复购率综合增长30%(以近30天的历史数据为基准)”, “time_boundary”: “严格15天可落地(假设618预热开始前15天启动)”, “channel_constraints”: [“天猫”, “京东”, “小红书”], “role_list”: [“运营专员A(天猫)”, “运营专员B(京东)”, “运营专员C(小红书种草)”, “运营专员D(跨渠道联动)”, “美工”, “文案”, “数据分析师”, “天猫小二对接人”, “京东小二对接人”, “小红书MCN对接人”], “sub_task_requirements”: { “min_time_unit”: “0.5天”, “must_have_fields”: [“负责人”, “前置依赖”, “交付标准”, “工时”, “风险预警”], “export_format”: “Microsoft Project CSV / 飞书多维表格JSON(二选一,默认飞书多维表格JSON)” }, “other_constraints”: [] }
Prompt Chain Step 2:核心增长模块拆解(输入:Step1的约束JSON → 输出:核心模块树JSON)
核心输出片段(JSON格式,经过结构化验证):
{ “core_modules”: [ { “module_id”: “M1”, “module_name”: “全渠道历史数据分析与目标拆解”, “module_priority”: “P0(最高优先级)”, “module_start_day”: 1, “module_end_day”: 2, “module_leader”: “数据分析师”, “module_sub_modules”: [] }, { “module_id”: “M2”, “module_name”: “天猫渠道预热活动策划与物料准备”, “module_priority”: “P0”, “module_start_day”: 2, “module_end_day”: 8, “module_leader”: “运营专员A(天猫)”, “module_sub_modules”: [ { “sub_module_id”: “M2-1”, “sub_module_name”: “天猫预热活动规则与玩法策划”, “sub_module_priority”: “P0” }, { “sub_module_id”: “M2-2”, “sub_module_name”: “天猫预热活动物料准备(Banner、详情页、优惠券图)”, “sub_module_priority”: “P0” }, { “sub_module_id”: “M2-3”, “sub_module_name”: “天猫预热活动小二对接与资源位申请”, “sub_module_priority”: “P1” } ] }, // 省略M3(京东)、M4(小红书)、M5(跨渠道联动)、M6(数据监控与迭代优化)模块 ] }
Prompt Chain Step 3:核心模块到子任务的初步拆解(输入:Step1约束JSON + Step2模块树JSON → 输出:初步子任务列表JSON)
核心输出片段(JSON格式,经过结构化验证):
{ “preliminary_sub_tasks”: [ { “sub_task_id”: “T1”, “sub_task_name”: “近30天XX美妆品牌天猫京东小红书全渠道历史数据采集”, “module_id”: “M1”, “preliminary_leader”: “数据分析师”, “preliminary_start_day”: 1, “preliminary_end_day”: 1.5, “preliminary_dependencies”: [], “preliminary_quality_check”: “是否覆盖了GMV、UV、PV、转化率、客单价、复购率、TOP10单品销量、渠道流量来源占比这9个核心指标?” }, { “sub_task_id”: “T2”, “sub_task_name”: “近30天XX美妆品牌全渠道核心指标增长瓶颈分析”, “module_id”: “M1”, “preliminary_leader”: “数据分析师”, “preliminary_start_day”: 1.5, “preliminary_end_day”: 2, “preliminary_dependencies”: [“T1”], “preliminary_quality_check”: “是否找到了每个渠道至少2个、跨渠道至少1个可量化的增长瓶颈?” }, // 省略T3-T30初步子任务 ] }
Prompt Chain Step 4:初步子任务的粒度与逻辑检查+修正(输入:Step1约束JSON + Step2模块树JSON + Step3初步子任务JSON → 输出:修正后子任务列表JSON + 修正日志JSON)
核心修正日志片段(JSON格式,保证可解释性):
{ “revision_logs”: [ { “revision_id”: “R1”, “related_sub_task_id”: “T5”, “original_sub_task_name”: “天猫预热活动优惠券图设计”, “revision_reason”: “粒度太粗——美工需要分别设计「满300减50元天猫平台券叠加图」「满599减100元品牌券图」「新人专享9.9元小样试用装券图」这3种不同类型的优惠券图,且交付时间不同”, “revision_action”: “将T5拆分为T5-1、T5-2、T5-3三个子任务”, “revision_time”: “Step4第1次迭代” }, { “revision_id”: “R2”, “related_sub_task_id”: “T12”, “original_sub_task_dependencies”: [“T6”], “revision_reason”: “前置依赖缺失——T12是「天猫预热活动Banner上线」,除了依赖T6(Banner设计完成),还需要依赖T10(天猫预热活动小二对接与资源位申请通过)”, “revision_action”: “将T12的前置依赖修改为[”T6“, ”T10“]”, “revision_time”: “Step4第1次迭代” }, // 省略R3-R12修正日志 ] }
Prompt Chain Step 5:修正后子任务的细节填充(输入:Step1约束JSON + Step2模块树JSON + Step4修正后子任务JSON → 输出:最终子任务全量JSON)
核心最终子任务片段(JSON格式,可直接导入飞书多维表格):
{ “final_sub_tasks”: [ { “sub_task_id”: “T1”, “sub_task_name”: “近30天XX美妆品牌天猫京东小红书全渠道历史数据采集”, “module_id”: “M1”, “module_name”: “全渠道历史数据分析与目标拆解”, “leader”: “数据分析师”, “start_day”: 1, “end_day”: 1.5, “work_hours”: 4, “dependencies”: [], “delivery_standards”: [ “导出包含GMV、UV、PV、转化率、客单价、复购率、TOP10单品销量、渠道流量来源占比这9个核心指标的Excel表格,数据粒度精确到「天」和「TOP3单品」”, “数据来源必须包含:天猫生意参谋专业版、京东商智高级版、小红书蒲公英平台后台、品牌内部CRM系统近30天的订单数据”, “Excel表格必须要有清晰的「数据说明」「数据清洗规则」「异常数据标注」三个Sheet” ], “risk_warnings”: [ “触发条件1:天猫生意参谋专业版数据导出权限失效 → 预警负责人:数据分析师+运营总监 → 预警响应时间:0.5天内 → 应急预案:申请临时权限或用品牌内部数据中台的历史数据替代” ], “priority”: “P0” }, // 省略T2-T40最终子任务 ], “export_format”: “飞书多维表格甘特图JSON”, “export_mapping_rules”: { “sub_task_id”: “任务编号”, “sub_task_name”: “任务名称”, “module_name”: “所属模块”, “leader”: “负责人”, “start_day”: “开始日期(相对于启动日的偏移量)”, “end_day”: “结束日期(相对于启动日的偏移量)”, “work_hours”: “工时(小时)”, “dependencies”: “前置依赖(任务编号,用逗号分隔)”, “delivery_standards”: “交付标准(用换行符分隔)”, “risk_warnings”: “风险预警(用换行符分隔)”, “priority”: “优先级(P0/P1/P2)” } }
文章脉络:我们今天要讲什么?
这篇文章我会用「问题解决型+部分深度剖析」的结构来写,总共分为8个部分:
- 引言(就是现在你正在读的这部分):痛点引入、解决方案概述、最终效果展示、文章脉络;
- 准备工作:环境/工具准备、基础知识储备(包括AI Agent Harness Engineering的基本概念、LangChain的基础链、Prompt Engineering的核心原则);
- 核心原理解析:为什么「分层迭代Prompt Chain」能从底层解决AI Agent规划问题?(包括大模型的推理逻辑缺陷分析、分层迭代的数学模型、结构化Prompt的设计原则);
- 核心步骤详解:从0到1搭建「分层迭代Prompt Chain任务拆解系统」的5个核心步骤(每个步骤都有完整的Prompt、Python代码、原理解释、边界处理);
- 实际场景应用:把这套系统应用到「API全链路测试助手」和「需求拆解器」这两个不同的场景中,看看效果如何;
- **实践Tips:我在落地过程中踩过的20个坑,以及对应的解决方案;
- 行业发展与未来趋势:AI Agent规划算法的发展历史、现状、以及未来的发展方向;
- 总结与扩展:回顾核心要点、常见问题FAQ、下一步学习资源、延伸阅读。
好了,废话不多说,我们进入正题!
(这里只放核心Prompt片段和输出片段,完整Prompt会放在文章的「核心步骤」部分)
在正式开始搭建「分层迭代Prompt Chain任务拆解系统」之前,我们需要先做好环境/工具准备和基础知识储备——这部分虽然看起来有点枯燥,但却是必不可少的:如果你的环境没搭好,或者基础知识储备不足,后面的核心步骤你可能根本看不懂,更别说自己动手实践了。
环境/工具准备
我推荐大家用Python 3.10+作为开发语言,用LangChain 0.1.x/0.2.x作为AI Agent框架(虽然LangChain 0.3.x已经出来了,但0.1.x/0.2.x的社区支持更完善,文档更齐全,更适合初学者),用OpenAI GPT-4o或者Anthropic Claude 3 Opus/Sonnet作为底层大模型(强模型是基础——如果用GPT-3.5-turbo,效果会大打折扣,因为它的推理能力、结构化输出能力、长上下文注意力能力都不如强模型),用Pydantic作为数据验证工具(保证Prompt Chain的每一步输出都是严格的结构化JSON,不会出现格式错误),用python-dotenv作为环境变量管理工具(保护你的API Key不会泄露)。
下面是具体的环境/工具安装步骤:
1. 安装Python 3.10+
我推荐大家用Anaconda或者Miniconda来管理Python环境——这样可以避免不同项目之间的依赖冲突。
如果你还没有安装Anaconda/Miniconda,可以去官网下载:
- Anaconda官网:https://www.anaconda.com/download
- Miniconda官网:https://docs.conda.io/en/latest/miniconda.html
安装完成后,打开终端(Windows用户打开「Anaconda Prompt」,Mac/Linux用户打开「Terminal」),创建一个名为ai-agent-prompt-chain的Python 3.10环境:
conda create -n ai-agent-prompt-chain python=3.10 -y
激活这个环境:
# Windows用户 conda activate ai-agent-prompt-chain # Mac/Linux用户 source activate ai-agent-prompt-chain
2. 安装必要的依赖库
在激活的环境中,依次安装以下依赖库:
# LangChain框架(核心) pip install langchain==0.2.12 langchain-openai==0.1.20 langchain-core==0.2.35 # Pydantic(数据验证,核心) pip install pydantic==2.8.2 # python-dotenv(环境变量管理) pip install python-dotenv==1.0.1 # 其他工具库(可选,但推荐) pip install pandas==2.2.2 openpyxl==3.1.5 # 处理Excel文件 pip install rich==13.7.1 # 美化终端输出
这里要注意的是LangChain的版本号——我特意指定了0.2.12、0.1.20、0.2.35这三个版本号,因为LangChain的更新非常快,不同版本之间的API可能有很大的差异——如果你用了其他版本,后面的代码可能会报错。
3. 申请大模型API Key
你需要申请至少一个强模型的API Key——我推荐大家先申请OpenAI GPT-4o的API Key,因为它的性价比最高(目前OpenAI GPT-4o的输入Token价格是$0.005/1K,输出Token价格是$0.015/1K——比Claude 3 Opus便宜很多,比Claude 3 Sonnet贵一点,但推理能力和结构化输出能力比Claude 3 Sonnet强)。
如果你没有OpenAI的账号,或者无法直接访问OpenAI的API,可以用国内的一些大模型API服务商,比如:
- 智谱AI(GLM-4-Plus):https://open.bigmodel.cn/
- 阿里通义千问(Qwen2-72B-Instruct/Qwen-Turbo):https://dashscope.aliyun.com/
- 百度文心一言(ERNIE 4.0 Turbo):https://cloud.baidu.com/product/wenxinworkshop
- 字节跳动豆包(Doubao Pro):https://www.volcengine.com/product/doubao
这些国内大模型的API服务商都有LangChain的集成——只需要把后面代码中的ChatOpenAI换成对应的ChatZhipuAI、ChatTongyi、ChatErnie、ChatDoubao即可,其他代码基本不用改。
申请到API Key后,在项目根目录下创建一个名为.env的文件,把你的API Key和其他必要的配置写进去:
# OpenAI配置(如果用国内大模型,把下面的OpenAI配置换成对应的国内大模型配置) OPENAI_API_KEY="你的OpenAI API Key" OPENAI_BASE_URL="你的OpenAI API Base URL(如果用国内镜像站的话,需要填这个;如果直接访问OpenAI的API,不需要填)" OPENAI_MODEL_NAME="gpt-4o-2024-08-06" # 推荐用最新的稳定版 OPENAI_TEMPERATURE=0.1 # 规划任务需要稳定性,所以温度要设得很低,推荐0.0-0.2 OPENAI_MAX_TOKENS=4096 # 每一步的输出Token数不要设得太大,推荐2048-8192 # 其他配置 PROJECT_ROOT_DIR="你的项目根目录的绝对路径"
重要提示: 千万不要把.env文件上传到GitHub或其他公开的代码仓库!一定要在.gitignore文件中加上.env——如果你还没有.gitignore文件,可以在项目根目录下创建一个,内容如下:
# Environment variables .env .env.local .env.*.local # Python __pycache__/ *.py[cod] *$py.class *.so .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg # IDE .vscode/ .idea/ *.swp *.swo *~ # OS .DS_Store Thumbs.db
基础知识储备
在正式开始之前,我们需要先掌握以下4个方面的基础知识:
- AI Agent Harness Engineering的基本概念;
- LangChain的基础链(尤其是LLMChain和SequentialChain);
- Prompt Engineering的核心原则(尤其是结构化输出Prompt的设计原则);
- Pydantic 2.x的基本用法(用于数据验证)。
如果你已经掌握了这些基础知识,可以直接跳过这部分,进入下一章的「核心原理解析」;如果你还没有掌握,或者想复习一下,建议你仔细阅读这部分——或者至少看一下我在每个知识点下面给出的「核心要点」和「快速学习资源链接」。
1. AI Agent Harness Engineering的基本概念
什么是AI Agent Harness Engineering?
简单来说,AI Agent Harness Engineering(中文可以翻译为「AI Agent harness工程」或「AI Agent管控工程」)是一门专门研究「如何构建、部署、监控、优化、维护可靠、高效、可扩展的AI Agent系统」的工程学科——它和传统的「Prompt Engineering」「大模型应用开发」的区别在于:
AI Agent的5个核心模块是什么?
根据吴恩达教授在「AI Agentic Design Patterns」课程中的定义,一个完整的AI Agent系统通常包含以下5个核心模块:
- 规划(Planning)模块:就是我们今天要讲的重点——它负责把用户的复杂任务拆解成一系列可执行的子任务,制定执行计划;
- 记忆(Memory)模块:负责存储AI Agent的「短期记忆」(比如当前对话的上下文、当前任务的执行进度)和「长期记忆」(比如项目的历史数据、用户的偏好、领域专有知识);
- 行动(Action)模块:负责执行规划模块制定的子任务——它通常包括「工具调用」(比如调用浏览器、调用API、调用数据库、调用向量数据库检索)和「直接输出」两种方式;
- 反思(Reflection)模块:负责对AI Agent的执行结果进行反思和总结——比如「这个子任务为什么失败了?」「下次遇到类似的问题应该怎么做?」;
- 反馈(Feedback)模块:负责把反思模块的结果反馈给规划模块和记忆模块——帮助规划模块优化后续的计划,帮助记忆模块更新长期记忆。
而我们今天要讲的「分层迭代Prompt Chain任务拆解法」,本质上就是对规划模块的底层逻辑进行重构——同时也会用到记忆模块(存储每一步的输出,作为下一步的输入)和反馈模块(每一步的结构化质量检查和修正)。
核心要点:
- AI Agent Harness Engineering的核心目标是构建「可靠、高效、可扩展、可维护、可解释、可控」的AI Agent系统;
- AI Agent的5个核心模块是:规划、记忆、行动、反思、反馈;
- 我们今天要讲的重点是「规划模块的优化」。
快速学习资源链接:
- 吴恩达教授的「AI Agentic Design Patterns」课程(免费,英文):https://www.deeplearning.ai/courses/ai-agentic-design-patterns/
- 吴恩达教授的「AI Agentic Design Patterns」课程的中文笔记(GitHub):https://github.com/datawhalechina/agentic-design-patterns
- LangChain官方文档中的「AI Agents」章节:https://python.langchain.com/v0.2/docs/how_to/#agents
- CrewAI官方文档:https://docs.crewai.com/
2. LangChain的基础链(尤其是LLMChain和SequentialChain)
什么是LangChain的Chain?
简单来说,LangChain的Chain(中文可以翻译为「链」)是一种把多个组件(比如大模型、Prompt模板、工具调用、记忆模块)串联起来,形成一个完整的「任务处理流程」的模块化组件——它的核心思想是「分而治之」:把一个复杂的任务拆解成多个简单的子任务,每个子任务由一个Chain来处理,然后把这些Chain串联起来,形成一个完整的任务处理流程。
LangChain中有很多种不同类型的Chain,比如:
- LLMChain:最基础的Chain——它把「Prompt模板」和「大模型」串联起来,输入一个Prompt变量字典,输出一个大模型的推理结果;
- SequentialChain:把多个Chain按照顺序串联起来——前一个Chain的输出作为后一个Chain的输入;
- RouterChain:根据输入的内容,自动选择合适的Chain来处理;
- RetrievalQAChain:把「向量数据库检索」和「大模型问答」串联起来——用于检索增强生成(RAG);
- PlanAndExecuteChain:把「规划模块」和「执行模块」串联起来——就是我们之前提到的「默认线性规划链」。
而我们今天要讲的「分层迭代Prompt Chain任务拆解法」,本质上就是用多个LLMChain和SequentialChain来构建的——不过我们会对默认的SequentialChain进行一些优化,加入「结构化输出验证」和「反馈迭代机制」。
LLMChain的基本用法是什么?
下面是一个最简单的LLMChain的Python代码示例:
# 导入必要的库 from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.chains import LLMChain from langchain_core.output_parsers import StrOutputParser # 输出解析器
# 加载环境变量 load_dotenv()
# 1. 初始化大模型 llm = ChatOpenAI(
model_name="gpt-4o-2024-08-06", temperature=0.1, max_tokens=4096
)
# 2. 定义Prompt模板 prompt_template = ChatPromptTemplate.from_messages([
("system", "你是一位专业的翻译官,请把用户输入的中文翻译成英文,要求翻译准确、流畅、符合英文的表达习惯。"), ("human", "{chinese_text}")
])
# 3. 定义输出解析器(这里用最简单的StrOutputParser,直接把大模型的输出转换成字符串) output_parser = StrOutputParser()
# 4. 构建LLMChain(LangChain 0.1.x/0.2.x推荐用「|」运算符来构建Chain,而不是用LLMChain类——不过LLMChain类也可以用) chain = prompt_template | llm | output_parser
# 5. 调用Chain result = chain.invoke({“chinese_text”: “你好,世界!”})
# 6. 输出结果 print(result)
运行这段代码后,你会得到以下输出:
Hello, world!
这里要注意的是LangChain 0.1.x/0.2.x推荐用「|」运算符来构建Chain(这种方式叫做「LangChain Expression Language,简称LCEL」)——LCEL比传统的LLMChain类更灵活、更易读、更易维护,而且支持异步调用、流式输出、中间结果缓存等高级功能——所以后面的代码我都会用LCEL来构建,而不是用传统的LLMChain类。
SequentialChain(LCEL版本)的基本用法是什么?
下面是一个最简单的LCEL版本的SequentialChain的Python代码示例——它先把中文翻译成英文,再把英文翻译成法语:
# 导入必要的库 from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough # 用于传递不需要处理的变量
# 加载环境变量 load_dotenv()
# 1. 初始化大模型 llm = ChatOpenAI(
model_name="gpt-4o-2024-08-06", temperature=0.1, max_tokens=4096
)
# 2. 定义第一个Chain:中文翻译成英文 chinese_to_english_prompt = ChatPromptTemplate.from_messages([
("system", "你是一位专业的中英翻译官,请把用户输入的中文翻译成英文,要求翻译准确、流畅、符合英文的表达习惯。"), ("human", "{chinese_text}")
]) chinese_to_english_chain = chinese_to_english_prompt | llm | StrOutputParser()
# 3. 定义第二个Chain:英文翻译成法语 english_to_french_prompt = ChatPromptTemplate.from_messages([
("system", "你是一位专业的英法翻译官,请把用户输入的英文翻译成法语,要求翻译准确、流畅、符合法语的表达习惯。"), ("human", "{english_text}")
]) english_to_french_chain = english_to_french_prompt | llm | StrOutputParser()
# 4. 构建SequentialChain(LCEL版本):先调用第一个Chain,把输出作为第二个Chain的输入;同时用RunnablePassthrough传递原始的chinese_text sequential_chain = (
{"english_text": chinese_to_english_chain, "chinese_text": RunnablePassthrough()} | english_to_french_chain
)
# 5. 调用SequentialChain result = sequential_chain.invoke({“chinese_text”: “你好,世界!”})
# 6. 输出结果 print(result)
运行这段代码后,你会得到以下输出:
Bonjour le monde!
这里要注意的是RunnablePassthrough的用法——它用于传递不需要处理的变量,比如上面的chinese_text——如果我们不用RunnablePassthrough,那么第二个Chain就无法获取到原始的chinese_text变量(当然在这个示例中第二个Chain不需要原始的chinese_text变量,但在后面的「分层迭代Prompt Chain任务拆解系统」中,我们经常需要传递前面步骤的原始输入或中间输出)。
核心要点:
- LangChain的Chain是一种把多个组件串联起来的模块化组件;
- LangChain 0.1.x/0.2.x推荐用LCEL(「|」运算符)来构建Chain;
- LLMChain是最基础的Chain,用于把Prompt模板和大模型串联起来;
- SequentialChain用于把多个Chain按照顺序串联起来;
RunnablePassthrough用于传递不需要处理的变量。
快速学习资源链接:
- LangChain官方文档中的「LCEL」章节:https://python.langchain.com/v0.2/docs/concepts/#langchain-expression-language-lcel
- LangChain官方文档中的「LLMChain」章节:https://python.langchain.com/v0.2/docs/how_to/llm_chain/
- LangChain官方文档中的「SequentialChain」章节:https://python.langchain.com/v0.2/docs/how_to/sequential_chain/
- 李沐老师的「动手学大模型应用开发」课程中的「LangChain基础」章节(免费,中文):https://space.bilibili.com/1567748478/channel/collectiondetail?sid=369948
3. Prompt Engineering的核心原则(尤其是结构化输出Prompt的设计原则)
什么是Prompt Engineering?
简单来说,Prompt Engineering(中文可以翻译为「提示工程」)是一门专门研究「如何设计高质量的Prompt,来引导大模型输出我们想要的结果」的学科——它是AI Agent Harness Engineering的基础,也是构建可靠、高效的AI Agent系统的关键。
Prompt Engineering的核心原则是什么?
关于Prompt Engineering的核心原则,不同的人有不同的看法——但根据OpenAI官方文档、Anthropic官方文档、以及我自己的实践经验,我认为以下10个原则是最重要的:
- 明确角色设定:在System Prompt中明确告诉大模型它的角色是什么(比如“你是一位专业的产品经理”“你是一位专业的API测试工程师”)——这样可以引导大模型从该角色的角度出发来思考问题;
- 明确目标设定:在System Prompt或Human Prompt中明确告诉大模型它的目标是什么(比如“请把这个需求拆解成可落地的子任务”“请帮我测试这个API的幂等性”)——不要让大模型猜你的目标;
- 明确边界设定:在System Prompt中明确告诉大模型它的能力边界是什么(比如“你只能处理电商领域的需求拆解”“你不能调用外部工具,只能根据我提供的文档来测试API”)——避免大模型做超出它能力范围的事情;
- 明确规则设定:在System Prompt中明确告诉大模型它需要遵守的规则是什么(比如“子任务的粒度不能太粗也不能太细”“API测试的用例必须包含正常用例、异常用例、边界用例”);
- 明确输出格式设定:在System Prompt或Human Prompt中明确告诉大模型它的输出格式是什么(比如“请输出严格的JSON格式”“请输出Markdown格式的表格”)——这是构建可靠的AI Agent系统的关键;
- 提供Few-Shot Learning示例:如果任务比较复杂,或者输出格式比较特殊,在Prompt中提供几个「输入-输出」示例——这样可以大幅提升大模型输出的质量和稳定性;
- 使用思维链(Chain of Thought,简称CoT)提示:如果任务需要复杂的推理,在Prompt中告诉大模型“请先思考,再给出答案”或者“请把你的思考过程写出来”——这样可以大幅提升大模型的推理准确性;
- 使用结构化的提示词:把Prompt分成多个清晰的部分(比如「角色设定」「目标设定」「边界设定」「规则设定」「输出格式设定」「Few-Shot Learning示例」「输入内容」)——这样可以让大模型更容易理解你的要求;
- 控制温度参数:温度参数(Temperature)控制大模型输出的随机性——温度越低,输出越稳定;温度越高,输出越有创意——对于规划、测试、翻译等需要稳定性的任务,温度要设得很低(推荐0.0-0.2);对于写作、创意设计等需要创意的任务,温度可以设得高一点(推荐0.5-0.8);
- 迭代优化Prompt:Prompt Engineering不是一蹴而就的——你需要不断地测试、不断地迭代优化Prompt,才能得到你想要的结果。
结构化输出Prompt的设计原则是什么?
结构化输出是构建可靠的AI Agent系统的核心中的核心——如果大模型的输出不是严格的结构化格式,那么后续的Chain就无法处理它的输出,整个系统就会崩溃。
根据我自己的实践经验,结构化输出Prompt的设计原则主要有以下5个:
- 明确指定输出格式:必须明确告诉大模型“请输出严格的JSON格式”“请输出严格的XML格式”“请输出严格的YAML格式”——不要说“请输出类似JSON的格式”;
- 提供详细的输出Schema:必须用JSON Schema、Pydantic模型、或者清晰的文字描述,告诉大模型输出的每个字段的名称、类型、含义、是否必填、约束条件是什么——比如:
{ “type”: “object”, “properties”: {
"sub_task_id": {"type": "string", "description": "子任务的唯一编号,格式为T+数字,比如T1、T2", "minLength": 2, "maxLength": 10, "pattern": "^T\d+$"}, "sub_task_name": {"type": "string", "description": "子任务的名称,要求清晰、明确、不超过50个字符", "minLength": 5, "maxLength": 50}, "leader": {"type": "string", "description": "子任务的负责人,必须从给定的角色列表中选择", "enum": ["运营专员A", "运营专员B", "数据分析师"]}, "work_hours": {"type": "number", "description": "子任务的工时估算,以0.5天为最小单位,比如0.5、1、1.5", "minimum": 0.5, "maximum": 10, "multipleOf": 0.5}
}, “required”: [“sub_task_id”, “sub_task_name”, “leader”, “work_hours”], “additionalProperties”: false }
json、),不要输出任何解释性的文字,不要输出任何多余的内容”——虽然GPT-4o、Claude 3 Opus/Sonnet这些强模型通常会遵守这个规则,但有时候还是会输出一些额外的内容,所以必须明确告诉它;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/271499.html