🎯 课程主题
综合运用前面所学的 Agent 构建知识,开发一个支持天气查询、数学计算、时间查询、货币转换、信息搜索的多功能智能助手。
📝 核心知识点
1. 项目需求分析
- 概念说明:开发一个多功能智能助手 Agent,支持五种功能的工具调用——天气查询、数学计算、时间查询、货币转换、信息搜索。每个功能对应一个独立的工具函数。
- 关键细节:本实战中天气查询和信息搜索使用写死的数据模拟,生产环境需对接真实 API(后续可通过 MCP Server 实现)。
2. Agent 构建四步骤
- 模型初始化:创建大模型实例(Agent 的大脑)
- 定义工具:编写各功能对应的工具函数(Agent 的手脚)
- 创建 Agent:通过
create_agent整合 model、tools、system_prompt 等(核心整合) - 执行测试:编写主程序进行交互测试
3. 面向对象封装设计
- 概念说明:以类的形式封装智能助手,将模型、工具、系统提示词、消息列表作为成员属性,将 Agent 调用封装为
chat()方法。 - 关键细节:
chat()方法提取最终 AIMessage 的 content 作为返回,保证输出简洁reset()方法重置消息列表,切断对话上下文- 消息列表在多次调用中不断累积,因此 Agent 能记住之前的问题(除非执行 reset)
🏗️ 架构与工作流
用户输入
│
▼
┌──────────────────────────────────┐
│ MultiFunctionAssistant │
│ ┌────────────────────────────┐ │
│ │ model ── system_prompt ── tools │
│ │ ▼ │ │
│ │ create_react_agent │ │
│ │ ▼ │ │
│ │ messages (累积历史消息) │ │
│ │ ▼ │ │
│ │ chat(user_input) → string │ │
│ │ reset() → 清空消息列表 │ │
│ └────────────────────────────┘ │
└──────────────────────────────────┘
│
▼
工具调用 (5个工具)
├── get_weather(city) → 天气查询
├── calculate(expression) → 数学计算
├── get_time_info() → 时间查询
├── currency_convert(...) → 货币转换
└── search_info(query) → 信息搜索
💻 代码实战
from langchain_deepseek import ChatDeepSeek
from langgraph.prebuilt import create_react_agent
from langchain_core.messages import HumanMessage, AIMessage
# ==================== 步骤1:模型初始化 ====================
model = ChatDeepSeek(model="deepseek-v4-flash")
# ==================== 步骤2:定义工具 ====================
def get_weather(city: str) -> str:
"""查询指定城市的天气"""
weather_data = {
"北京": "北京今日晴,温度22-30°C,空气质量优",
"上海": "上海今日多云,温度25-32°C,湿度较大",
"广州": "广州今日雷阵雨,温度26-33°C,出门请带伞",
"深圳": "深圳今日晴转多云,温度24-31°C",
}
return weather_data.get(city, f"抱歉,天气查询工具暂不支持{city}")
def calculate(expression: str) -> str:
"""执行数学计算,支持加减乘除"""
try:
result = eval(expression)
return f"计算结果:{expression} = {result}"
except Exception as e:
return f"计算出错:{str(e)}"
import datetime
def get_time_info(query: str = "当前") -> str:
"""获取当前时间信息"""
now = datetime.datetime.now()
return f"当前时间:{now.strftime('%Y年%m月%d日 %H:%M:%S')},星期{['一','二','三','四','五','六','日'][now.weekday()]}"
def currency_convert(amount: float, from_currency: str, to_currency: str = "CNY") -> str:
"""货币转换(示例汇率,实际需接入实时API)"""
rates = {"USD": 7.25, "EUR": 7.89, "JPY": 0.048, "CNY": 1.0}
if from_currency not in rates or to_currency not in rates:
return "不支持的货币类型"
result = amount * rates[from_currency] / rates[to_currency]
return f"{amount} {from_currency} = {result:.2f} {to_currency}"
def search_info(query: str) -> str:
"""搜索各类信息(示例数据)"""
if "Python" in query:
return "Python是一种广泛使用的高级编程语言,由Guido van Rossum于1991年发布。"
elif "AI" in query or "人工智能" in query:
return "人工智能是计算机科学的一个分支,致力于创造能够模拟人类智能的系统。"
return f"关于'{query}'的搜索结果:暂无详细信息,请尝试更具体的搜索词。"
tools = [get_weather, calculate, get_time_info, currency_convert, search_info]
# ==================== 步骤3:创建 Agent(面向对象封装)============
from typing import List
class MultiFunctionAssistant:
"""多功能智能助手"""
def __init__(self):
self.model = model
self.tools = tools
self.system_prompt = (
"你是一个多功能智能助手,可以帮助用户:\n"
"1. 查询天气\n2. 数学计算\n3. 查询时间\n"
"4. 货币转换\n5. 搜索信息\n"
"请根据用户需求选择合适的工具。"
)
self.agent = create_react_agent(
model=self.model,
tools=self.tools,
system_prompt=self.system_prompt
)
self.messages: List = [] # 消息历史列表
def chat(self, user_input: str) -> str:
"""与助手对话,返回回答文本"""
if not user_input.strip():
return "请输入有效的问题"
self.messages.append(HumanMessage(content=user_input))
result = self.agent.invoke({"messages": self.messages})
# 更新消息列表为完整的交互历史
self.messages = result["messages"]
# 提取最后一条AIMessage的内容作为回复
for msg in reversed(self.messages):
if isinstance(msg, AIMessage) and msg.content:
return msg.content
return "助手暂未生成回复"
def reset(self):
"""重置对话历史"""
self.messages = []
print("对话已重置")
# ==================== 步骤4:测试 ====================
def main():
assistant = MultiFunctionAssistant()
# 方式一:预设问题批量测试
test_questions = [
"北京天气怎么样?",
"帮我计算一下 (45 + 55) * 2.5",
"现在几点了?",
"100美元能兑换多少人民币?",
]
for q in test_questions:
print(f"\n👤 用户: {q}")
reply = assistant.chat(q)
print(f"🤖 助手: {reply}")
# 重置对话
assistant.reset()
# 方式二:交互式循环
print("\n===== 交互模式(输入 'exit' 退出,'reset' 重置)=====")
while True:
user_input = input("\n👤 请输入问题: ").strip()
if user_input.lower() == "exit":
print("再见!")
break
elif user_input.lower() == "reset":
assistant.reset()
continue
reply = assistant.chat(user_input)
print(f"🤖 助手: {reply}")
if __name__ == "__main__":
main()
⚠️ 常见问题与避坑指南
- 消息列表是累积型的:每次
chat()调用后self.messages会被更新为完整的历史记录,因此多次对话间 Agent 能记住上下文。如需隔离问题,调用reset()清空历史。 eval()在生产环境中存在安全风险,实际项目中应使用ast.literal_eval()或自定义表达式解析器。- 天气查询和信息搜索使用了硬编码数据,生产环境需对接真实 API(推荐通过 MCP Server 接入,将在后续章节讲解)。
chat()方法通过reversed()遍历找到最后一条 AIMessage 提取 content,确保总是返回最终结果。
💡 个人总结与延伸
本实战将前面所学的模型初始化、工具绑定、系统提示词、Agent 创建等知识整合为一个完整的项目,采用面向对象设计使代码结构清晰可维护。这只是 Agent 应用的起点——后续可通过 MCP Server 对接真实外部 API,通过中间件增强安全与容错能力,通过多 Agent 协作处理更复杂的任务。