实战分享:用 Agentic 设计模式重塑你的 AI 项目开发流程
最近和几个做 AI 应用的朋友聊天,大家普遍有个感觉:模型能力越来越强,但项目交付的效率和最终产出的质量,似乎并没有线性提升。我们花大量时间在提示工程上,反复调试,结果还是常常得到一个“看似正确,实则脆弱”的解决方案。问题出在哪?很多时候,我们仍然在用“一次性问答”的思维去构建系统,把大模型当作一个静态的、万能的“神谕”,而不是一个可以引导、可以协作、可以自我完善的动态智能体。
这让我想起了软件开发中设计模式的价值。它们不是具体的代码,而是一套经过验证的、解决特定问题的思维框架。在 AI 应用开发领域,我们同样需要这样的框架。Agentic 设计模式正是这样一套方法论,它不局限于某个特定的模型或工具链,而是指导我们如何将大模型的能力组织起来,构建出更自主、更可靠、更高效的智能系统。简单说,它让 AI 从“答题机器”变成了“解题伙伴”。
今天,我们不谈空洞的理论,直接进入实战。我会结合具体的代码示例和项目场景,拆解如何将 Agentic 的核心理念——反思、工具使用、规划、多智能体协作——落地到你的项目中,真正提升开发效率和系统表现。
1. 从“一次性生成”到“迭代式精炼”:反思模式实战
反思模式是 Agentic 工作流的基石。它的核心思想是让 AI 具备自我审查和迭代优化的能力。这听起来很抽象,但在代码生成、内容审核、数据分析报告撰写等场景下,效果立竿见影。
想象一下,你让模型生成一段数据处理脚本。传统的零样本提示可能给你一个能运行的版本,但里面可能充斥着冗余循环、未处理的边界条件,或者糟糕的变量命名。反思模式则要求模型先“交初稿”,再以“审阅者”的身份批判自己的作品,最后基于批评进行修订。
1.1 构建一个简单的代码审查智能体
我们用一个 Python 示例来具体说明。假设我们需要一个智能体,它能生成一个函数,并自动检查其代码质量。
首先,我们定义智能体的核心“反思”逻辑。这里我们使用 LangChain 的框架来构建,因为它提供了清晰的智能体抽象。
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage, AIMessage
import re
class CodeReflectionAgent:
def __init__(self, model_name="gpt-4"):
self.llm = ChatOpenAI(model_name=model_name, temperature=0.1)
self.conversation_history = []
def generate_code(self, requirement):
"""第一轮:根据需求生成初始代码"""
system_prompt = SystemMessage(content="你是一个资深的 Python 开发工程师。请根据用户需求,编写简洁、高效的代码。只返回代码块,不要额外解释。")
user_prompt = HumanMessage(content=f"需求:{requirement}")
response = self.llm([system_prompt, user_prompt])
initial_code = response.content
self.conversation_history.append(("生成", initial_code))
return initial_code
def reflect_on_code(self, code):
"""第二轮:以审查者身份反思代码问题"""
reflection_prompt = SystemMessage(content="你是一个严格的代码审查员。请仔细分析以下 Python 代码,指出其在效率、可读性、健壮性(如边界条件处理)、PEP 8 规范遵守等方面存在的具体问题。请分点列出,问题要具体。")
code_message = HumanMessage(content=f"待审查的代码:\n```python\n{code}\n```")
response = self.llm([reflection_prompt, code_message])
critique = response.content
self.conversation_history.append(("反思", critique))
return critique
def revise_code(self, code, critique):
"""第三轮:根据批评意见修订代码"""
revision_prompt = SystemMessage(content="你是一名优秀的程序员。请根据代码审查意见,对原始代码进行修改和优化。只返回最终修订后的完整代码块。")
revision_message = HumanMessage(content=f"原始代码:\n```python\n{code}\n```\n\n审查意见:\n{critique}")
response = self.llm([revision_prompt, revision_message])
revised_code = response.content
self.conversation_history.append(("修订", revised_code))
return revised_code
def run(self, requirement, max_iterations=2):
"""运行完整的反思工作流"""
print(f"需求: {requirement}\n")
code = self.generate_code(requirement)
print(f"=== 初始代码生成 ===\n{code}\n")
for i in range(max_iterations):
print(f"--- 第 {i+1} 轮反思 ---")
critique = self.reflect_on_code(code)
print(f"审查意见:\n{critique}\n")
new_code = self.revise_code(code, critique)
print(f"修订后的代码:\n{new_code}\n")
# 简单判断是否还有明显问题(例如是否存在“TODO”或“fixme”注释)
if "TODO" not in new_code.upper() and "FIXME" not in new_code.upper():
# 可以加入更复杂的判断,比如静态分析
print("反思循环结束,代码已优化。")
return new_code
code = new_code
print(f"达到最大迭代次数 {max_iterations},返回当前最优代码。")
return code
# 使用示例
if __name__ == "__main__":
agent = CodeReflectionAgent(model_name="gpt-4")
requirement = "编写一个函数,输入一个整数列表,返回列表中所有偶数的平方组成的新列表。如果输入不是列表或包含非整数元素,应优雅地处理错误。"
final_code = agent.run(requirement)
注意:在实际生产环境中,反思环节可以集成真正的静态分析工具(如
pylint、black)的输出来作为更客观的批评依据,而不仅仅依赖 LLM 的主观判断。
这个简单的智能体展示了一个完整的“生成-反思-修订”循环。你可能会发现,经过一轮反思后,模型生成的代码会从仅仅实现功能,进化到包含异常处理、类型注解,甚至更高效的列表推导式。
1.2 反思模式的关键设计考量
实施反思模式时,有几点需要特别注意:
- 反思的粒度:是审查整个模块,还是逐函数审查?对于复杂任务,分层反思(先审查架构,再审查具体实现)往往更有效。
- 停止条件:如何判断“足够好”?可以设定最大迭代次数,也可以让模型自己判断是否还需要改进(例如,增加一个“是否满意”的自评步骤)。
- 反思提示词的质量:审查者的角色设定至关重要。是“严厉的架构师”还是“注重细节的测试工程师”?不同的角色会指出不同维度的问题。
反思模式的价值在于,它将开发者的部分代码审查工作自动化、前置化了。它不能替代人工审查,但能极大减少低级错误和风格不一致的问题,让开发者更专注于逻辑和架构层面的挑战。
2. 打破知识边界:工具使用模式的深度集成
大模型的知识是静态的、有截止日期的,并且不擅长精确计算。工具使用模式通过赋予模型调用外部工具的能力,完美地弥补了这些缺陷。这不仅仅是让模型“能上网搜索”,而是构建一个模型与真实世界交互的标准化接口。
2.1 构建一个具备多工具调用能力的智能体
让我们设计一个数据分析助手智能体,它需要能查询数据库、进行专业计算并绘制图表。
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain.chat_models import ChatOpenAI
from langchain.utilities import SQLDatabase
from langchain_experimental.sql import SQLDatabaseChain
import pandas as pd
import matplotlib.pyplot as plt
import io
import json
# 模拟一些工具函数
def query_database(query: str) -> str:
"""模拟数据库查询工具。实际项目中会连接真实数据库。"""
# 这里用一个简单的字典模拟数据表
data = {
'sales': pd.DataFrame({
'date': ['2023-01-01', '2023-01-02', '2023-01-03'],
'region': ['North', 'South', 'North'],
'amount': [1000, 1500, 800]
}),
'products': pd.DataFrame({
'product_id': [1, 2, 3],
'name': ['Product A', 'Product B', 'Product C'],
'category': ['Electronics', 'Books', 'Electronics']
})
}
try:
# 这是一个极其简化的“SQL”解析,仅为演示。真实场景应使用 SQLDatabaseChain。
if "sales" in query.lower():
df = data['sales']
if "north" in query.lower():
result = df[df['region'] == 'North']
else:
result = df
return result.to_string()
else:
return "未找到相关数据表或查询条件。"
except Exception as e:
return f"查询出错: {e}"
def calculate_statistics(data_description: str) -> str:
"""模拟统计计算工具。接收数据描述,返回统计结果。"""
# 假设数据描述是JSON字符串或简单描述,这里解析并计算
try:
# 示例:如果描述中包含列表
import re
numbers = re.findall(r'\d+', data_description)
if numbers:
num_list = list(map(int, numbers))
stats = {
"总和": sum(num_list),
"平均值": sum(num_list) / len(num_list),
"最大值": max(num_list),
"最小值": min(num_list)
}
return json.dumps(stats, ensure_ascii=False)
else:
return "未从描述中提取到有效数值数据。"
except Exception as e:
return f"统计计算失败: {e}"
def generate_plot(instruction: str) -> str:
"""模拟图表生成工具。根据指令生成图表并保存。"""
try:
# 根据指令生成一个简单的示例图
plt.figure()
if "trend" in instruction.lower() or "line" in instruction.lower():
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title("示例趋势图")
else:
plt.bar(['A', 'B', 'C'], [5, 7, 3])
plt.title("示例柱状图")
# 保存到内存或文件
buf = io.BytesIO()
plt.savefig(buf, format='png')
plt.close()
buf.seek(0)
# 在实际应用中,这里可能返回文件路径或Base64编码的图片
return "图表已生成并保存为 'output_plot.png'。"
except Exception as e:
return f"图表生成失败: {e}"
# 定义工具列表
tools = [
Tool(
name="SalesDatabase",
func=query_database,
description="用于查询销售数据。输入应为自然语言描述,例如‘查询北部地区的销售数据’。"
),
Tool(
name="DataStatistics",
func=calculate_statistics,
description="用于计算一组数据的统计信息(总和、平均值、最大值、最小值)。输入应包含数据列表的描述。"
),
Tool(
name="PlotGenerator",
func=generate_plot,
description="用于生成图表。输入应为对图表类型的描述,例如‘生成一个销售趋势折线图’。"
)
]
# 初始化智能体
llm = ChatOpenAI(model_name="gpt-4", temperature=0)
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # 使用 ReAct 代理框架
verbose=True, # 输出详细思考过程
handle_parsing_errors=True
)
# 执行一个复杂任务
result = agent.run("请先查询一下北部地区的销售数据,然后计算总销售额和平均销售额,最后根据结果生成一个简单的柱状图来展示各日期的销售额。")
print(result)
运行上述代码,你会看到智能体是如何一步步“思考”的:
- 思考:我需要先获取数据。
- 行动:调用
SalesDatabase工具查询“北部地区销售数据”。 - 观察:工具返回了数据表格。
- 思考:现在我有了数据,需要计算总和与平均值。
- 行动:调用
DataStatistics工具,并尝试从刚才返回的数据中提取金额列表。 - 观察:工具返回了统计结果。
- 思考:最后,我需要用这些数据生成一个柱状图。
- 行动:调用
PlotGenerator工具。
提示:
ZERO_SHOT_REACT_DESCRIPTION代理类型让模型遵循“思考 -> 行动 -> 观察”的循环,这是工具使用模式的经典实现,它让模型的推理过程对开发者可见、可控。
2.2 工具生态的设计哲学
工具使用模式的成功,很大程度上取决于工具的设计质量。好的工具应该具备以下特征:
| 特征 | 说明 | 反面例子 |
|---|---|---|
| 功能单一明确 | 一个工具只做一件事,且描述清晰。 | “数据处理工具”(过于宽泛) |
| 接口稳定 | 输入输出格式固定,减少模型调用时的歧义。 | 输入有时是字符串,有时是字典。 |
| 错误处理友好 | 返回的错误信息应能帮助模型理解问题所在。 | 只返回 None 或抛出晦涩异常。 |
| 有状态与无状态 | 区分清楚。查询工具通常无状态,而“购物车”工具则有状态。 | 混淆状态,导致会话间数据污染。 |
在实践中,我建议为你的 AI 项目维护一个工具目录,并随着项目演进不断丰富和优化它。这就像为你的智能体打造一个专属的“瑞士军刀”。
3. 化繁为简:规划模式驱动复杂任务分解
当面对“开发一个简单的待办事项 Web 应用”这样的复杂指令时,直接让模型生成所有代码无异于让它“一口吃成胖子”,结果往往是一团糟。规划模式的核心,是教导模型像资深项目经理一样,先拆解任务,再分步执行。
3.1 实现一个任务规划与执行智能体
我们可以利用 LangChain 的 LLMChain 和自定义输出解析器,来构建一个具备规划能力的智能体。
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List
import json
# 定义规划步骤的数据结构
class PlanStep(BaseModel):
step_number: int = Field(description="步骤序号")
description: str = Field(description="该步骤的详细描述")
deliverable: str = Field(description="该步骤需要产出的具体成果")
required_tools: List[str] = Field(default_factory=list, description="完成此步骤可能需要的工具列表")
class ProjectPlan(BaseModel):
overall_goal: str = Field(description="项目的总体目标")
steps: List[PlanStep] = Field(description="实现目标的具体步骤列表")
class PlanningAgent:
def __init__(self, model_name="gpt-4"):
self.llm = ChatOpenAI(model_name=model_name, temperature=0.1)
self.parser = PydanticOutputParser(pydantic_object=ProjectPlan)
# 规划提示词模板
plan_prompt_template = """
你是一个经验丰富的技术项目经理。请将以下复杂任务分解成一个清晰、可执行的项目计划。
任务:{task}
请遵循以下要求:
1. 首先明确项目的总体目标。
2. 将任务分解为5-7个逻辑连贯的步骤。
3. 每个步骤必须有明确的描述和可交付成果。
4. 考虑步骤间的依赖关系。
5. 识别每个步骤可能需要使用的工具或资源(如:代码编辑器、数据库、API调用、测试框架等)。
{format_instructions}
"""
self.plan_prompt = PromptTemplate(
template=plan_prompt_template,
input_variables=["task"],
partial_variables={"format_instructions": self.parser.get_format_instructions()}
)
self.plan_chain = LLMChain(llm=self.llm, prompt=self.plan_prompt)
# 执行步骤的提示词模板(简化示例)
self.execution_prompt = PromptTemplate.from_template(
"你现在是负责执行项目第{step_num}步的工程师。步骤描述:{step_desc}。可交付成果要求:{deliverable}。请开始你的工作,只返回最终的交付成果(如代码、文档内容等)。"
)
self.execution_chain = LLMChain(llm=self.llm, prompt=self.execution_prompt)
def create_plan(self, task):
"""生成项目计划"""
print(f"开始为任务制定计划:{task}\n")
plan_output = self.plan_chain.run(task=task)
try:
plan = self.parser.parse(plan_output)
print("=== 项目计划生成完毕 ===")
print(f"总体目标:{plan.overall_goal}\n")
for step in plan.steps:
print(f"步骤 {step.step_number}: {step.description}")
print(f" 交付物:{step.deliverable}")
print(f" 所需工具:{', '.join(step.required_tools) if step.required_tools else '无'}")
print()
return plan
except Exception as e:
print(f"解析计划失败: {e}\n原始输出:{plan_output}")
return None
def execute_plan(self, plan):
"""(模拟)执行计划中的每个步骤"""
if not plan:
return
results = {}
for step in plan.steps:
print(f"\n>>> 正在执行步骤 {step.step_number}: {step.description}")
# 在实际应用中,这里会根据 step.required_tools 调用不同的执行器或工具
# 此处简化为让 LLM 模拟生成交付物
execution_result = self.execution_chain.run(
step_num=step.step_number,
step_desc=step.description,
deliverable=step.deliverable
)
results[step.step_number] = execution_result
print(f"交付物:\n{execution_result[:200]}...") # 只打印前200字符
# 模拟步骤间依赖:可以将上一步的结果作为上下文传递给下一步
return results
# 使用示例
if __name__ == "__main__":
agent = PlanningAgent()
complex_task = "开发一个具有用户登录、注册、创建待办事项、标记完成、删除待办事项等功能的单页面Web应用前端,使用Vue 3框架和Pinia进行状态管理。"
project_plan = agent.create_plan(complex_task)
if project_plan:
# 在实际项目中,执行部分会集成真实的代码生成、文件操作等
print("\n--- 开始模拟执行计划 ---")
agent.execute_plan(project_plan)
运行这个智能体,你会得到一个结构化的开发计划,可能包括:
- 项目初始化与环境搭建。
- 用户认证模块(登录/注册)UI 开发。
- 用户认证状态管理(Pinia Store)实现。
- 待办事项列表 UI 组件开发。
- 待办事项增删改查功能与状态管理集成。
- 应用路由与页面布局。
- 样式美化与最终测试。
3.2 规划模式的进阶:动态调整与 ReAct 框架
上述示例是静态规划。更高级的规划模式(如 ReAct)支持动态调整。智能体在执行每一步后,会根据结果和观察,决定下一步是继续按原计划进行,还是需要重新规划。
# 一个简化的 ReAct 步骤示例(概念代码)
def react_style_agent(initial_goal):
thought = f"我的目标是:{initial_goal}. 我需要先规划第一步。"
for i in range(10): # 限制最大步数
# 1. 根据当前“思考”决定“行动”
action = decide_action_based_on_thought(thought, available_tools)
# 2. 执行行动,获得“观察”
observation = execute_action(action)
# 3. 根据行动和观察,进行新的“思考”
thought = reflect_on_action_and_observation(action, observation, initial_goal)
if goal_achieved(thought, observation):
print("任务完成!")
break
这种“思考-行动-观察”的循环,使得智能体能够应对执行过程中的意外,比如工具调用失败、中间结果不符合预期等,从而展现出更强的鲁棒性。
规划模式的价值在于,它将模糊的用户需求转化为清晰、可追踪、可验证的执行路径。这不仅提升了最终结果的质量,也让整个 AI 系统的行为变得更加可预测和可调试。
4. 从单兵作战到团队协作:多智能体模式架构设计
当任务足够复杂,涉及多个专业领域时,单个智能体可能力不从心。多智能体模式通过组建一个各司其职的“AI 团队”来应对挑战。每个智能体扮演特定角色(如架构师、前端工程师、后端工程师、测试员),它们通过协作共同完成任务。
4.1 设计一个软件项目开发团队
让我们模拟一个由三个智能体组成的微型开发团队:ProductManager(产品经理)、FrontendEngineer(前端工程师)、BackendEngineer(后端工程师)。
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
class RoleBasedAgent:
def __init__(self, role, system_prompt, model_name="gpt-4"):
self.role = role
self.llm = ChatOpenAI(model_name=model_name, temperature=0.7) # 温度可稍高,鼓励创造性
self.memory = ConversationBufferMemory()
self.system_message = SystemMessage(content=system_prompt)
# 每个智能体有自己的对话链
self.chain = ConversationChain(llm=self.llm, memory=self.memory)
def receive_message(self, message, from_agent=None):
"""接收来自其他智能体或用户的消息"""
sender = f"[{from_agent}] " if from_agent else ""
self.memory.chat_memory.add_user_message(f"{sender}{message}")
def think_and_respond(self, broadcast_func):
"""基于记忆思考并做出响应,通过广播函数发送出去"""
# 构建包含系统提示和记忆的完整提示
prompt = f"{self.system_message.content}\n\n当前对话历史:\n{self.memory.buffer}\n\n请以{self.role}的身份思考并给出接下来的行动或回复:"
response = self.llm([HumanMessage(content=prompt)]).content
# 将自身的思考也存入记忆
self.memory.chat_memory.add_ai_message(response)
# 广播响应
broadcast_func(self.role, response)
return response
class MultiAgentTeam:
def __init__(self):
# 定义团队成员及其角色
self.agents = {
"PM": RoleBasedAgent(
"产品经理",
"你是负责一个待办事项应用的产品经理。你的职责是理解用户需求,将其分解为产品特性,并协调前端和后端工程师的工作。你关注用户体验和产品目标。请用清晰、有条理的方式沟通。"
),
"FE": RoleBasedAgent(
"前端工程师",
"你是一名专注于 Vue.js 的前端工程师。你负责根据产品需求实现用户界面和交互逻辑。你关注组件设计、状态管理和响应式布局。请用技术语言与后端工程师对接API。"
),
"BE": RoleBasedAgent(
"后端工程师",
"你是一名使用 Python FastAPI 的后端工程师。你负责设计数据库模型、RESTful API 和业务逻辑。你关注数据安全、API 性能和可扩展性。请用技术语言与前端工程师对接API。"
)
}
self.message_board = [] # 记录所有团队对话
def broadcast(self, sender_role, message):
"""模拟团队广播,所有其他成员都会收到消息"""
print(f"\n--- {sender_role} 发言 ---")
print(f"{message}")
self.message_board.append((sender_role, message))
# 其他成员接收消息(这里简化处理,实际可根据消息内容决定是否通知所有人)
for role, agent in self.agents.items():
if role != sender_role:
agent.receive_message(message, from_agent=sender_role)
def run_project_kickoff(self, user_requirement):
"""运行项目启动会议"""
print(f"项目启动:{user_requirement}\n")
# 产品经理首先发言,解读需求
self.broadcast("PM", f"大家好,我们接到一个新需求:'{user_requirement}'。我认为核心功能包括用户认证和待办事项的CRUD。FE,你这边对界面有什么初步想法吗?")
# 模拟几轮讨论
rounds = 3
for i in range(rounds):
print(f"\n=== 讨论轮次 {i+1} ===")
# 可以设定更复杂的触发逻辑,这里简单轮询
for role in ["FE", "BE", "PM"]:
# 每个智能体基于当前对话历史进行发言
self.agents[role].think_and_respond(self.broadcast)
def get_discussion_summary(self):
"""获取讨论摘要"""
summary_prompt = f"以下是开发团队的讨论记录:\n{self.message_board}\n请总结达成的技术方案和待办事项。"
summarizer_llm = ChatOpenAI(model_name="gpt-4", temperature=0)
summary = summarizer_llm([HumanMessage(content=summary_prompt)]).content
return summary
# 使用示例
if __name__ == "__main__":
team = MultiAgentTeam()
requirement = "我们需要一个个人使用的待办事项Web应用,要能登录,在不同设备上同步我的任务列表。"
team.run_project_kickoff(requirement)
print("\n" + "="*50)
print("会议总结:")
summary = team.get_discussion_summary()
print(summary)
运行这段代码,你会看到三个智能体之间模拟的讨论。产品经理提出需求,前端工程师讨论组件和状态管理,后端工程师设计 API 和数据模型。他们可能会就 API 接口格式(如 POST /api/todos 的请求体)、状态同步机制等进行“协商”。
4.2 多智能体系统的协调与仲裁
简单的广播协作可能产生混乱。更成熟的多智能体系统需要引入协调机制:
- 集中式协调者:一个主智能体(如
Architect)负责分配任务、仲裁分歧、整合最终结果。 - 合约与通信协议:定义智能体之间交换信息的标准格式(如使用 JSON Schema 描述 API 接口),减少误解。
- 共享工作区:模拟一个共享的“文档”或“黑板”,智能体将中间成果(如 API 文档、组件设计图)放在上面,供其他成员查阅和修改。
多智能体模式最强大的地方在于专业化分工。你可以为代码优化、安全审计、文档编写、单元测试生成等任务分别训练或配置专门的智能体,让它们在自己的领域做到最好,然后通过协作产生远超单个通用智能体的成果。
5. 融合与超越:构建你的 Agentic 工作流引擎
单独使用上述任何一种模式都能带来提升,但真正的威力在于将它们有机融合。一个强大的 AI 应用,很可能同时包含这四种模式。
设想一个智能编程助手的工作流:
- 规划:智能体首先将用户模糊的指令(“帮我做个博客网站”)分解为详细的产品需求文档和技术栈选择。
- 多智能体协作:根据规划,启动“前端架构师”、“后端架构师”、“数据库设计师”等多个智能体进行技术方案讨论,产出设计稿。
- 工具使用:在编码阶段,智能体调用代码生成工具、代码库搜索工具、API 文档查询工具等。
- 反思:每完成一个模块,由“代码审查智能体”进行静态分析和逻辑检查,提出修改意见,迭代优化。
实现这样的工作流,你需要一个编排引擎。这个引擎负责管理智能体的生命周期、控制流程跳转、维护共享状态(上下文)。虽然目前没有绝对的标准框架,但你可以基于 LangChain、AutoGen 或 LlamaIndex 等库进行构建。
# 一个超级简化的融合工作流引擎概念
class AgenticWorkflowEngine:
def __init__(self):
self.planner = PlanningAgent()
self.code_agent = CodeReflectionAgent()
self.tools = {...} # 工具集
self.context = {} # 共享上下文
def execute_complex_task(self, user_input):
# 阶段1: 规划
plan = self.planner.create_plan(user_input)
self.context['plan'] = plan
results = {}
# 阶段2: 按计划执行,并集成工具和反思
for step in plan.steps:
print(f"\n>> 执行阶段: {step.description}")
# 根据步骤描述,决定使用哪个智能体或工具
if "code" in step.deliverable.lower():
# 使用代码智能体,并可能集成工具(如查询文档)
sub_task = f"{step.description}. 交付物要求: {step.deliverable}"
# 可能先让工具搜索最佳实践
search_result = self.tools['web_search'](f"best practice {sub_task}")
sub_task_with_context = f"{sub_task}. 参考信息: {search_result}"
code_result = self.code_agent.run(sub_task_with_context)
results[step.step_number] = code_result
self.context[f'step_{step.step_number}_code'] = code_result
elif "design" in step.deliverable.lower():
# 可能触发多智能体讨论
team = MultiAgentTeam()
team.run_project_kickoff(step.description)
results[step.step_number] = team.get_discussion_summary()
# ... 处理其他类型的步骤
return results
构建这样的引擎是复杂的,但回报也是巨大的。它意味着你构建的不是一个又一个孤立的 AI 功能点,而是一个具备完整项目理解和执行能力的数字员工。
在我最近的一个内部工具开发项目中,我们尝试用类似的融合工作流来自动生成数据管道的配置代码。规划智能体将数据源、转换逻辑、输出目标拆解成步骤;工具使用智能体去查询不同数据库的连接参数;代码智能体生成具体的 PySpark 或 SQL 代码;反思智能体则检查代码中的性能隐患。原本需要半天的工作,现在只需要清晰描述需求,几分钟后就能得到可用的、经过初步优化的代码草案,开发者的角色从“码农”转变为了“需求澄清者和质量把关人”。
这或许就是 Agentic 设计模式带来的最深远的改变:它重新定义了人机协作的边界。我们不再需要事无巨细地告诉机器每一步怎么做,而是可以像与一个经验丰富的团队合作一样,提出目标,进行讨论,审核结果。效率的提升是显而易见的,但更重要的是,它让我们能更专注于那些真正需要人类创意和判断力的高价值工作。
&spm=1001.2101.3001.5002&articleId=153661399&d=1&t=3&u=7323e85cd3564c94aacba29a98e3ab4e)
589

被折叠的 条评论
为什么被折叠?



