AI Agent 入门
import osfrom typing import Annotated, TypedDictfrom langchain.tools import toolfrom langchain.chat_models import init_chat_modelfrom langgraph.graph import StateGraph, START, ENDfrom langgraph.graph.message import add_messagesfrom langgraph.prebuilt import ToolNode# ========== 1. 定义工具 ==========@tooldef get_weather(city: str) -> str:"""查询指定城市的实时天气信息,包括温度、天气状况等"""# 实际项目中这里会调用天气 API,这里用模拟数据演示weather_data = {"北京": "晴,15-26°C,北风3级","上海": "多云,18-24°C,东风2级","广州": "小雨,22-28°C,南风1级",}return weather_data.get(city, f"暂无{city}的天气数据")@tooldef get_clothing_advice(weather: str) -> str:"""根据天气信息推荐今日穿搭建议"""if "雨" in weather:return "建议带伞,穿防水外套,搭配短靴"elif "晴" in weather:return "阳光好,建议穿轻薄长袖,外搭薄外套应对温差"else:return "天气多变,建议穿着舒适的休闲装,备一件外套"tools = [get_weather, get_clothing_advice]# ========== 2. 初始化大模型 ==========# 请将你的 API Key 配置在环境变量 MODELSCOPE_API_KEY 中llm = init_chat_model(model="glm-4-flash",model_provider="openai",api_key=os.environ.get("MODELSCOPE_API_KEY", "your-key-here"),base_url="https://open.bigmodel.cn/api/paas/v4",)# 关键:把工具绑定给大模型,让它知道有哪些工具可用llm_with_tools = llm.bind_tools(tools)# ========== 3. 定义 State ==========class State(TypedDict):messages: Annotated[list, add_messages]# ========== 4. 定义节点 ==========def chatbot(state: State):"""大模型节点:思考并决定是否调用工具"""return {"messages": [llm_with_tools.invoke(state["messages"])]}def route_tools(state: State):"""条件边:检查是否需要调用工具"""last_message = state["messages"][-1]# 如果最后一条消息包含 tool_calls 属性且非空,就去执行工具if hasattr(last_message, "tool_calls") and last_message.tool_calls:return "tools"return END# ========== 5. 构建图 ==========graph_builder = StateGraph(State)# 添加节点graph_builder.add_node("chatbot", chatbot)graph_builder.add_node("tools", ToolNode(tools)) # LangGraph 内置的工具执行节点# 添加边graph_builder.add_edge(START, "chatbot") # 入口 → 大模型graph_builder.add_conditional_edges( # 大模型 → 工具 or 结束"chatbot", route_tools,{"tools": "tools", END: END})graph_builder.add_edge("tools", "chatbot") # 工具 → 回到大模型(继续思考)# 编译agent = graph_builder.compile()# ========== 6. 运行 ==========if __name__ == "__main__":result = agent.invoke({"messages": [{"role": "user", "content": "帮我查一下北京今天的天气,然后推荐穿搭"}]})# 打印最终回复print(result["messages"][-1].content)

夜雨聆风