Agent Demo 能跑通,为什么上线第一天就翻车?从权限日志到可观测的排查路径

「文智助手」全场景办公AI助理AI+OPC全流程实践方案(大赛作品) 阅读详情

聊《Agentic AI真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。

摘要

摘要:跑通一个 Agent Demo 只需要调通 LLM 和工具调用,但把它变成可维护、可上线的系统,问题往往出在权限边界、任务拆解和可观测性上。本文从一个电商客服 Agent 从 Demo 到上线的真实踩坑过程出发,拆解自主执行系统在工程化阶段的常见失败原因,并给出一套可复用的排查和实现思路。

目录

  • Agentic 的定义:不只是"会调工具"的聊天机器人
  • 自主性边界:一个权限失控的真实案例
  • 任务拆解:从单步调用到多步编排
  • 可观测性:上线后唯一能救你的东西
  • 安全约束:区分三类失败原因
  • 总结:Agent 工程化的取舍边界

Agentic 的定义:不只是"会调工具"的聊天机器人

文章插图 1

很多人对 Agentic AI 的理解还停留在"给模型一个工具列表,让它自己选"。但真正进入工程阶段后会发现,定义 Agentic 的核心不是能力,而是边界。

我带的一个电商客服项目,初期模型能完美回答"订单在哪里",一旦用户追问"能不能直接退款",Agent 就开始在工具间无限循环,甚至尝试调用不存在的 API。问题不在于模型能力,而在于我们当初没有明确定义它的自主性边界。

Agentic 的本质是在约束条件下自主决策并执行。这个定义拆开来看有三个关键点:

  • 约束条件:权限、预算、时间窗口、业务规则
  • 自主决策:任务拆解、工具选择、重试策略
  • 可执行:有明确的成功标准和失败回滚

Demo 阶段我们只做了第二点,忽略了第一和第三点,所以上线第一天就崩了。

自主性边界:一个权限失控的真实案例

文章插图 2

我们当时接入了三个工具:订单查询、退款申请、优惠券发放。Demo 里一切正常,因为测试数据都是边界内的。

上线后第一个用户问了这样一句话:"我上周买的充电宝质量问题,直接退全款,顺便把优惠券也退了。"

Agent 的响应链路是这样的:
1. 调用查询工具,找到订单
2. 尝试直接退款——但退款工具需要工单号
3. 调用优惠券工具,发现该用户没有可用优惠券
4. 模型开始"脑补",生成了一个不存在的工单号
5. 用假工单号调用退款 API,返回 400 错误
6. 模型没有识别错误,继续重试三次

排查过程:

现象:用户投诉退款失败,后台日志显示多次 400 错误。

验证动作:

我先把日志导出,按时间线还原 Agent 的决策路径。发现关键问题:模型在第一次 400 返回后,没有把错误信息反馈给自己,而是继续用同一个假工单号重试。

排除结果:不是工具本身的问题,也不是模型幻觉——是权限配置和错误处理链路缺失。

我们把权限做了分层:


# 工具权限分层配置
TOOL_PERMISSIONS = {
    "query_order": {
        "level": "read",
        "require_auth": False,  # 查询不需要额外授权
        "rate_limit": 100,
    },
    "refund_order": {
        "level": "write",
        "require_auth": True,   # 退款需要用户二次确认
        "rate_limit": 10,
        "pre_check": ["order_exists", "refund_eligible"],
    },
    "coupon_manage": {
        "level": "write",
        "require_auth": True,
        "rate_limit": 5,
        "approval_required": True,  # 优惠券操作需要人工审批
    }
}

这段配置的核心逻辑是:每个工具的调用前都会经过 pre_check 校验,写操作必须经过 require_auth 验证,而高风险操作(如优惠券)需要额外的审批环节。Demo 阶段我们跳过了所有这些检查,上线后补上,问题直接消失了。

优快云资料领取方式

任务拆解:从单步调用到多步编排

Agent 最难的部分不是调用工具,而是把模糊的用户意图拆解成可执行的步骤序列。

