2026 年从 0 开发 AI Agent 需要的 10 个技能
·
1. 引言
2026 年,AI Agent 已从概念验证走向大规模生产部署。无论是自动化客服、代码审查助手,还是复杂的多步骤工作流编排,Agent 都成为 AI 应用的核心范式。如果你正打算从零开始进入这个领域,面对琳琅满目的框架和工具,可能会感到迷茫。本文梳理了 2026 年开发 AI Agent 最核心的 10 个技能,帮助你构建清晰的学习路径。
下面是一个 AI Agent 系统的整体架构图,帮助你建立全局认知:
2. 大语言模型(LLM)原理与调用
理解 LLM 是开发 Agent 的基石。你不需要从零训练一个模型,但必须掌握以下三个核心方面:
2.1 模型选择
2026 年的模型生态更加多元化,选择时需关注以下维度:
| 模型 | 上下文窗口 | 工具调用能力 | 成本(每百万 Token) | 适用场景 |
|---|---|---|---|---|
| GPT-4o | 128K | ⭐⭐⭐⭐⭐ | $2.5 / $10 | 复杂推理、多模态 |
| Claude 3.5 Sonnet | 200K | ⭐⭐⭐⭐ | $3 / $15 | 长文档、代码生成 |
| Gemini 2.0 Pro | 1M | ⭐⭐⭐⭐ | $2 / $8 | 超长上下文 |
| Llama 3.1 405B | 128K | ⭐⭐⭐ | 免费(自部署) | 私有化部署 |
2.2 API 调用实战
from openai import OpenAI
client = OpenAI()
# 带函数调用的 Agent 请求
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个智能助手,可以根据需要调用工具。"},
{"role": "user", "content": "查询北京今天的天气"}
],
tools=[{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
},
"required": ["city"]
}
}
}],
stream=True # 流式输出
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
2.3 提示工程最佳实践
SYSTEM_PROMPT = """你是一个 AI Agent,拥有以下工具可用:
{tools}
决策规则:
1. 首先理解用户意图
2. 如果需要外部信息,调用对应工具
3. 如果工具返回结果,基于结果生成回答
4. 如果无法完成,明确告知用户限制
安全约束:
- 不要执行任何涉及资金转账的操作
- 不要删除或修改用户数据
- 遇到敏感信息请求时拒绝并说明原因"""
LLM 调用流程如下图所示:
3. 工具调用(Function Calling)与 API 集成
Agent 的核心能力是"行动",而行动通常通过调用外部工具实现。2026 年的工具调用体系已经非常成熟。
3.1 定义工具 Schema
from pydantic import BaseModel, Field
from typing import List, Optional
class SearchTool(BaseModel):
"""搜索工具的定义"""
name: str = "web_search"
description: str = "搜索互联网获取最新信息"
class Parameters(BaseModel):
query: str = Field(description="搜索关键词")
max_results: int = Field(default=5, description="返回结果数量")
language: Optional[str] = Field(default="zh", description="语言")
parameters: Parameters
# 转换为 JSON Schema
tool_schema = {
"type": "function",
"function": {
"name": "web_search",
"description": "搜索互联网获取最新信息",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索关键词"},
"max_results": {"type": "integer", "default": 5},
"language": {"type": "string", "default": "zh"}
},
"required": ["query"]
}
}
}
3.2 工具注册与执行框架
from typing import Dict, Callable, Any
import asyncio
class ToolRegistry:
"""工具注册中心"""
def __init__(self):
self._tools: Dict[str, Dict] = {}
def register(self, name: str, func: Callable, schema: dict):
self._tools[name] = {
"function": func,
"schema": schema
}
async def execute(self, name: str, **kwargs) -> Any:
if name not in self._tools:
raise ValueError(f"工具 {name} 未注册")
tool = self._tools[name]
try:
# 超时控制
result = await asyncio.wait_for(
tool["function"](**kwargs),
timeout=30.0
)
return {"success": True, "data": result}
except asyncio.TimeoutError:
return {"success": False, "error": "工具调用超时"}
except Exception as e:
return {"success": False, "error": str(e)}
# 使用示例
registry = ToolRegistry()
registry.register("web_search", web_search_func, search_schema)
registry.register("calculator", calculator_func, calc_schema)
3.3 错误处理策略
class ToolExecutionStrategy:
"""工具执行策略:重试 + 降级"""
async def execute_with_retry(self, tool_name: str, max_retries: int = 3, **kwargs):
for attempt in range(max_retries):
result = await registry.execute(tool_name, **kwargs)
if result["success"]:
return result["data"]
# 指数退避
wait_time = 2 ** attempt
await asyncio.sleep(wait_time)
# 降级策略:返回缓存或默认值
return self._fallback(tool_name, **kwargs)
工具调用的完整流程:
4. 记忆与上下文管理
Agent 需要记住对话历史、任务状态和用户偏好,才能做出连贯的决策。2026 年的记忆系统已经分层化、专业化。
4.1 三层记忆架构
from typing import List, Dict, Any
from datetime import datetime
import json
class MemorySystem:
"""三层记忆系统"""
def __init__(self):
self.short_term: List[Dict] = [] # 短期记忆
self.long_term: VectorStore = VectorStore() # 长期记忆
self.episodic: Dict[str, Any] = {} # 情景记忆(任务状态)
def add_to_short_term(self, message: Dict, max_tokens: int = 4000):
"""滑动窗口管理"""
self.short_term.append(message)
# 计算当前 Token 数
total_tokens = sum(len(json.dumps(m)) for m in self.short_term)
# 超出限制时,压缩早期内容
if total_tokens > max_tokens:
self._compress_history()
def _compress_history(self):
"""使用 LLM 压缩历史摘要"""
early_messages = self.short_term[:-10] # 保留最近 10 条
summary_prompt = f"请总结以下对话的核心信息:\n{early_messages}"
# 调用 LLM 生成摘要
summary = llm_client.summarize(summary_prompt)
# 替换为摘要
self.short_term = [
{"role": "system", "content": f"历史摘要:{summary}"}
] + self.short_term[-10:]
def remember(self, key: str, value: Any, ttl: int = 3600):
"""存储长期记忆"""
self.long_term.store(
key=key,
value=value,
metadata={"timestamp": datetime.now(), "ttl": ttl}
)
def recall(self, query: str, top_k: int = 5) -> List[Dict]:
"""检索相关记忆"""
return self.long_term.search(query, top_k=top_k)
4.2 向量数据库集成
import chromadb
from chromadb.config import Settings
class VectorStore:
"""基于 Chroma 的向量存储"""
def __init__(self, collection_name: str = "agent_memory"):
self.client = chromadb.Client(Settings(
chroma_db_impl="duckdb+parquet",
persist_directory="./memory_db"
))
self.collection = self.client.get_or_create_collection(
name=collection_name,
embedding_function=default_embedding()
)
def store(self, key: str, value: Any, metadata: dict = None):
self.collection.add(
ids=[key],
documents=[json.dumps(value)],
metadatas=[metadata or {}]
)
def search(self, query: str, top_k: int = 5) -> List[Dict]:
results = self.collection.query(
query_texts=[query],
n_results=top_k
)
return [
{"id": id, "content": json.loads(doc), "score": dist}
for id, doc, dist in zip(
results["ids"][0],
results["documents"][0],
results["distances"][0]
)
]
记忆系统架构图:
5. 规划与推理(Planning & Reasoning)
Agent 不能只做一步反应,它需要具备分解复杂任务并逐步执行的能力。2026 年主流的规划模式是 ReAct + 树状搜索。
5.1 ReAct 模式实现
class ReActAgent:
"""ReAct(Reasoning + Acting)模式实现"""
async def run(self, task: str, max_steps: int = 10):
thoughts = []
actions = []
observations = []
for step in range(max_steps):
# 1. 思考(Reasoning)
thought = await self._think(
task=task,
history=list(zip(thoughts, actions, observations))
)
thoughts.append(thought)
# 2. 行动(Acting)
action = self._parse_action(thought)
if action["type"] == "final_answer":
return action["content"]
# 3. 观察(Observation)
observation = await self._execute_action(action)
observations.append(observation)
return "达到最大步数,任务未完成"
async def _think(self, task: str, history: list) -> str:
prompt = f"""任务:{task}
历史步骤:
{self._format_history(history)}
请思考下一步应该做什么,输出格式:
思考:<你的推理过程>
行动:<工具名称>(<参数>)
或
思考:<你的推理过程>
最终答案:<最终回答>"""
response = await llm_client.chat(prompt)
return response
def _parse_action(self, thought: str) -> dict:
"""解析 LLM 输出的行动指令"""
if "最终答案:" in thought:
return {"type": "final_answer", "content": thought.split("最终答案:")[1]}
# 解析工具调用
import re
match = re.search(r"行动:(\w+)\((.+)\)", thought)
if match:
return {
"type": "tool_call",
"name": match.group(1),
"args": eval(f"{{{match.group(2)}}}")
}
return {"type": "unknown"}
5.2 任务分解与树状搜索
class TaskDecomposer:
"""任务分解器:将复杂任务拆解为子任务 DAG"""
def decompose(self, task: str) -> List[Dict]:
prompt = f"""将以下任务分解为可执行的子任务列表:
任务:{task}
输出 JSON 格式:
[
{{"id": 1, "name": "子任务名", "depends_on": [], "description": "描述"}},
{{"id": 2, "name": "子任务名", "depends_on": [1], "description": "描述"}}
]"""
response = llm_client.chat(prompt)
return json.loads(response)
async def execute_dag(self, tasks: List[Dict]):
"""按依赖关系执行 DAG"""
completed = set()
while len(completed) < len(tasks):
# 找出可执行的任务(依赖已全部完成)
ready = [
t for t in tasks
if all(dep in completed for dep in t["depends_on"])
and t["id"] not in completed
]
# 并行执行
results = await asyncio.gather(*[
self._execute_subtask(t) for t in ready
])
for t, r in zip(ready, results):
completed.add(t["id"])
print(f"子任务 {t['name']} 完成:{r}")
规划与推理流程:
6. 多 Agent 协作与编排
2026 年的复杂系统往往由多个专业 Agent 协同工作,形成"Agent 团队"。
6.1 多 Agent 架构设计
from enum import Enum
from dataclasses import dataclass
from typing import List, Optional
class AgentRole(Enum):
RESEARCHER = "研究员"
CODER = "代码编写者"
REVIEWER = "审查员"
COORDINATOR = "协调者"
TESTER = "测试员"
@dataclass
class AgentMessage:
"""Agent 间通信消息"""
sender: str
receiver: str
content: str
message_type: str # "task", "result", "review", "question"
metadata: dict = None
class AgentTeam:
"""多 Agent 协作团队"""
def __init__(self):
self.agents: Dict[str, BaseAgent] = {}
self.message_queue: asyncio.Queue = asyncio.Queue()
def add_agent(self, name: str, role: AgentRole, agent: BaseAgent):
self.agents[name] = {
"role": role,
"agent": agent,
"status": "idle"
}
async def coordinate(self, task: str):
"""协调者分配任务"""
coordinator = self.agents["coordinator"]
# 1. 分析任务,生成子任务列表
subtasks = await coordinator.agent.analyze_task(task)
# 2. 分配子任务
for subtask in subtasks:
best_agent = self._select_agent(subtask)
await self._assign_task(best_agent, subtask)
# 3. 收集结果
results = []
for _ in range(len(subtasks)):
result = await self.message_queue.get()
results.append(result)
# 4. 整合输出
final_output = await coordinator.agent.synthesize(results)
return final_output
def _select_agent(self, subtask: dict) -> str:
"""根据子任务类型选择最合适的 Agent"""
task_type = subtask.get("type")
mapping = {
"research": "researcher",
"code": "coder",
"review": "reviewer",
"test": "tester"
}
return mapping.get(task_type, "coordinator")
6.2 Agent 间通信协议
class AgentCommunicationProtocol:
"""Agent 间通信协议实现"""
@staticmethod
async def send_message(sender: str, receiver: str, content: str, msg_type: str):
message = AgentMessage(
sender=sender,
receiver=receiver,
content=content,
message_type=msg_type,
metadata={"timestamp": datetime.now().isoformat()}
)
# 通过消息队列传递
await message_queue.put(message)
@staticmethod
async def request_review(code_agent: str, reviewer: str, code: str) -> str:
"""代码审查请求"""
await AgentCommunicationProtocol.send_message(
sender=code_agent,
receiver=reviewer,
content=f"请审查以下代码:\n```python\n{code}\n```",
msg_type="review_request"
)
# 等待审查结果
review_result = await message_queue.get()
return review_result.content
多 Agent 协作流程图:
7. 安全与防护(Guardrails)
Agent 拥有执行能力,安全是上线前的第一道关卡。2026 年的安全体系已经形成多层防护。
7.1 输入安全防护
class InputGuardrail:
"""输入安全防护层"""
def __init__(self):
self.blocked_patterns = [
r"忽略之前的指令",
r"你是.*,现在你要",
r"system.*override",
r"DROP TABLE",
r"rm\s+-rf",
]
self.sensitive_patterns = [
r"\bpassword\b",
r"\bapi[_-]?key\b",
r"\btoken\b",
r"\bsecret\b",
]
def validate_input(self, user_input: str) -> tuple[bool, str]:
"""验证用户输入,返回 (是否通过, 原因)"""
# 1. 检查注入攻击
for pattern in self.blocked_patterns:
if re.search(pattern, user_input, re.IGNORECASE):
return False, "检测到潜在的提示注入攻击"
# 2. 检查敏感信息
for pattern in self.sensitive_patterns:
if re.search(pattern, user_input, re.IGNORECASE):
return False, "输入包含敏感信息,已拦截"
# 3. 长度检查
if len(user_input) > 10000:
return False, "输入过长"
return True, "通过"
7.2 权限控制模型
class PermissionManager:
"""权限控制管理器"""
def __init__(self):
self.tool_permissions = {
"read_file": {"level": "low", "requires_confirm": False},
"write_file": {"level": "medium", "requires_confirm": True},
"delete_file": {"level": "high", "requires_confirm": True},
"execute_command": {"level": "high", "requires_confirm": True},
"send_email": {"level": "medium", "requires_confirm": True},
"make_payment": {"level": "critical", "requires_confirm": True},
}
def check_permission(self, tool_name: str, user_role: str) -> bool:
"""检查权限"""
if tool_name not in self.tool_permissions:
return False
tool_level = self.tool_permissions[tool_name]["level"]
role_levels = {
"admin": ["low", "medium", "high", "critical"],
"editor": ["low", "medium"],
"viewer": ["low"]
}
return tool_level in role_levels.get(user_role, [])
def require_confirmation(self, tool_name: str) -> bool:
"""是否需要用户确认"""
return self.tool_permissions.get(tool_name, {}).get("requires_confirm", True)
7.3 输出审核
class OutputGuardrail:
"""输出安全审核"""
async def audit_output(self, agent_output: str) -> tuple[bool, str]:
"""审核 Agent 输出"""
# 1. 检查是否包含危险指令
if self._contains_dangerous_commands(agent_output):
return False, "输出包含危险系统指令"
# 2. 检查是否泄露敏感信息
if self._contains_sensitive_data(agent_output):
return False, "输出可能包含敏感信息"
# 3. 调用 LLM 进行语义审核
audit_result = await self._llm_audit(agent_output)
if not audit_result["safe"]:
return False, audit_result["reason"]
return True, "通过"
安全防护架构:
8. 评估与可观测性(Evaluation & Observability)
没有评估,就无法迭代。你需要知道 Agent 为什么做出某个决定。
8.1 全链路追踪
from opentelemetry import trace
from opentelemetry.exporter.otlp import OTLPSpanExporter
import uuid
class AgentTracer:
"""Agent 全链路追踪器"""
def __init__(self):
self.tracer = trace.get_tracer("agent-tracer")
self.current_trace_id = None
async def trace_agent_run(self, task: str):
"""追踪一次完整的 Agent 执行"""
self.current_trace_id = str(uuid.uuid4())
with self.tracer.start_as_current_span("agent_run") as span:
span.set_attribute("task", task)
span.set_attribute("trace_id", self.current_trace_id)
# 记录每个步骤
async for step in self._run_with_tracing(task):
yield step
def log_llm_call(self, prompt: str, response: str, latency_ms: int):
"""记录 LLM 调用"""
with self.tracer.start_as_current_span("llm_call") as span:
span.set_attribute("prompt_tokens", len(prompt))
span.set_attribute("response_tokens", len(response))
span.set_attribute("latency_ms", latency_ms)
span.set_attribute("trace_id", self.current_trace_id)
def log_tool_call(self, tool_name: str, args: dict, result: dict, latency_ms: int):
"""记录工具调用"""
with self.tracer.start_as_current_span("tool_call") as span:
span.set_attribute("tool_name", tool_name)
span.set_attribute("args", str(args))
span.set_attribute("success", result.get("success", False))
span.set_attribute("latency_ms", latency_ms)
8.2 自动化测试框架
class AgentTestFramework:
"""Agent 自动化测试框架"""
def __init__(self):
self.test_cases = []
self.results = []
def add_test_case(self, name: str, input: str, expected_output: str,
expected_tools: List[str] = None):
"""添加测试用例"""
self.test_cases.append({
"name": name,
"input": input,
"expected": expected_output,
"expected_tools": expected_tools or []
})
async def run_tests(self, agent) -> dict:
"""运行所有测试用例"""
summary = {"passed": 0, "failed": 0, "total": len(self.test_cases)}
for case in self.test_cases:
try:
# 执行 Agent
result = await agent.run(case["input"])
# 验证输出
output_match = self._semantic_similarity(
result["output"], case["expected"]
)
# 验证工具调用
tools_match = all(
tool in result["tools_called"]
for tool in case["expected_tools"]
)
if output_match > 0.8 and tools_match:
summary["passed"] += 1
self.results.append({"case": case["name"], "status": "PASS"})
else:
summary["failed"] += 1
self.results.append({
"case": case["name"],
"status": "FAIL",
"details": {
"output_similarity": output_match,
"tools_match": tools_match
}
})
except Exception as e:
summary["failed"] += 1
self.results.append({
"case": case["name"],
"status": "ERROR",
"error": str(e)
})
return summary
8.3 性能监控仪表盘
class AgentMetrics:
"""Agent 性能指标收集"""
def __init__(self):
self.metrics = {
"total_requests": 0,
"success_rate": 0.0,
"avg_latency_ms": 0.0,
"avg_tokens_per_request": 0,
"tool_call_distribution": defaultdict(int),
"error_types": defaultdict(int)
}
def record_request(self, success: bool, latency_ms: float,
tokens_used: int, tools_called: List[str]):
"""记录一次请求的指标"""
self.metrics["total_requests"] += 1
# 更新成功率(滑动窗口)
window_size = 1000
self.metrics["success_rate"] = (
(self.metrics["success_rate"] * (window_size - 1) + int(success))
/ window_size
)
# 更新平均延迟
self.metrics["avg_latency_ms"] = (
self.metrics["avg_latency_ms"] * 0.95 + latency_ms * 0.05
)
# 更新 Token 消耗
self.metrics["avg_tokens_per_request"] = (
self.metrics["avg_tokens_per_request"] * 0.95 + tokens_used * 0.05
)
# 记录工具调用分布
for tool in tools_called:
self.metrics["tool_call_distribution"][tool] += 1
评估与可观测性架构:
9. 前端与交互设计
Agent 的最终用户是人,良好的交互体验至关重要。
9.1 流式响应实现
// 前端流式响应实现
class StreamResponseHandler {
constructor(containerId) {
this.container = document.getElementById(containerId);
this.currentMessage = '';
this.thinkingIndicator = null;
}
async connectToAgent(endpoint, userMessage) {
// 显示思考中状态
this.showThinking();
const response = await fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message: userMessage }),
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
this.handleChunk(chunk);
}
this.hideThinking();
}
handleChunk(chunk) {
// 解析 SSE 数据
const lines = chunk.split('\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = JSON.parse(line.slice(6));
if (data.type === 'thinking') {
this.showThinkingProcess(data.content);
} else if (data.type === 'tool_call') {
this.showToolCall(data.tool, data.args);
} else if (data.type === 'content') {
this.
更多推荐


所有评论(0)