← 文章 / AI技术
栈帧溢出 2小时前 · 2026-11-07 21:25:38 · 8 阅读

企业级AIAgent工程化实战|承接观测评估治理,搭建可回放生产底座

上一篇《讲透 AI Agent 落地闭环:观测、评估、治理(附生产级代码)》发出来之后,后台收到很多朋友留言:看懂了观测、评估、治理这套 AgentOps 理念,但卡在从 Demo 走向企业规模化落地。

很多团队的现状是:单 Agent 跑通了,一上多任务、多用户、多模型、长期会话就崩。记忆乱了、工具调用不可控、版本没法灰度、成本不可控、出问题很难复现。

所以新开一个长期连载专栏:企业级 AI Agent 工程化实战系列。本篇是系列第二篇,聚焦工程落地链路:编排、记忆持久化、版本灰度、限流熔断、可回放调试,配套可直接改了上测试环境的代码。后续持续更新,会补上多 Agent 协作、MCP 工具接入、评估平台搭建、成本大盘、私有化部署踩坑记录。

大家先理清一个核心认知:Agent 工程化 ≠ 写一个会调用工具的智能体。 Demo 只需要 “单次任务跑成功”;企业级 Agent,追求的是稳定、可迭代、可审计、可灰度、故障可回溯,把不确定的大模型能力,装进可控的工程容器里。


一、先梳理:企业 Agent 工程化完整链路

承接上篇的观测、评估、治理,工程层是承上启下的底座,分成 5 个核心模块:

  1. 会话与状态持久化(记忆层):短记忆、长记忆、向量库检索、会话快照,解决上下文丢失、记忆污染
  2. Agent 编排层:任务拆解、路由、子任务串行 / 并行、失败重试、超时控制
  3. 工具沙箱层:工具鉴权、参数校验、调用限流、沙箱隔离、敏感操作拦截(和上篇治理护栏联动)
  4. 版本与灰度层:Agent 版本管理、提示词版本、模型切换 A/B 实验、流量切分
  5. 埋点与回放层:自动记录每一步输入输出、工具参数、耗时、token,支持任务一键回放(对接上篇观测系统)

很多团队跳过工程底座,直接堆模型、堆提示词,上线后就是无休止的线上事故,评估数据失真,治理规则很难落地。

一句话总结:观测用来发现问题,评估用来衡量好坏,治理用来约束边界;工程化,是让这套闭环能够稳定跑在企业生产里。

二、最小生产底座代码:可持久化、可回放的 Agent 骨架

下面这份代码是轻量化骨架,没有重度依赖框架,适合直接嵌入后端服务;埋点日志结构和上篇观测体系对齐,日志可以直接投递到监控系统做大盘。

import time
import uuid
import json
from dataclasses import dataclass, asdict
from typing import Optional, Dict, Any, List

# -------------------------- 数据结构定义:会话快照、埋点日志 --------------------------
@dataclass
class AgentTrace:
    trace_id: str
    session_id: str
    step_id: str
    step_type: str  # llm_call / tool_call / plan / finish
    input: Dict[str, Any]
    output: Dict[str, Any]
    cost_tokens: int
    latency_ms: int
    timestamp: float
    extra: Optional[Dict] = None

@dataclass
class AgentSession:
    session_id: str
    user_id: str
    agent_version: str
    history: List[Dict]
    long_memory_refs: List[str]
    status: str = "running"

class SimpleAgentStorage:
    """极简存储,生产环境替换为 Redis + MySQL / MongoDB"""
    def __init__(self):
        self.session_map: Dict[str, AgentSession] = {}
        self.trace_list: List[AgentTrace] = []

    def save_session(self, sess: AgentSession):
        self.session_map[sess.session_id] = sess

    def get_session(self, session_id: str) -> Optional[AgentSession]:
        return self.session_map.get(session_id)

    def append_trace(self, trace: AgentTrace):
        self.trace_list.append(trace)
        # 生产:投递日志到 Loki / ClickHouse / 自研观测平台
        # print(json.dumps(asdict(trace), ensure_ascii=False))