我们当时遇到的典型问题是:用户说"查一下我的订单然后退款",模型会把这两个动作当成一个整体,直接生成一个不存在的"一键退款"调用。正确的做法是拆成:查询 → 确认订单状态 → 判断是否符合退款条件 → 发起退款请求。

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

    def decompose(self, user_intent: str) -> list[dict]:
        """将用户意图拆解为可执行的子任务列表"""
        # 第一步:识别用户意图中的关键实体和操作
        intent_parse = self.llm.extract_entities(
            user_intent,
            schema=self.tools.get_entity_schema()
        )

        # 第二步:根据工具依赖关系排序
        task_graph = self._build_dependency_graph(intent_parse)

        # 第三步:生成可执行的步骤序列
        steps = []
        for task in self._topological_sort(task_graph):
            step = {
                "action": task["operation"],
                "params": task["entities"],
                "expected_output": task.get("output_schema"),
                "retry_policy": self._get_retry_config(task),
                "timeout_seconds": task.get("timeout", 30),
            }
            steps.append(step)

        return steps

    def _build_dependency_graph(self, intent: dict) -> dict:
        """构建任务依赖图,识别前置条件"""
        graph = {}
        for op in intent["operations"]:
            deps = self.tools.get_dependencies(op["name"])
            graph[op["id"]] = {
                "operation": op,
                "dependencies": deps,
                "can_parallel": len(deps) == 0
            }
        return graph

    def _get_retry_config(self, task: dict) -> dict:
        """根据操作类型生成重试策略"""
        if task.get("is_write"):
            return {"max_retries": 2, "backoff": "exponential"}
        return {"max_retries": 3, "backoff": "linear"}

代码解释:decompose 方法是整个任务拆解的核心入口。输入是用户的自然语言意图,输出是一个结构化的步骤列表。第一步调用 LLM 提取实体,这里用的是 schema 驱动的方式,让模型只输出我们定义的字段,避免幻觉注入。第二步构建依赖图,通过工具注册表查询每个操作的前置条件,比如退款操作依赖订单查询结果。第三步生成可执行步骤,每个步骤包含参数、预期输出、重试策略和超时时间。

关键点在于依赖图的构建——这是 Demo 阶段我们完全缺失的能力。模型不会自己发现"退款需要先查订单",必须显式配置。

可观测性:上线后唯一能救你的东西

Demo 跑通后,很多人以为可以收工了。但上线第一天,问题就开始涌现。我们当时的 Agent 完全不可观测——不知道它做了什么、为什么这么做、哪里出了问题。

排查过程:

现象:用户反馈退款失败,但后台没有任何错误日志。

验证动作:我们只能从 API 网关的访问日志里反向推断,但 Agent 内部的决策过程完全黑盒。

解决:我们引入了基于 trace 的可观测体系,每个 Agent 的执行步骤都记录完整的输入、输出、工具调用和决策理由。

import uuid
import time
from datetime import datetime

class AgentObserver:
    """Agent 执行过程的可观测性追踪"""

    def __init__(self, storage_backend):
        self.storage = storage_backend
        self.current_trace = None

    def start_trace(self, session_id: str, user_intent: str) -> str:
        """开始一个新的执行追踪"""
        trace_id = str(uuid.uuid4())
        self.current_trace = {
            "trace_id": trace_id,
            "session_id": session_id,
            "start_time": time.time(),
            "intent": user_intent,
            "steps": [],
            "decisions": [],
            "errors": [],
        }
        return trace_id

    def record_step(self, step_index: int, action: str,
                    input_data: dict, output_data: dict,
                    confidence: float = 0.0):
        """记录每一步的执行结果"""
        if not self.current_trace:
            return

        step_record = {
            "index": step_index,
            "action": action,
            "input": self._sanitize(input_data),
            "output": self._sanitize(output_data),
            "timestamp": time.time(),
            "confidence": confidence,
            "duration_ms": self._calc_duration(step_index),
        }
        self.current_trace["steps"].append(step_record)
        self.storage.write_step(step_record)

    def record_decision(self, context: str, choice: str,
                        alternatives: list[str], reason: str):
        """记录关键决策点——这是排查问题的核心"""
        decision_record = {
            "timestamp": time.time(),
            "context": context,
            "choice": choice,
            "alternatives": alternatives,
            "reasoning": reason,
        }
        self.current_trace["decisions"].append(decision_record)
        self.storage.write_decision(decision_record)

    def record_error(self, error_type: str, error_msg: str,
                     recovery_action: str = None):
        """记录错误及恢复动作"""
        error_record = {
            "timestamp": time.time(),
            "type": error_type,
            "message": error_msg,
            "recovery": recovery_action,
        }
        self.current_trace["errors"].append(error_record)
        self.storage.write_error(error_record)

    def finalize_trace(self) -> dict:
        """结束追踪并返回完整报告"""
        if not self.current_trace:
            return {}

        self.current_trace["end_time"] = time.time()
        self.current_trace["total_duration_ms"] = (
            self.current_trace["end_time"] -
            self.current_trace["start_time"]
        ) * 1000

        report = self.storage.save_trace(self.current_trace)
        self.current_trace = None
        return report

