1. 项目概述:从“玩具”到“工程”的跨越

聊到AI Agent,很多朋友的第一反应可能是“不就是给大模型加个工具调用吗?”。确实,早期的Agent概念演示,往往是一个简单的循环:用户提问 -> 模型思考 -> 调用工具 -> 输出结果。这种模式能快速做出一个“玩具级”的Demo,证明其可行性。但当你真正想把它投入生产环境,去处理复杂的业务流程、应对高并发的用户请求、保证服务的稳定性和可维护性时,你就会发现,那个简单的循环瞬间变得千疮百孔。架构设计,正是为了解决从“玩具”到“可工程化系统”这一核心矛盾而生的。它不再仅仅关注单次对话的逻辑,而是需要统筹考虑系统的整体行为、数据流、状态管理、容错与扩展。

为什么架构如此重要?我打个比方:盖一间狗窝,你可能只需要几块木板和钉子,凭感觉就能搭起来;但你要盖一栋能抗八级地震、容纳上百人办公的摩天大楼,就必须有严谨的蓝图、结构力学计算、管线规划和施工规范。AI Agent系统就是后者。一个缺乏良好架构的Agent,在简单场景下或许能跑,但随着功能增加,它会迅速变得难以理解、难以调试、难以扩展,最终成为一团无人敢动的“祖传代码”。本章的“实战”,就是要带你画出这栋“摩天大楼”的蓝图,并告诉你每一部分为什么要这么设计,以及如何用代码把它搭建起来。

2. 核心架构模式深度解析

市面上关于AI Agent架构的讨论很多,但经过大量项目实践,我认为可以将其核心归纳为三种主流模式,它们各有侧重,适用于不同的场景。理解它们的差异,是做出正确技术选型的第一步。

2.1 模式一:中心化编排模式

这是目前最常见、也最直观的架构模式。你可以把它想象成一个公司的“中央指挥部”。在这个模式中,存在一个核心的“大脑”或“编排器”,它负责接收用户输入,理解意图,然后像项目经理一样,将任务分解、规划步骤,并调度不同的“员工”去执行。这些“员工”就是各种工具、技能或子Agent。

核心组件与数据流:

  1. 入口与路由 :接收用户请求,可能包含简单的意图识别,将请求分发给对应的编排器。
  2. 中央编排器 :这是架构的核心。它通常由一个或多个大模型驱动,负责:
    • 任务规划与分解 :将复杂目标拆解为可执行的子任务序列。
    • 工具选择与调度 :根据当前任务上下文,从工具库中选择最合适的工具并调用。
    • 状态管理 :维护整个对话或任务的生命周期状态,包括历史记录、中间结果等。
    • 流程控制 :决定下一步该做什么(继续调用工具、询问用户、还是结束任务)。
  3. 工具/技能层 :一组封装好的、可执行特定功能的模块。例如:搜索API、数据库查询、代码执行器、数学计算器等。它们接受编排器的指令,执行并返回结果。
  4. 记忆与知识库 :为编排器和工具提供上下文支持。包括短期记忆(对话历史)、长期记忆(向量数据库存储的知识)、以及工作记忆(当前任务链的中间状态)。

适用场景与优势:

  • 场景 :任务目标明确、流程相对固定或可规划的领域。例如:数据分析报告生成、自动化客服工单处理、多步骤信息查询与整合。
  • 优势
    • 逻辑清晰 :控制流集中,易于理解和调试。
    • 强一致性 :中央大脑能全局统筹,确保任务执行不偏离主线。
    • 易于监控 :所有决策和调度都经过编排器,便于记录日志和审计。

实操心得与避坑指南:

注意:编排器的能力瓶颈就是整个系统的瓶颈。如果编排器本身的任务规划或工具选择能力不足,系统性能会大打折扣。在实践中,我们常常需要为编排器设计精妙的提示词工程,甚至采用“反思-修正”循环来提升其规划质量。

一个常见的坑是“工具爆炸”。当工具数量增多时,编排器选择工具的准确率会下降。解决方案是引入“工具路由”或“分层工具库”,先对工具进行粗粒度分类,再进行细粒度选择。

2.2 模式二:去中心化协同模式

这种模式更像一个“扁平化管理的创业团队”。没有唯一的中央大脑,而是由多个具备特定专长的Agent(或称“技能”)通过协作来完成复杂任务。它们之间通过约定的通信协议(如发布/订阅、消息队列、直接调用)进行交互。

