AI Agent完整实战指南:从零开始构建智能自主系统
在2024年的今天,大语言模型已经从简单的问答工具演进到了一个新的阶段——AI Agent(智能代理)时代。这不仅仅是技术的迭代,更是人工智能应用范式的革命性转变。
一、理解AI Agent:不只是聊天机器人
传统AI与Agent的本质区别
当我们使用ChatGPT时,交互模式很简单:你提问,它回答。但AI Agent的工作方式完全不同。
想象一个真实场景:你需要订一张明天去北京的机票。
传统ChatGPT的处理方式:
- 它会告诉你:"您可以访问携程或飞猪网站,搜索明天北京的航班..."
- 接下来所有步骤都需要你手动完成:打开网站、搜索、比价、下单、支付
AI Agent的处理方式:
- 自动搜索可用航班信息
- 对比不同航司的价格和时间
- 调用订票接口完成预订
- 处理支付流程
- 发送确认邮件和行程单
这就是Agent的核心特征:自主性、规划能力和工具使用能力。
Agent的四大核心能力
1. 感知能力(Perception)
Agent需要理解环境和任务。这不仅包括自然语言处理,还包括对结构化数据、API返回值、甚至图像和传感器数据的理解。
2. 规划能力(Planning)
这是Agent最核心的能力。它需要将复杂目标分解为可执行的子任务。比如"帮我准备明天的会议"会被分解为:
- 查看日历确认会议时间
- 检索相关文档资料
- 生成会议大纲
- 准备演示文稿
- 发送会议通知
3. 执行能力(Action)
Agent需要调用各种工具来完成任务:搜索引擎、数据库、API接口、文件系统等。关键是它知道什么时候该用什么工具。
4. 记忆能力(Memory)
短期记忆用于维持对话上下文,长期记忆则像知识库一样存储历史信息和学习到的知识。
二、ReAct模式:Agent的思维方式
ReAct(Reasoning + Acting)是目前最主流的Agent架构模式。它模拟了人类解决问题的思维过程。
ReAct的工作循环
思考(Thought)→ 行动(Action)→ 观察(Observation)→ 思考...
来看一个实际案例:
用户提问: "今天北京天气如何?"
Agent的思维过程:
Thought: 用户想知道北京的天气,我需要查询实时天气数据
Action: 调用天气API,参数city="北京"
Observation: API返回 {weather: "晴", temp: 25, humidity: 60}
Thought: 我已经获取到天气信息,可以给出完整回答了
Final Answer: 今天北京天气晴朗,气温25°C,湿度60%,适合户外活动
这个过程展现了Agent的核心优势:可解释性。我们能清楚地看到Agent的每一步决策和执行过程。
三、LangChain:构建Agent的最佳框架
LangChain是目前最成熟的Agent开发框架,拥有完整的工具生态和活跃的社区。
搭建你的第一个Agent(10分钟)
首先安装必要的包:
pip install langchain langchain-openai python-dotenv
配置API密钥(使用.env文件):
# .env
OPENAI_API_KEY=你的密钥
接下来构建一个简单但完整的Agent:
from langchain_openai import ChatOpenAI
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain.tools import tool
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from dotenv import load_dotenv
load_dotenv()
# 定义工具函数
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气信息"""
# 这里模拟API调用,实际应该对接真实天气API
weather_data = {
"北京": "晴天,25°C,湿度60%",
"上海": "多云,22°C,湿度75%",
"深圳": "阵雨,28°C,湿度85%"
}
return weather_data.get(city, f"{city}天气数据获取中...")
@tool
def calculate(expression: str) -> str:
"""计算数学表达式"""
try:
result = eval(expression)
return f"计算结果:{result}"
except:
return "表达式格式错误"
# 初始化语言模型
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 创建工具列表
tools = [get_weather, calculate]
# 设计提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个智能助手,可以查询天气和进行数学计算。"),
("user", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
# 创建Agent
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
handle_parsing_errors=True
)
# 测试运行
if __name__ == "__main__":
# 测试1:天气查询
result = agent_executor.invoke({"input": "北京今天天气怎么样?"})
print("\n回答:", result["output"])
# 测试2:数学计算
result = agent_executor.invoke({"input": "100乘以25等于多少?"})
print("\n回答:", result["output"])
运行效果
当你运行这个Agent时,会看到详细的思维过程:
> Entering new AgentExecutor chain...
Thought: 用户想知道北京的天气情况
Action: get_weather
Action Input: 北京
Observation: 晴天,25°C,湿度60%
Thought: 我已经获取到天气信息
Final Answer: 北京今天天气晴朗,温度25°C,湿度60%,适合外出活动。
> Finished chain.
添加记忆功能
真实的对话系统需要记住上下文。LangChain提供了多种记忆机制:
from langchain.memory import ConversationBufferMemory
# 创建记忆组件
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# 在创建Agent时添加记忆
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory, # 添加记忆功能
verbose=True
)
# 测试记忆功能
agent_executor.invoke({"input": "我叫张三,来自北京"})
agent_executor.invoke({"input": "我叫什么名字?来自哪里?"})
# Agent会回答:你叫张三,来自北京
四、RAG系统:让Agent拥有专业知识
RAG(Retrieval-Augmented Generation,检索增强生成)是当前最实用的技术之一。它解决了一个关键问题:如何让AI使用实时更新的专业知识。
RAG的工作原理
传统大模型的知识固化在训练数据中,但RAG系统的工作流程是:
用户提问 → 检索相关文档 → 将文档作为上下文 → 生成回答
这带来三大优势:
- 知识实时更新:无需重新训练模型,只需更新文档库
- 回答有据可查:可以追溯答案来源
- 成本低廉:相比微调模型,维护文档库的成本要低得多
构建企业级RAG系统
假设你要构建一个公司内部的知识库问答系统:
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
# 步骤1:加载文档
# 假设你有一个包含公司文档的文件夹
loader = DirectoryLoader(
'./company_docs/',
glob="**/*.txt",
loader_cls=TextLoader
)
documents = loader.load()
# 步骤2:文档切分
# 使用递归切分器,这是目前最好的切分策略
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # 每块文本1000字符
chunk_overlap=200, # 块之间重叠200字符,保证上下文连续
separators=["\n\n", "\n", "。", "!", "?", ";", " ", ""]
)
texts = text_splitter.split_documents(documents)
# 步骤3:创建向量数据库
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(texts, embeddings)
# 步骤4:构建问答链
llm = ChatOpenAI(model="gpt-4", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 将检索到的文档全部塞入上下文
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}) # 检索最相关的3个文档块
)
# 步骤5:提问
result = qa_chain.invoke({
"query": "公司的年假政策是什么?"
})
print(result["result"])
优化RAG系统的关键技巧
1. 文档切分策略
切分得太大,检索精度下降;切分得太小,上下文不完整。实践中的最佳配置:
RecursiveCharacterTextSplitter(
chunk_size=1000, # 中文约500字
chunk_overlap=200, # 20%的重叠率
separators=["\n\n", "\n", "。", " "] # 优先按段落切分
)
2. 添加元数据过滤
当文档库很大时,可以先用元数据过滤,再进行向量检索:
from langchain.schema import Document
docs = [
Document(
page_content="产品A的技术规格...",
metadata={"product": "A", "type": "tech_spec"}
),
Document(
page_content="产品B的用户手册...",
metadata={"product": "B", "type": "manual"}
)
]
# 检索时只查找产品A的技术文档
retriever = vectorstore.as_retriever(
search_kwargs={
"k": 3,
"filter": {"product": "A", "type": "tech_spec"}
}
)
3. 多查询检索
用户的问题可能表述不准确,多查询检索会自动生成问题的多个变体:
from langchain.retrievers import MultiQueryRetriever
# 自动将"产品怎么用"扩展为:
# - 如何使用产品
# - 产品使用方法
# - 产品操作指南
retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=llm
)
五、多Agent协作:构建AI团队
单个Agent能力有限,多个Agent协作才能处理复杂任务。
实战案例:内容创作团队
假设要自动生成一篇技术博客,我们可以设计三个Agent协作:
from langchain.agents import Agent, AgentExecutor
from langchain.tools import Tool
# Agent 1: 研究员
# 负责收集资料和数据
class ResearcherAgent:
def __init__(self, llm, tools):
self.llm = llm
self.tools = tools # 搜索、Wikipedia等工具
def research(self, topic):
prompt = f"""你是一名专业研究员。
任务:收集关于"{topic}"的详细资料
要求:
1. 搜集最新数据和案例
2. 整理关键信息点
3. 列出数据来源
"""
# 执行研究任务
result = self.execute(prompt)
return result
# Agent 2: 作家
# 负责撰写文章
class WriterAgent:
def __init__(self, llm):
self.llm = llm
def write(self, research_data):
prompt = f"""你是一名资深技术作家。
基于以下研究资料撰写博客文章:
{research_data}
要求:
1. 结构清晰,逻辑严密
2. 通俗易懂,避免过度专业术语
3. 包含实际案例
4. 字数2000-3000字
"""
article = self.llm.predict(prompt)
return article
# Agent 3: 编辑
# 负责审核和优化
class EditorAgent:
def __init__(self, llm, tools):
self.llm = llm
self.tools = tools # 语法检查、事实核查工具
def edit(self, article):
prompt = f"""你是一名专业编辑。
请审核并优化以下文章:
{article}
检查项:
1. 语法和拼写错误
2. 逻辑连贯性
3. 事实准确性
4. 标题和小标题优化
"""
final_article = self.llm.predict(prompt)
return final_article
# 协作流程
def create_article_pipeline(topic):
# 初始化三个Agent
researcher = ResearcherAgent(llm, search_tools)
writer = WriterAgent(llm)
editor = EditorAgent(llm, grammar_tools)
# 执行流水线
print("Step 1: 研究员正在收集资料...")
research_data = researcher.research(topic)
print("Step 2: 作家正在撰写文章...")
draft = writer.write(research_data)
print("Step 3: 编辑正在审核优化...")
final_article = editor.edit(draft)
return final_article
# 使用
article = create_article_pipeline("2024年AI Agent技术趋势")
print(article)
工具链设计
有时单个工具不够用,需要组合多个工具:
from langchain.tools import tool
@tool
def web_search_and_summarize(query: str) -> str:
"""搜索网络并总结内容"""
# 1. 执行搜索
search_results = google_search(query)
# 2. 提取网页内容
contents = []
for url in search_results[:5]: # 取前5个结果
content = extract_webpage_content(url)
contents.append(content)
# 3. 用LLM总结
combined_content = "\n\n".join(contents)
summary = llm.predict(
f"请总结以下内容,提取关键信息:\n\n{combined_content}"
)
return summary
@tool
def analyze_and_visualize(data: str) -> str:
"""分析数据并生成图表"""
# 1. 数据分析
analysis = llm.predict(f"分析以下数据的趋势和规律:{data}")
# 2. 生成图表代码
chart_code = llm.predict(
f"生成matplotlib代码来可视化以下数据:{data}\n分析结果:{analysis}"
)
# 3. 执行代码生成图片
exec(chart_code)
return f"分析结果:{analysis}\n图表已保存为chart.png"
六、AutoGPT:完全自主的Agent系统
AutoGPT代表了Agent的最高形态:给定一个长期目标,它会自主规划、执行、评估,直到完成任务。
AutoGPT的核心循环
1. 设定目标
2. 思考下一步行动
3. 执行行动
4. 评估结果
5. 将结果存入长期记忆
6. 回到步骤2(循环直到目标完成)
AutoGPT与普通Agent的区别
| 特性 | 普通Agent | AutoGPT |
|---|---|---|
| 自主性 | 处理单次任务 | 追求长期目标 |
| 记忆 | 短期对话历史 | 持久化长期记忆 |
| 迭代 | 固定步数后停止 | 直到目标达成 |
| 复杂度 | 适合明确任务 | 适合开放性目标 |
简化实现
下面是一个AutoGPT的核心实现框架:
import json
from typing import List, Dict
class SimpleAutoGPT:
def __init__(self, goal: str, llm, tools: List, memory_file="memory.json"):
self.goal = goal
self.llm = llm
self.tools = {tool.name: tool for tool in tools}
self.memory_file = memory_file
self.memory = self.load_memory()
def load_memory(self) -> List[Dict]:
"""加载长期记忆"""
try:
with open(self.memory_file, 'r', encoding='utf-8') as f:
return json.load(f)
except FileNotFoundError:
return []
def save_memory(self):
"""保存记忆到磁盘"""
with open(self.memory_file, 'w', encoding='utf-8') as f:
json.dump(self.memory, f, ensure_ascii=False, indent=2)
def think(self) -> Dict:
"""思考下一步行动"""
# 构建提示词
memory_summary = "\n".join([
f"- {m['action']}: {m['result'][:100]}"
for m in self.memory[-10:] # 最近10条记忆
])
tools_desc = "\n".join([
f"- {name}: {tool.description}"
for name, tool in self.tools.items()
])
prompt = f"""
目标:{self.goal}
可用工具:
{tools_desc}
已完成的行动:
{memory_summary}
基于以上信息,分析当前进度并决定下一步行动。
回答格式(JSON):
{{
"progress": "当前进度评估",
"next_action": "要使用的工具名称",
"action_input": "工具参数",
"reasoning": "选择这个行动的原因"
}}
"""
response = self.llm.predict(prompt)
# 解析JSON响应
try:
decision = json.loads(response)
except:
decision = {
"progress": "思考中",
"next_action": "search",
"action_input": self.goal,
"reasoning": "需要更多信息"
}
return decision
def execute(self, decision: Dict) -> str:
"""执行决策"""
tool_name = decision.get("next_action")
tool_input = decision.get("action_input")
if tool_name not in self.tools:
return f"错误:工具 {tool_name} 不存在"
tool = self.tools[tool_name]
try:
result = tool.run(tool_input)
return result
except Exception as e:
return f"执行出错:{str(e)}"
def evaluate_progress(self) -> bool:
"""评估是否完成目标"""
prompt = f"""
目标:{self.goal}
已完成的所有行动:
{json.dumps(self.memory, ensure_ascii=False, indent=2)}
问题:目标是否已经完成?
回答格式(JSON):
{{
"completed": true/false,
"completion_rate": "完成度百分比",
"reasoning": "判断理由"
}}
"""
response = self.llm.predict(prompt)
try:
evaluation = json.loads(response)
return evaluation.get("completed", False)
except:
return False
def run(self, max_iterations: int = 20):
"""主循环"""
print(f"启动AutoGPT,目标:{self.goal}\n")
for i in range(max_iterations):
print(f"\n{'='*60}")
print(f"迭代 {i+1}/{max_iterations}")
print(f"{'='*60}")
# 1. 思考
decision = self.think()
print(f"\n思考:{decision['reasoning']}")
print(f"进度:{decision['progress']}")
print(f"下一步:{decision['next_action']}({decision['action_input']})")
# 2. 执行
print(f"\n执行中...")
result = self.execute(decision)
print(f"结果:{result[:200]}...")
# 3. 记忆
self.memory.append({
"iteration": i + 1,
"thought": decision['reasoning'],
"action": decision['next_action'],
"input": decision['action_input'],
"result": result
})
self.save_memory()
# 4. 评估
if self.evaluate_progress():
print(f"\n目标已完成!共执行{i+1}步")
break
return self.memory
# 使用示例
if __name__ == "__main__":
from langchain.tools import Tool
from langchain_openai import ChatOpenAI
# 定义工具
def search_tool(query):
# 模拟搜索
return f"关于'{query}'的搜索结果:[相关信息...]"
def write_file_tool(content):
with open("output.txt", "w", encoding="utf-8") as f:
f.write(content)
return "文件已保存"
tools = [
Tool(name="search", func=search_tool, description="搜索网络信息"),
Tool(name="write_file", func=write_file_tool, description="将内容写入文件")
]
llm = ChatOpenAI(model="gpt-4", temperature=0.7)
# 创建AutoGPT实例
auto_gpt = SimpleAutoGPT(
goal="研究2024年AI Agent市场规模,生成分析报告并保存为文件",
llm=llm,
tools=tools
)
# 运行
result = auto_gpt.run(max_iterations=10)
实战案例:自动市场调研
给AutoGPT一个开放性目标:"调研2024年AI绘画市场规模并生成报告"
它会自主执行以下步骤:
信息收集阶段
- 搜索"AI绘画市场规模 2024"
- 访问前5个权威网站
- 提取关键数据和统计信息
数据分析阶段
- 对比不同来源的数据
- 计算市场增长率
- 识别主要参与者
报告生成阶段
- 起草报告大纲
- 撰写各章节内容
- 添加数据图表
质量检查阶段
- 验证数据来源可靠性
- 检查逻辑完整性
- 优化语言表达
交付阶段
- 保存为Markdown文件
- 生成PDF版本
- 发送完成通知
整个过程无需人工干预,完全自主完成。
七、生产级Agent系统设计
将Agent部署到生产环境需要考虑性能、安全、监控等多个维度。
系统架构设计
用户请求
↓
API Gateway(限流、认证)
↓
Agent调度器(负载均衡)
↓
┌──────────┬──────────┬──────────┐
↓ ↓ ↓ ↓
Agent Pool
[Agent1] [Agent2] [Agent3] [Agent4]
↓ ↓ ↓ ↓
└──────────┴──────────┴──────────┘
↓
工具层
┌──────────┬──────────┬──────────┐
↓ ↓ ↓ ↓
搜索引擎 数据库 外部API 文件系统
性能优化
1. 缓存策略
重复的查询应该被缓存,避免重复调用昂贵的API:
from functools import lru_cache
import hashlib
# 内存缓存(适合小数据)
@lru_cache(maxsize=1000)
def expensive_search(query: str) -> str:
"""缓存搜索结果"""
return search_api(query)
# Redis缓存(适合分布式系统)
import redis
redis_client = redis.Redis(host='localhost', port=6379, db=0)
def cached_search(query: str) -> str:
# 生成缓存键
cache_key = f"search:{hashlib.md5(query.encode()).hexdigest()}"
# 尝试从缓存获取
cached = redis_client.get(cache_key)
if cached:
return cached.decode('utf-8')
# 缓存未命中,执行搜索
result = search_api(query)
# 存入缓存,1小时过期
redis_client.setex(cache_key, 3600, result)
return result
2. 异步执行
使用异步提高并发处理能力:
import asyncio
from langchain.agents import AgentExecutor
async def run_agent_async(query: str) -> str:
"""异步运行Agent"""
result = await agent_executor.ainvoke({"input": query})
return result["output"]
async def handle_batch_queries(queries: list) -> list:
"""批量处理查询"""
tasks = [run_agent_async(q) for q in queries]
results = await asyncio.gather(*tasks)
return results
# 使用
queries = ["查询1", "查询2", "查询3"]
results = asyncio.run(handle_batch_queries(queries))
3. 流式输出
对于长文本生成,使用流式输出提升用户体验:
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
llm = ChatOpenAI(
model="gpt-4",
temperature=0.7,
streaming=True, # 启用流式输出
callbacks=[StreamingStdOutCallbackHandler()]
)
# 用户会实时看到生成的文本,而不是等待全部完成
监控与日志
完整的日志系统:
import logging
import time
import json
from datetime import datetime
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('agent.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
class MonitoredAgent:
def __init__(self, agent_executor):
self.agent = agent_executor
self.metrics = {
"total_queries": 0,
"successful": 0,
"failed": 0,
"total_time": 0
}
def run(self, query: str) -> dict:
"""运行Agent并记录指标"""
self.metrics["total_queries"] += 1
start_time = time.time()
try:
logger.info(f"开始处理查询: {query}")
# 执行Agent
result = self.agent.invoke({"input": query})
# 记录成功
duration = time.time() - start_time
self.metrics["successful"] += 1
self.metrics["total_time"] += duration
logger.info(f"查询成功 | 耗时: {duration:.2f}秒 | 结果长度: {len(result['output'])}")
return {
"success": True,
"result": result["output"],
"duration": duration
}
except Exception as e:
# 记录失败
duration = time.time() - start_time
self.metrics["failed"] += 1
logger.error(f"查询失败 | 错误: {str(e)} | 耗时: {duration:.2f}秒")
return {
"success": False,
"error": str(e),
"duration": duration
}
def get_metrics(self) -> dict:
"""获取性能指标"""
avg_time = (
self.metrics["total_time"] / self.metrics["total_queries"]
if self.metrics["total_queries"] > 0 else 0
)
success_rate = (
self.metrics["successful"] / self.metrics["total_queries"] * 100
if self.metrics["total_queries"] > 0 else 0
)
return {
"总查询数": self.metrics["total_queries"],
"成功数": self.metrics["successful"],
"失败数": self.metrics["failed"],
"成功率": f"{success_rate:.2f}%",
"平均响应时间": f"{avg_time:.2f}秒"
}
安全性设计
1. 输入验证与清洗
防止恶意输入攻击:
import re
class InputValidator:
# 危险关键词黑名单
DANGEROUS_PATTERNS = [
r'<script',
r'DROP\s+TABLE',
r'DELETE\s+FROM',
r'rm\s+-rf',
r'eval\(',
r'exec\(',
r'__import__'
]
@classmethod
def is_safe(cls, user_input: str) -> tuple[bool, str]:
"""检查输入是否安全"""
# 检查长度
if len(user_input) > 10000:
return False, "输入过长"
# 检查危险模式
for pattern in cls.DANGEROUS_PATTERNS:
if re.search(pattern, user_input, re.IGNORECASE):
return False, f"检测到危险内容: {pattern}"
return True, "安全"
@classmethod
def sanitize(cls, user_input: str) -> str:
"""清洗输入"""
# 移除HTML标签
clean = re.sub(r'<[^>]+>', '', user_input)
# 移除特殊字符
clean = re.sub(r'[^\w\s\u4e00-\u9fff,。!?、;:""''()]', '', clean)
return clean.strip()
# 使用
def safe_agent_run(query: str):
# 验证输入
is_safe, message = InputValidator.is_safe(query)
if not is_safe:
logger.warning(f"不安全的输入被拦截: {message}")
return {"error": "输入不符合安全规范"}
# 清洗输入
clean_query = InputValidator.sanitize(query)
# 执行Agent
return agent.run(clean_query)
2. 权限控制
不同用户应该有不同的工具访问权限:
class RoleBasedAgent:
# 定义角色权限
ROLE_PERMISSIONS = {
"guest": ["search"], # 游客只能搜索
"user": ["search", "calculator", "weather"], # 普通用户
"premium": ["search", "calculator", "weather", "database"], # 付费用户
"admin": ["search", "calculator", "weather", "database", "system"] # 管理员
}
def __init__(self, all_tools: list):
self.all_tools = {tool.name: tool for tool in all_tools}
def create_agent_for_role(self, role: str):
"""根据角色创建Agent"""
# 获取该角色允许的工具
allowed_tool_names = self.ROLE_PERMISSIONS.get(role, [])
allowed_tools = [
self.all_tools[name]
for name in allowed_tool_names
if name in self.all_tools
]
# 创建受限的Agent
agent = create_openai_functions_agent(llm, allowed_tools, prompt)
executor = AgentExecutor(agent=agent, tools=allowed_tools)
logger.info(f"为角色 {role} 创建Agent,可用工具: {allowed_tool_names}")
return executor
# 使用
rbac_agent = RoleBasedAgent(all_tools)
guest_agent = rbac_agent.create_agent_for_role("guest")
admin_agent = rbac_agent.create_agent_for_role("admin")
API服务化部署
使用FastAPI构建生产级API:
from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel
import uvicorn
app = FastAPI(title="AI Agent API", version="1.0")
# 请求模型
class QueryRequest(BaseModel):
query: str
user_role: str = "user"
class QueryResponse(BaseModel):
success: bool
result: str = None
error: str = None
duration: float
# 初始化Agent(启动时加载)
monitored_agent = None
@app.on_event("startup")
async def startup_event():
global monitored_agent
logger.info("初始化Agent系统...")
# 这里初始化你的Agent
monitored_agent = MonitoredAgent(agent_executor)
logger.info("Agent系统就绪")
@app.post("/agent/query", response_model=QueryResponse)
async def query_agent(request: QueryRequest):
"""Agent查询接口"""
# 验证输入
is_safe, message = InputValidator.is_safe(request.query)
if not is_safe:
raise HTTPException(status_code=400, detail=message)
# 执行查询
result = monitored_agent.run(request.query)
return QueryResponse(
success=result["success"],
result=result.get("result"),
error=result.get("error"),
duration=result["duration"]
)
@app.get("/agent/metrics")
async def get_metrics():
"""获取系统指标"""
return monitored_agent.get_metrics()
@app.get("/health")
async def health_check():
"""健康检查"""
return {"status": "healthy"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
Docker部署
FROM python:3.11-slim
WORKDIR /app
# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制代码
COPY . .
# 暴露端口
EXPOSE 8000
# 启动服务
CMD ["uvicorn", "api:app", "--host", "0.0.0.0", "--port", "8000"]
docker-compose.yml:
version: '3.8'
services:
agent-api:
build: .
ports:
- "8000:8000"
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
volumes:
- ./logs:/app/logs
restart: unless-stopped
redis:
image: redis:7-alpine
ports:
- "6379:6379"
restart: unless-stopped
启动:
docker-compose up -d
八、最佳实践与经验总结
1. Prompt工程的艺术
好的Prompt结构:
[角色定位] + [任务描述] + [输出格式] + [约束条件]
示例:
prompt = """
你是一个专业的数据分析师(角色)。
请分析以下销售数据,找出销售趋势和异常值(任务)。
输出格式(输出格式):
1. 关键发现(3-5条)
2. 数据表格
3. 具体建议
要求(约束):
- 使用专业术语
- 提供具体数值
- 建议具有可操作性
数据:{data}
"""
2. 错误处理策略
from tenacity import retry, stop_after_attempt, wait_exponential
class RobustAgent:
@retry(
stop=stop_after_attempt(3), # 最多重试3次
wait=wait_exponential(multiplier=1, min=2, max=10) # 指数退避
)
def run_with_retry(self, query: str):
"""带重试机制的执行"""
try:
return self.agent.run(query)
except Exception as e:
logger.warning(f"执行失败,准备重试: {str(e)}")
raise # 重新抛出异常以触发重试
3. 成本控制
class CostAwareAgent:
def __init__(self, agent, daily_limit=100):
self.agent = agent
self.daily_limit = daily_limit # 每日API调用上限
self.today_usage = 0
self.last_reset = datetime.now().date()
def run(self, query: str):
# 检查是否需要重置计数
if datetime.now().date() > self.last_reset:
self.today_usage = 0
self.last_reset = datetime.now().date()
# 检查是否超限
if self.today_usage >= self.daily_limit:
return {"error": "今日API调用已达上限"}
# 执行并计数
result = self.agent.run(query)
self.today_usage += 1
logger.info(f"今日使用量: {self.today_usage}/{self.daily_limit}")
return result
九、未来展望
AI Agent技术正在快速演进,几个值得关注的方向:
1. 多模态Agent
未来的Agent将能够处理文本、图像、视频、音频等多种模态:
# 未来的多模态Agent
agent.run("分析这张图片中的物体,并搜索相关信息")
# Agent会:
# 1. 用视觉模型理解图片
# 2. 识别物体
# 3. 搜索相关信息
# 4. 综合生成回答
2. 实时学习Agent
Agent能够从每次交互中学习,持续优化:
# 具备学习能力的Agent
class LearningAgent:
def learn_from_feedback(self, query, response, user_feedback):
"""从用户反馈中学习"""
if user_feedback == "满意":
self.positive_examples.append((query, response))
else:
self.negative_examples.append((query, response))
# 定期微调
if len(self.positive_examples) > 100:
self.fine_tune()
3. Agent市场
未来会出现Agent交易市场,开发者可以:
- 发布自己开发的专业Agent
- 购买他人的Agent能力
- 组合多个Agent形成工作流
结语
AI Agent技术正在重新定义人机交互的方式。从简单的问答到复杂的自主任务执行,Agent让AI真正成为我们的智能助手。
本文涵盖了从基础概念到生产部署的完整知识体系,包括:
- Agent的核心原理和架构设计
- LangChain框架的实战应用
- RAG系统的构建技巧
- 多Agent协作模式
- AutoGPT的自主决策机制
- 生产级系统的性能、安全、监控
掌握这些技术,你就能构建真正智能的AI应用,让AI不只是回答问题,而是主动解决问题。
技术在快速迭代,但核心思想不变:让AI理解目标、自主规划、灵活执行、持续学习。
开始动手实践吧,未来已来。
技术栈参考:
- LangChain / LlamaIndex
- OpenAI GPT-4 / Claude
- 向量数据库:FAISS / Pinecone / Milvus
- 部署:FastAPI + Docker + Kubernetes
延伸阅读:
- LangChain官方文档:https://python.langchain.com
- AutoGPT项目:https://github.com/Significant-Gravitas/AutoGPT
- ReAct论文:Yao et al. 2023