新闻详情

新闻详情

首页 / 资讯中心 / 详情

Agent 长期运行可靠性:分布式状态管理与容错实践

发布时间:2026/9/26 0:06:54来源:尧图网络
Agent 长期运行可靠性:分布式状态管理与容错实践
1. 从一次线上事故说起为什么 Agent 的可靠性问题如此特殊去年冬天我负责的一个自动化运维 Agent 在凌晨三点突然开始疯狂重试同一个任务。它每隔 30 秒就重新执行一次“清理临时文件”的操作持续了整整四个小时直到磁盘 I/O 被打满、监控告警才把人叫醒。事后复盘发现根因极其简单Agent 在调用某个外部接口时超时了而它的重试逻辑没有做幂等控制也没有记录“这个任务已经执行过”的状态。更麻烦的是这个 Agent 是分布式的三个副本同时在做同样的事情互相之间完全不知道对方的存在。这件事让我彻底意识到一个问题当我们把 Agent 当作一个长期运行的服务来部署时它本质上已经变成了一个分布式状态机。它需要维护自己的状态、需要处理并发、需要保证幂等、需要在失败后恢复。但绝大多数 Agent 框架在设计之初根本没有考虑这些。这篇文章想聊的就是这个话题Agentic AI 的基础设施可靠性。我会从状态管理的角度切入拆解 Agent 长期运行时面临的真实挑战给出可落地的方案和踩坑经验。如果你正在做 Agent 开发、AI Infra 建设或者准备把 Agent 从 Demo 推向生产环境这些内容应该对你有用。2. Agent 为什么不是“无状态函数”核心认知的转变2.1 从 Chatbot 到 Agent状态复杂度的跃迁很多人对 Agent 的第一印象来自 Chatbot——你问一句它答一句每次对话独立服务端不需要记住任何东西。这种模式下服务端就是一个无状态函数输入 prompt输出 response完事。但 Agent 完全不是这个逻辑。一个典型的 Agent 执行流程是这样的接收任务 → 规划步骤 → 调用工具 → 观察结果 → 调整计划 → 继续执行 → 直到任务完成。这个过程中Agent 需要记住当前执行到哪一步了、之前调用了哪些工具、得到了什么结果、下一步该做什么。这些信息就是 Agent 的状态。更关键的是Agent 的执行时间可能很长。一个复杂的数据分析任务Agent 可能需要运行几分钟甚至几十分钟。在这段时间里服务可能重启、网络可能抖动、外部 API 可能超时。如果 Agent 的状态只存在内存里一旦进程挂掉所有进度全部丢失只能从头再来。这里有一个常见的误区很多人觉得“Agent 不就是调 LLM 吗能有多复杂”。实际上LLM 调用只是 Agent 的一个环节真正复杂的是围绕 LLM 构建的整个执行框架——状态管理、工具编排、错误处理、并发控制这些才是 Agent 可靠性的核心。2.2 分布式状态机的三个核心特征把 Agent 理解成分布式状态机它具备三个核心特征第一状态需要持久化。Agent 的执行进度、中间结果、工具调用记录都必须落到可靠的存储上。内存只能作为缓存不能作为唯一的状态载体。第二状态需要一致性保证。在分布式环境下多个 Agent 副本可能同时操作同一份状态。如果没有一致性机制就会出现我开头提到的那个问题三个副本同时执行同一个任务。第三状态需要可恢复。当 Agent 因为各种原因中断后它需要能够从上次的状态继续执行而不是从头开始。这要求状态机有明确的检查点机制。这三个特征决定了 Agent 的基础设施不能简单套用传统的 Web 服务架构。Web 服务通常是无状态的水平扩展很容易Agent 是有状态的扩展时需要额外考虑状态的分片和同步。2.3 一个具体的状态模型设计我在实际项目中用过的一个状态模型把 Agent 的状态分成四层状态层级存储内容存储介质生命周期会话状态用户身份、会话上下文Redis小时级任务状态当前任务、执行计划、步骤进度关系数据库天级执行状态当前步骤、工具调用参数、中间结果关系数据库 对象存储天级记忆状态长期记忆、经验沉淀向量数据库永久这个分层设计的逻辑是不同层级的状态有不同的访问频率和持久化要求。会话状态读写最频繁用 Redis 保证低延迟任务和执行状态需要事务保证用关系数据库记忆状态需要语义检索用向量数据库。实操心得不要把所有状态都塞进一个存储里。我见过有团队把 Agent 的所有状态都放在 Redis 里结果 Redis 内存暴涨而且因为 Redis 持久化配置不当重启后状态全丢。分层存储虽然增加了一点架构复杂度但换来的可靠性和可维护性是值得的。3. 状态持久化的具体实现从检查点到事件溯源3.1 检查点机制最直接的状态保存方案检查点Checkpoint是最容易理解的状态持久化方案。它的思路很简单Agent 每执行完一个步骤就把当前状态序列化后写入存储。如果 Agent 崩溃了重启后从最后一个检查点恢复。实现检查点需要注意几个细节序列化的选择。Agent 的状态通常包含复杂的嵌套结构——执行计划是树形的工具调用记录是列表中间结果可能是任意 JSON。我推荐用 JSON 或 MessagePack 做序列化前者可读性好后者性能更优。避免用 Pickle 这类与语言绑定的方案否则后续做多语言支持会很痛苦。检查点的粒度。粒度太粗恢复时丢失的进度多粒度太细写入频繁影响性能。我的经验是以“工具调用”为粒度比较合适。每次工具调用完成后写一次检查点这样即使崩溃最多只需要重做一次工具调用。检查点的清理。检查点不能无限增长。任务完成后相关的检查点应该被清理或归档。我通常设置一个 TTL比如 7 天超过时间的检查点自动删除。import json import hashlib from datetime import datetime class AgentCheckpoint: def __init__(self, storage_backend): self.storage storage_backend def save(self, task_id, step_index, state): checkpoint { task_id: task_id, step_index: step_index, state: state, timestamp: datetime.utcnow().isoformat(), checksum: self._compute_checksum(state) } key fcheckpoint:{task_id}:{step_index} self.storage.set(key, json.dumps(checkpoint)) def load_latest(self, task_id): # 从存储中查找该任务最新的检查点 keys self.storage.keys(fcheckpoint:{task_id}:*) if not keys: return None latest_key max(keys, keylambda k: int(k.split(:)[-1])) return json.loads(self.storage.get(latest_key)) def _compute_checksum(self, state): return hashlib.sha256( json.dumps(state, sort_keysTrue).encode() ).hexdigest()这段代码展示了检查点的基本实现。checksum字段用于校验状态完整性防止存储损坏导致恢复出错误的状态。3.2 事件溯源更优雅但更复杂的选择事件溯源Event Sourcing是另一种状态管理思路。它不保存状态本身而是保存所有导致状态变化的事件。当前状态 所有事件的依次应用结果。举个例子Agent 的状态变化可以表示为一系列事件——TaskStarted、StepPlanned、ToolCalled、ToolReturned、StepCompleted。要恢复状态只需要从头回放这些事件。事件溯源的优势很明显完整的审计日志、天然支持时间旅行、方便做状态回滚。但它的复杂度也更高需要设计事件 schema、需要处理事件版本兼容、需要定期做快照来加速恢复。我在一个需要严格审计的 Agent 项目里用过事件溯源。那个项目要求记录 Agent 的每一个决策依据事件溯源天然满足这个需求。但对于大多数普通 Agent 项目检查点机制已经够用了没必要为了“优雅”而引入额外复杂度。3.3 两种方案的对比与选型建议维度检查点机制事件溯源实现复杂度低高存储开销中每次存全量状态低只存增量事件恢复速度快直接读最新检查点慢需要回放事件审计能力弱强状态回滚不支持天然支持适用场景大多数 Agent 应用需要审计/回滚的场景选型建议如果你的 Agent 只是执行任务不需要审计和回滚用检查点就够了。如果 Agent 的决策过程需要被严格记录或者需要支持“回到某个历史状态重新执行”那事件溯源更合适。踩坑提醒事件溯源有一个隐蔽的坑——事件 schema 的版本兼容。当你修改了事件的结构后旧事件可能无法被新代码正确解析。解决方案是在事件里加版本号解析时根据版本号做兼容处理。这个坑我在项目上线三个月后才遇到当时不得不写了一个数据迁移脚本非常痛苦。4. 分布式协调多副本 Agent 的并发控制4.1 为什么 Agent 需要分布式锁回到开头那个事故三个 Agent 副本同时执行同一个任务。这个问题的本质是缺少分布式锁。在分布式环境下多个 Agent 副本可能同时被调度执行同一个任务。如果没有协调机制就会出现重复执行。对于幂等操作比如查询数据重复执行问题不大但对于非幂等操作比如发送邮件、扣款、删除文件重复执行就是灾难。分布式锁的核心要求是同一时刻只有一个副本能持有某个任务的锁。其他副本要么等待要么跳过。4.2 基于 Redis 的分布式锁实现Redis 是实现分布式锁最常用的方案。核心命令是SET key value NX PX timeout它的语义是如果 key 不存在则设置 key 并返回成功如果 key 已存在则返回失败。PX参数设置过期时间防止锁因为持有者崩溃而永远不释放。import redis import uuid import time class DistributedLock: def __init__(self, redis_client, lock_key, ttl_ms30000): self.redis redis_client self.lock_key lock_key self.ttl_ms ttl_ms self.token str(uuid.uuid4()) def acquire(self, timeout_ms5000): deadline time.time() timeout_ms / 1000 while time.time() deadline: if self.redis.set( self.lock_key, self.token, nxTrue, pxself.ttl_ms ): return True time.sleep(0.05) return False def release(self): # 使用 Lua 脚本保证原子性只有持有者才能释放锁 lua_script if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end self.redis.eval(lua_script, 1, self.lock_key, self.token)这段代码有两个关键点第一token用于标识锁的持有者释放锁时只有持有者才能释放第二释放锁用 Lua 脚本保证原子性避免“检查-删除”之间的竞态条件。4.3 锁的续期与看门狗机制分布式锁有一个经典问题如果任务执行时间超过了锁的 TTL锁会自动释放其他副本就能获取锁导致并发执行。解决方案是锁续期Watchdog。持锁的副本启动一个后台线程定期检查任务是否还在执行如果是就延长锁的 TTL。import threading class LockWatchdog: def __init__(self, lock, interval_ms10000): self.lock lock self.interval interval_ms / 1000 self.running False self.thread None def start(self): self.running True self.thread threading.Thread(targetself._renew_loop) self.thread.daemon True self.thread.start() def _renew_loop(self): while self.running: time.sleep(self.interval) if self.running: # 延长锁的 TTL self.lock.redis.pexpire( self.lock.lock_key, self.lock.ttl_ms ) def stop(self): self.running False if self.thread: self.thread.join(timeout1)实操心得Watchdog 的续期间隔应该小于锁 TTL 的一半。比如 TTL 是 30 秒续期间隔设为 10 秒比较合适。这样即使某次续期失败还有一次重试机会。另外Watchdog 线程必须是 daemon 线程否则主进程退出时会被阻塞。4.4 任务分片另一种协调思路除了分布式锁任务分片是另一种协调思路。它的核心思想是把任务队列分成多个分片每个 Agent 副本负责一个分片。这样不同副本处理不同任务天然避免了冲突。任务分片的实现通常依赖消息队列。比如用 Kafka 的话可以创建多个 partition每个 Agent 副本消费一个 partition。用 RabbitMQ 的话可以用 consistent hash exchange 做路由。分片方案的优点是扩展性好增加副本只需要增加分片。缺点是分片之间可能不均衡某些分片任务多某些分片任务少。需要额外的负载均衡机制。5. 容错与恢复当 Agent 执行失败时怎么办5.1 失败分类哪些失败可以重试哪些不能Agent 执行失败的原因五花八门但可以归为几类瞬时失败。网络抖动、外部 API 限流、数据库连接池满。这类失败通常重试就能成功。永久失败。参数错误、权限不足、资源不存在。这类失败重试多少次都没用需要人工介入或修改任务。部分失败。一个任务包含多个步骤前几步成功了中间某步失败了。这类失败需要从失败点恢复而不是从头重来。未知失败。比如 LLM 返回了无法解析的输出、工具调用返回了预期之外的结果。这类失败需要兜底策略。针对不同失败类型处理策略也不同。瞬时失败用指数退避重试永久失败直接标记任务失败并告警部分失败用检查点恢复未知失败用降级策略或转人工。5.2 指数退避重试的实现细节指数退避Exponential Backoff是重试策略的标准做法。核心思想是每次重试的间隔按指数增长避免短时间内大量重试压垮下游服务。import random def exponential_backoff_retry( func, max_retries5, base_delay1.0, max_delay60.0 ): for attempt in range(max_retries): try: return func() except TransientError as e: if attempt max_retries - 1: raise delay min(base_delay * (2 ** attempt), max_delay) # 加入随机抖动避免多个副本同时重试 jitter random.uniform(0, delay * 0.1) time.sleep(delay jitter) raise MaxRetriesExceeded()这里有两个关键细节第一max_delay限制最大间隔防止间隔无限增长第二加入随机抖动Jitter避免多个副本在同一时刻重试造成“惊群效应”。5.3 死信队列与人工介入有些任务重试多次后仍然失败这时候需要死信队列Dead Letter Queue。死信队列的作用是把无法处理的任务暂存起来等待人工排查或后续处理。死信队列的实现通常依赖消息队列的原生支持。比如 RabbitMQ 有 DLXDead Letter ExchangeKafka 可以创建一个专门的 topic 作为死信队列。死信队列里的任务需要配套的排查工具。我通常会记录失败原因、重试次数、最后一次执行的堆栈信息方便排查。同时设置告警当死信队列积压超过阈值时通知相关人员。踩坑提醒死信队列不是垃圾桶不能只往里扔不处理。我见过有团队的死信队列积压了几万条消息没人看最后存储都爆了。死信队列必须有配套的处理流程和定期清理机制。5.4 状态恢复的幂等性保证从检查点恢复时有一个容易被忽略的问题恢复后的操作必须是幂等的。举个例子Agent 执行到“发送通知邮件”这一步检查点记录了“准备发送”但实际邮件已经发出去了只是检查点没来得及更新。恢复后Agent 会再次发送邮件用户收到两封。解决方案是给每个操作加唯一标识执行前先检查是否已经执行过。比如发送邮件时用task_id step_index作为幂等键发送前先查一下这个键是否已存在。def send_notification_idempotent(task_id, step_index, content): idempotency_key fnotify:{task_id}:{step_index} if redis.set(idempotency_key, 1, nxTrue, ex86400): # 键不存在说明还没发送过 actually_send_notification(content) else: # 键已存在说明已经发送过跳过 pass这个模式叫“幂等键”是分布式系统里保证幂等性的标准做法。6. 可观测性让 Agent 的状态“看得见”6.1 Agent 可观测性的三个层次Agent 的可观测性比传统服务更复杂因为它有三个层次基础设施层。CPU、内存、网络、磁盘这些常规指标。这一层用 Prometheus Grafana 就能覆盖。Agent 执行层。任务执行进度、步骤耗时、工具调用成功率、LLM 调用延迟。这一层需要自定义指标。决策质量层。Agent 的决策是否合理、是否偏离预期、是否产生了有害输出。这一层最难通常需要结合人工评估和自动化评估。大多数团队只做了第一层第二层做了一部分第三层基本空白。但恰恰是第二层和第三层对 Agent 的可靠性至关重要。6.2 关键指标的定义与采集我在项目中定义了一套 Agent 核心指标分享给大家参考指标名称类型说明告警阈值agent_task_totalCounter任务总数-agent_task_successCounter成功任务数-agent_task_failedCounter失败任务数失败率 5%agent_step_durationHistogram步骤耗时分布P99 30sagent_tool_call_errorsCounter工具调用错误数错误率 10%agent_llm_latencyHistogramLLM 调用延迟P95 10sagent_checkpoint_ageGauge最新检查点年龄 5minagent_lock_wait_timeHistogram锁等待时间P99 5s这些指标覆盖了 Agent 执行的关键环节。其中agent_checkpoint_age特别重要如果检查点长时间没更新说明 Agent 可能卡住了。6.3 分布式追踪在 Agent 中的应用Agent 的一次执行涉及多个组件调度器、状态存储、LLM 服务、工具服务。当出现问题时需要快速定位是哪个环节出了问题。分布式追踪Distributed Tracing就是干这个的。实现分布式追踪的标准方案是 OpenTelemetry。核心概念是 Trace 和 Span一个 Trace 代表一次完整的 Agent 执行一个 Span 代表执行中的一个环节。from opentelemetry import trace tracer trace.get_tracer(agent) def execute_step(step): with tracer.start_as_current_span(execute_step) as span: span.set_attribute(step.type, step.type) span.set_attribute(step.index, step.index) with tracer.start_as_current_span(call_tool) as tool_span: tool_span.set_attribute(tool.name, step.tool_name) result call_tool(step.tool_name, step.params) tool_span.set_attribute(tool.success, result.success) with tracer.start_as_current_span(update_checkpoint): save_checkpoint(step.index, result) return result这样一次 Agent 执行的完整链路就能在追踪系统里看到哪个环节慢、哪个环节出错一目了然。实操心得分布式追踪的采样率需要仔细设置。100% 采样对存储压力太大采样率太低又可能漏掉关键问题。我的经验是正常执行采样 10%失败执行采样 100%。这样既能控制存储成本又能保证问题可追溯。7. 实战案例一个长期运行 Agent 的完整架构7.1 架构总览说了这么多理论来看一个实际项目的架构。这是一个运行了半年的自动化数据处理 Agent每天处理上千个任务平均任务执行时间 5 分钟。架构分为五层接入层。接收任务请求做初步校验和限流。调度层。负责任务分发和副本协调用分布式锁保证同一任务只被一个副本执行。执行层。Agent 的实际执行环境包含 LLM 调用、工具调用、状态管理。存储层。分层存储Redis 存会话状态PostgreSQL 存任务和执行状态S3 存大文件向量库存长期记忆。可观测层。Prometheus 采集指标Jaeger 做追踪ELK 做日志。7.2 关键配置参数这个项目运行半年积累了一些关键配置参数分享出来供参考agent: checkpoint: interval_steps: 1 # 每步都写检查点 ttl_days: 7 # 检查点保留 7 天 storage: postgresql # 检查点存储 lock: ttl_ms: 30000 # 锁 TTL 30 秒 watchdog_interval_ms: 10000 # 续期间隔 10 秒 acquire_timeout_ms: 5000 # 获取锁超时 5 秒 retry: max_retries: 5 # 最大重试 5 次 base_delay_ms: 1000 # 基础延迟 1 秒 max_delay_ms: 60000 # 最大延迟 60 秒 jitter_ratio: 0.1 # 抖动比例 10% timeout: task_timeout_s: 3600 # 任务超时 1 小时 step_timeout_s: 300 # 步骤超时 5 分钟 llm_timeout_s: 60 # LLM 调用超时 60 秒这些参数不是拍脑袋定的是经过压测和线上调优得出的。比如锁 TTL 设为 30 秒是因为 P99 的步骤执行时间是 20 秒左右30 秒留了足够余量。7.3 一次故障的完整排查过程分享一次真实的故障排查过程展示可观测性体系的价值。现象某天下午任务失败率从 1% 飙升到 15%。第一步看指标。发现agent_tool_call_errors指标异常升高说明工具调用出了问题。第二步看追踪。在 Jaeger 里筛选失败的 Trace发现失败集中在调用某个外部 API 的环节。第三步看日志。日志显示外部 API 返回了 429限流。第四步定位根因。进一步排查发现这个外部 API 的限流阈值是每分钟 100 次而我们的 Agent 在下午任务高峰期调用频率超过了这个阈值。第五步修复。在工具调用层加了限流器控制调用频率。同时调整了重试策略对 429 错误使用更长的退避时间。整个排查过程不到 20 分钟靠的就是完善的指标、追踪和日志。如果没有这套可观测性体系可能要在各种日志里翻半天。8. 常见问题速查与避坑指南8.1 状态管理类问题问题Agent 重启后状态丢失。排查方向检查状态是否只存在内存里。如果是需要引入持久化存储。检查检查点是否正常写入检查存储连接是否正常。问题检查点写入太频繁影响性能。排查方向检查检查点粒度是否太细。如果每个 LLM token 都写检查点肯定扛不住。调整为以步骤为粒度。另外检查存储是否用了批量写入。问题恢复后状态不一致。排查方向检查检查点的 checksum 是否匹配。检查恢复逻辑是否正确处理了部分完成的状态。检查是否有并发写入导致状态覆盖。8.2 分布式协调类问题问题多个副本同时执行同一任务。排查方向检查分布式锁是否正确实现。检查锁的 TTL 是否太短导致任务没执行完锁就释放了。检查 Watchdog 是否正常工作。问题锁释放失败导致死锁。排查方向检查释放锁的 Lua 脚本是否正确。检查是否有异常导致释放逻辑没执行。确保锁有 TTL 兜底。问题锁等待时间过长。排查方向检查是否有任务执行时间过长导致锁被长时间持有。考虑拆分大任务或者调整锁粒度。8.3 容错恢复类问题问题重试导致重复执行。排查方向检查操作是否幂等。引入幂等键机制。检查重试逻辑是否在正确的层级。问题死信队列积压。排查方向检查失败原因是否集中。如果是某个外部依赖的问题先修复依赖。检查死信队列是否有配套的处理流程。问题恢复后 Agent 行为异常。排查方向检查恢复的状态是否完整。检查 LLM 的上下文是否包含了恢复所需的信息。检查工具调用的参数是否正确恢复。8.4 独家避坑技巧技巧一给 Agent 加“心跳”。Agent 在执行长任务时定期更新一个心跳键。监控系统检查心跳键的年龄如果超过阈值就告警。这能及时发现 Agent 卡死的情况。技巧二状态变更加版本号。每次状态变更时递增版本号写入时用乐观锁UPDATE ... WHERE version ?。这能防止并发写入导致的状态覆盖。技巧三定期做恢复演练。不要等到真出问题了才测试恢复逻辑。定期手动 kill 掉 Agent 进程验证它能否正确恢复。我每个月做一次演练发现过好几个恢复逻辑的 bug。技巧四LLM 调用加缓存。相同的 prompt 和参数LLM 的返回通常是一样的。加一层缓存能显著降低 LLM 调用次数既省钱又提速。注意缓存 key 要包含模型版本和参数。技巧五工具调用加超时。任何外部调用都必须设超时。我见过因为没设超时Agent 卡在一个 HTTP 请求上几个小时的情况。超时时间根据工具的正常响应时间设定通常 30 秒到 5 分钟。9. 关于 Agent 基础设施可靠性的一些个人体会做 Agent 基础设施这半年多最大的体会是Agent 的可靠性问题本质上不是 AI 问题而是分布式系统问题。状态管理、并发控制、容错恢复、可观测性这些都是分布式系统领域成熟了几十年的课题。Agent 的特殊之处在于它把这些问题的复杂度放大了——因为 Agent 的执行时间更长、状态更复杂、失败模式更多样。另一个体会是不要过早追求“完美”的可靠性方案。我一开始想上事件溯源觉得它优雅、强大。但实际做下来发现检查点机制已经能满足 90% 的需求而且实现简单、排查容易。事件溯源的复杂度在项目早期是负担而不是优势。先把检查点做好等真正需要审计和回滚时再考虑事件溯源。最后一个体会可观测性的投入永远不亏。在 Agent 项目里可观测性不是“锦上添花”而是“雪中送炭”。没有指标、追踪和日志排查问题就像盲人摸象。我建议在项目第一天就把可观测性框架搭起来后面会省很多事。后续如果要做扩展我会考虑两个方向一是把状态管理抽象成独立的服务让 Agent 框架专注于执行逻辑二是引入更智能的故障预测用历史数据训练模型提前发现可能失败的任务。这两个方向都还在探索中有进展再分享。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

