1. 项目概述:当AI Agent成为新常态,基础设施的范式转移

最近和几个做AI应用的朋友聊天,发现一个挺有意思的现象。大家聊起技术栈,不再是“我用Django,他用Spring Boot”,而是“我的Agent用LangChain,他的用AutoGen,最近在试Claude Code”。这背后反映的,是一个正在发生的深刻变化:我们构建软件的核心单元,正在从传统的“服务”或“函数”,转向一个更智能、更自主的实体—— AI Agent

这个转变,对技术基础设施(Infra)提出了全新的拷问。过去,我们为Web服务建Infra,核心是处理HTTP请求、管理数据库连接、保障服务高可用。但现在,如果你的核心业务逻辑是一个能自主调用工具、理解上下文、甚至能自我规划的Agent,你为它搭建的Infra,还是原来那一套吗?你的监控看板,还能看清Agent的“思考”链路吗?你的部署流水线,能处理Agent复杂的依赖(比如特定的Python包、模型权重文件)吗?你的成本核算,能精确到每个Agent会话消耗的Token和API调用吗?

“Agent时代,你的Infra为谁而建?” 这个问题,本质上是在问:当开发范式从“确定性指令执行”转向“非确定性智能体协作”时,支撑这一切的底层技术设施,需要进行哪些根本性的重构?这不仅仅是把大模型API封装一下那么简单,它涉及到开发、调试、部署、运维、成本、安全等全链路的革新。今天,我就结合自己最近在Agent项目上的实践,以及观察到的行业趋势,来拆解一下Agent时代的基础设施到底应该长什么样,以及我们该如何着手构建它。

2. Agent Infra的核心需求与设计原则解析

要构建适合Agent的Infra,首先得理解Agent和传统服务到底有什么不同。传统微服务像一个听话的工人,你给一个明确的指令(API请求),它执行固定的逻辑,返回确定的结果。而Agent更像一个拥有专业知识和工具包的顾问,你给它一个目标(比如“分析这份财报”),它会自己拆解步骤、选择工具(搜索、计算、画图)、与环境交互,最终给你一个分析报告。这个过程充满了非确定性。

基于这种差异,Agent Infra的设计需要遵循几个核心原则:

2.1 以“会话”和“工作流”为中心,而非“请求/响应”

传统Infra的度量单位是QPS(每秒查询数)和P99延迟。但对于Agent,一次用户交互可能是一个长达数分钟甚至更久的“会话”(Session)。这个会话内包含多轮与大模型的对话、多次工具调用、可能的状态分支。因此,Infra需要能追踪整个会话的完整生命周期,包括:

  • 会话状态持久化 :Agent的“记忆”(对话历史、中间结果)需要被妥善保存,以支持长上下文和会话恢复。
  • 工作流可视化与调试 :你需要能清晰地看到,在这个会话里,Agent先调用了搜索API,然后进行了数据提取,最后生成了图表。当结果不符合预期时,你能回溯到具体哪一步出了问题。
  • 成本归属 :这次会话总共消耗了多少Token、调用了多少次付费API,成本需要能精确归属到这个会话或用户。

注意:很多团队一开始会用简单的日志来追踪,但很快会发现日志散落各处,关联困难。一个专门用于追踪Agent思维链(Chain-of-Thought)和工具调用链的“可观测性”层,是Agent Infra的必需品,而不是奢侈品。

2.2 拥抱异构与动态的工具生态

Agent的核心能力之一是使用工具(Tools)。这个工具生态是高度异构和动态的:

  • 类型多样 :从简单的计算器、时间查询,到复杂的数据库查询(SQL)、代码执行(Python REPL)、浏览器自动化(Playwright)、专业软件操作(如Figma插件)。
  • 协议新兴 :除了自定义的API, MCP 正在成为一个重要的工具协议标准。MCP允许工具以标准化的方式向AI模型(如Claude Code)声明自己的能力,模型可以动态发现并使用它们。
  • 动态注册 :新的工具可能随时被开发出来并注入到Agent系统中。

