🍋🍋AI学习🍋🍋

🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞


2025年,AI Agent技术迎来爆发式发展,从概念验证走向生产级应用。本文将系统拆解AI Agent的核心架构,详细介绍如何使用LangGraph构建企业级智能体系统,并通过实战案例展示开发的完整流程。

一、AI Agent核心架构解析

1.1 Agent系统三层架构模型

一个完整的AI Agent系统通常包含以下三个核心层次:

1.1.1 决策层(Model Layer)

核心职责:

  • 任务规划与分解

  • 工具选择与参数生成

  • 状态管理与决策

技术实现:

class DecisionEngine:
    def __init__(self, llm, tools):
        self.llm = llm
        self.tools = tools
        
    def plan_task(self, objective, context):
        """任务规划"""
        prompt = f"""
        基于当前目标和上下文,制定详细的执行计划:
        目标:{objective}
        上下文:{context}
        可用工具:{[tool.name for tool in self.tools]}
        
        请返回JSON格式的任务计划,包含:
        - steps: 执行步骤列表
        - tool_usage: 预计使用的工具
        - dependencies: 依赖关系
        """
        return self.llm.generate(prompt)
    
    def decide_next_action(self, state):
        """决定下一步行动"""
        prompt = f"""
        基于当前状态,决定下一步应该执行什么操作:
        {state}
        
        请选择:
        1. 直接回答用户问题
        2. 调用工具获取信息
        3. 请求用户补充信息
        """
        return self.llm.generate(prompt)
1.1.2 执行层(Execution Layer)

核心组件:

  • 工具调用管理器

  • API接口适配器

  • 异常处理机制

工具分类体系:

工具类型 执行位置 应用场景 示例
Extensions 服务端 实时API调用 搜索服务、天气查询
Functions 客户端 UI交互、权限控制 按钮点击、表单提交
Data Stores 服务端 知识检索、数据查询 向量数据库、SQL查询
1.1.3 交互层(Interaction Layer)

主要功能:

  • 用户意图识别

  • 多模态输入处理

  • 响应生成与格式化

1.2 Agent能力成熟度模型

根据2025年最新标准,AI Agent能力分为五个成熟度等级:

Level 1-2:基础执行阶段

  • 脚本自动化

  • 单步工具调用

  • 固定流程执行

Level 3:规划执行阶段(当前主流)

  • 任务分解能力

  • 动态工具选择

  • 异常恢复机制

Level 4:反思优化阶段(2025年技术突破点)

  • 自我批判能力

  • 用户反馈学习

  • 策略动态优化

Level 5:自主进化阶段(未来方向)

  • 跨领域知识迁移

  • 元学习能力

  • 自主创新

二、LangGraph核心概念与技术架构

2.1 LangGraph简介

LangGraph是LangChain生态系统的核心组件,专门用于构建基于图结构的复杂工作流和Agent系统。相比传统的链式调用,LangGraph提供了更强大的流程编排能力。

核心优势:

  • 结构化工作流:支持分支、循环和条件逻辑

  • 状态管理:强大的上下文维护机制

  • 可视化监控:与LangSmith深度集成

  • 可扩展性:易于集成自定义组件

2.2 核心概念详解

2.2.1 图(Graph)

图是整个工作流的容器,包含节点和边的集合:

from langgraph.graph import StateGraph
from typing import Dict, Any
​
# 创建状态图
workflow = StateGraph(Dict[str, Any])
2.2.2 节点(Node)

节点是工作流的基本处理单元:

def process_node(state: Dict[str, Any]) -> Dict[str, Any]:
    """处理节点示例"""
    # 执行业务逻辑
    result = do_something(state["input_data"])
    
    # 更新状态
    return {
        **state,
        "processed_data": result,
        "status": "completed"
    }
​
# 添加节点到图中
workflow.add_node("processor", process_node)
2.2.3 边(Edge)

边定义节点之间的连接关系:

# 标准边:固定执行路径
workflow.add_edge("start", "processor")
​
# 条件边:根据状态动态选择路径
def route_based_on_result(state: Dict[str, Any]) -> str:
    if state["confidence"] > 0.8:
        return "high_confidence_path"
    else:
        return "low_confidence_path"
​
workflow.add_conditional_edges(
    "classifier",
    route_based_on_result,
    {
        "high_confidence_path": "direct_output",
        "low_confidence_path": "human_review"
    }
)
2.2.4 状态(State)

状态是在工作流中传递的数据结构:

# 初始状态
initial_state = {
    "input": "用户查询内容",
    "context": [],
    "intermediate_results": {},
    "final_result": None
}
​
# 编译工作流
app = workflow.compile()
​
# 执行工作流
result = app.invoke(initial_state)

三、LangGraph搭建Agent核心步骤

3.1 环境准备与安装

# 基础安装
pip install langchain langgraph langchain-community
​
# 如果需要可视化和监控
pip install langsmith
​
# 设置环境变量
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY="your-api-key"
export LANGCHAIN_PROJECT="agent-development"

3.2 构建基础Agent工作流