核心组件与协作机制:

  1. 专长Agent :每个Agent都是一个独立的、功能聚焦的实体。例如:一个“检索专家”Agent负责从知识库找资料,一个“代码专家”Agent负责编写和检查代码,一个“文案专家”Agent负责润色文本。
  2. 通信总线/协调层 :提供Agent间通信的基础设施。可以是简单的函数调用,也可以是更复杂的消息中间件(如RabbitMQ、Redis Pub/Sub),甚至是基于Actor模型。
  3. 协作协议 :定义Agent之间如何“对话”。例如:一个Agent完成任务后,如何通知下一个Agent?如何传递上下文?错误如何上报?常见的协议有基于目标的(Goal-Based)、基于合约的(Contract Net Protocol)等。
  4. 宏观协调器 :并非必须,但可以存在一个轻量级的协调器,负责触发任务启动、监控整体进度、处理异常冲突,但它不参与具体的任务规划和工具调用。

适用场景与优势:

  • 场景 :任务模块化程度高、领域知识分散、需要高度并行或异步处理的场景。例如:复杂的游戏NPC系统、模拟社会实验、大型软件系统中多个AI辅助模块的协作。
  • 优势
    • 高内聚、低耦合 :每个Agent独立开发、测试和部署,系统模块化程度高。
    • 可扩展性强 :新增一个功能,只需增加一个对应的Agent并接入通信总线。
    • 鲁棒性更好 :单个Agent故障不一定导致整个系统瘫痪。

实操心得与避坑指南:

注意:去中心化架构的最大挑战是“协调成本”。Agent之间如何高效、无歧义地通信是一个难题。设计不好的通信协议会导致消息泛滥、死锁或活锁。

在实践中,我们通常会为消息定义严格的结构化格式(如JSON Schema),并包含消息类型、发送者、接收者、内容、会话ID等元数据。另一个坑是“共识问题”,当多个Agent对同一事实有不同认知时,需要设计冲突解决机制,比如引入一个“仲裁者”Agent或采用投票机制。

2.3 模式三:分层混合模式

这是前两种模式的结合,也是在实际大型项目中最为常见的架构。它采用了“战略-战术-执行”的分层思想,兼顾了集中控制的全局观和分布式执行的灵活性。

典型的三层结构:

  1. 战略层 :由“管理者”Agent或编排器担任。负责接收高层目标,进行顶层的任务分解和资源分配。它关注“做什么”和“谁来做”,而不是“具体怎么做”。
  2. 战术层 :由多个“领域专家”Agent组成。每个专家负责一个子领域(如财务分析、法律条文、UI设计)。它们从战略层接收子任务,并负责在该领域内进行更细致的规划和执行。
  3. 执行层 :由具体的工具、API或原子操作组成。战术层的专家Agent调用这些执行单元来完成最终的动作。

数据流示例 :用户说“帮我分析公司上季度的财报,并写一份投资建议”。战略层将其分解为“财务数据分析”和“报告撰写”两个子任务,分别派发给“财务专家”和“文案专家”。财务专家调用数据查询工具、计算工具生成分析结果;文案专家接收分析结果,调用文本生成工具撰写报告。两者协同完成最终输出。

适用场景与优势:

  • 场景 :超大型、跨领域、流程极其复杂的AI应用。例如:企业级智能决策支持系统、全自动的研发项目管理助手、城市级智慧交通调度中枢。
  • 优势
    • 兼顾灵活与控制 :高层有全局视野,底层有执行效率。
    • 易于管理复杂 :将复杂性隔离在不同的层次中。
    • 复用性高 :战术层的领域专家可以在不同战略任务中被复用。

实操心得与避坑指南:

注意:分层架构的设计难点在于“层间接口”的定义。接口过于宽松,会导致信息丢失;接口过于严格,又会限制灵活性。需要为每一层设计清晰的输入/输出契约。

另一个实践要点是“上下文传递”。如何将战略层的全局上下文有效地、且不产生信息过载地传递给战术层,是一个需要精心设计的问题。我们通常采用“上下文摘要”或“相关性过滤”技术,只传递对下层Agent决策最关键的信息。

3. 架构核心组件设计与实现要点

无论选择哪种模式,一个健壮的AI Agent系统都离不开以下几个核心组件的扎实设计。这部分是“实战”中的重头戏,我会结合代码片段和配置示例来讲解。

