LangGraph 智能体状态管理与决策

LangGraph 智能体状态管理与决策

LangGraph 智能体状态管理与决策


请添加图片描述

🌌你好!这里是 晓雨的笔记本在所有感兴趣的领域扩展知识,感谢你的陪伴与支持~👋 欢迎添加文末好友,不定期掉落福利资讯


写在最前面

版权声明:本文为原创,遵循 CC 4.0 BY-SA 协议。转载请注明出处。

本次演示围绕 Bright Data Web MCP 与 LangGraph 的集成实操 展开,完整展示了从获取大模型 API Key、创建大模型会话,到获取 Bright Data API Key、通过 MultiServerMCPClient 连接 Web MCP 服务器,并在 Bright Data 后台进一步启用浏览器自动化工具、扩展智能体可调用能力的全流程;同时结合 LangGraph 的 StateGraph,搭建了包含大模型节点、工具调用节点和路由规则节点的循环式 AI 研究智能体。演示过程中,通过“打开网页并持续滚动,直到提取 30 条语录的作者、内容与标签”这一实际任务,直观呈现了智能体基于实时网页数据进行搜索、抓取、交互和推理的完整效果。实测结果表明,LangGraph 提供了清晰可控的智能体状态管理与决策机制,而 Bright Data Web MCP 则补足了真实网页访问与动态页面交互能力,使 AI Agent 无需将复杂抓取逻辑硬编码进提示词或业务代码中,也能更稳定地完成生产级研究任务。

赠送25美金的注册链接

LangGraph 智能体状态管理与决策

 from __future__ import annotations import argparse import asyncio import json import os import sys from typing import Any, Literal from urllib.parse import urlencode from dotenv import load_dotenv from langchain_core.messages import HumanMessage, SystemMessage, ToolMessage from langchain_openai import ChatOpenAI from langchain_mcp_adapters.client import MultiServerMCPClient from langgraph.graph import END, START, MessagesState, StateGraph # webmcp-langgraph-demo.py file SYSTEM_PROMPT ="""You are a web research assistant. Task: - Research the user's topic using Google search results and a few sources. - Return 6–10 simple bullet points. - Add a short "Sources:" list with only the URLs you used. How to use tools: - First call the search tool to get Google results. - Select 3–5 reputable results and scrape them. - If scraping fails, try a different result. Constraints: - Use at most 5 sources. - Prefer official docs or primary sources. - Keep it quick: no deep crawling. """ def make_llm_call_node(llm_with_tools): async def llm_call(state: MessagesState): messages = [SystemMessage(content=SYSTEM_PROMPT)] + state["messages"] ai_message = await llm_with_tools.ainvoke(messages) return {"messages": [ai_message]} return llm_call def make_tool_node(tools_by_name: dict): async def tool_node(state: MessagesState): last_ai_msg = state["messages"][-1] tool_results = [] for tool_call in last_ai_msg.tool_calls: tool = tools_by_name.get(tool_call["name"]) if not tool: tool_results.append( ToolMessage( content=f"Tool not found: {tool_call['name']}", tool_call_id=tool_call["id"], ) ) continue # MCP tools are typically async observation = ( await tool.ainvoke(tool_call["args"]) if hasattr(tool, "ainvoke") else tool.invoke(tool_call["args"]) ) tool_results.append( ToolMessage( content=str(observation), tool_call_id=tool_call["id"], ) ) return {"messages": tool_results} return tool_node def should_continue(state: MessagesState) -> Literal["tool_node", END]: last_message = state["messages"][-1] if getattr(last_message, "tool_calls", None): return "tool_node" return END async def main(): # Load environment variables from .env load_dotenv() # Read Bright Data token bd_token = os.getenv("BRIGHTDATA_TOKEN") if not bd_token: raise ValueError("Missing BRIGHTDATA_TOKEN") # Connect to Bright Data Web MCP server client = MultiServerMCPClient({ "bright_data": { "url": f"https://mcp.brightdata.com/mcp?token={bd_token}", "transport": "streamable_http", } }) #&groups=advanced_scraping,browser # Fetch all available MCP tools (search, scrape, etc.) tools = await client.get_tools() tools_by_name = {tool.name: tool for tool in tools} print(f"Available tools: {list(tools_by_name.keys())}") # Debug: print available tool names # Initialize the LLM and allow it to call MCP tools openai_api_key = os.getenv("OPENAI_API_KEY") llm = ChatOpenAI(model="gpt-4o-all", temperature=0, api_key=openai_api_key, base_url="https://poloapi.top/v1",) llm_with_tools = llm.bind_tools(tools) # Build the LangGraph agent graph = StateGraph(MessagesState) graph.add_node("llm_call", make_llm_call_node(llm_with_tools)) graph.add_node("tool_node", make_tool_node(tools_by_name)) # Graph flow: # START → LLM → (tools?) → LLM → END graph.add_edge(START, "llm_call") graph.add_conditional_edges("llm_call", should_continue, ["tool_node", END]) graph.add_edge("tool_node", "llm_call") agent = graph.compile() # Example research query topic = "使用工具访问https://quotes.toscrape.com/scroll,想办法拿到30条quotes提取 quote、author、tags" # You can change this topic as needed # Run the agent result = await agent.ainvoke( { "messages": [ HumanMessage(content=f"Research this topic:\n{topic}") ] }, # Prevent infinite loops config={"recursion_limit": 50} ) # Print the final response print(result["messages"][-1].content) if __name__ == "__main__": asyncio.run(main())

