在大模型应用开发实践中,我们通常会遇到两种截然不同的工作模式:Workflow(工作流)和Agent(智能代理)。这两种模式各有其适用场景和优势特点,理解它们的差异对于构建高效的大模型应用至关重要。
Workflow模式是一种预定义执行路径的工作方式。在这种模式下,开发者需要事先设计好完整的处理流程,大模型主要承担流程控制和路由决策的角色。典型的Workflow应用场景包括:
Workflow的核心特点是:
以Dify平台的可视化编排为例,开发者可以通过拖拽方式构建完整的业务流程,大模型在其中的作用主要是根据用户输入判断应该进入哪个处理分支。
Agent模式则赋予了大模型更高的自主决策权。在这种模式下,大模型可以根据对话上下文和环境状态,动态决定是否需要调用工具、调用哪个工具以及如何组合多个工具的执行结果。典型的Agent应用场景包括:
Agent的核心特点是:
以AutoGen和CrewAI为代表的Agent框架,将"在对话中动态规划与调用工具"作为核心能力,使得系统能够处理那些无法事先穷举所有可能路径的复杂任务。
ReAct(Reasoning + Acting)范式由Shunyu Yao等人在2022年的论文《ReAct: Synergizing Reasoning and Acting in Language Models》中首次提出。这一范式彻底改变了传统AI系统的工作方式,将推理(Reasoning)和行动(Acting)有机结合起来。
传统AI系统通常采用两种极端的工作方式:
而ReAct范式通过交替进行推理和行动,实现了更接近人类的问题解决方式。具体来说,一个完整的ReAct循环包含以下步骤:
让我们通过一个天气查询的案例来对比三种不同的实现方式:
python复制# 传统纯推理方法
def traditional_reasoning_only(question):
"""仅基于训练数据回答"""
return "基于我的训练数据,今天可能是晴天"
# 传统纯行动方法
def traditional_action_only(question):
"""直接调用API,缺乏思考"""
if "天气" in question:
return "晴天,温度25°C" # 硬编码结果
return "无法处理"
# ReAct方法
def react_approach(question):
"""推理和行动交替进行"""
# 第1步:推理 - 分析问题
reasoning = "用户问的是今天某城市的天气,我需要查询实时天气信息"
# 第2步:行动 - 执行查询
weather_result = weather_api("某城市")
# 第3步:推理 - 分析查询结果
reasoning = "查询结果显示今天某城市是晴天,温度25度,这是实时准确信息"
# 第4步:行动 - 生成最终答案
return "今天某城市是晴天,温度25度,适合外出"
在实际应用中,ReAct范式的优势主要体现在:
要实现一个能够自主决策的Agent系统,我们需要解决三个核心问题:
以下是一个基于LangChain的基础Agent实现示例:
python复制from langchain_core.tools import tool
# 工具定义
@tool
def search_web(query: str):
"""搜索互联网获取最新信息"""
return "搜索结果..."
@tool
def get_weather(city: str):
"""查询城市天气"""
if city == "北京":
return "北京今天16度,晴"
return "未知城市"
# 工具绑定
tools = [search_web, get_weather]
llm_with_tools = llm.bind_tools(tools)
# 工具调用
response = llm_with_tools.invoke("北京天气怎么样?")
# AI会自动生成:get_weather(city="北京")
这个基础实现展示了Agent系统的核心工作流程:
对于更复杂的应用场景,我们需要构建功能更全面的Agent系统。下面是一个支持多种功能的进阶版Agent实现:
python复制import os
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
# 1. 配置大语言模型
os.environ["OPENAI_API_KEY"] = "your-api-key"
llm = ChatOpenAI(model="gpt-4")
# 2. 定义工具集
@tool
def search_web(query: str):
"""搜索互联网获取最新信息"""
print(f"正在搜索: {query}")
return f"关于'{query}'的搜索结果..."
@tool
def get_weather(city: str):
"""查询城市天气"""
weather_data = {
"北京": "北京今天16度,天气晴朗",
"上海": "上海今天20度,多云"
}
return weather_data.get(city, "未知城市天气")
@tool
def save_user_info(name: str, age: int, email: str):
"""保存用户信息"""
print(f"保存用户: {name}, {age}岁, 邮箱:{email}")
return f"用户{name}信息已保存"
# 3. 创建工具节点
tools = [search_web, get_weather, save_user_info]
tool_node = ToolNode(tools)
llm_with_tools = llm.bind_tools(tools)
# 4. 定义图状态和节点
class AgentState(TypedDict):
messages: list[AnyMessage]
def call_model(state):
"""模型决策节点"""
messages = state['messages']
response = llm_with_tools.invoke(messages)
return {"messages": [response]}
# 5. 构建工作流图
workflow = StateGraph(AgentState)
workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)
workflow.add_edge(START, "agent")
workflow.add_conditional_edges(
"agent",
lambda state: "tools" if state["messages"][-1].tool_calls else END,
{"tools": "tools", END: END}
)
workflow.add_edge("tools", "agent")
graph = workflow.compile()
这个进阶实现引入了几个关键改进:
一个完整的Agent系统通常包含以下核心组件:
工具管理模块:
决策引擎:
状态管理:
执行控制:
结果处理:
| 特性 | Workflow | Agent |
|---|---|---|
| 问题确定性 | 高 | 低 |
| 执行路径 | 固定 | 动态 |
| 开发复杂度 | 中等 | 较高 |
| 维护成本 | 低(流程稳定) | 高(需持续优化) |
| 异常处理 | 预先定义 | 动态适应 |
| 典型应用 | 标准化业务流程 | 开放性问题求解 |
流程控制方式:
工具调用机制:
上下文管理:
扩展性:
在实际项目中,选择Workflow还是Agent应该基于以下考量:
选择Workflow当:
选择Agent当:
混合模式:
在很多实际场景中,最佳方案往往是混合使用两种模式。例如:
现代大模型应用通常由以下几个关键组件构成:
提示词工程:
智能体框架:
大模型核心:
工具生态:
协议标准:
Function Calling架构:
MCP架构:
混合架构:
工具调用优化:
提示工程优化:
流程控制优化:
记忆管理优化:
工具滥用问题:
无限循环问题:
上下文丢失问题:
工具冲突问题:
工具选择优化:
提示工程技巧:
流程控制技巧:
监控与日志:
工具权限控制:
输入输出过滤:
审计与合规:
防滥用机制:
在实际项目中,我们发现最有效的安全策略是多层次防御: