1. 从零搭建你的第一个AI智能体
作为一名长期从事AI应用开发的工程师,我经常遇到初学者询问如何快速上手构建AI智能体。今天我将通过一个天气查询智能体的完整实现过程,带你掌握LangChain框架的核心用法。这个案例麻雀虽小五脏俱全,涵盖了智能体开发的完整技术栈。
智能体(Agent)与传统AI模型的区别在于其具备自主决策能力。就像人类助手会根据情况选择不同工具完成任务,智能体能够根据用户需求自动选择调用合适的工具。我们即将构建的天气查询智能体,就能理解自然语言指令,自动判断是否需要调用天气查询API。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境准备
2.1 基础环境配置
首先确保你的Python环境版本≥3.8,这是LangChain框架的最低要求。我推荐使用conda创建独立环境:
bash复制conda create -n langchain-demo python=3.10
conda activate langchain-demo
2.2 依赖安装
除了项目提示的langchain和langchain-openai,我们还需要安装pydantic用于数据验证:
bash复制pip install langchain langchain-openai pydantic
注意:如果你在国内网络环境,建议使用清华源加速安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple
3. 核心组件解析与实现
3.1 语言模型配置
我们使用ChatOpenAI作为基础语言模型,这里有几个关键参数需要注意:
python复制llm = ChatOpenAI(
model="glm-4-flash", # 轻量级模型响应更快
temperature=0, # 设为0确保确定性输出
api_key="your_api_key", # 实际使用请替换为有效key
base_url="https://open.bigmodel.cn/api/paas/v4/"
)
- model选择:glm-4-flash是性价比很高的轻量级模型,适合简单任务。复杂场景可考虑glm-4
- temperature参数:控制输出随机性。0表示完全确定性,适合工具调用场景
- base_url:指定API端点,不同服务提供商地址不同
3.2 工具定义与封装
智能体的核心能力来自于工具调用。我们先定义一个模拟天气查询工具:
python复制class WeatherInput(BaseModel):
location: str = Field(description="城市名称,如'北京'或'Shanghai'")
def get_weather(location: str) -> str:
"""获取指定城市的实时天气数据(模拟实现)"""
# 实际项目中这里会调用天气API
return f"{location}天气:晴,25°C,湿度60%"
使用StructuredTool进行工具封装:
python复制tools = [
StructuredTool.from_function(
name="weather_query", # 工具唯一标识
func=get_weather,
description="查询指定城市的实时天气信息",
args_schema=WeatherInput
)
]
经验分享:工具描述(description)要清晰准确,这直接影响LLM是否选择该工具
3.3 智能体提示工程
提示模板设计是智能体行为控制的关键:
python复制prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的天气助手,准确回答天气相关问题。"
"当用户询问天气时,你必须调用weather_query工具获取数据。"),
("human", "{input}"),
MessagesPlaceholder("agent_scratchpad")
])
- system消息定义角色和基础规则
- agent_scratchpad保留智能体的思考过程
- 实际项目中可以添加更多few-shot示例
4. 智能体组装与测试
4.1 智能体创建流程
python复制agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True # 开发阶段建议开启详细日志
)
4.2 实际测试案例
python复制# 简单查询
result = agent_executor.invoke({"input": "北京天气怎么样?"})
print(result['output'])
# 带条件的查询
result = agent_executor.invoke({"input": "上海和杭州哪个城市更热?"})
在verbose模式下,你会在控制台看到类似这样的思考过程:
code复制> 进入新链...
思考:用户询问北京天气,需要调用weather_query工具
调用:weather_query
参数:{"location": "北京"}
观察:北京天气:晴,25°C,湿度60%
思考:可以直接返回查询结果
5. 生产环境优化建议
5.1 错误处理增强
实际项目中需要添加完善的错误处理:
python复制def get_weather(location: str) -> str:
try:
# 模拟API调用可能失败
if random.random() < 0.1:
raise ValueError("API服务暂时不可用")
return f"{location}天气数据..."
except Exception as e:
return f"查询失败:{str(e)}"
5.2 性能优化技巧
- 缓存机制:对天气数据添加TTL缓存
- 批量查询:支持同时查询多个城市
- 超时设置:为API调用添加超时控制
python复制from functools import lru_cache
@lru_cache(maxsize=100)
def get_weather(location: str) -> str:
# 实现带缓存的查询
6. 扩展方向
这个基础框架可以扩展出许多实用功能:
- 多工具集成:加入航班查询、景点推荐等工具
- 记忆功能:使用ConversationBufferMemory保存对话历史
- 验证机制:添加用户地理位置验证等安全措施
python复制# 示例:添加对话记忆
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory,
verbose=True
)
我在实际项目中发现,智能体开发最难的不是技术实现,而是设计清晰的工具边界和提示词规则。建议从简单场景开始,逐步迭代扩展功能。
