大模型Agent智能体正在从简单的问答对话走向复杂的任务执行系统。Agent的核心能力在于将大语言模型的推理能力与外部工具调用相结合,通过多步推理完成单次对话无法解决的复杂任务。本文围绕Agent智能体开发中的工具调用协议、ReAct推理框架、多步工作流编排等关键技术展开,提供可直接复用的代码实现。
Agent智能体架构与核心组件
Agent智能体的本质是一个自主决策循环:感知输入、规划行动、执行工具、观察结果、更新状态,直到任务完成或达到终止条件。与传统的Chain-of-LangChain链式调用不同,Agent的执行路径不是预定义的,而是由模型在运行时动态决定。
一个完整的Agent系统包含以下组件:
– LLM核心:负责推理和决策,支持function calling或tool use接口
– 工具集:搜索、计算、数据库查询、API调用等可执行函数
– 记忆模块:短期对话上下文与长期向量记忆
– 规划器:将用户目标分解为可执行的子任务序列
– 执行引擎:调度工具调用,处理异常与重试
Function Calling工具定义规范
OpenAI、Anthropic、Google等厂商的function calling接口格式略有差异,但核心思路一致:将工具能力以JSON Schema形式声明,模型根据上下文选择调用哪个工具、传入什么参数。
from openai import OpenAI
import json
client = OpenAI()
# 定义工具集
tools = [
{
"type": "function",
"function": {
"name": "search_database",
"description": "在产品数据库中搜索匹配条件的商品",
"parameters": {
"type": "object",
"properties": {
"keyword": {"type": "string", "description": "搜索关键词"},
"max_price": {"type": "number", "description": "最高价格"},
"category": {"type": "string", "enum": ["电子", "服装", "食品"]}
},
"required": ["keyword"]
}
}
},
{
"type": "function",
"function": {
"name": "calculate_discount",
"description": "根据商品价格和折扣规则计算最终价格",
"parameters": {
"type": "object",
"properties": {
"original_price": {"type": "number", "description": "原价"},
"discount_rate": {"type": "number", "description": "折扣率,0.8表示8折"}
},
"required": ["original_price", "discount_rate"]
}
}
}
]
# 工具实现
def search_database(keyword, max_price=None, category=None):
results = [
{"name": "无线蓝牙耳机", "price": 199, "category": "电子"},
{"name": "智能手表", "price": 899, "category": "电子"},
]
filtered = [r for r in results if keyword.lower() in r["name"].lower()]
if max_price:
filtered = [r for r in filtered if r["price"] <= max_price]
return json.dumps(filtered, ensure_ascii=False)
def calculate_discount(original_price, discount_rate):
final_price = round(original_price * discount_rate, 2)
return json.dumps({"original": original_price, "final": final_price}, ensure_ascii=False)
tool_map = {
"search_database": search_database,
"calculate_discount": calculate_discount
}
ReAct推理框架实现多步工具调用
ReAct(Reasoning + Acting)框架是Agent智能体最经典的推理范式。模型在每一步先输出思考过程(Thought),再决定行动(Action),执行后观察结果(Observation),循环往复直到得出最终答案。
def run_agent(user_query, max_steps=10):
messages = [
{"role": "system", "content": "你是一个购物助手Agent,可以搜索商品和计算折扣。请逐步思考并使用工具完成任务。"},
{"role": "user", "content": user_query}
]
for step in range(max_steps):
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto"
)
msg = response.choices[0].message
messages.append(msg)
if msg.tool_calls:
for tc in msg.tool_calls:
func_name = tc.function.name
func_args = json.loads(tc.function.arguments)
print(f"[Step {step+1}] 调用工具: {func_name}({func_args})")
result = tool_map[func_name](**func_args)
print(f"[Step {step+1}] 工具返回: {result}")
messages.append({
"role": "tool",
"tool_call_id": tc.id,
"content": result
})
else:
print(f"[Step {step+1}] Agent最终回答: {msg.content}")
return msg.content
return "Agent达到最大步数限制,未能完成任务。"
answer = run_agent("帮我找一款200元以内的蓝牙耳机,然后算一下打8折多少钱")
多Agent协作与工作流编排
面对复杂任务,单Agent的能力存在上限。多Agent系统通过角色分工和消息传递实现协作:一个Coordinator Agent负责任务拆解和分发,多个Worker Agent各司其职,结果汇总后由Coordinator给出最终输出。
from enum import Enum
from dataclasses import dataclass
class AgentRole(Enum):
COORDINATOR = "coordinator"
RESEARCHER = "researcher"
CODER = "coder"
REVIEWER = "reviewer"
@dataclass
class TaskMessage:
sender: str
receiver: str
content: str
task_id: str
status: str # pending, in_progress, completed, failed
class MultiAgentOrchestrator:
def __init__(self):
self.agents = {}
self.message_queue = []
def register_agent(self, name, role, system_prompt):
self.agents[name] = {
"role": role,
"system_prompt": system_prompt,
"history": []
}
def dispatch_task(self, task_description):
sub_tasks = self._decompose_task(task_description)
results = []
for sub_task in sub_tasks:
agent_name = self._select_agent(sub_task["type"])
result = self._execute_agent(agent_name, sub_task["prompt"])
results.append({"agent": agent_name, "result": result})
final = self._synthesize(results, task_description)
return final
def _decompose_task(self, task):
return [
{"type": "research", "prompt": f"调研: {task}"},
{"type": "coding", "prompt": f"实现: {task}"},
{"type": "review", "prompt": f"审查: {task}"}
]
def _select_agent(self, task_type):
mapping = {"research": "researcher", "coding": "coder", "review": "reviewer"}
return mapping.get(task_type, "coordinator")
def _execute_agent(self, agent_name, prompt):
agent = self.agents[agent_name]
messages = [{"role": "system", "content": agent["system_prompt"]}]
messages.append({"role": "user", "content": prompt})
resp = client.chat.completions.create(model="gpt-4o", messages=messages)
return resp.choices[0].message.content
def _synthesize(self, results, original_task):
summary = "\n".join([f"[{r['agent']}] {r['result'][:200]}..." for r in results])
return f"任务: {original_task}\n\n协作结果:\n{summary}"
Agent记忆与状态持久化
长期运行的Agent需要跨越单次会话的记忆能力。短期记忆用于当前对话上下文,长期记忆通过向量数据库存储历史交互,在需要时检索相关片段注入上下文。
import chromadb
class AgentMemory:
def __init__(self, collection_name="agent_memory"):
self.client = chromadb.PersistentClient(path="./agent_memory_db")
self.collection = self.client.get_or_create_collection(name=collection_name)
def store(self, text, metadata=None, doc_id=None):
self.collection.add(
documents=[text],
metadatas=[metadata or {}],
ids=[doc_id or f"mem_{self.collection.count()}"]
)
def retrieve(self, query, top_k=5):
results = self.collection.query(query_texts=[query], n_results=top_k)
return results["documents"][0] if results["documents"] else []
memory = AgentMemory()
memory.store("用户偏好购买性价比高的电子产品", {"type": "preference"})
memory.store("用户上次购买了蓝牙耳机", {"type": "history"})
relevant = memory.retrieve("用户想买什么电子产品")
context = "\n".join(relevant)
Agent开发中的常见陷阱与解决方案
工具调用幻觉:模型编造不存在的工具或传入错误参数。解决方案是在工具描述中明确约束,并在执行前做参数校验。
无限循环:Agent反复调用同一工具无法收敛。设置max_steps硬限制,并在prompt中要求模型在工具调用失败后调整策略而非重试相同操作。
上下文窗口溢出:多轮工具调用的历史消息快速膨胀。使用滑动窗口或摘要压缩策略,保留最近的N轮交互,将更早的历史压缩为摘要。
def compress_context(messages, keep_recent=10):
if len(messages) <= keep_recent:
return messages
system_msgs = [m for m in messages if m["role"] == "system"]
recent = messages[-(keep_recent - len(system_msgs)):]
early = messages[len(system_msgs):-len(recent)]
summary = compress_with_llm(early)
return system_msgs + [
{"role": "system", "content": f"历史摘要: {summary}"}
] + recent
Agent评估与可观测性
Agent系统调试难度远高于普通LLM应用,因为执行路径不确定。需要记录每一步的思考、工具调用、返回结果,形成完整的trace日志。
import logging
from datetime import datetime
class AgentTracer:
def __init__(self, agent_name):
self.logger = logging.getLogger(agent_name)
self.logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(f"agent_trace_{agent_name}.log", encoding="utf-8")
handler.setFormatter(logging.Formatter("%(asctime)s | %(message)s"))
self.logger.addHandler(handler)
def trace_step(self, step, thought, action, observation, duration_ms):
self.logger.info(
f"Step {step} | Thought: {thought[:100]}... | "
f"Action: {action} | Duration: {duration_ms}ms | "
f"Observation: {str(observation)[:200]}..."
)
def trace_error(self, step, error):
self.logger.error(f"Step {step} | ERROR: {error}")
Agent智能体的工程化落地需要在推理能力、工具编排、状态管理和可观测性之间找到平衡。从单Agent的ReAct循环到多Agent协作编排,核心是将LLM的推理能力转化为可执行的任务流,同时通过完善的trace机制确保系统行为可追溯、可调试。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-agent-zhi-neng-ti-kai-fa-shi-zhan-gong-ju-diao/