QQ通讯组件做网页在线客服:临时会话原理与接入避坑指南 2026/9/26 0:53:01

QQ通讯组件做网页在线客服:临时会话原理与接入避坑指南

先说个很常见的场景:一个访客点开你网站上的“在线客服”,浏览器立刻唤起本机QQ,弹出一个聊天窗口,对方不用加好友、不用下载任何插件,直接就能和你对话。这种体验,其实就是“QQ通讯组件”在网页里的典型应…

阅读更多 →
毕业设计实战:沙县小吃点餐系统从业务建模到部署避坑全指南 2026/9/26 0:53:01

毕业设计实战:沙县小吃点餐系统从业务建模到部署避坑全指南

简介:沙县小吃点餐系统完整源码与毕业论文打包,面向计算机相关专业毕业设计或课程设计人群,可作为基于JavaWeb与MySQL的典型管理系统开发参考。资源覆盖管理员、用户及前台首页三个操作端,涉及小吃信息、门店信息、预约信息、订单…

阅读更多 →
深入 Agent Sprite Forge 后处理引擎:洋红泛洪、连通域切帧与 GIF 编码原理 2026/9/26 0:52:35

深入 Agent Sprite Forge 后处理引擎:洋红泛洪、连通域切帧与 GIF 编码原理

深入 Agent Sprite Forge 后处理引擎:洋红泛洪、连通域切帧与 GIF 编码原理 【免费下载链接】agent-sprite-forge Agent Skill for generating 2D sprite sheets and map, transparent PNG frames, and animated GIFs from prompts. 项目地址: https://gitcode.co…