hello,这里是 晓雨的笔记本 。如果你喜欢我的文章,欢迎三连给我鼓励和支持:👍点赞 📁 关注 💬评论,我会给大家带来更多有用有趣的文章。
原文链接 👉 ,⚡️更新更及时。

欢迎大家点开下面名片,添加好友交流。

Read more

Python大数据毕设选题:基于Hadoop+Django肥胖风险分析与可视化系统详解 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘

Python大数据毕设选题:基于Hadoop+Django肥胖风险分析与可视化系统详解 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡如果你遇到具体的技术问题或计算机毕设方面需求可以在主页上详细资料里↑↑联系我~~ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡获取源码主页–> 计算机编程指导师 ⚡⚡文末获取源码 温馨提示:文末有ZEEKLOG平台官方免费提供的博客联系方式的名片! 温馨提示:文末有ZEEKLOG平台官方免费提供的博客联系方式的名片! 温馨提示:文末有ZEEKLOG平台官方免费提供的博客联系方式的名片! 肥胖风险分析与可视化系统-简介 本系统“基于Hadoop+Django的肥胖风险分析与可视化系统”旨在构建一个完整的大数据分析与Web应用流程。系统底层采用Hadoop分布式文件系统(HDFS)作为海量肥胖相关数据的存储基石,确保数据的高容错性和高吞吐量。核心计算引擎则选用Apache

By Ne0inhk
Python 绘制动态跳动爱心|情人节专属浪漫代码,新手零基础也能上手

Python 绘制动态跳动爱心|情人节专属浪漫代码,新手零基础也能上手

马上就是情人节,程序员的浪漫从一行行代码开始!今天分享一款纯 Python 内置库实现的动态跳动爱心,无需复杂第三方依赖,黑色背景搭配粒子化爱心,自带自然的跳动节奏和柔和光晕,既适合送给心仪的人制造惊喜,也能作为 Python 基础练手案例。本文全程保姆级文本解析 + 代码注释双保障,从环境搭建到代码逻辑逐字拆解,纯新手也能跟着一步步实现,轻松拿捏编程浪漫~ 这是最近粉丝私信求表白代码的聊天记录 —— 情人节 / 过年想给心仪的人制造浪漫,用代码做一份专属爱心礼物再合适不过,安排! 一、效果预览 运行代码后会直接弹出640×480的独立图形窗口,黑色背景搭配粒子化粉色爱心,实现沉浸式浪漫视觉效果,核心效果如下: 1. 爱心以自然的周期性节奏跳动,完成“收缩-扩张-收缩”的循环,流畅无卡顿; 2. 爱心由大量细腻粒子构成,轮廓清晰、内部填充饱满,边缘带有轻微粒子扩散效果; 3. 爱心外围附带动态光晕,光晕的大小、粒子数量随爱心跳动节奏同步变化,氛围感拉满; 4. 全程动态渲染,对电脑性能无要求,低配设备也能流畅运行,关闭窗口即可停止程序。

By Ne0inhk
博主亲测!Python+IPIDEA 自动化高效采集音乐数据

博主亲测!Python+IPIDEA 自动化高效采集音乐数据

文章目录 * 一、前言 * 二、全面认识 * 2.1 初步认识 * 2.2 实际使用感受 * 三、手把手教你:从0到1的完整流程 * 四、实战体验 * 五、超多场景预设,助力解决难题 * 六、用后感受 一、前言 最近想做个某云音乐每日推荐歌单存档小工具 —— 每天自动获取推荐歌曲,存成 Excel 方便回顾。结果刚跑了 3 天,代码就报网络异常,手动访问发现被平台限制了:刷新 10 次有 8 次跳验证,根本拿不到数据。 我一开始没当回事,试了两种办法:先是用免费代理池,结果要么失效快,要么访问速度比蜗牛还慢,歌单同步成功率不到 30%;后来手动换手机热点,每天要切 3 次

By Ne0inhk

Python 爬虫实战:爬取音乐平台(网易云 / QQ 音乐)歌曲信息

前言 音乐平台汇聚了海量的歌曲资源,包含歌名、歌手、专辑、播放量、歌词等核心信息,这些数据在音乐趋势分析、个性化推荐研究、音乐版权管理等场景中具有重要价值。传统手动整理歌曲信息的方式效率极低,而基于 Python 的爬虫技术能够批量采集音乐平台的歌曲数据,大幅提升数据获取效率。本文以网易云音乐和 QQ 音乐两大主流平台为例,系统讲解歌曲信息爬取的技术方案、接口解析方法及数据结构化处理,为音乐数据分析师和开发者提供可落地的实战指南。 摘要 本文聚焦音乐平台歌曲信息的爬取实战,分别以网易云音乐网页版和QQ 音乐网页版为核心操作对象(可直接点击进入对应平台),从抓包分析接口、构造请求参数,到多维度歌曲信息提取、数据清洗与存储,完整实现歌名、歌手、专辑、播放量、时长等核心字段的采集。文中包含可直接运行的代码案例、接口参数说明表格及数据输出结果,兼顾技术深度与实操性,帮助读者掌握不同音乐平台歌曲数据爬虫开发的核心技术。 一、技术栈与原理概述 1.1 核心技术栈 < 技术 / 库功能说明

By Ne0inhk