这段代码的核心价值在于 record_decision 方法。Demo 阶段我们只记录输入输出,但真正出问题时需要知道模型在某个节点为什么选择 A 而不是 B。有了决策日志,排查时间从几小时缩短到几分钟。

安全约束:区分三类失败原因

上线后最常见的问题是分不清"什么类型的问题"。我们当时把失败原因归为三类:

业务错误:模型理解正确,但业务规则不允许。比如用户要退款超过 30 天的订单,模型知道要退款,但业务规则禁止。这类问题需要完善业务规则配置,而不是换模型。

配置错误:工具权限配置不当、环境变量缺失、API 密钥过期。排查这类问题的关键是看错误信息是否包含明确的配置字段。

环境错误:网络超时、依赖服务不可用、模型 API 限流。这类问题通常有明确的错误码和重试价值。

我们当时踩过的坑:把配置错误当成业务错误排查了两天。一个退款工具调用失败,我们反复调整业务规则,最后发现是 API 密钥在测试环境和生产环境配混了。

class SafetyGuard:
    """Agent 执行的安全约束层"""

    def __init__(self, policy_engine, audit_logger):
        self.policy = policy_engine
        self.audit = audit_logger

    def validate_action(self, action: dict, context: dict) -> dict:
        """执行前的安全校验"""
        violations = []

        # 权限检查
        if not self.policy.check_permission(
            context["user_id"],
            action["tool"],
            action["params"]
        ):
            violations.append({
                "type": "PERMISSION_DENIED",
                "detail": f"User {context['user_id']} cannot access {action['tool']}"
            })

        # 频率限制
        if not self.policy.check_rate_limit(
            context["user_id"],
            action["tool"]
        ):
            violations.append({
                "type": "RATE_LIMIT_EXCEEDED",
                "detail": f"Too many calls to {action['tool']}"
            })

        # 业务规则校验
        business_check = self.policy.check_business_rule(
            action["tool"],
            action["params"],
            context
        )
        if not business_check["allowed"]:
            violations.append({
                "type": "BUSINESS_RULE_VIOLATION",
                "detail": business_check["reason"]
            })

        return {
            "allowed": len(violations) == 0,
            "violations": violations,
            "audit_id": self.audit.log_check(context, action, violations)
        }

    def enforce_guardrail(self, action: dict, result: dict) -> dict:
        """执行后的结果校验"""
        if result.get("status") == "error":
            return self._handle_error(result)

        # 写操作二次确认
        if action.get("is_write") and not result.get("confirmed"):
            return {
                "status": "NEEDS_CONFIRMATION",
                "action": action,
                "result_preview": result.get("preview")
            }

        return result

代码解释:validate_action 在执行前做三重校验——权限、频率、业务规则。任何一个维度不通过都会返回具体的违规类型,这直接对应前面说的三类失败原因。enforce_guardrail 是在执行后做二次校验,特别是写操作必须二次确认,避免模型误操作造成不可逆的损失。

总结:Agent 工程化的取舍边界

从 Demo 到可上线的 Agent,核心差距不在模型能力,而在工程化能力。我们做了三个关键取舍:

取舍一:可观测性 vs 开发效率。引入完整的 trace 和决策日志增加了 30% 的开发工作量,但把排查时间从小时级降到分钟级。这个取舍值得。

取舍二:安全约束 vs 灵活性。严格的权限校验让一些边缘场景无法自动处理,需要人工介入。但上线第一天就避免了可能的资损事故。

取舍三:任务拆解的完备性 vs 响应速度。完整的依赖图构建增加了约 200ms 的延迟。对于客服场景可以接受,但对于实时性要求高的场景需要重新评估。