因此,Agent Infra必须提供一个灵活、安全、可扩展的 工具运行时 。它需要:

  1. 统一的工具抽象层 :无论底层工具是HTTP API、本地函数、还是MCP Server,对Agent而言,调用方式应该尽可能一致。
  2. 安全的沙箱环境 :对于执行代码、访问数据库这类高风险工具,必须有严格的权限控制和资源隔离,防止Agent“胡作非为”。
  3. 工具的热发现与热加载 :在不重启Agent服务的情况下,能够新增或更新工具定义。

2.3 应对非确定性,强化管控与护栏

Agent的“智能”也带来了“不可控”。你无法百分百预测Agent在复杂场景下会做出什么决策。因此,Infra必须内置强大的管控和护栏(Guardrails)机制:

  • 输入/输出过滤与校验 :检查用户输入是否包含敏感信息,审查Agent的输出是否合规、无偏见。
  • 流程约束 :可以定义“在调用支付工具前,必须经过人工审核步骤”这样的规则。
  • 熔断与降级 :当Agent陷入循环或调用成本过高时,能自动中断会话或切换到更简单的模式。
  • 版本管理与回滚 :Agent的行为严重依赖提示词(Prompt)和模型版本。Infra需要像管理代码一样管理Prompt的版本,并能快速回滚到稳定版本。

3. 核心组件拆解:构建现代Agent Infra的技术栈

理解了设计原则,我们来看看一个完整的Agent Infra应该包含哪些核心组件。我将其分为四层: 编排与执行层 工具与扩展层 可观测性与管控层 资源与部署层

3.1 编排与执行层:Agent的大脑与调度中心

这是Agent Infra最核心的部分,负责定义Agent的行为逻辑并驱动其执行。目前主要有两种范式:

1. 基于框架的编排: 这是目前的主流方式,使用像LangChain、LlamaIndex、AutoGen、LangGraph这样的框架。它们提供了高级抽象,让你用代码定义Agent的工作流。

  • LangChain/LangGraph :提供了 AgentExecutor StateGraph 等概念,非常适合构建复杂的、有状态的、多Agent协作的工作流。你可以清晰地定义不同节点(Agent或工具)之间的流转逻辑。
  • AutoGen :专注于多Agent对话与协作,通过定义不同的角色(如 AssistantAgent , UserProxyAgent ),模拟一个团队解决问题。
  • 实践选择 :对于业务逻辑复杂、需要严格状态控制的场景,我倾向于使用 LangGraph 。它的图(Graph)模型非常直观,调试起来相对容易。对于以对话和讨论为主的场景, AutoGen 更合适。

2. 基于“AI原生”环境的执行: Claude Code 为代表。它不是一个传统意义上的框架,而是一个深度集成在IDE(如VS Code)中的AI编码环境。在Claude Code中,你通过自然语言或简单的配置来赋予AI技能(Skills),这些技能背后可能就是一个个工具或工作流。它的特点是 极度贴近开发环境,交互自然

  • Claude Code与MCP的集成 :这是其强大之处。你可以轻松配置各种 MCP Server (如连接数据库的 sqlite-mcp 、进行网页抓取的 playwright-mcp 、搜索的 tavily-mcp )。配置好后,Claude(AI模型)就能直接使用这些工具,无需你编写粘合代码。
  • 适用场景 :非常适合 快速原型验证 辅助复杂开发任务 、以及作为 高级AI助手 来使用。对于需要7x24小时运行的线上服务型Agent,可能还需要将其工作流“编译”或迁移到更传统的服务器端框架中。

实操心得:不要陷入“框架战争”。早期探索和内部工具开发,用Claude Code搭配MCP,效率极高。当需要构建稳定、可运维的线上服务时,再基于LangGraph等框架进行工程化实现。两者可以互补。

3.2 工具与扩展层:Agent的双手

这一层决定了Agent的能力边界。关键在于实现工具的“即插即用”和“安全可控”。

