1. 项目概述
"动手实现你的第一个AI Agent"这个标题背后,隐藏着当前技术领域最炙手可热的话题之一。作为一名在自动化系统和智能代理领域摸爬滚打多年的开发者,我清楚地记得第一次成功让AI Agent自主完成任务时的那种兴奋感。不同于简单的脚本或程序,一个真正的AI Agent具备感知环境、自主决策和持续学习的能力,这正是它令人着迷的地方。
本章将带你从零开始构建一个具备基础能力的AI Agent。不同于市面上大多数教程只展示片段代码,我会完整呈现一个可运行的天气查询Agent实现,包含详细的代码注释和设计思路。这个Agent能够理解自然语言指令,调用外部API获取实时天气数据,并以人性化的方式反馈给用户。
2. 核心设计思路
2.1 AI Agent的基本架构
一个典型的AI Agent由以下几个核心组件构成:
- 感知模块:负责接收和处理输入信息
- 决策引擎:基于输入和内部状态做出判断
- 行动模块:执行具体操作或输出响应
- 记忆单元:存储历史交互和学到的知识
- 学习机制:根据反馈优化行为模式
在我们的天气查询Agent中,这些组件将这样实现:
class WeatherAgent: def __init__(self): self.memory = {} # 记忆最近查询过的城市天气 self.api_key = "YOUR_API_KEY" # 天气API密钥 def perceive(self, user_input): """解析用户输入""" pass def decide(self, parsed_input): """决定如何响应""" pass def act(self, decision): """执行具体操作""" pass def learn(self, feedback): """根据用户反馈优化""" pass2.2 技术选型考量
为什么选择Python作为实现语言?主要基于以下几点考虑:
- 丰富的AI生态:Python拥有最完善的机器学习和NLP库
- 开发效率高:快速原型开发,适合教学演示
- 跨平台性:代码可以在各种环境中运行
- 社区支持:遇到问题容易找到解决方案
对于天气API,我们选用OpenWeatherMap,因为它:
- 提供免费基础套餐
- 数据更新及时
- 接口文档清晰
- 全球覆盖范围广
3. 详细实现步骤
3.1 环境准备与依赖安装
首先确保你的Python环境是3.8或更高版本。我们需要安装以下关键库:
pip install requests python-dotenv langchain openai创建一个.env文件存放敏感信息:
OPENWEATHER_API_KEY=your_api_key_here OPENAI_API_KEY=your_openai_key_here重要提示:永远不要将API密钥直接硬编码在代码中,使用环境变量是最佳实践。
3.2 核心代码实现
以下是完整Agent实现,我添加了详细注释说明每个部分的作用:
import os import requests from dotenv import load_dotenv from langchain.llms import OpenAI from langchain.prompts import PromptTemplate load_dotenv() # 加载环境变量 class WeatherAgent: def __init__(self): self.llm = OpenAI(temperature=0.7) # 初始化语言模型 self.memory = {} # 用于缓存天气数据 self.api_key = os.getenv("OPENWEATHER_API_KEY") # 定义提示模板 self.prompt_template = PromptTemplate( input_variables=["city"], template="生成一段关于{city}天气的友好回复,包含温度、湿度和天气状况描述。" ) def get_weather_data(self, city): """调用OpenWeatherMap API获取天气数据""" if city in self.memory: return self.memory[city] try: url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={self.api_key}&units=metric" response = requests.get(url) data = response.json() if response.status_code == 200: weather_data = { 'temp': data['main']['temp'], 'humidity': data['main']['humidity'], 'description': data['weather'][0]['description'] } self.memory[city] = weather_data # 缓存数据 return weather_data else: return None except Exception as e: print(f"获取天气数据出错: {e}") return None def generate_response(self, city, weather_data): """使用LLM生成自然语言响应""" if not weather_data: return f"抱歉,我无法获取{city}的天气信息。" prompt = self.prompt_template.format(city=city) response = self.llm(prompt) return response def run(self, city): """主运行方法""" print(f"正在查询{city}的天气...") weather_data = self.get_weather_data(city) response = self.generate_response(city, weather_data) return response # 使用示例 if __name__ == "__main__": agent = WeatherAgent() while True: city = input("请输入城市名称(输入quit退出): ") if city.lower() == 'quit': break print(agent.run(city)) print("\n" + "="*50 + "\n")3.3 代码解析与关键点
记忆缓存机制:
- 使用简单的字典缓存最近查询结果
- 减少API调用次数,提升响应速度
- 适合小型应用,生产环境建议使用Redis
错误处理:
- 对API调用进行try-catch包装
- 检查HTTP状态码
- 提供友好的错误反馈
LLM集成:
- 使用LangChain简化LLM交互
- 通过PromptTemplate控制输出格式
- temperature参数控制创造性
4. 进阶优化方向
4.1 性能优化技巧
异步请求: 使用
aiohttp代替requests实现并发:import aiohttp async def fetch_weather(session, city): async with session.get(url) as response: return await response.json()缓存过期: 添加TTL机制,避免使用过时数据:
from datetime import datetime, timedelta self.memory = { 'city': { 'data': {...}, 'expires': datetime.now() + timedelta(hours=1) } }
4.2 功能扩展思路
多城市比较:
def compare_weather(self, cities): results = {} for city in cities: results[city] = self.get_weather_data(city) return self.llm(f"比较以下城市天气:{results}")天气预报: 调用OpenWeatherMap的forecast接口获取5天预报
用户偏好记忆: 存储用户常查询的城市,提供快捷访问
5. 常见问题与解决方案
5.1 API相关问题
Q:获取天气数据时返回401错误A:检查以下几点:
- API密钥是否正确配置在.env文件
- 是否在OpenWeatherMap激活了免费套餐
- 密钥是否包含多余空格
Q:响应速度慢A:可能原因:
- 网络延迟 - 考虑使用本地缓存
- API限制 - 检查免费套餐的调用频率限制
- 同步请求 - 改为异步实现
5.2 语言模型问题
Q:生成的回复不自然A:调整方案:
- 修改prompt模板,提供更明确的指令
- 降低temperature值减少随机性
- 添加few-shot示例
Q:处理非英语城市名出错A:解决方案:
- 在调用API前进行城市名标准化
- 使用地理编码API转换城市名
- 添加备选名称映射表
6. 生产环境部署建议
当你想把这个Demo Agent投入实际使用时,需要考虑:
安全性增强:
- 添加API调用速率限制
- 实现用户认证
- 日志记录和监控
可扩展架构:
graph LR A[客户端] --> B[API网关] B --> C[Agent服务] C --> D[缓存层] C --> E[天气API] C --> F[LLM服务]持续改进:
- 收集用户反馈优化prompt
- A/B测试不同响应格式
- 监控API调用成功率
这个天气查询Agent虽然简单,但包含了AI Agent开发的核心模式。通过这个基础框架,你可以继续扩展更复杂的功能,如多Agent协作、长期记忆存储、复杂任务分解等。我在实际项目中发现,从这样的小型Agent开始迭代,往往比一开始就设计庞大系统更易成功。