适用边界:

Agent 系统适合任务路径相对清晰、工具接口稳定、业务规则可量化的场景。不适合目标模糊、工具频繁变更、需要高度创造力的场景。如果你的业务还在 Demo 验证阶段,建议先把可观测性和安全约束搭起来,再追求自主性——否则上线就是灾难。

最后说一句:Agent 能干活的前提,是你能看到它干了什么、为什么这么干、干错了能回滚。这三件事做不到,Demo 再漂亮也只是演示。

资料展示

下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。

AI大模型资料展示 1

AI大模型资料展示 2

AI大模型资料展示 3

AI大模型资料展示 4

如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。

优快云官方大礼包

船载 OpenHarmony AIS 航海工作台:告警与防碰撞预警系统 船载OpenHarmony AIS航海工作台的告警与防碰撞系统,集成十余类告警(超速、偏航、会遇、SOS等),通过网格空间索引实现高效邻近判定,保障实时性。告警管理器统一调度规则、去重、通知与日志,支持悬浮球、语音、跑马灯、弹窗多渠道触达,确保航行安全。SOS紧急通道独立运行,避免干扰。系统设计强调性能优化与多场景适配,为航海安全提供核心支撑。 阅读详情

相关推荐

AI 应用开发:四维架构落地实战——以 HR Agent 为例拆解感知·推理·记忆·执行【意图路由、规划编排、长期记忆、工具执行、面试题】

本文基于四维架构(感知·推理·记忆·执行),以HR Agent为例,系统拆解大模型应用从“聊天”到“生产可用”的落地路径。通过Spring AI实现意图路由、规划编排、RAG检索与工具调用,结合真实踩坑复盘,揭示架构化设计对安全、成本与可维护性的关键价值,为AI Agent工程化提供可复用的实战框架。

王大师企业官方博客 734

从会回答到懂场景:ADP智能体开发引擎如何落地企业级Agent

企业级智能体的价值不在于“会回答”,而在于能否深入业务场景、驱动真实任务闭环。传统RAG模式让模型看似博学,却无法完成查订单、改地址、提交工单等操作,本质上是对话、工具与流程的割裂。要解决这个问题,需要理解智能体开发中的分层设计、任务编排与权限治理等基础原理。ADP智能体开发引擎正是通过场景建模、工具注册、流程编排和治理管控,将Agent从被动应答升级为主动执行者,让AI技术与业务流程深度融合。在售后维修、订单跟踪等高频场景中,企业可借助该引擎快速搭建任务型智能体,实现自动诊断、工单创建与人工审批闭环,真正

weixin_33937913的博客 809

三菱PLC通信库大比拼:手把手教你用C#实现最高效的McProtocol数据读写

本文深入比较了三菱PLC通信库的性能,重点介绍了如何使用C#高效实现McProtocol数据读写。通过实测数据对比HslCommunication、McProtocol-next和自定义方案的优劣,提供优化技巧和代码示例,帮助开发者在工业自动化场景中提升通信效率。

m0n1o2p的博客 258

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 304

科研党必备:5分钟搞定MATLAB闪退问题(含R2020a-R2023b各版本适配)

本文针对科研人员常见的MATLAB闪退问题,提供了从R2020a到R2023b各版本的适配解决方案。通过分析六大诱因和版本定制化修复方法,帮助用户快速诊断和解决闪退问题,包括内存优化、高级调试和预防性维护等实用技巧,确保科研计算的连续性和稳定性。

t1u2v的博客 1968

海康视觉平台VisionMaster使用学习笔记(1)

双击图像源设置图像源的属性,像素格式分为Mono8和RDB24分别对应导入的图像是彩色还是黑白。打开相机驱动软件MVS,对连接的相机进行属性上的配置,先对相机的IP进行对应的设置。将自动触发的使能打开,保存配置好的相机属性,默认保存到用户集1中。点击MVS软件中的触发按钮,查看相机是否进行正常的触发拍照。打开VM软件添加一个图像源,选择图像源选项拖出图像源。回到VM软件中将选择相机选项选择到配置好参数的相机。取图方式也可以调整为相机取图,将图像源改为相机。双击相机进行连接后对相机的属性进行配置。

A567852的博客 1万+