1. 工具网关与协议适配器: 你需要一个中心化的组件来管理所有工具。这个组件负责:

  • 协议转换 :将内部统一的工具调用格式,转换为目标工具所需的协议(HTTP/gRPC/命令行/MCP等)。
  • 认证与鉴权 :管理调用第三方API所需的密钥(如OpenAI API Key、SerpAPI Key),避免在Agent代码中硬编码。
  • 负载均衡与熔断 :对于调用频繁的公共服务(如搜索API),需要做负载均衡和失败重试。
  • MCP Server集成 :这是当前的热点。你需要一个MCP主机(Host)来加载和管理多个MCP Server。例如,你可以运行一个 brave-search-mcp 来提供搜索能力,一个 filesystem-mcp 来让Agent安全地读写指定目录的文件。

2. 工具开发与注册:

  • 自定义工具 :使用框架(如LangChain的 @tool 装饰器)快速将Python函数封装成工具。重点是写好工具的描述(Description),这直接影响了LLM是否以及如何调用它。
  • MCP Server开发 :如果你有独特的内部系统需要对接,可以考虑开发自己的MCP Server。MCP协议基于JSON-RPC,定义清晰,有现成的SDK(如 @modelcontextprotocol/sdk for JS/TS),开发难度并不高。
  • 工具注册表 :维护一个所有可用工具的注册表,包含工具的名称、描述、参数schema、安全等级等信息。Agent在初始化时,可以动态地从注册表加载所需工具。

3.3 可观测性与管控层:Agent的仪表盘与安全带

这是保障Agent系统稳定、可靠、合规运行的关键。传统APM(应用性能监控)工具对Agent的观测粒度太粗了。

1. 思维链(CoT)追踪与日志: 你需要记录下完整的“AI思考过程”。这包括:

  • 每一轮用户输入和模型原始输出。
  • 模型每一次触发“工具调用”的决策过程(即ReAct模式中的 Thought 部分)。
  • 工具调用的输入参数、执行结果、耗时。
  • 最终返回给用户的结果。 推荐使用像 LangSmith Arize AI Weights & Biates 这类专门为LLM应用设计的平台。它们能可视化整个工作流,方便你调试Prompt、分析工具使用频率、定位问题。

2. 成本监控与优化: Agent的成本模型复杂,主要来自:

  • Token消耗 :输入和输出的Token数。不同模型(如 gpt-4o vs gpt-3.5-turbo )价格差异巨大。
  • 工具调用成本 :调用的外部API可能按次收费(如搜索、图像生成)。
  • 基础设施成本 :运行Agent服务本身的服务器/容器成本。 Infra需要提供实时的成本仪表盘,并能设置预算告警。一个常见的优化策略是 让Agent在尝试复杂工具链之前,先用一个快速但能力稍弱的模型(如 gpt-3.5-turbo )进行意图识别和路由 ,判断是否需要启动“重型”工作流。

3. 护栏(Guardrails)系统: 这是一个主动防御系统,用于约束Agent行为。

  • 内容安全过滤器 :在输入和输出端,检查是否有违规、敏感内容。可以使用关键词过滤、正则表达式,或调用另一个专门的审核模型。
  • 流程合规检查器 :例如,在金融场景,确保涉及转账的Agent操作必须经过特定的审批流程节点。
  • 输出结构化验证 :强制要求Agent的输出必须符合某个JSON Schema,确保下游系统能正确解析。 Pydantic 库在这方面非常好用。

3.4 资源与部署层:Agent的躯干

Agent最终需要跑在稳定的基础设施上。

1. 模型部署与路由:

  • 自研模型 vs. 云API :大多数团队从云API(如OpenAI、Anthropic、DeepSeek)开始。Infra需要封装统一的模型调用客户端,方便切换和降级。
  • 模型路由与负载均衡 :当有多个模型可用时(例如,一个主用 gpt-4 ,一个备用的 claude-3-haiku ),需要智能路由策略,基于成本、延迟、当前负载进行选择。
  • 上下文长度管理 :这是个大坑。不同模型有最大上下文长度限制(如32K、128K、1M Tokens)。Infra需要自动管理会话历史,当接近限制时,通过智能摘要(Summarization)或滑动窗口(Sliding Window)等方式压缩历史,避免出现 API error: 400 this model's maximum context length is ... 这类错误。