3.2.1 定义状态结构
from typing import TypedDict, List
​
class AgentState(TypedDict):
    """Agent状态定义"""
    query: str
    thoughts: List[str]
    actions: List[str]
    observations: List[str]
    final_answer: str
    iterations: int
    max_iterations: int = 10
3.2.2 实现核心节点
from langchain_openai import ChatOpenAI
from langchain.tools import tool
from langgraph.graph import END
​
# 初始化LLM
llm = ChatOpenAI(model="gpt-4o", temperature=0.7)
​
# 定义工具
@tool
def search_tool(query: str) -> str:
    """搜索工具:获取最新信息"""
    # 实际实现中这里会调用搜索引擎API
    return f"搜索结果:关于'{query}'的最新信息..."
​
@tool
def calculator_tool(expression: str) -> str:
    """计算工具:执行数学计算"""
    try:
        result = eval(expression)
        return f"计算结果:{expression} = {result}"
    except Exception as e:
        return f"计算错误:{str(e)}"
​
tools = [search_tool, calculator_tool]
​
# 思考节点
def think_node(state: AgentState) -> AgentState:
    """思考节点:决定下一步行动"""
    prompt = f"""
    基于当前状态,决定下一步应该执行什么操作:
    查询:{state['query']}
    历史思考:{state['thoughts']}
    历史行动:{state['actions']}
    观察结果:{state['observations']}
    
    可用工具:{[tool.name for tool in tools]}
    
    请思考:
    1. 是否需要调用工具?
    2. 如果需要,应该调用哪个工具?
    3. 工具参数是什么?
    4. 如果不需要工具,直接回答用户问题。
    
    输出格式:
    思考:[你的思考过程]
    行动:[工具名称,参数] 或 完成:[最终答案]
    """
    
    response = llm.invoke(prompt).content
    
    # 解析响应
    thoughts = state['thoughts'] + [response.split('思考:')[1].split('行动:')[0].strip()]
    
    if '完成:' in response:
        final_answer = response.split('完成:')[1].strip()
        return {
            **state,
            'thoughts': thoughts,
            'final_answer': final_answer
        }
    else:
        action_part = response.split('行动:')[1].strip()
        tool_name, tool_args = action_part.split(',')[0], action_part.split(',')[1]
        actions = state['actions'] + [(tool_name, tool_args)]
        
        return {
            **state,
            'thoughts': thoughts,
            'actions': actions,
            'iterations': state['iterations'] + 1
        }
​
# 行动节点
def act_node(state: AgentState) -> AgentState:
    """行动节点:执行工具调用"""
    last_action = state['actions'][-1]
    tool_name, tool_args = last_action
    
    # 查找对应的工具
    tool = next((t for t in tools if t.name == tool_name), None)
    
    if tool:
        try:
            result = tool.invoke(tool_args)
            observations = state['observations'] + [result]
            return {
                **state,
                'observations': observations
            }
        except Exception as e:
            observations = state['observations'] + [f"工具调用失败:{str(e)}"]
            return {
                **state,
                'observations': observations
            }
    else:
        observations = state['observations'] + [f"工具'{tool_name}'不存在"]
        return {
            **state,
            'observations': observations
        }
​
# 判断节点:是否继续循环
def should_continue(state: AgentState) -> str:
    """判断是否继续执行"""
    if state['final_answer']:
        return END
    if state['iterations'] >= state['max_iterations']:
        return "max_iteration_break"
    return "continue"
3.2.3 组装工作流
# 创建状态图
workflow = StateGraph(AgentState)

# 添加节点
workflow.add_node("think", think_node)
workflow.add_node("act", act_node)
workflow.add_node("max_iteration_break", lambda state: {**state, "final_answer": "已达到最大迭代次数"})

# 设置入口点
workflow.set_entry_point("think")

# 添加边
workflow.add_edge("think", "act")
workflow.add_edge("act", "think")
workflow.add_edge("max_iteration_break", END)

# 添加条件边
workflow.add_conditional_edges(
    "think",
    should_continue,
    {
        END: END,
        "continue": "act",
        "max_iteration_break": "max_iteration_break"
    }
)

# 编译工作流
agent = workflow.compile()

3.3 高级特性实现

3.3.1 工作流可视化
# 生成ASCII图
agent.get_graph().print_ascii()

# 生成Mermaid图(用于文档)
print(agent.get_graph().draw_mermaid())
3.3.2 状态持久化
import json
from datetime import datetime

def save_state(state: AgentState, filename: str = None):
    """保存状态到文件"""
    if not filename:
        filename = f"agent_state_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
    
    with open(filename, 'w', encoding='utf-8') as f:
        json.dump(state, f, ensure_ascii=False, indent=2)
    
    return filename

def load_state(filename: str) -> AgentState:
    """从文件加载状态"""
    with open(filename, 'r', encoding='utf-8') as f:
        state = json.load(f)
    
    # 确保类型正确
    return AgentState(**state)