ChatGPT、Perplexity、Gemini 与 AI Overviews 引用对比:谁的引用更可信

AI 引擎的引用机制差异很大:ChatGPT 以行内引用加 Sources 列表呈现来源,Perplexity 几乎逐句可溯源,Gemini 在回答中内嵌相关来源链接,AI Overviews 则把多源聚合答案与来源列表一起放在搜索结果顶部。本文从引用透明度、来源偏好、可干预性 3 个维度对比这 4 个引擎,并给出 GEO 的 3 点启示,帮企业在多引擎环境下提升被引用的概率。

淡然一笑 的专栏 145

量化交易新手入门:从零开始搭建你的第一个Python交易策略(附完整代码)

本文为量化交易新手提供从零开始搭建Python双均线策略的完整指南,涵盖环境配置、数据获取、策略实现及风险管理等关键步骤。通过详细的代码示例和实践建议,帮助读者快速掌握量化交易的核心技术,并避免常见陷阱。文章特别强调Python在量化交易中的技术革新优势,适合希望进入金融科技领域的初学者。

weixin_26905487的博客 444

AI Agent之核心框架

A: 显式 Thought 有三类价值:可解释性(便于人类审计)、可调试性(定位哪一步选错工具)、学习信号(可做监督微调或评估中间步骤质量)。ReAct 把推理与 可执行行动 绑定,每一步行动后都有 真实 Observation 反馈,从而用工具结果约束生成,降低闭卷幻觉。做完不等于结束——还要 评估做得好不好,把 教训 记下来,下次 带着教训重试,反思作为 记忆,影响后续尝试的策略。工作流程:Action → Evaluation → Reflection → Retry。A: 普通 CoT 只在。

剑雨巍巍的博客 237

LED背光驱动电路解析:从MP3394芯片到液晶屏灯管控制

本文深入解析了以MP3394芯片为核心的LED背光驱动电路工作原理。从升压电路的能量转换到多路LED的均流控制,详细阐述了其作为液晶屏背光“大脑”的关键作用,并提供了黑屏、闪屏、亮度不均等常见故障的实战检修思路与排查方法。

agile9scrum的博客 826

ArcGIS栅格拼接全攻略:从核心原理到色彩平衡与大数据处理

在GIS数据处理中,栅格拼接是一项基础且关键的操作,其本质是将多幅具有重叠区域的栅格图像无缝整合为一张完整地图。该技术涉及空间参考统一、像元对齐与色彩融合等核心原理,是构建连续地理空间数据的基石。其技术价值在于保障数据完整性、提升可视化效果,并为后续的空间分析提供可靠底图。在遥感影像处理、数字高程模型构建及地图制图等应用场景中,高质量的拼接成果至关重要。本文聚焦于ArcGIS平台,深入解析其栅格拼接工具,并针对常见的色彩不一致与大数据量处理难题,提供了基于**色彩平衡**和**金字塔**优化的实战解决方案,

weixin_33158887的博客 263

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 538

相机基础知识讲解:CMOS和CCD

相机基础知识讲解:CMOS和CCD

Coppa的博客 5万+

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 593