2. 计算与部署环境:

  • 无服务器(Serverless)优先 :Agent的工作负载往往是突发、间歇性的。使用AWS Lambda、Google Cloud Functions、Vercel等Serverless平台,可以很好地匹配这种模式,按实际执行时间计费,成本效益高。
  • 容器化与编排 :对于需要常驻内存、状态复杂的长会话Agent,可能需要部署在Kubernetes中。需要特别注意容器内Python环境的管理、依赖包的安装(尤其是那些带有C扩展的包,如 numpy , pandas )。
  • GPU资源管理 :如果部署自研的轻量级模型(如通过Ollama),则需要管理GPU资源。可以考虑使用像 runai k8s-device-plugin 这样的工具在K8s中调度GPU。

4. 实战:从零搭建一个简易Agent Infra原型

理论说了这么多,我们动手搭一个最简单的原型,把关键环节串起来。我们的目标是:构建一个能联网搜索并总结的Agent,并为其配备基础的观测能力。

4.1 环境准备与核心框架选择

我们选择 LangChain 作为编排框架,因为它生态丰富,文档齐全。同时,我们会使用 LangSmith 进行观测(它提供免费的额度)。

# 创建项目并安装核心依赖
mkdir agent-infra-demo && cd agent-infra-demo
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

pip install langchain langchain-openai langchain-community langsmith
pip install duckduckgo-search  # 一个免费的搜索工具

接下来,去 LangSmith官网 注册账号,创建一个API Key。然后在环境中配置:

export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_ENDPOINT="https://api.smith.langchain.com"
export LANGCHAIN_API_KEY="你的-api-key"
export OPENAI_API_KEY="你的-openai-key"

4.2 构建工具与Agent

我们创建一个 agent.py 文件:

import os
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_community.tools import DuckDuckGoSearchRun
from langchain.memory import ConversationBufferMemory

# 1. 初始化模型和工具
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 先用成本较低的模型
search_tool = DuckDuckGoSearchRun(name="web_search", description="使用此工具在互联网上搜索最新信息。")

tools = [search_tool]

# 2. 设计Prompt模板,明确告诉Agent它的角色和能力
prompt = ChatPromptTemplate.from_messages([
    ("system", """你是一个有用的助手,可以访问网络搜索来获取最新信息。
    请遵循以下规则:
    1. 如果用户的问题涉及实时信息、新闻或你不知道的具体数据,请先使用搜索工具。
    2. 基于搜索结果进行总结和回答,必要时引用来源。
    3. 保持回答简洁、准确。"""),
    MessagesPlaceholder(variable_name="chat_history"), # 预留位置给历史消息
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad"), # 预留位置给Agent的思考过程
])

# 3. 创建记忆,让Agent能记住对话上下文
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

# 4. 组装Agent
agent = create_openai_tools_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, memory=memory, verbose=True)

# 5. 运行测试
if __name__ == "__main__":
    while True:
        try:
            user_input = input("\nYou: ")
            if user_input.lower() in ['quit', 'exit']:
                break
            response = agent_executor.invoke({"input": user_input})
            print(f"\nAssistant: {response['output']}")
        except Exception as e:
            print(f"出错: {e}")

运行这个脚本,问它“今天北京天气怎么样?”。你会看到控制台输出详细的 verbose 日志,包括Agent决定调用搜索工具、搜索的关键词、搜索结果、以及最终的回答。同时,所有这一切都会被自动记录到你的LangSmith项目中。

4.3 接入观测平台(LangSmith)

上述代码已经通过环境变量配置好了LangSmith。运行几次对话后,登录LangSmith控制台,你应该能看到一个“Traces”列表。点开任意一个Trace,你可以看到完整的可视化工作流:

  • 绿色的“ChatOpenAI”节点代表LLM的思考。
  • 蓝色的“DuckDuckGoSearchRun”节点代表工具调用,点开可以看到输入(搜索词)和输出(搜索结果)。
  • 整个链路的耗时、Token消耗一目了然。

这就是最基础的可观测性。你可以在这里分析:Agent是否频繁调用搜索?搜索词是否准确?回答是否基于搜索结果?