3.3.3 异常处理与重试机制
def robust_tool_invoke(tool, args, max_retries=3):
    """带重试机制的工具调用"""
    for attempt in range(max_retries):
        try:
            return tool.invoke(args)
        except Exception as e:
            if attempt == max_retries - 1:
                raise e
            print(f"工具调用失败,重试 {attempt + 1}/{max_retries}")
            time.sleep(1)  # 简单的退避策略

四、实战案例:智能数据分析Agent

4.1 需求分析

业务场景: 企业数据分析智能体,能够自动完成数据获取、清洗、分析和报告生成。

核心功能:

  1. 接收用户的数据分析需求

  2. 自动搜索相关数据源

  3. 数据清洗和预处理

  4. 执行统计分析

  5. 生成可视化报告

  6. 提供自然语言解释

4.2 系统设计

class DataAnalysisState(TypedDict):
    """数据分析Agent状态"""
    user_request: str
    data_sources: List[str]
    raw_data: Dict[str, Any]
    cleaned_data: Dict[str, Any]
    analysis_results: Dict[str, Any]
    visualization: str
    final_report: str
    status: str

4.3 核心实现代码

# 1. 需求理解节点
def understand_requirement(state: DataAnalysisState) -> DataAnalysisState:
    """理解用户需求"""
    prompt = f"""
    分析用户的数据分析需求:
    {state['user_request']}
    
    请识别:
    1. 分析主题
    2. 需要的数据类型
    3. 分析方法建议
    4. 预期输出格式
    """
    
    understanding = llm.invoke(prompt).content
    
    return {
        **state,
        'requirement_analysis': understanding,
        'status': 'requirement_understood'
    }

# 2. 数据搜索节点
def search_data(state: DataAnalysisState) -> DataAnalysisState:
    """搜索相关数据"""
    prompt = f"""
    基于需求分析,生成数据搜索查询:
    {state['requirement_analysis']}
    
    请生成3-5个具体的搜索关键词或数据源。
    """
    
    search_queries = llm.invoke(prompt).content.split('\n')
    search_queries = [q.strip() for q in search_queries if q.strip()]
    
    # 模拟数据搜索
    data_sources = []
    for query in search_queries[:3]:  # 限制搜索次数
        data = search_tool.invoke(query)
        data_sources.append({
            'query': query,
            'data': data[:200] + '...'  # 简化显示
        })
    
    return {
        **state,
        'data_sources': data_sources,
        'status': 'data_searched'
    }

# 3. 数据分析节点
def analyze_data(state: DataAnalysisState) -> DataAnalysisState:
    """执行数据分析"""
    prompt = f"""
    基于搜索到的数据,执行分析:
    {state['data_sources']}
    
    请完成:
    1. 数据清洗和预处理
    2. 关键指标计算
    3. 趋势分析
    4. 结论和建议
    """
    
    analysis = llm.invoke(prompt).content
    
    return {
        **state,
        'analysis_results': analysis,
        'status': 'data_analyzed'
    }

# 4. 报告生成节点
def generate_report(state: DataAnalysisState) -> DataAnalysisState:
    """生成最终报告"""
    prompt = f"""
    基于分析结果,生成专业的数据分析报告:
    {state['analysis_results']}
    
    报告格式要求:
    1. 标题和摘要
    2. 数据来源说明
    3. 详细分析过程
    4. 关键发现
    5. 建议和展望
    """
    
    report = llm.invoke(prompt).content
    
    return {
        **state,
        'final_report': report,
        'status': 'report_generated'
    }

# 组装数据分析工作流
data_workflow = StateGraph(DataAnalysisState)

# 添加节点
data_workflow.add_node("understand", understand_requirement)
data_workflow.add_node("search", search_data)
data_workflow.add_node("analyze", analyze_data)
data_workflow.add_node("report", generate_report)

# 设置流程
data_workflow.set_entry_point("understand")
data_workflow.add_edge("understand", "search")
data_workflow.add_edge("search", "analyze")
data_workflow.add_edge("analyze", "report")
data_workflow.add_edge("report", END)

# 编译工作流
data_agent = data_workflow.compile()

4.4 执行与测试

# 测试数据分析Agent
test_request = """
分析2025年第三季度中国新能源汽车市场的发展趋势,
包括销量增长、主要厂商表现、技术创新和政策影响。
"""

# 执行Agent
result = data_agent.invoke({
    'user_request': test_request,
    'data_sources': [],
    'raw_data': {},
    'cleaned_data': {},
    'analysis_results': {},
    'visualization': '',
    'final_report': '',
    'status': 'initialized'
})

# 输出结果
print("=" * 80)
print("数据分析报告")
print("=" * 80)
print(result['final_report'])

总结

9.1 核心要点回顾

AI Agent架构:决策层、执行层、交互层的三层架构模型

9.2 未来展望

随着大模型技术的不断发展和应用场景的持续拓展,AI Agent将在以下方面实现重大突破:

  1. 认知能力:从工具调用向真正的理解和推理演进

  2. 自主决策:具备更强的自主决策和规划能力

  3. 人机协作:与人类实现更自然、更高效的协作

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