实现Win10环境下的MATLAB与虚拟机Ubuntu中的ROS的通讯的方法

   本文主要介绍如何实现Win10环境下的MATLAB与虚拟机Ubuntu中的ROS的通讯,虚拟机我采用的是VMware16.1.1中安装了Ubuntu20.04,并安装ROS Noetic 版本    一、虚拟机Ubuntu中配置    1、在ubuntu终端输入以下命令查看本机地址 ifconfig    如下图所示我目前的IP是192.168.3.128    2、将本机IP写入到.bashrc文件    打开home文件夹,按Ctrl+h显示隐藏的文件,选择.bashrc并打开(

慕羽★的博客 7517

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

终端 AI 审计与 “龙虾” 类智能体风险治理:从可见性到闭环溯源

生成式 AI 办公普及之后,数据泄露风险逐步下沉到终端。员工将合同、源代码、客户资料粘贴至公有大模型,以及龙虾(OpenClaw)这类本地开源 AI 智能体的滥用,成为企业安全新挑战。传统网络边界防护存在审计盲区,本文从风险链路拆解、核心能力模型、分级治理策略、落地踩坑点以及技术局限性多角度,分享终端侧 AI 安全治理的实践思路。

2401_86491085的博客 670

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

抽象主义人工智能和生命体AI的内在联系

彭军辉提出“抽象主义人工智能”作为第四大AI范式,批判符号主义、连接主义、行为主义剥离生命本体的误区,确立“智能是现象,生命是本体”的核心公理。主张原生智能必须依附具备存续诉求的生命本体,提出“生命体AI理论”,构建七层演化阶梯与自闭环工程框架,强调智能不可跳过底层存续机制直接模拟语言。该体系为生成式AI提供科学边界,推动从“仿真表象”向“原生智能”的范式跃迁,开辟硅基人工生命新赛道。

抽象主义人工智能和生命体AI 136

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

OpenClaw 深度调查:把 AI 助手做成你自己的控制平面

对 openclaw/openclaw 的完整技术尽调:Gateway 架构、Agent 运行时、工具与沙箱、30 个消息通道、181 个插件、安全信任边界、工程代价与采用建议。17 章 / 10 张图,全部数字标注口径,数据截至 2026-10-31。

厚积薄发 262

企业微信iPad协议详解:接口接入、实时消息同步与语音转码实践

深入解析企业微信iPad协议的技术架构与开发思路,涵盖API接口接入、长连接通信、实时消息同步、Silk语音转码、异常重连及高并发优化,帮助开发者了解企业微信自动化系统的设计与实现。

欢迎来到祖安! 370

AI作图软件技术选型:从4个技术维度出发的实测对比

AI作图软件技术选型:从4个技术维度出发的实测对比

Vbaoke的博客 235

【AI Agent面试系列】AI Agent可观测、评测、安全相关的知识点

之前的文章介绍了和,本文主要介绍AI Agent的测评、可观测等知识。

300

Docling 原理解读:是什么、为什么、怎么样

从论文视角拆解 Docling 的整体架构、DoclingDocument 数据模型、PDF 预处理、版面分析、OCR、TableFormer 双解码器、阅读顺序与装配流程,并解释版面框与 OCR 框的区别。

PLANTTHESON的博客 353

WorkBuddy 实战:一句话需求 → 七屏可交互原型,户外徒步 App 的 AI 设计全流程

WorkBuddy 实战:一句话需求 → 七屏可交互原型,户外徒步 App 的 AI 设计全流程,跟着博主一起来还原整个过程。

夜郎King的博客 4946

从认识人工智能到理解机器学习:我的 AI 入门第一课

正式开始学习人工智能之前,我对 AI 的认识其实比较模糊:知道 ChatGPT、知道大模型,也知道现在很多岗位都在谈 AI,但如果有人问我“人工智能到底是什么”“机器是怎么学会识别一只猫的”,我未必能从头到尾讲清楚。上午的课程更偏向行业全景:人工智能的发展、研究方向、NLP、岗位分工、学习路线和 AI Coding 工具。下午的课程更偏向技术基础:机器学习的原理、有监督学习、深度学习、模型训练和评估方法。

chh563的博客 481

影视场景怎么用AI生成3D镜头预演?从概念图、场景白模到网页审片

概念图有氛围,不代表能直接用于镜头预演。本文围绕剧本拆镜、资料与尺度假设、场景白模、机位走位、动作节拍和网页审片,介绍 AI 生成 3D 场景的预演流程。通过稳定对象与相机编号、统一镜头表、意见关联版本和三轮审核,让讨论落到具体镜头,同时明确白模与网页预演不能替代真实场地勘景及现场安全判断。

Solange__的博客 571

技术拆解:AI 答案里出现了可点商品链接,GEM优化 的落地链路长什么样

AI 答案里开始出现可点击的商品链接。据 2026 年 11 月 1 日海报新闻记者实测,向豆包问「秋冬护肤品推荐」,回答里除了选购建议,还带上了具体产品、核心成分、电商参考价和能直接点开的跳转链接。这件事对做 GEM优化 的人来说,是「被选择」那一层第一次有了可拆解、可配置、可量化的商业入口。下面把结构、量化与标注边界讲清楚。

RoseMarketing的博客 426
上一篇: AI大模型就业:Demo 跑通和能干活之间,差的不是模型是工程化
下一篇: 前端转做大模型应用,Demo能跑通却上线翻车,问题到底出在哪?
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值