# -------------------------- Agent 核心运行时:编排、埋点、快照 --------------------------
class EnterpriseAgent:
    def __init__(self, agent_version: str, storage: SimpleAgentStorage):
        self.agent_version = agent_version
        self.storage = storage
        # 工具注册表,可对接治理规则:黑名单、权限校验
        self.tool_registry = {
            "search": self.mock_search_tool,
            "calculator": self.mock_calc_tool
        }

    def _record_trace(self, trace_id, session_id, step_type, in_data, out_data, token_cost, start_ts):
        trace = AgentTrace(
            trace_id=trace_id,
            session_id=session_id,
            step_id=str(uuid.uuid4()),
            step_type=step_type,
            input=in_data,
            output=out_data,
            cost_tokens=token_cost,
            latency_ms=int((time.time() - start_ts)*1000)
        )
        self.storage.append_trace(trace)

    def mock_llm_plan(self, user_query: str, history: List[Dict]) -> Dict[str, Any]:
        """模拟LLM任务规划,真实场景替换为OpenAI / Gemini / Mistral 调用"""
        return {
            "plan": ["调用search查询资料", "调用calculator汇总数据", "生成最终回答"],
            "need_tools": ["search", "calculator"],
            "reply": ""
        }

    def mock_search_tool(self, params: Dict):
        return {"result": f"【搜索结果】关键词:{params.get('keyword')}"}

    def mock_calc_tool(self, params: Dict):
        a, b = params.get("a"), params.get("b")
        return {"result": a + b}

    def run_task(self, session_id: str, user_id: str, user_input: str) -> Dict[str, Any]:
        trace_id = str(uuid.uuid4())
        start_all = time.time()
        # 加载或者新建会话快照(持久化记忆)
        sess = self.storage.get_session(session_id)
        if not sess:
            sess = AgentSession(
                session_id=session_id,
                user_id=user_id,
                agent_version=self.agent_version,
                history=[],
                long_memory_refs=[]
            )
        sess.history.append({"role":"user", "content":user_input})

        # Step1:任务规划
        t1 = time.time()
        plan_result = self.mock_llm_plan(user_input, sess.history)
        self._record_trace(
            trace_id, session_id, "plan",
            {"query":user_input, "history_len":len(sess.history)},
            plan_result, token_cost=120, start_ts=t1
        )

        # Step2:按计划串行执行工具(编排逻辑,可改成并行、DAG)
        tool_outputs = {}
        for tool_name in plan_result["need_tools"]:
            if tool_name not in self.tool_registry:
                continue
            t_tool = time.time()
            tool_param = {"keyword":user_input} if tool_name == "search" else {"a":10, "b":20}
            tool_ret = self.tool_registry[tool_name](tool_param)
            tool_outputs[tool_name] = tool_ret
            self._record_trace(
                trace_id, session_id, "tool_call",
                {"tool":tool_name, "params":tool_param},
                tool_ret, token_cost=10, start_ts=t_tool
            )

        # Step3:生成最终回复
        final_reply = f"任务执行完成,工具结果:{tool_outputs}"
        sess.history.append({"role":"assistant", "content":final_reply})
        sess.status = "finished"
        self.storage.save_session(sess)

        return {
            "trace_id": trace_id,
            "session_id": session_id,
            "reply": final_reply,
            "agent_version": self.agent_version
        }

# -------------------------- 测试入口 --------------------------
if __name__ == "__main__":
    store = SimpleAgentStorage()
    agent_v1 = EnterpriseAgent(agent_version="v1.0.0", storage=store)
    resp = agent_v1.run_task(
        session_id="sess_001",
        user_id="u_10086",
        user_input="帮我查一下AI Agent工程化资料并做简单计算"
    )
    print(json.dumps(resp, ensure_ascii=False, indent=2))

代码说明(公众号适合加粗重点)

✅ 自带会话快照:任务中断、重启服务之后,同一个 session_id 可以恢复上下文,解决长会话丢失 ✅ 全链路埋点:规划、LLM 调用、工具调用每一步都生成 trace,直接对接上篇的观测平台 ✅ 版本字段埋入每一次会话:方便做 A/B 实验,v1/v2 版本 Agent 流量切分对比评估指标 ✅ 工具统一注册入口:后续在这里接入治理规则,拦截高危工具、校验参数、增加限流熔断 ✅ trace_id 全局唯一:线上出问题,直接拿 trace_id 回放整个 Agent 执行链路,复现比单纯看日志高效很多

⚠️ 提醒:这是教学骨架,生产环境还需要加上:token 限流、模型失败降级、工具超时熔断、向量库长记忆检索、敏感词拦截、权限校验、异步任务队列。这些内容我会放在本系列后续文章里。

三、工程化落地的 3 个高频踩坑(企业真实反馈)

坑 1:把所有上下文全部塞进 Prompt,不做分层记忆

短记忆放在会话 history,长记忆必须抽摘要 + 向量检索。无限堆 history,成本爆炸、模型容易遗忘、输出漂移。

坑 2:Agent 没有版本,提示词一改全量上线

提示词、工具逻辑、系统指令,都要版本化。上新版本先切 5% 流量,用评估数据集自动对比新旧版本指标,指标恶化直接回滚,这就是 A/B 实验,和评估体系强绑定。

坑 3:观测只看最终结果,不看中间步骤

Agent 是多步推理系统,很多错误发生在工具调用参数错误、规划步骤跑偏,最终输出看着没问题,中间逻辑已经错了。所以 trace 必须记录每一步计划、入参、返回值,而不是只存问答对。

四、本系列后续更新预告(持续连载)

这个专栏会长期持续更新,每一篇都附带可运行代码,方向规划如下:

  1. 多 Agent 协作编排、DAG 任务调度、子 Agent 通信机制
  2. MCP 标准化工具接入、工具权限沙箱、第三方 API 调用治理
  3. 自动评估平台搭建:批量跑评测集,自动生成版本对比报告
  4. Token 成本大盘、动态路由:根据任务自动选低成本模型
  5. 私有化部署方案、容器化、异步任务队列、高可用架构
  6. 真实业务案例:内部知识库问答 Agent、数据分析 Agent 落地复盘

如果你想看某个方向优先写,可以在评论区留言。

五、写在最后

Agent 的竞争,早已经不是单纯比拼哪个大模型更聪明。 模型能力是上限,工程化底座、观测评估治理闭环,才决定这个智能体能不能稳定跑在企业业务里,能不能持续迭代、敢放量。

上篇我们搭好了 “体检 + 打分 + 护栏” 体系,本篇补上 Agent 运行底座。后面我们会一点点把整套企业生产方案拼完整。

🔗 回顾上一篇:《讲透 AI Agent 落地闭环:观测、评估、治理(附生产级代码)》 💡 关注本号,持续跟进企业级 Agent 工程化连载,所有配套代码都会同步放出。



#AIAgent #AgentOps #大模型工程化 #企业级 AI #智能体落地 #LangGraph #LLM 实战


原始来源: 栈帧溢出

评论 (0)