3.1 记忆系统的工程化实现

记忆是Agent的“经验”和“知识”。一个只有短期对话记忆的Agent,就像金鱼,无法进行复杂的多轮任务。

1. 记忆的分类与存储策略:

  • 对话历史 :最基础的短期记忆。但全量存储每一轮对话会导致上下文窗口快速耗尽。 策略 :采用滑动窗口,只保留最近N轮;或进行摘要,将长篇历史压缩成一段概要。
  • 实体记忆 :关于用户或世界的关键事实(如用户偏好、项目状态)。 策略 :使用键值数据库存储,便于快速检索和更新。
  • 向量记忆 :用于存储和检索非结构化知识(文档、网页内容)。 策略 :使用向量数据库,将文本嵌入为向量,通过相似度搜索召回相关知识。

2. 实现示例:基于摘要的对话记忆管理

from langchain.schema import BaseMemory
from langchain.llms import OpenAI
import json

class SummarizedConversationMemory(BaseMemory):
    def __init__(self, llm, max_turns=10, summary_interval=5):
        self.llm = llm
        self.max_turns = max_turns  # 原始对话保留轮数
        self.summary_interval = summary_interval  # 每N轮生成一次摘要
        self.raw_history = []  # 原始对话记录
        self.summaries = []  # 历史摘要
        self.current_context = ""  # 当前浓缩后的上下文

    def _generate_summary(self, recent_turns):
        """调用LLM生成对话摘要"""
        prompt = f"""
        请将以下对话内容浓缩成一个简洁的段落摘要,保留关键事实、决策和用户意图。
        对话内容:
        {recent_turns}
        摘要:
        """
        return self.llm(prompt)

    def save_context(self, inputs, outputs):
        user_input = inputs.get("input", "")
        ai_output = outputs.get("output", "")
        self.raw_history.append((user_input, ai_output))

        # 检查是否需要生成摘要
        if len(self.raw_history) % self.summary_interval == 0:
            recent = self.raw_history[-self.summary_interval:]
            recent_text = "\n".join([f"User: {u}\nAI: {a}" for u, a in recent])
            new_summary = self._generate_summary(recent_text)
            self.summaries.append(new_summary)
            # 只保留最新的3个摘要,防止过长
            self.summaries = self.summaries[-3:]

        # 构建当前上下文:最新摘要 + 最近原始对话
        latest_raw = self.raw_history[-self.max_turns:]
        latest_raw_text = "\n".join([f"User: {u}\nAI: {a}" for u, a in latest_raw])
        self.current_context = "\n".join(self.summaries) + "\n最近对话:\n" + latest_raw_text

    def load_memory_variables(self, inputs):
        return {"conversation_context": self.current_context}

避坑技巧 :摘要的生成本身消耗Token和算力,且可能丢失细节。需要根据任务敏感性调整 summary_interval 。对于需要精确引用历史细节的任务(如代码审查),应减少摘要频率或保留更多原始记录。

3.2 工具调用层的可靠性与安全性

工具调用是Agent与外部世界交互的“手”。它的稳定性和安全性直接决定系统的可用性。

1. 工具的动态注册与发现: 不应在代码中硬编码工具列表。理想的方式是有一个“工具注册中心”,支持热插拔。

class ToolRegistry:
    def __init__(self):
        self._tools = {}
        self._tool_descriptions = []

    def register(self, name: str, func: callable, description: str, schema: dict):
        """注册一个工具"""
        self._tools[name] = {
            "func": func,
            "description": description,
            "schema": schema  # 符合OpenAPI格式的参数模式
        }
        self._tool_descriptions.append(f"- {name}: {description}")

    def get_tool(self, name):
        return self._tools.get(name)

    def list_tools_prompt(self):
        """生成供LLM选择工具的描述文本"""
        return "可用工具:\n" + "\n".join(self._tool_descriptions)

# 使用示例
registry = ToolRegistry()
registry.register(
    name="get_weather",
    func=fetch_weather_api,
    description="根据城市名称获取当前天气情况",
    schema={
        "type": "object",
        "properties": {
            "city": {"type": "string", "description": "城市名称,如'北京'"}
        },
        "required": ["city"]
    }
)

2. 参数验证与错误处理: LLM生成的参数可能不符合预期,必须进行严格验证。

import jsonschema
from pydantic import BaseModel, ValidationError