4.4 添加基础护栏(Guardrail)

我们添加一个简单的输入检查,防止用户询问不适当的问题。创建一个 guardrails.py

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

def input_safety_check(user_input: str) -> bool:
    """
    简单的基于关键词的输入安全检查。
    在实际项目中,应使用更复杂的模型或专用服务。
    """
    unsafe_keywords = ["如何制造", "违禁品", "仇恨言论"] # 示例关键词
    for keyword in unsafe_keywords:
        if keyword in user_input:
            return False
    return True

def content_moderation_chain():
    """一个使用LLM进行更细致内容审核的链(示例)"""
    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
    prompt = ChatPromptTemplate.from_messages([
        ("system", "请判断以下用户输入是否安全、合法、符合道德。只回答‘安全’或‘不安全’。"),
        ("human", "{input}"),
    ])
    return prompt | llm | StrOutputParser()

# 在主程序中集成
if __name__ == "__main__":
    from agent import agent_executor # 假设主程序整合
    user_input = input("You: ")
    
    # 方法1:快速关键词过滤
    if not input_safety_check(user_input):
        print("Assistant: 您的问题涉及不安全内容,我无法回答。")
        exit()
    
    # 方法2:使用LLM进行审核(更灵活但成本更高)
    # moderator = content_moderation_chain()
    # result = moderator.invoke({"input": user_input})
    # if "不安全" in result:
    #     print("Assistant: 您的问题可能涉及不安全内容,我无法回答。")
    #     exit()
    
    # 通过检查,执行Agent
    response = agent_executor.invoke({"input": user_input})
    print(f"Assistant: {response['output']}")

这个简单的例子展示了Agent Infra的几个核心部分是如何协同工作的:框架负责编排、工具提供能力、观测平台记录一切、护栏保障安全。

5. 进阶挑战与深度优化策略

当你的Agent从原型走向生产,会遇到更多深水区问题。这里分享几个关键挑战和应对思路。

5.1 长上下文管理与优化策略

随着会话进行,历史记录会越来越长。直接塞给模型会导致:

  1. 成本飙升(Token费钱)。
  2. 可能超过模型上下文窗口(如 API error: 400 this model‘s maximum context length is 1048576 tokens )。
  3. 模型性能下降,无关历史干扰当前决策。

解决方案:

  • 自动摘要(Summarization) :定期(如每10轮对话)或用另一个小模型,将之前的对话历史总结成一段精简的文字,替换掉原始冗长的历史。LangChain提供了 ConversationSummaryBufferMemory 等内存类来实现。
  • 向量检索记忆(VectorStore-Backed Memory) :将历史对话切片存储到向量数据库(如Chroma、Pinecone)。当需要回忆时,只检索与当前问题最相关的历史片段。这模拟了人类的“选择性记忆”,非常有效。
  • 结构化记忆 :不是存储原始对话文本,而是将对话中提取的关键实体、事实、用户偏好以结构化的方式(如JSON)存储和更新。这需要更复杂的设计,但对复杂Agent至关重要。

5.2 复杂工作流的稳定性保障

Agent的“非确定性”在复杂多步工作流中会被放大,容易“跑偏”或陷入死循环。

应对策略:

  • 采用有状态图(StateGraph) :使用LangGraph等框架,将工作流明确定义为一个图(Graph),每个节点是确定性的步骤(调用工具或LLM),边是流转条件。这大大增强了可控性和可调试性。
  • 设置超时与最大步数限制 :在 AgentExecutor 中务必设置 max_iterations (如15步)和 max_execution_time 。防止一个简单问题触发无限循环。
  • 人工介入(Human-in-the-Loop) :在关键决策点(如确认执行删除操作、进行大额支付)设置“人工审核节点”。Agent执行到此处会暂停,等待人工批准后再继续。

5.3 成本控制与性能权衡

Agent应用的成本可能是个无底洞。需要精细化运营。

