万字长文!从 0 到 1 搭建基于 LangGraph 的 AI Agent

因此本节课中,我们将迈出关键一步,引入当前 Agent 生态中非常热门的框架——LangGraph。它基于“有向图”模型,将 Agent 的运行流程抽象为“节点 + 状态流转”,具备结构清晰、易扩展、原生支持多工具/多轮调用等显著优势。通过与上一节手写 Agent 的对比学习,你将切实体会到:借助 LangGraph,我们可以用更高效、更优雅的方式构建复杂智能体系统。

LangGraph 简介

LangGraph 最核心的设计理念就是将智能体流程图形化建模。在 LangGraph 中,每一个操作单元(比如大模型调用、函数执行、判断逻辑)都是一个 节点(Node),节点之间通过 边(Edge) 相连接,构成了完整的智能体工作流。特别是,它支持 条件边(Conditional Edges),可以根据状态决定分支路径,类似于传统的 if-else 语句。这样构建出来的智能体,就像画流程图一样简单、直观,极大地增强了结构可视性与逻辑解耦能力。

另外,LangGraph 并不只是“把流程画出来”这么简单,它还原生支持三个非常重要的功能:

  • ✅ Cyclic Graphs(循环图):支持智能体在不同节点之间循环跳转,方便实现多轮思考与行动;

  • ✅ Persistence(状态持久化):图中状态可以随时保存、恢复,支持断点续跑与回溯;

  • ✅ Human-in-the-loop(人类参与环节):支持在流程中插入人工确认、反馈或干预节点,增强系统可控性。

这些功能,若在传统实现中靠代码维护会非常复杂,而 LangGraph 提供了图层级的原生支持,几乎开箱即用。

代码实战

前期准备

首先我们可以沿用上一节课创建的环境(没看过的小伙伴可以点击链接查阅一下),但是我们需要额外在终端安装以下这些库:

pip install langgraph langchain langchain-openai langchain-community pygraphviz

然后我们还可以配置好大模型的环境,我们只需要写入api_key的信息即可:

from langchain_openai import ChatOpenAI
aliyun_api_key = '你的api_key'
model = ChatOpenAI(
    model="qwen-plus",  # 或其他你在 DashScope 控制台启用的模型名
    openai_api_key=aliyun_api_key,
    openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

假如在国外的朋友可以照着原本教程的代码配置Tavily Search,这个API密钥我们可以通过链接((https://www.tavily.com/)去获取。

from langchain_community.tools.tavily_search import TavilySearchResults
import os
os.environ["TAVILY_API_KEY"] = "你的api_key"
tool = TavilySearchResults(max_results=4) #increased number of results
print(type(tool))
print([tool.name](http://tool.name/))

但是由于国内无法直接使用,因此这里我们可以替换成国内可用的一个搜查工具——博查。博查算是我发现国内可用里面比较方便快捷的网络搜索工具了,其他百度啊Bing这种用起来都比较复杂,博查算是充值就能用的了。我们可以在博查的官网(https://open.bochaai.com/)注册一个账号(可以直接微信登录)。

进去后就可以点击右上角的控制台找到账号充值的位置,然后充值10块钱进去尝试一下。

然后再点击右边的API KEY管理生成一个属于我们自己的API KEY。

拿到这个API KEY以后呢,我们再点击开发文档(https://bocha-ai.feishu.cn/wiki/HmtOw1z6vik14Fkdu5uc9VaInBb)里看看怎么去获取到对应的信息和内容。博查里面其实有好几种不同的搜索方式,这里演示我就使用最普通的Web Search好了。

拿到了这个代码内容以后呢,我们其实就要把这个调用的方式封装成LangGraph支持的格式了。这里其实我们就可以去求助一下AI,让其帮我们改一下。那AI哐哧哐哧就写了一个工具出来(当然这里也要几轮的交互,最重要的其实是要把返回的数据结构给到AI,就是真正的通过上面的代码调用一次,把返回的数据结构传给AI,那AI就知道要怎么写了)。我们只需要在最下面写入API_KEY并看看返回的结果即可。

from typing import Type
from pydantic import BaseModel, Field, PrivateAttr
from langchain_core.tools import BaseTool
import requests

# 输入参数定义
class BoChaSearchInput(BaseModel):
    query: str = Field(..., description="搜索的查询内容")

# LangChain Tool 定义
class BoChaSearchResults(BaseTool):
    name: str = "bocha_web_search"
    description: str = "使用博查API进行网络搜索,可以用来查找实时信息或新闻"
    args_schema: Type[BaseModel] = BoChaSearchInput

    # 私有属性,用于保存调用参数
    _api_key: str = PrivateAttr()
    _count: int = PrivateAttr()
    _summary: bool = PrivateAttr()
    _freshness: str = PrivateAttr()

    # 初始化方法
    def __init__(self, api_key: str, count: int = 5, summary: bool = True, freshness: str = "noLimit", **kwargs):
        super().__init__(**kwargs)
        self._api_key = api_key
        self._count = count
        self._summary = summary
        self._freshness = freshness

    # Tool 实际运行逻辑
    def _run(self, query: str) -> str:
        url = "https://api.bochaai.com/v1/web-search"
        headers = {
            "Authorization": f"Bearer {self._api_key}",
            "Content-Type": "application/json"
        }
        payload = {
            "query": query,
            "summary": self._summary,
            "freshness": self._freshness,
            "count": self._count
        }

        try:
            response = requests.post(url, headers=headers, json=payload, timeout=10)
            response.raise_for_status()
            data = response.json()

            # ✅ 正确解析返回值中的搜索结果位置
            results = data.get("data", {}).get("webPages", {}).get("value", [])
            ifnot results:
                returnf"未找到相关内容。\n[DEBUG] 返回数据:{data}"

            # 格式化输出结果
            output = ""
            for i, item in enumerate(results[:self._count]):
                title = item.get("name", "无标题")
                snippet = item.get("snippet", "无摘要")
                url = item.get("url", "")
                output += f"{i+1}. {title}\n{snippet}\n链接: {url}\n\n"

            return output.strip()

        except Exception as e:
            returnf"搜索失败: {e}"

tool = BoChaSearchResults(api_key="你的博查API Key", count=4)

# 单次使用(模拟 Agent 工具调用)
result = tool.invoke({"query": "阿里巴巴2024年的ESG报告"})
print(result)

测试完没问题以后,我们下面就正式开始关于LangGraph的Agent构件了!

温馨提示一下,大家测试完记得把单次使用的代码删掉或者注释掉,不然每运行

### AI Agent 技术原理 AI Agent 的核心技术在于其具备感知环境、决策制定和执行操作的能力。这种能力来源于多个关键技术模块的协同工作,主要包括以下几个方面: #### 1. **感知与输入** AI Agent 需要通过传感器或其他形式的数据采集设备来感知外部世界。这可以包括摄像头捕捉视觉信息、麦克风接收音频信号或者网络接口获取数化数据[^2]。 #### 2. **状态表示与建模** 为了有效地处理来自外界的信息,Agent 必须构建内部的状态模型。这一过程通常涉及将原始感官数据转化为结构化特征向量或更高层次的概念描述。现代方法常依赖于深度神经网络来进行自动化的特征提取和抽象[^4]。 #### 3. **规划与推理** 基于当前所处的状态以及既定的目标,AI Agent 使用各种算法进行路径寻找或是策略推导。强化学习便是其中一种重要手段,在未知环境中探索最优行为序列的同时不断优化奖励函数下的累积收益[^1]。 #### 4. **行动控制** 最终决定做出后,还需要有机制将其转换成实际物理世界的动作指令或者是虚拟空间内的命令发送出去。对于机械臂来说可能是电机驱动参数调整;而对于软件型Agents,则更多表现为API调用或者其他形式的服务请求发起[^3]。 --- ### AI Agent 应用场景分析 随着技术进步,AI Agents 已经渗透到我们生活的方方面面,并展现出强大的实用价值: #### 自动驾驶车辆 利用复杂的传感融合技术和实时路况判断逻辑,使得无人驾驶成为可能。这类系统不仅需要精确识别周围物体位置关系还要预测其他交通参与者未来动态趋势以便安全高效通行[^3]. ```python def autonomous_driving(perception_data, traffic_rules): state = process_perception(perception_data) action_plan = plan_actions(state, traffic_rules) execute_commands(action_plan) def process_perception(data): # Example of feature extraction using deep learning models. model_output = neural_network_forward_pass(data) return interpret_model_results(model_output) ``` #### 游戏娱乐行业 无论是单机还是在线多人游戏中都存在大量NPC角色扮演者,他们依据预设剧本加上随机应变技巧给予玩家沉浸式体验感。同时电竞训练营也采用类似的思路培养顶尖选手对抗水平[^2]. #### 客服支持平台 借助自然语言理解和生成技术,智能客服能够快速响应客户咨询并提供解决方案减少人工成本提高效率。例如当收到订单查询需求时会自动检索数据库返回相应结果甚至主动推荐关联商品促进销售增长. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值