def safe_tool_call(tool_name, arguments, registry):
    tool_info = registry.get_tool(tool_name)
    if not tool_info:
        return {"error": f"工具 '{tool_name}' 未找到"}

    # 1. JSON Schema验证
    try:
        jsonschema.validate(arguments, tool_info["schema"])
    except jsonschema.ValidationError as e:
        return {"error": f"参数验证失败: {e.message}"}

    # 2. (可选) 使用Pydantic进行更丰富的验证和类型转换
    class ToolInput(BaseModel):
        city: str

    try:
        validated_input = ToolInput(**arguments)
    except ValidationError as e:
        return {"error": f"参数解析失败: {e}"}

    # 3. 执行工具,并捕获异常
    try:
        result = tool_info["func"](**validated_input.dict())
        return {"success": True, "result": result}
    except Exception as e:
        # 记录详细日志,但返回给LLM的用户友好信息
        logger.error(f"工具执行失败: {e}", exc_info=True)
        return {"error": f"执行工具时发生错误: {str(e)}"}

3. 安全性考量:

  • 权限控制 :为工具划分权限等级(如读取、写入、执行)。根据用户身份或会话上下文,动态过滤可用的工具列表。
  • 输入净化 :对传入工具的参数进行清洗,防止注入攻击(特别是调用数据库或Shell命令的工具)。
  • 资源隔离与限流 :对耗时或耗资源的工具(如网络请求、大文件处理)进行超时设置和并发限制。

3.3 规划与反思机制的设计

这是让Agent从“机械执行”走向“智能适应”的关键。规划解决“下一步做什么”,反思解决“上一步做得对不对”。

1. 基于链式思考的规划器实现: 规划不一定是复杂的算法,利用LLM的推理能力进行链式思考就非常有效。

class ChainOfThoughtPlanner:
    def __init__(self, llm, tool_registry):
        self.llm = llm
        self.tools = tool_registry

    def plan(self, objective, context):
        prompt = f"""
        你是一个任务规划专家。你的目标:{objective}
        当前已知信息:{context}
        你可以使用的工具:{self.tools.list_tools_prompt()}

        请按步骤规划如何完成这个目标。输出格式必须是严格的JSON:
        {{
            "plan": [
                {{
                    "step": 1,
                    "action": "要执行的动作描述",
                    "tool": "使用的工具名(如无需工具则填null)",
                    "input": {{工具所需的参数}}
                }},
                ...
            ],
            "reasoning": "你的思考过程"
        }}
        """
        response = self.llm(prompt)
        # 这里需要添加健壮的JSON解析和错误处理
        import json
        try:
            plan = json.loads(response)
            return plan
        except json.JSONDecodeError:
            # 如果LLM没有返回合法JSON,可以触发反思或降级处理
            return {"plan": [], "error": "规划解析失败"}

2. 反思循环的集成: 在每一步行动后,让Agent评估结果,决定是继续、重试还是调整计划。

def reflection_cycle(agent, objective, max_cycles=5):
    context = agent.memory.load_context()
    for cycle in range(max_cycles):
        # 1. 规划
        plan = agent.planner.plan(objective, context)
        if plan.get("error"):
            return {"status": "failed", "reason": "规划失败"}

        # 2. 执行第一步
        current_step = plan["plan"][0]  # 简化:每次只执行第一步
        result = agent.execute_step(current_step)

        # 3. 反思
        reflection_prompt = f"""
        目标:{objective}
        执行步骤:{current_step}
        执行结果:{result}
        这个结果是否令人满意?是否朝着目标前进?
        如果失败,原因是什么?下一步应该调整计划还是重试?
        请输出JSON:{{"satisfactory": true/false, "next_action": "continue|retry|replan", "insight": "你的分析"}}
        """
        reflection = agent.llm(reflection_prompt)
        # 解析reflection...

        if reflection["next_action"] == "continue":
            # 更新上下文,继续下一步
            agent.memory.save_context(...)
            # 从plan中移除已完成步骤,继续循环
        elif reflection["next_action"] == "retry":
            # 重试当前步骤,可能调整参数
            continue
        elif reflection["next_action"] == "replan":
            # 重新规划
            break
        else:
            # 完成或失败
            return result
    return {"status": "max_cycles_reached"}

实操心得 :反思本身也有成本。不宜在每一步后都进行深度反思,否则会严重拖慢速度。通常策略是:在关键决策点、检测到错误时、或每隔N步后进行反思。