阅读更多 →
命令行批量下载抖音无水印视频:从单条到主页归档实战 2026/9/26 0:52:29

命令行批量下载抖音无水印视频:从单条到主页归档实战

1. 为什么我放弃了图形工具,转回命令行做抖音视频归档做内容运营或者素材收集的朋友,大概率都遇到过这样的场景:刷到一个特别对味的账号,想把ta主页的视频全部存下来做参考,结果一条条点开、复制链接、打开解析网站、等…

阅读更多 →
Django大数据选品实战:直播带货商品评分模型与可视化全解析 2026/9/26 0:52:28

Django大数据选品实战:直播带货商品评分模型与可视化全解析

我做直播电商相关系统也有几年了,去年带学生做毕业设计时,选了“基于Django大数据在直播带货商品选品中的应用”这个方向。这个题目乍一看有点“拼盘”:Django是大数据?选品用什么大数据?实际上把一个真实的小型数据决…

阅读更多 →
UE5 GAS框架实战:构建可扩展ARPG战斗系统的核心方法 2026/9/26 0:52:22

UE5 GAS框架实战:构建可扩展ARPG战斗系统的核心方法

1. 先别急着写代码:ARPG战斗框架到底在解决什么问题如果你在UE里做过ARPG,一定体会过战斗系统写到后期的那种窒息感。普攻连段、闪避无敌帧、受击硬直、怪物AI、伤害数字、BUFF叠层、技能打断、镜头冲击……表面上每个功能都不难,但一旦它们互…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