成本控制手段:

  • 模型分级调用 :构建一个模型路由层。对于简单的意图识别、分类任务,使用便宜的模型(如 gpt-3.5-turbo , claude-3-haiku )。只有需要深度推理、创造时,才调用 gpt-4o claude-3-opus
  • 缓存(Caching) :对重复或相似的查询结果进行缓存。例如,用户问“北京的面积”,答案短期内不会变,可以直接返回缓存。LangChain集成了 InMemoryCache RedisCache 等。
  • Token使用分析 :利用LangSmith等工具,定期分析哪些工作流、哪些用户的对话消耗Token最多,优化对应的Prompt或流程。

性能优化:

  • 流式响应(Streaming) :对于生成时间较长的回答,采用流式输出,让用户先看到部分结果,提升体验。
  • 异步执行 :如果Agent需要并行调用多个独立工具(如同时查询天气和新闻),使用异步框架(如 asyncio )可以大幅缩短总耗时。

5.4 安全与权限的纵深防御

Agent能调用工具,意味着它拥有了执行能力,安全是重中之重。

安全架构建议:

  1. 工具权限最小化 :每个工具都应定义明确的权限范围。例如,一个“文件读取”工具只能访问 /var/data/input/ 目录,绝不能访问 /etc/passwd
  2. 用户级隔离 :不同用户的Agent会话必须在运行时环境(如容器、进程)或数据访问层面进行隔离,防止数据泄露。
  3. 审计日志 :所有工具调用,无论成功失败,都必须记录详尽的审计日志,包括调用者、参数、时间、结果,并永久存储,以备溯源。
  4. 沙箱化工具执行 :对于执行任意代码( Python REPL )这类极高风险工具,必须在严格的沙箱环境(如 gVisor , Firecracker 微虚拟机)中运行,限制其网络、文件系统访问。

6. 未来展望:Agent Infra的演进方向

Agent技术还在飞速演进,其基础设施也必然随之变化。我认为以下几个方向值得关注:

1. 标准化与互操作性: MCP 的出现是一个重要信号。未来可能会有更多类似的标准,来定义Agent与工具、Agent与Agent、甚至Agent与人的交互协议。一个统一的“工具描述语言”和“发现协议”,将让Agent的能力组合像乐高积木一样灵活。你的Infra需要为拥抱这些标准做好准备。

2. Infra的“AI原生”重构: 未来的Infra组件本身可能会由AI驱动。例如:

  • AI驱动的运维(AIOps) :不是由人设置告警阈值,而是由AI分析历史指标,自动预测容量瓶颈、定位异常根因。
  • 智能资源调度 :调度器能理解不同Agent工作负载的特性(计算密集型、IO密集型、对延迟敏感等),并像“老司机”一样将其调度到最合适的节点上。
  • 自愈系统 :当Agent因某个外部API失效而卡住时,Infra能自动发现备用工具或降级方案,实现工作流的自愈。

3. 从“编码”到“编排”的开发者体验升级: 随着 Claude Code 这类AI原生开发环境的成熟,构建Agent的体验会越来越接近“自然语言编程”或“可视化编排”。开发者可能更多的是在定义目标、约束和审核节点,而具体的步骤逻辑由AI辅助生成。Infra需要提供对应的“低代码/无代码”界面和强大的版本管理、测试框架。

4. 多模态与具身智能的支撑: 当Agent从处理文本,扩展到理解图像、语音,甚至控制物理设备(机器人)时,Infra需要集成强大的多模态模型,并提供低延迟、高带宽的实时数据流处理能力。这对网络、边缘计算都提出了新挑战。

回到最初的问题:“Agent时代,你的Infra为谁而建?” 答案已经清晰:它是为 那个拥有自主性、会思考、会使用工具、在非确定性中探索目标的智能体 而建的。它不再是一个被动的资源提供者,而是一个主动的 能力增强平台 安全监护平台 。它的核心使命是: 最大化Agent的创造力,同时最小化其不可控风险

构建这样的Infra绝非一日之功,但可以从一个小原型开始,从一个具体的业务场景切入,逐步迭代。最重要的是,要时刻保持对Agent独特工作方式的理解,用适合它的方式来设计和构建支撑它的系统。这场范式转移的浪潮才刚刚开始,现在正是深入思考和实践的最佳时机。

更多推荐