4. 性能、监控与部署考量

一个设计再精妙的架构,如果性能低下、不可观测、难以部署,也无法投入生产。

4.1 性能优化策略

  1. LLM调用优化

    • 缓存 :对具有确定性的LLM请求(如固定的工具描述生成、常见的规划模板)的结果进行缓存,可以大幅减少Token消耗和延迟。可以使用Redis或内存缓存。
    • 批处理 :将多个独立的、无需上下文关联的LLM调用(如并行校验多个数据项)合并为一个批处理请求,某些云API支持此功能。
    • 上下文压缩 :如前所述,对记忆进行摘要。此外,在发送给LLM的提示词中,移除不必要的空白和冗余描述。
  2. 异步与非阻塞设计 : Agent的步骤中,有些是CPU密集型(本地计算),有些是I/O密集型(网络调用、数据库查询)。使用异步编程可以避免“空等”。

    import asyncio
    async def execute_agent_workflow(agent, task):
        # 并行执行多个不依赖的工具调用
        tool_calls = [
            agent.execute_async(tool1, params1),
            agent.execute_async(tool2, params2),
        ]
        results = await asyncio.gather(*tool_calls, return_exceptions=True)
        # 处理结果,然后进行需要这些结果的下一步
        next_step = await agent.planner.plan_async(...)
        return next_step
    
  3. 流式输出与用户体验 : 对于生成文本等耗时操作,采用流式响应,让用户看到生成过程,而不是长时间等待。

    # 使用支持流式的LLM SDK
    from openai import OpenAI
    client = OpenAI()
    stream = client.chat.completions.create(
        model="gpt-4",
        messages=[...],
        stream=True
    )
    for chunk in stream:
        if chunk.choices[0].delta.content is not None:
            # 将内容片段实时发送给前端
            yield chunk.choices[0].delta.content
    

4.2 可观测性与监控

“黑盒”系统是运维的噩梦。必须为Agent系统注入可观测性。

  1. 结构化日志 : 不要简单打印 print 语句。使用结构化日志库,记录每个关键事件的JSON日志。

    import structlog
    logger = structlog.get_logger()
    
    async def call_tool(self, tool_name, params):
        with logger.bind(tool=tool_name, params=params, session_id=self.session_id):
            logger.info("tool.invocation.started")
            try:
                result = await self._do_call(tool_name, params)
                logger.info("tool.invocation.succeeded", duration_ms=duration)
                return result
            except Exception as e:
                logger.error("tool.invocation.failed", error=str(e))
                raise
    

    这样的日志便于被日志收集系统索引和查询,例如可以快速统计每个工具的调用次数、平均耗时、失败率。

  2. 关键指标监控

    • 业务指标 :任务完成率、平均完成步骤数、用户满意度评分。
    • 性能指标 :LLM调用延迟(P50, P95, P99)、Token消耗速率、工具调用耗时。
    • 质量指标 :规划步骤的合理性(可通过人工抽样或规则评估)、工具调用准确率、反思触发的频率和原因。 使用Prometheus、Datadog等工具收集和展示这些指标。
  3. 追踪与调试 : 为每个用户会话或任务分配唯一的 trace_id ,并在所有组件间传递。这样可以将分散的日志、指标串联起来,重现整个任务的执行路径,对于调试复杂问题至关重要。

4.3 部署模式与基础设施

  1. 无服务器与容器化

    • 轻量级、事件驱动型Agent :适合部署在无服务器平台。每个请求启动一个独立的执行环境,按需付费,无需管理服务器。
    • 长时运行、有状态Agent :需要部署在容器中,使用Kubernetes进行编排和管理。因为这类Agent可能需要维护WebSocket连接、管理内存中的会话状态。
  2. 状态管理 : Agent的记忆和会话状态不能只保存在进程内存中,否则重启或扩缩容会导致状态丢失。必须外部化存储。

    • 方案 :使用Redis或数据库存储会话状态。将会话ID作为Key,序列化的记忆和上下文作为Value。
    • 注意 :序列化/反序列化会有性能开销,需要评估状态大小和访问频率。
  3. 版本管理与回滚 : Agent的提示词、工具集、规划逻辑都可能频繁迭代。必须建立完善的版本控制流程。

    • 提示词、配置与代码一同版本化
    • 采用蓝绿部署或金丝雀发布,逐步将流量切到新版本Agent,并密切监控错误率和业务指标。
    • 具备快速回滚到上一个稳定版本的能力。

