从 LLM 到 Agent:AI 应用架构的演进与实战

0 阅读8分钟

摘要:本文深入探讨了从传统 LLM 应用到 AI Agent 架构的演进路径,分析了 ReAct、CoT、ToT 等推理模式,并结合实际案例分享了 Agent 系统的设计原则与工程实践。适合希望构建生产级 AI 应用的开发者阅读。


引言:为什么我们需要 Agent?

2023 年,大语言模型(LLM)的爆发让无数开发者兴奋不已。然而,随着实践的深入,一个核心问题逐渐浮现:如何让 LLM 从"聊天机器人"进化为真正能解决问题的"智能助手"?

单纯的 Prompt Engineering 很快遇到了瓶颈:

  • 上下文长度限制导致复杂任务难以处理
  • 模型幻觉问题影响输出可靠性
  • 无法与外部系统交互,能力受限
  • 缺乏长期记忆和状态管理能力

Agent 架构的出现,正是为了解决这些问题。

一、Agent 的核心概念与架构

1.1 什么是 AI Agent?

Agent(智能体)是一个能够感知环境、做出决策并执行动作的自主系统。与传统 LLM 应用相比,Agent 具有以下特征:

特性传统 LLM 应用AI Agent
交互方式单次问答多轮对话+工具调用
记忆能力无状态长期记忆+上下文管理
外部能力纯文本生成可调用 API、操作数据库
推理模式直接生成规划-执行-观察循环
自主性被动响应主动决策

1.2 经典 Agent 架构模式

ReAct(Reasoning + Acting)

ReAct 是目前最流行的 Agent 架构之一,由 Google 在 2022 年提出。其核心思想是将**推理(Reasoning)行动(Acting)**交替进行:

Thought: 我需要先搜索相关信息
Action: search[关键词]
Observation: 搜索结果...
Thought: 基于搜索结果,我应该...
Action: calculate[公式]
Observation: 计算结果...
Thought: 现在我可以给出最终答案了
Action: finish[答案]

这种模式的优势在于:

  • 推理过程透明可解释
  • 可以处理需要多步骤的复杂任务
  • 错误可以及时发现和修正

Chain-of-Thought (CoT)

CoT 通过引导模型"一步步思考"来提升推理能力。在 Agent 场景中,CoT 常与工具调用结合:

# 伪代码示例
response = llm.generate("""
问题:计算 2024 年北京到上海的机票平均价格

步骤 1:搜索 2024 年机票价格数据
步骤 2:提取价格信息
步骤 3:计算平均值

请按步骤执行...
""")

Tree-of-Thoughts (ToT)

ToT 是 CoT 的扩展,允许模型在多个可能的推理路径中进行探索,类似于人类的"头脑风暴":

问题:如何优化这个 SQL 查询?

思路 A:添加索引
  - 子思路 A1:在 user_id 上添加索引
  - 子思路 A2:在 created_at 上添加索引
思路 B:重写查询
  - 子思路 B1:使用 JOIN 替代子查询
  - 子思路 B2:添加查询缓存

评估各路径,选择最优方案...

二、Agent 系统的关键组件

2.1 规划(Planning)模块

规划模块负责将复杂任务分解为可执行的子任务。常见实现方式:

任务分解策略:

  • 分解为步骤:将任务拆分为线性步骤序列
  • 分解为子目标:按目标层次组织任务
  • 递归分解:复杂子任务继续分解
class Planner:
    def decompose(self, task: str) -> List[SubTask]:
        # 使用 LLM 进行任务分解
        prompt = f"将以下任务分解为 3-5 个具体步骤:\n{task}"
        steps = self.llm.generate(prompt)
        return self.parse_steps(steps)

2.2 记忆(Memory)模块

记忆是 Agent 的"大脑",分为两类:

短期记忆(Short-term Memory):

  • 当前对话上下文
  • 最近的操作历史
  • 临时计算结果

长期记忆(Long-term Memory):

  • 用户偏好和画像
  • 历史对话摘要
  • 知识库索引

实现方案对比:

方案适用场景优点缺点
向量数据库语义检索支持模糊匹配需要额外基础设施
传统数据库结构化数据事务性强语义检索能力弱
缓存系统高频访问数据速度快容量受限

2.3 工具(Tools)模块

工具调用是 Agent 扩展能力的关键。一个典型的工具定义:

@tool
def search_database(query: str, table: str = "users") -> str:
    """
    在数据库中搜索用户信息
    
    Args:
        query: 搜索关键词
        table: 要搜索的表名
    
    Returns:
        搜索结果 JSON 字符串
    """
    results = db.execute(f"SELECT * FROM {table} WHERE name LIKE '%{query}%'")
    return json.dumps(results)

工具调用的核心挑战:

  1. 参数提取:从自然语言中准确提取工具参数
  2. 错误处理:工具调用失败时的容错机制
  3. 结果解析:将工具输出转化为模型可理解的格式

2.4 执行(Execution)模块

执行模块负责协调各组件,实现 Agent 的主循环:

class Agent:
    def run(self, user_input: str) -> str:
        # 1. 理解用户意图
        intent = self.planner.parse_intent(user_input)
        
        # 2. 检索相关记忆
        context = self.memory.retrieve(user_input)
        
        # 3. 规划执行步骤
        plan = self.planner.create_plan(intent, context)
        
        # 4. 执行步骤循环
        for step in plan.steps:
            if step.requires_tool:
                result = self.tools.execute(step.tool_call)
                self.memory.add_observation(result)
            else:
                response = self.llm.generate(step.prompt)
                
        # 5. 生成最终回复
        return self.synthesize_response()

