LangChain Agent系统:从智能决策到工具调用的自主能力框架
LangChain Agent系统解决了传统AI应用中的一个关键痛点:如何让大语言模型具备自主决策和工具调用能力。传统困境:手动调用工具链Agent系统的价值:智能自主决策1.2 核心组件定位AgentExecutor:Agent决策与工具执行的调度中枢职责:管理Agent的完整执行生命周期核心功能:维护"思考-行动-观察"的循环机制处理工具调用的安全封装管理中间步骤和状态提供错误处理和恢复机制C
·
LangChain Agent系统:从智能决策到工具调用的自主能力框架
目录
1. 核心定义与价值
1.1 Agent系统解决的核心问题
LangChain Agent系统解决了传统AI应用中的一个关键痛点:如何让大语言模型具备自主决策和工具调用能力。
传统困境:手动调用工具链
# 传统方式:开发者需要手动编排工具调用逻辑
def manual_tool_chain(user_input):
if "天气" in user_input:
return weather_tool.run(user_input)
elif "计算" in user_input:
return calculator_tool.run(user_input)
elif "搜索" in user_input:
return search_tool.run(user_input)
else:
return llm.predict(user_input)
Agent系统的价值:智能自主决策
# Agent方式:LLM自主决策使用哪个工具
agent_executor = AgentExecutor.from_agent_and_tools(
agent=create_tool_calling_agent(llm, tools, prompt),
tools=tools,
verbose=True
)
# Agent会根据用户输入自动选择合适的工具
result = agent_executor.invoke({"input": "今天北京天气如何?"})
1.2 核心组件定位
AgentExecutor:Agent决策与工具执行的调度中枢
- 职责:管理Agent的完整执行生命周期
- 核心功能:
- 维护"思考-行动-观察"的循环机制
- 处理工具调用的安全封装
- 管理中间步骤和状态
- 提供错误处理和恢复机制
ChatOpenAIFunctionsAgent/ToolCallingAgent:适配函数调用的智能代理
- 职责:将LLM的输出解析为具体的工具调用动作
- 核心功能:
- 函数调用格式的标准化处理
- 工具选择的智能决策
- 多轮对话上下文管理
1.3 Agent执行流程图
2. 底层实现逻辑
2.1 AgentExecutor的"决策-执行-反馈"循环
核心执行循环实现
class AgentExecutor(Chain):
def _call(self, inputs: dict[str, str], run_manager=None) -> dict[str, Any]:
# 构建工具映射
name_to_tool_map = {tool.name: tool for tool in self.tools}
intermediate_steps: list[tuple[AgentAction, str]] = []
iterations = 0
start_time = time.time()
# 核心循环:直到达到停止条件
while self._should_continue(iterations, time.time() - start_time):
# 1. 决策阶段:Agent分析当前状态并做出决策
next_step_output = self._take_next_step(
name_to_tool_map, inputs, intermediate_steps, run_manager
)
# 2. 判断是否完成
if isinstance(next_step_output, AgentFinish):
return self._return(next_step_output, intermediate_steps)
# 3. 执行阶段:更新中间步骤
intermediate_steps.extend(next_step_output)
iterations += 1
# 4. 反馈阶段:处理超时或超出最大迭代次数
output = self._action_agent.return_stopped_response(
self.early_stopping_method, intermediate_steps, **inputs
)
return self._return(output, intermediate_steps)
单步决策执行详解
def _iter_next_step(self, name_to_tool_map, inputs, intermediate_steps, run_manager):
"""单步思考-行动-观察循环"""
try:
# 准备中间步骤(可能需要裁剪以控制上下文长度)
intermediate_steps = self._prepare_intermediate_steps(intermediate_steps)
# 调用Agent进行决策(核心思考过程)
output = self._action_agent.plan(
intermediate_steps,
callbacks=run_manager.get_child() if run_manager else None,
**inputs,
)
except OutputParserException as e:
# 处理解析错误,转换为特殊的AgentAction
output = AgentAction("_Exception", str(e), str(e))
# 如果是完成信号,直接返回
if isinstance(output, AgentFinish):
yield output
return
# 执行工具调用
actions = [output] if isinstance(output, AgentAction) else output
for agent_action in actions:
yield agent_action
yield self._perform_agent_action(name_to_tool_map, agent_action, run_manager)
2.2 ToolCallingAgent的函数调用适配原理
现代化的工具调用Agent实现
def create_tool_calling_agent(
llm: BaseLanguageModel,
tools: Sequence[BaseTool],
prompt: ChatPromptTemplate
) -> Runnable:
"""创建支持工具调用的Agent"""
# 1. 验证提示词模板包含必要的占位符
missing_vars = {"agent_scratchpad"}.difference(
prompt.input_variables + list(prompt.partial_variables)
)
if missing_vars:
raise ValueError(f"Prompt missing required variables: {missing_vars}")
# 2. 绑定工具到LLM(关键步骤)
llm_with_tools = llm.bind_tools(tools)
# 3. 构建Runnable链
return (
RunnablePassthrough.assign(
agent_scratchpad=lambda x: format_to_tool_messages(x["intermediate_steps"])
)
| prompt
| llm_with_tools
| ToolsAgentOutputParser()
)
工具调用格式化处理
def format_to_tool_messages(intermediate_steps: list[tuple[AgentAction, str]]) -> list[BaseMessage]:
"""将中间步骤格式化为工具消息"""
messages = []
for agent_action, observation in intermediate_steps:
# 添加工具调用消息
messages.append(
AIMessage(
content="",
tool_calls=[{
"name": agent_action.tool,
"args": agent_action.tool_input,
"id": agent_action.tool_call_id,
}]
)
)
# 添加工具执行结果消息
messages.append(
ToolMessage(
content=observation,
tool_call_id=agent_action.tool_call_id
)
)
return messages
2.3 工具调用安全封装机制
工具执行的安全包装
def _perform_agent_action(self, name_to_tool_map, agent_action, run_manager) -> AgentStep:
"""安全执行Agent动作"""
if run_manager:
run_manager.on_agent_action(agent_action, color="green")
# 检查工具是否存在
if agent_action.tool in name_to_tool_map:
tool = name_to_tool_map[agent_action.tool]
# 获取工具运行参数
tool_run_kwargs = self._action_agent.tool_run_logging_kwargs()
# 安全执行工具
try:
observation = tool.run(
agent_action.tool_input,
verbose=self.verbose,
callbacks=run_manager.get_child() if run_manager else None,
**tool_run_kwargs,
)
except Exception as e:
# 工具执行失败时的处理
observation = f"Tool execution failed: {str(e)}"
else:
# 处理无效工具调用
observation = InvalidTool().run({
"requested_tool_name": agent_action.tool,
"available_tool_names": list(name_to_tool_map.keys()),
})
return AgentStep(action=agent_action, observation=observation)
3. 代码实践
3.1 基础实践1:单一工具调用Agent
依赖安装
pip install langchain langchain-openai langchain-community
完整实现代码
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
import os
# 设置API密钥
os.environ["OPENAI_API_KEY"] = "your-api-key-here"
# 1. 定义工具
@tool
def calculator(expression: str) -> str:
"""执行数学计算。输入应该是一个数学表达式字符串。"""
try:
# 安全的数学表达式计算
result = eval(expression, {"__builtins__": {}}, {
"abs": abs, "round": round, "min": min, "max": max,
"sum": sum, "pow": pow, "len": len
})
return f"计算结果: {result}"
except Exception as e:
return f"计算错误: {str(e)}"
# 2. 创建LLM实例
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0,
streaming=True # 启用流式输出以获得更好的用户体验
)
# 3. 定义提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个数学助手,可以帮助用户进行各种数学计算。"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"), # 关键:Agent的思考过程
])
# 4. 创建工具列表
tools = [calculator]
# 5. 创建Agent
agent = create_tool_calling_agent(llm, tools, prompt)
# 6. 创建AgentExecutor
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 显示详细执行过程
max_iterations=3, # 最大迭代次数
return_intermediate_steps=True # 返回中间步骤
)
# 7. 测试Agent
def test_calculator_agent():
"""测试计算器Agent"""
test_cases = [
"计算 25 * 4 + 10",
"求 2 的 8 次方",
"计算 (100 + 50) / 3 的结果"
]
for question in test_cases:
print(f"\n问题: {question}")
print("-" * 50)
result = agent_executor.invoke({"input": question})
print(f"最终答案: {result['output']}")
# 显示中间步骤
if result.get('intermediate_steps'):
print("\n执行步骤:")
for i, (action, observation) in enumerate(result['intermediate_steps'], 1):
print(f" 步骤 {i}:")
print(f" 工具: {action.tool}")
print(f" 输入: {action.tool_input}")
print(f" 输出: {observation}")
if __name__ == "__main__":
test_calculator_agent()
### 3.2 基础实践2:多工具协作与多轮决策
```python
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from datetime import datetime
import requests
import json
# 1. 定义多个工具
@tool
def get_current_time() -> str:
"""获取当前时间"""
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
@tool
def calculator(expression: str) -> str:
"""执行数学计算"""
try:
result = eval(expression, {"__builtins__": {}}, {
"abs": abs, "round": round, "min": min, "max": max,
"sum": sum, "pow": pow, "len": len, "sqrt": lambda x: x**0.5
})
return f"计算结果: {result}"
except Exception as e:
return f"计算错误: {str(e)}"
@tool
def search_web(query: str) -> str:
"""模拟网络搜索功能"""
# 这里使用模拟数据,实际应用中可以接入真实的搜索API
mock_results = {
"天气": "今天北京天气晴朗,温度25°C",
"新闻": "今日科技新闻:AI技术取得重大突破",
"股票": "今日股市表现良好,上证指数上涨2.5%"
}
for key in mock_results:
if key in query:
return mock_results[key]
return f"搜索结果:关于'{query}'的相关信息"
@tool
def text_analyzer(text: str) -> str:
"""分析文本长度和基本统计信息"""
word_count = len(text.split())
char_count = len(text)
line_count = len(text.split('\n'))
return f"文本分析结果:字符数={char_count}, 单词数={word_count}, 行数={line_count}"
# 2. 创建增强的Agent系统
def create_multi_tool_agent():
"""创建多工具协作Agent"""
# LLM配置
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.1, # 稍微增加创造性
streaming=True
)
# 增强的提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个智能助手,拥有多种工具来帮助用户解决问题。
可用工具:
1. calculator - 进行数学计算
2. get_current_time - 获取当前时间
3. search_web - 搜索网络信息
4. text_analyzer - 分析文本统计信息
使用指南:
- 仔细分析用户需求,选择合适的工具
- 可以组合使用多个工具来完成复杂任务
- 如果需要多步骤操作,请逐步执行
- 始终为用户提供清晰、有用的回答"""),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
# 工具列表
tools = [calculator, get_current_time, search_web, text_analyzer]
# 创建Agent
agent = create_tool_calling_agent(llm, tools, prompt)
# 创建AgentExecutor,配置更多参数
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=5, # 允许更多迭代
max_execution_time=30, # 30秒超时
return_intermediate_steps=True,
handle_parsing_errors=True, # 处理解析错误
)
return agent_executor
# 3. 复杂任务测试
def test_multi_tool_collaboration():
"""测试多工具协作能力"""
agent_executor = create_multi_tool_agent()
complex_tasks = [
# 任务1:时间计算
"现在是几点?如果我需要在3小时后开会,那是几点?",
# 任务2:信息搜索 + 文本分析
"搜索今天的天气信息,然后分析搜索结果的文本统计",
# 任务3:数学计算 + 时间
"计算从现在开始的72小时是多少天?并告诉我那个时间点",
# 任务4:综合任务
"帮我分析这段文本'人工智能正在改变世界,LangChain让AI应用开发变得更简单',然后计算如果每个字符代表1分钟,读完需要多长时间"
]
for i, task in enumerate(complex_tasks, 1):
print(f"\n{'='*60}")
print(f"复杂任务 {i}: {task}")
print('='*60)
try:
result = agent_executor.invoke({"input": task})
print(f"\n✅ 最终结果: {result['output']}")
# 显示执行轨迹
if result.get('intermediate_steps'):
print(f"\n🔍 执行轨迹 ({len(result['intermediate_steps'])} 步):")
for step_num, (action, observation) in enumerate(result['intermediate_steps'], 1):
print(f" 步骤 {step_num}: {action.tool}")
print(f" 输入: {action.tool_input}")
print(f" 输出: {observation[:100]}...") # 截断长输出
except Exception as e:
print(f"❌ 执行失败: {str(e)}")
if __name__ == "__main__":
test_multi_tool_collaboration()
3.3 进阶实践:Agent与记忆组件结合
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain.memory import ConversationBufferWindowMemory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage
from typing import Dict, Any
import json
# 1. 自定义记忆管理工具
@tool
def save_user_preference(key: str, value: str) -> str:
"""保存用户偏好设置"""
# 在实际应用中,这里应该连接到数据库
if not hasattr(save_user_preference, 'preferences'):
save_user_preference.preferences = {}
save_user_preference.preferences[key] = value
return f"已保存用户偏好: {key} = {value}"
@tool
def get_user_preference(key: str) -> str:
"""获取用户偏好设置"""
if not hasattr(save_user_preference, 'preferences'):
return f"未找到偏好设置: {key}"
value = save_user_preference.preferences.get(key)
if value:
return f"用户偏好 {key}: {value}"
else:
return f"未设置偏好: {key}"
@tool
def list_user_preferences() -> str:
"""列出所有用户偏好"""
if not hasattr(save_user_preference, 'preferences'):
return "暂无用户偏好设置"
prefs = save_user_preference.preferences
if not prefs:
return "暂无用户偏好设置"
pref_list = [f"{k}: {v}" for k, v in prefs.items()]
return "用户偏好列表:\n" + "\n".join(pref_list)
# 2. 带记忆的Agent类
class MemoryAgent:
"""具有记忆能力的Agent"""
def __init__(self):
# 初始化LLM
self.llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.2,
streaming=True
)
# 初始化记忆组件
self.memory = ConversationBufferWindowMemory(
k=10, # 保留最近10轮对话
memory_key="chat_history",
return_messages=True,
output_key="output"
)
# 定义工具
self.tools = [
save_user_preference,
get_user_preference,
list_user_preferences,
self._create_calculator_tool(),
self._create_note_tool()
]
# 创建Agent
self.agent_executor = self._create_agent()
def _create_calculator_tool(self):
"""创建计算器工具"""
@tool
def calculator_with_memory(expression: str) -> str:
"""执行数学计算并记住计算历史"""
try:
result = eval(expression, {"__builtins__": {}}, {
"abs": abs, "round": round, "min": min, "max": max,
"sum": sum, "pow": pow, "len": len, "sqrt": lambda x: x**0.5
})
# 保存计算历史
if not hasattr(calculator_with_memory, 'history'):
calculator_with_memory.history = []
calculator_with_memory.history.append({
'expression': expression,
'result': result
})
return f"计算结果: {result}"
except Exception as e:
return f"计算错误: {str(e)}"
return calculator_with_memory
def _create_note_tool(self):
"""创建笔记工具"""
@tool
def note_manager(action: str, content: str = "") -> str:
"""管理用户笔记。action可以是'add', 'list', 'clear'"""
if not hasattr(note_manager, 'notes'):
note_manager.notes = []
if action == 'add':
note_manager.notes.append(content)
return f"已添加笔记: {content}"
elif action == 'list':
if not note_manager.notes:
return "暂无笔记"
return "笔记列表:\n" + "\n".join([f"{i+1}. {note}" for i, note in enumerate(note_manager.notes)])
elif action == 'clear':
note_manager.notes.clear()
return "已清空所有笔记"
else:
return "无效操作,请使用 'add', 'list', 或 'clear'"
return note_manager
def _create_agent(self):
"""创建带记忆的Agent"""
# 带记忆的提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个智能个人助手,具有记忆能力。你可以:
1. 记住用户的偏好和设置
2. 保存和管理用户的笔记
3. 执行数学计算
4. 维护对话历史
重要特性:
- 利用对话历史提供个性化服务
- 主动询问和记住用户偏好
- 在适当时候引用之前的对话内容
- 提供连贯的多轮对话体验
请始终友好、有帮助,并充分利用你的记忆能力。"""),
# 关键:添加聊天历史占位符
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
# 创建Agent
agent = create_tool_calling_agent(self.llm, self.tools, prompt)
# 创建AgentExecutor
return AgentExecutor(
agent=agent,
tools=self.tools,
memory=self.memory, # 关键:添加记忆组件
verbose=True,
max_iterations=5,
return_intermediate_steps=True,
handle_parsing_errors=True,
)
def chat(self, user_input: str) -> Dict[str, Any]:
"""与Agent对话"""
try:
# 获取聊天历史
chat_history = self.memory.chat_memory.messages
# 调用Agent
result = self.agent_executor.invoke({
"input": user_input,
"chat_history": chat_history
})
return result
except Exception as e:
return {"output": f"抱歉,处理您的请求时出现错误: {str(e)}"}
def get_conversation_summary(self) -> str:
"""获取对话摘要"""
messages = self.memory.chat_memory.messages
if not messages:
return "暂无对话历史"
summary = f"对话历史 (共 {len(messages)} 条消息):\n"
for i, msg in enumerate(messages[-6:], 1): # 显示最近6条
role = "用户" if isinstance(msg, HumanMessage) else "助手"
content = msg.content[:50] + "..." if len(msg.content) > 50 else msg.content
summary += f"{i}. {role}: {content}\n"
return summary
# 3. 交互式测试
def interactive_memory_test():
"""交互式记忆Agent测试"""
agent = MemoryAgent()
print("🤖 智能记忆助手已启动!")
print("💡 我可以记住我们的对话,保存您的偏好,管理笔记等。")
print("📝 输入 'quit' 退出,'summary' 查看对话摘要\n")
# 预设一些测试场景
test_scenarios = [
"你好!我叫张三,我喜欢喝咖啡",
"请帮我保存一个偏好:我的工作时间是9-18点",
"计算 25 * 4 + 100",
"请帮我记录一个笔记:明天下午3点开会",
"我刚才说我叫什么名字?",
"我的工作时间是什么?",
"列出我的所有笔记",
"再帮我计算一下 (100 + 200) / 3"
]
print("🎯 自动测试场景:")
for i, scenario in enumerate(test_scenarios, 1):
print(f"\n--- 场景 {i} ---")
print(f"👤 用户: {scenario}")
result = agent.chat(scenario)
print(f"🤖 助手: {result['output']}")
# 显示中间步骤(简化版)
if result.get('intermediate_steps'):
tools_used = [step[0].tool for step in result['intermediate_steps']]
print(f"🔧 使用工具: {', '.join(set(tools_used))}")
print(f"\n📊 对话摘要:")
print(agent.get_conversation_summary())
if __name__ == "__main__":
interactive_memory_test()
4. 设计考量
4.1 决策与执行解耦的优势
传统紧耦合方式的问题
# 紧耦合:决策逻辑与执行逻辑混合
class TightlyCoupledAgent:
def process(self, input_text):
# 决策和执行混在一起,难以维护和扩展
if "计算" in input_text:
result = self.calculator.run(input_text)
return f"计算结果:{result}"
elif "搜索" in input_text:
result = self.search.run(input_text)
return f"搜索结果:{result}"
# ... 更多硬编码逻辑
LangChain的解耦设计
# 解耦设计:清晰的职责分离
class DecoupledAgentSystem:
"""
AgentExecutor: 负责执行流程控制
Agent: 负责智能决策
Tools: 负责具体功能实现
"""
def __init__(self):
# 决策层:Agent负责"思考"
self.agent = create_tool_calling_agent(llm, tools, prompt)
# 执行层:AgentExecutor负责"行动"
self.executor = AgentExecutor.from_agent_and_tools(
agent=self.agent,
tools=tools
)
def process(self, input_text):
# 简洁的调用接口,内部自动处理复杂的决策-执行循环
return self.executor.invoke({"input": input_text})
解耦带来的优势:
- 可维护性:决策逻辑与执行逻辑分离,便于独立修改
- 可扩展性:新增工具无需修改Agent决策逻辑
- 可测试性:可以独立测试决策和执行组件
- 可复用性:同一个Agent可以配合不同的工具集
4.2 函数调用标准化设计
工具接口标准化
# 所有工具都遵循统一的BaseTool接口
class BaseTool:
name: str # 工具名称
description: str # 工具描述,用于LLM理解工具功能
def run(self, tool_input: Any) -> str:
"""同步执行工具"""
pass
async def arun(self, tool_input: Any) -> str:
"""异步执行工具"""
pass
函数调用格式标准化
def convert_to_openai_function(tool: BaseTool) -> dict:
"""将LangChain工具转换为OpenAI函数调用格式"""
return {
"name": tool.name,
"description": tool.description,
"parameters": {
"type": "object",
"properties": tool.args_schema.schema()["properties"],
"required": tool.args_schema.schema().get("required", [])
}
}
# 标准化的工具绑定
llm_with_tools = llm.bind_tools(tools) # 自动处理格式转换
4.3 安全性与可控性机制
多层安全防护
class SafeAgentExecutor(AgentExecutor):
"""增强安全性的AgentExecutor"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 1. 迭代次数限制
self.max_iterations = kwargs.get('max_iterations', 15)
# 2. 执行时间限制
self.max_execution_time = kwargs.get('max_execution_time', 60)
# 3. 工具白名单
self.allowed_tools = {tool.name for tool in self.tools}
# 4. 输入验证
self.input_validator = kwargs.get('input_validator')
def _perform_agent_action(self, name_to_tool_map, agent_action, run_manager):
"""增强的工具执行安全检查"""
# 工具名称验证
if agent_action.tool not in self.allowed_tools:
return AgentStep(
action=agent_action,
observation=f"安全错误:不允许使用工具 {agent_action.tool}"
)
# 输入验证
if self.input_validator:
validation_result = self.input_validator(agent_action.tool_input)
if not validation_result.is_valid:
return AgentStep(
action=agent_action,
observation=f"输入验证失败:{validation_result.error}"
)
# 执行原始逻辑
return super()._perform_agent_action(name_to_tool_map, agent_action, run_manager)
4.4 生态协同能力
与LangChain生态的深度集成
# 1. 与Memory组件集成
agent_with_memory = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
memory=ConversationBufferMemory() # 无缝集成记忆组件
)
# 2. 与Retriever集成
from langchain.agents.agent_toolkits import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever=vector_store.as_retriever(),
name="knowledge_search",
description="搜索知识库获取相关信息"
)
# 3. 与Callbacks集成
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
callbacks=[
StdOutCallbackHandler(), # 标准输出
WandbCallbackHandler(), # 实验跟踪
CustomCallbackHandler() # 自定义回调
]
)
# 4. 与Runnable接口集成
agent_chain = (
RunnablePassthrough.assign(
agent_scratchpad=lambda x: format_to_tool_messages(x["intermediate_steps"])
)
| prompt
| llm_with_tools
| ToolsAgentOutputParser()
)
# 可以像其他Runnable一样使用
result = agent_chain.invoke({"input": "用户输入", "intermediate_steps": []})
5. 替代方案与优化空间
5.1 不依赖LangChain的替代实现方案
方案1:基于OpenAI原生API的简化实现
import openai
from typing import List, Dict, Any, Callable
import json
class SimpleAgent:
"""不依赖LangChain的简化Agent实现"""
def __init__(self, api_key: str, model: str = "gpt-3.5-turbo"):
self.client = openai.OpenAI(api_key=api_key)
self.model = model
self.tools = {}
self.system_prompt = "你是一个智能助手,可以使用工具来帮助用户。"
def add_tool(self, name: str, func: Callable, description: str, parameters: Dict):
"""添加工具"""
self.tools[name] = {
"function": func,
"description": description,
"parameters": parameters
}
def _create_function_definitions(self) -> List[Dict]:
"""创建函数定义"""
functions = []
for name, tool in self.tools.items():
functions.append({
"type": "function",
"function": {
"name": name,
"description": tool["description"],
"parameters": tool["parameters"]
}
})
return functions
def run(self, user_input: str, max_iterations: int = 5) -> str:
"""运行Agent"""
messages = [
{"role": "system", "content": self.system_prompt},
{"role": "user", "content": user_input}
]
for iteration in range(max_iterations):
# 调用LLM
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
tools=self._create_function_definitions(),
tool_choice="auto"
)
message = response.choices[0].message
messages.append(message.model_dump())
# 检查是否需要调用工具
if message.tool_calls:
for tool_call in message.tool_calls:
function_name = tool_call.function.name
function_args = json.loads(tool_call.function.arguments)
# 执行工具
if function_name in self.tools:
try:
result = self.tools[function_name]["function"](**function_args)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": str(result)
})
except Exception as e:
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": f"工具执行错误: {str(e)}"
})
else:
# 没有工具调用,返回最终结果
return message.content
return "达到最大迭代次数,任务可能未完成"
5.2 优化方向分析
5.2.1 决策效率优化
问题:当前Agent每次决策都需要完整的LLM调用,在复杂任务中效率较低。
优化方案:
class OptimizedAgent:
"""决策效率优化的Agent"""
def __init__(self):
self.decision_cache = {} # 决策缓存
self.pattern_matcher = PatternMatcher() # 模式匹配器
self.lightweight_planner = LightweightPlanner() # 轻量级规划器
def plan(self, intermediate_steps, **kwargs):
"""优化的规划方法"""
# 1. 快速模式匹配
quick_decision = self.pattern_matcher.match(kwargs["input"])
if quick_decision:
return quick_decision
# 2. 缓存查找
cache_key = self._generate_cache_key(intermediate_steps, kwargs)
if cache_key in self.decision_cache:
return self.decision_cache[cache_key]
# 3. 轻量级规划
if len(intermediate_steps) < 2:
lightweight_plan = self.lightweight_planner.plan(kwargs["input"])
if lightweight_plan:
return lightweight_plan
# 4. 完整LLM决策(最后手段)
result = super().plan(intermediate_steps, **kwargs)
# 5. 缓存结果
self.decision_cache[cache_key] = result
return result
class PatternMatcher:
"""模式匹配器:处理常见的简单请求"""
def __init__(self):
self.patterns = {
r"计算\s*(.+)": lambda match: AgentAction("calculator", match.group(1), ""),
r"搜索\s*(.+)": lambda match: AgentAction("search", match.group(1), ""),
r"时间|几点": lambda match: AgentAction("get_time", "", "")
}
def match(self, user_input: str) -> Optional[AgentAction]:
"""快速模式匹配"""
import re
for pattern, action_generator in self.patterns.items():
match = re.search(pattern, user_input)
if match:
return action_generator(match)
return None
5.2.2 安全性增强
优化方案:
class SecureAgent:
"""安全增强的Agent"""
def __init__(self):
self.security_manager = SecurityManager()
self.audit_logger = AuditLogger()
self.sandbox = ToolSandbox()
def _perform_agent_action(self, name_to_tool_map, agent_action, run_manager):
"""安全的工具执行"""
# 1. 安全检查
security_check = self.security_manager.validate_action(agent_action)
if not security_check.is_safe:
self.audit_logger.log_security_violation(agent_action, security_check.reason)
return AgentStep(
action=agent_action,
observation=f"安全检查失败: {security_check.reason}"
)
# 2. 沙箱执行
try:
observation = self.sandbox.execute_tool(
tool_name=agent_action.tool,
tool_input=agent_action.tool_input,
timeout=30 # 30秒超时
)
except SandboxViolation as e:
self.audit_logger.log_sandbox_violation(agent_action, str(e))
observation = f"沙箱安全违规: {str(e)}"
except Exception as e:
observation = f"工具执行失败: {str(e)}"
# 3. 输出过滤
filtered_observation = self.security_manager.filter_output(observation)
return AgentStep(action=agent_action, observation=filtered_observation)
5.2.3 功能扩展优化
优化方案:
class AdvancedPlanningAgent:
"""具有高级规划能力的Agent"""
def __init__(self):
self.task_decomposer = TaskDecomposer()
self.dependency_resolver = DependencyResolver()
self.progress_tracker = ProgressTracker()
self.plan_optimizer = PlanOptimizer()
def plan(self, intermediate_steps, **kwargs):
"""高级规划方法"""
user_input = kwargs["input"]
# 1. 任务分解
if not hasattr(self, 'current_plan'):
self.current_plan = self.task_decomposer.decompose(user_input)
self.current_plan = self.plan_optimizer.optimize(self.current_plan)
# 2. 进度跟踪
self.progress_tracker.update(intermediate_steps)
# 3. 依赖解析
next_task = self.dependency_resolver.get_next_task(
self.current_plan,
self.progress_tracker.completed_tasks
)
if next_task:
return AgentAction(
tool=next_task.tool,
tool_input=next_task.input,
log=f"执行计划中的任务: {next_task.description}"
)
else:
# 所有任务完成
return AgentFinish(
return_values={"output": self.progress_tracker.get_summary()},
log="所有计划任务已完成"
)
5.3 性能对比分析
维度 | LangChain Agent | 简化实现 | 优化版本 |
---|---|---|---|
决策效率 | 中等 (每次完整LLM调用) | 高 (直接API调用) | 高 (缓存+模式匹配) |
安全性 | 基础 (基本验证) | 低 (需自行实现) | 高 (多层防护) |
功能扩展 | 高 (丰富生态) | 低 (需自行开发) | 高 (高级规划) |
开发复杂度 | 低 (开箱即用) | 中等 (需要理解细节) | 高 (功能丰富) |
维护成本 | 低 (框架维护) | 中等 (自行维护) | 中等 (模块化设计) |
6. 总结
6.1 LangChain Agent系统的核心价值
LangChain Agent系统通过AgentExecutor和ToolCallingAgent的协同工作,成功解决了AI应用开发中的关键挑战:
- 智能决策自动化:从手动编排工具调用转向LLM自主决策
- 标准化工具集成:统一的工具接口和函数调用格式
- 可靠的执行框架:完善的错误处理和状态管理机制
- 丰富的生态支持:与LangChain生态的深度集成
6.2 设计哲学的深层价值
"思考-行动-观察"循环不仅是一个技术实现,更体现了对人类问题解决过程的深度模拟:
6.3 实际应用价值
通过本文的代码实践,我们看到Agent系统在以下场景中展现出强大能力:
- 单一工具场景:简化复杂计算任务的处理流程
- 多工具协作:智能选择和组合使用不同工具
- 记忆增强:提供个性化和上下文感知的服务
6.4 未来发展方向
LangChain Agent系统的发展将朝着以下方向演进:
- 效率优化:通过缓存、模式匹配等技术提升决策效率
- 安全增强:多层安全防护和沙箱执行机制
- 智能规划:支持复杂多步骤任务的自动分解和执行
- 生态扩展:与更多外部系统和服务的深度集成
6.5 开发建议
对于希望使用LangChain Agent系统的开发者,建议:
- 从简单开始:先掌握单一工具的Agent实现
- 逐步扩展:逐渐增加工具数量和复杂度
- 重视安全:在生产环境中务必加强安全防护
- 持续优化:根据实际使用情况优化性能和用户体验
LangChain Agent系统为构建下一代智能应用提供了坚实的基础,其灵活的架构和丰富的功能使其成为AI应用开发的重要工具。通过深入理解其设计原理和实现机制,开发者可以构建出更加智能、可靠和高效的AI应用系统。
更多推荐
所有评论(0)