5. 从设计到实现:一个简易任务型Agent的完整案例

让我们将上述所有理论付诸实践,构建一个简易的“旅行规划助手”Agent。它采用中心化编排模式,目标是接收用户如“我想下周末去杭州玩,预算3000元”的请求,自动完成信息搜集和行程规划。

5.1 系统组件定义

  1. 工具集

    • search_flights(departure_city, arrival_city, date, budget) : 模拟查询航班。
    • search_hotels(city, check_in_date, check_out_date, budget) : 模拟查询酒店。
    • search_attractions(city, keywords) : 模拟查询旅游景点。
    • calculate_budget(flight_price, hotel_price, days) : 计算每日预算。
    • generate_itinerary(flights, hotels, attractions, budget) : 生成格式化的行程单。
  2. 记忆 :使用我们之前实现的 SummarizedConversationMemory

  3. 编排器 :一个基于LLM的规划器,负责分解任务和调用工具。

5.2 核心工作流实现

class TravelPlanningAgent:
    def __init__(self, llm, memory, tool_registry):
        self.llm = llm
        self.memory = memory
        self.tools = tool_registry
        self.planner = ChainOfThoughtPlanner(llm, tool_registry)

    async def run(self, user_request: str):
        """主执行循环"""
        context = self.memory.load_memory_variables({})
        full_context = f"用户请求:{user_request}\n历史上下文:{context}"

        plan_result = self.planner.plan(objective=user_request, context=full_context)
        if plan_result.get("error"):
            return "抱歉,任务规划失败。"

        itinerary = None
        for step in plan_result["plan"]:
            self.memory.save_context({"step": step["action"]}, {}) # 记录步骤

            if step["tool"] and step["tool"] != "null":
                # 执行工具调用
                tool_result = safe_tool_call(step["tool"], step["input"], self.tools)
                if tool_result.get("error"):
                    # 触发反思:工具调用失败,是否需要调整计划?
                    reflection = self._reflect_on_failure(step, tool_result["error"])
                    if reflection["action"] == "retry":
                        # 简化处理:重试一次
                        tool_result = safe_tool_call(step["tool"], step["input"], self.tools)
                    else:
                        return f"步骤'{step['action']}'执行失败:{tool_result['error']}"
                # 将结果存入上下文,供后续步骤使用
                self.memory.save_context({"tool_result": tool_result}, {})
            else:
                # 非工具步骤,可能是LLM生成文本等
                pass

        # 所有步骤执行完毕,调用生成行程单的工具
        # 这里假设最后一步是generate_itinerary,且所需参数已在前序步骤中准备好
        final_result = safe_tool_call("generate_itinerary", {...}, self.tools)
        return final_result.get("result", "行程规划完成,但生成最终文档时出错。")

    def _reflect_on_failure(self, failed_step, error_msg):
        """简单的失败反思"""
        prompt = f"""
        在执行步骤 `{failed_step['action']}` 时出错:{error_msg}。
        原计划是:{failed_step}。
        你认为应该:
        1. 重试此步骤(可能参数微调)?
        2. 放弃此步骤,继续执行后续计划?
        3. 整个任务失败?
        请只输出数字1、2或3。
        """
        decision = self.llm(prompt).strip()
        if decision == "1":
            return {"action": "retry"}
        elif decision == "2":
            return {"action": "skip"}
        else:
            return {"action": "fail"}

5.3 部署与运行

  1. 封装为Web服务 :使用FastAPI将 TravelPlanningAgent 封装成HTTP端点。
  2. 配置管理 :将LLM API密钥、工具端点URL等敏感信息通过环境变量或配置中心管理。
  3. 添加健康检查与监控 :为API添加 /health 端点,并集成之前提到的结构化日志和指标收集。
  4. 容器化 :编写Dockerfile,构建镜像,推送到镜像仓库。
  5. 部署 :在Kubernetes中创建Deployment和Service,配置资源限制和就绪探针。

通过这个案例,你可以清晰地看到,一个完整的AI Agent系统是如何将架构设计中的各个模块——记忆、规划、工具、反思——有机地组合在一起,并最终通过工程化的手段部署上线的。这其中的每一步,都充满了设计权衡和实战细节,远非一个简单的 if-else 循环所能涵盖。

更多推荐