三、生产环境实践经验

3.1 性能优化策略

1. 流式响应

Agent 执行可能需要较长时间,流式输出可以提升用户体验:

async def stream_response(agent, user_input):
    async for chunk in agent.run_streaming(user_input):
        yield chunk

2. 并行工具调用

当多个工具调用之间没有依赖关系时,可以并行执行:

# 串行(慢)
result1 = await tool_a.run()
result2 = await tool_b.run()

# 并行(快)
results = await asyncio.gather(
    tool_a.run(),
    tool_b.run()
)

3. 智能重试机制

工具调用失败时,Agent 应该能够自动重试或调整策略:

class RetryStrategy:
    def execute_with_retry(self, tool_call, max_retries=3):
        for attempt in range(max_retries):
            try:
                return tool_call.execute()
            except ToolError as e:
                if attempt == max_retries - 1:
                    raise
                # 让 LLM 分析错误并调整参数
                fixed_call = self.llm.fix_tool_call(tool_call, e)
                tool_call = fixed_call

3.2 可靠性保障

1. 输出验证

对 LLM 输出进行结构化验证:

from pydantic import BaseModel, validator

class AgentOutput(BaseModel):
    action: str
    parameters: dict
    reasoning: str
    
    @validator('action')
    def validate_action(cls, v):
        allowed = ['search', 'calculate', 'finish', 'ask_user']
        if v not in allowed:
            raise ValueError(f'Invalid action: {v}')
        return v

2. 人机协作

对于高风险操作,引入人工确认机制:

def execute_critical_action(action):
    if action.risk_level > 0.7:
        return ask_human_confirmation(action)
    return action.execute()

3. 可观测性

完善的日志和追踪是调试 Agent 的关键:

import structlog

logger = structlog.get_logger()

@trace_agent_execution
async def agent_run(user_input):
    logger.info("agent_execution_started", input=user_input)
    # ... 执行逻辑
    logger.info("agent_execution_completed", output=response)

3.3 成本控制

Agent 系统往往涉及多次 LLM 调用,成本管理至关重要:

策略 1:模型分级

  • 简单任务使用轻量级模型(如 GPT-3.5)
  • 复杂推理才使用大模型(如 GPT-4)

策略 2:缓存机制

  • 缓存常见的工具调用结果
  • 缓存相似问题的推理过程

策略 3:Token 优化

  • 精简 Prompt,移除冗余上下文
  • 使用更高效的对话压缩技术

四、实战案例:智能客服 Agent

下面分享一个我们实际落地的智能客服 Agent 架构:

系统架构

用户输入 → 意图识别 → 知识检索 → 问题分类 → 响应生成
              ↓           ↓           ↓
         [轻量模型]  [向量检索]  [规则引擎]
              ↓           ↓           ↓
         复杂查询? → 是 → 调用工具/API
              ↓
         否 → 直接回复

核心代码示例

class CustomerServiceAgent:
    def __init__(self):
        self.intent_classifier = IntentClassifier()
        self.knowledge_base = VectorStore()
        self.tools = ToolRegistry()
        
    async def handle(self, user_message: str, session_id: str):
        # 加载会话记忆
        memory = await self.load_memory(session_id)
        
        # 意图识别
        intent = await self.intent_classifier.classify(user_message)
        
        # 根据意图路由
        if intent == "order_query":
            return await self.handle_order_query(user_message, memory)
        elif intent == "technical_issue":
            return await self.handle_technical_issue(user_message, memory)
        elif intent == "escalate":
            return await self.escalate_to_human(user_message, memory)
        else:
            # 通用问答
            context = await self.knowledge_base.search(user_message)
            return await self.generate_response(user_message, context, memory)

效果数据

  • 问题解决率:从 45% 提升至 78%
  • 平均响应时间:从 5 分钟降至 30 秒
  • 人工介入率:从 60% 降至 15%
  • 用户满意度:从 3.2 提升至 4.6(满分 5)

五、未来展望

Agent 技术仍在快速发展,值得关注的方向:

1. 多 Agent 协作

未来的复杂任务将由多个专业 Agent 协作完成,类似人类团队的分工合作。

2. 自主学习能力

Agent 能够从交互中学习,不断优化自己的策略和工具使用方式。

3. 标准化协议

如 MCP(Model Context Protocol)等标准化协议的出现,将降低 Agent 开发的门槛。

4. 边缘部署

随着模型效率提升,轻量级 Agent 将能够在边缘设备上运行。

结语

从 LLM 到 Agent,不仅是技术架构的演进,更是 AI 应用范式的转变。Agent 让 AI 从"被动回答"走向"主动解决",从"单轮对话"走向"持续协作"。

对于开发者而言,现在正是学习和实践 Agent 技术的最佳时机。希望本文的分享能够帮助你更好地理解和应用 Agent 架构,构建出真正有价值的 AI 应用。


参考资源:

  • ReAct: Synergizing Reasoning and Acting in Language Models
  • LangChain 官方文档
  • AutoGPT 开源项目
  • OpenAI Function Calling 文档

关于作者: 专注于 AI 应用架构设计与落地,热爱探索大模型技术的工程实践。欢迎在评论区交流讨论!