构建 Agent 的五大难点与解决方案

从理论到实践,带你攻克智能体开发中最棘手的五个技术难题。


前言

随着大语言模型(LLM)能力的飞速提升,AI Agent 成为 2025-2026 年最炙手可热的技术方向。从 AutoGPT 到 Claude Code,从客服机器人到自动化运维,Agent 正在重塑软件开发的范式。

然而,构建一个真正可靠的 Agent 远比做一个 ChatBot 困难得多。一个 Demo 级的 Agent 可能一个下午就能搭出来,但要做到生产级可用------能稳定运行、不烧钱、不给用户添乱------需要跨越许多深坑。

本文将深入剖析 Agent 开发中最常见的五大难点,并结合业界实践给出可落地的解决方案。


目录

  1. 难点一:无限循环与任务卡死

  2. 难点二:工具选择错误

  3. 难点三:上下文窗口溢出

  4. 难点四:错误处理与鲁棒性

  5. 难点五:成本控制

  6. 总结:构建可靠 Agent 的黄金法则


5.1 难点一:无限循环与任务卡死

问题描述

这是 Agent 开发中最经典、也最令人头疼的问题。Agent 在执行任务时出现两种极端情况:

  • 无限循环(Infinite Loop) :Agent 反复执行相同的工具调用,永远无法收敛。比如不断调用 search 查找同一个问题但每次都觉得"还不够",或者反复 read 同一个文件却始终觉得"需要再看看"。

  • 任务卡死(Deadlock/Stall):Agent 卡在某个步骤,既不报错也不继续。常见于等待一个永远不会返回的结果,或者在两个工具之间反复切换而没有任何进展。

一个真实的例子:

复制代码
Step  1: search("如何实现用户登录")
Step  2: read("auth.py")
Step  3: search("如何实现用户登录")   ← 又搜了一遍
Step  4: read("auth.py")              ← 又读了一遍
Step  5: search("如何实现用户登录")   ← 无限循环开始...
...
Step 47: search("如何实现用户登录")   ← 还在循环

解决方案

1. 设置硬性步数上限(Step Cap)

最直接但有效的手段------在 Agent 执行层面设置最大步数限制。一旦超过阈值,强制终止并返回当前状态。

python 复制代码
MAX_STEPS = 50
for step in range(MAX_STEPS):
    action = agent.decide()
    if action.is_final:
        return action.result
    execute(action)
raise MaxStepsExceededError("Agent exceeded maximum steps")

Claude Code、LangChain、AutoGen 等主流框架都内置了此机制。建议开发环境下设 30-50 步,生产环境根据任务复杂度设 100-200 步。

2. 循环检测(Loop Detection)

在每次工具调用前,检查是否与最近 N 步内的某一步完全相同或高度相似。

python 复制代码
def detect_loop(history: list[Action], window: int = 5) -> bool:
    if len(history) < window * 2:
        return False
    recent = history[-window:]
    previous = history[-window*2:-window]
    return recent == previous
​
def detect_repeating_pattern(history: list[Action], threshold: int = 3) -> bool:
    """检测同一个 action+参数组合是否重复超过阈值"""
    from collections import Counter
    action_counts = Counter(str(a) for a in history[-20:])
    return any(count >= threshold for count in action_counts.values())

当检测到循环时,可以:

  • 提示 Agent "你似乎在重复操作,请尝试不同的方法"

  • 强制切换到备选策略

  • 直接终止并上报给用户

3. 进度追踪与自省(Progress Tracking & Self-Reflection)

要求 Agent 在每个关键步骤后明确输出当前进度。这不仅是给开发者看的,更应该注入到 Agent 的系统提示中:

复制代码
在每次行动后,问自己三个问题:
1. 我离目标更近了吗?
2. 上一步带来了什么新信息?
3. 我接下来应该做什么,为什么?
​
如果连续三步没有实质性进展,请停下来重新思考策略。
4. 设置超时机制(Timeout)

不仅仅是步数上限,还需要墙钟时间(wall-clock)超时。某些工具调用(如网络请求、大文件处理)可能单步就耗时很久:

python 复制代码
import signal
​
def execute_with_timeout(action, timeout_seconds=60):
    signal.alarm(timeout_seconds)
    try:
        return execute(action)
    except TimeoutError:
        return "Action timed out, please try a different approach"
    finally:
        signal.alarm(0)
5. 结构化退出条件(Structured Termination Criteria)

不要只依赖 Agent 自己判断"任务完成"。在系统设计层面明确定义终止条件:

终止类型 条件 示例
成功完成 产出符合验收标准 代码通过编译且测试通过
优雅降级 超过步数但有部分产出 已找到 3 个 bug,展示给用户
强制终止 循环检测/超时触发 停止并告知用户卡在哪里
用户中断 用户手动停止 保留进度供用户下次继续

5.2 难点二:工具选择错误

问题描述

Agent 的核心能力之一是使用工具(Function Calling / Tool Use),但选错工具是高频故障模式。典型表现包括:

  • 工具混淆:需要搜索文件时调用了 Web Search,需要执行命令时调用了文件读取。

  • 参数错误 :调用 grep("foo", path="/nonexistent") 路径写错;调用 search("query that is way too long and contains special characters that break the search")

  • 幻觉工具调用:调用了一个不存在的工具,或者脑补了工具的返回结果。

  • 工具链断裂:工具 A 的输出需要传给工具 B,但 Agent 拼接错误或遗漏了关键字段。

根本原因

  1. 工具描述不清晰 :工具的 descriptionparameters schema 写得模糊,Agent 无法准确理解工具的能力边界。

  2. 工具数量过多 :当工具超过 20-30 个时,模型的选择准确率显著下降------这是注意力稀释(Attention Dilution)导致的。

  3. 缺乏使用示例:模型没有看到工具的正确使用范式,只能靠猜。

  4. 上下文干扰:前面步骤的错误信息或无关内容干扰了模型对当前工具的判断。

7-10 解决方案

以下是业界验证有效的 7 到 10 条实践方案:

1. 精简工具集(Tool Pruning) ⭐

不是工具越多越好。按场景分组,每次只暴露相关工具:

复制代码
场景:代码审查
可用工具:read_file, grep, git_diff, lsp_hover
不可用:web_search, bash_execute, file_write  ← 不相关的不给

实现动态工具注册:

python 复制代码
def get_tools_for_context(context: TaskContext) -> list[Tool]:
    tools = []
    if context.requires_file_access:
        tools.extend([read_file, grep, glob])
    if context.requires_execution:
        tools.extend([bash_execute])
    if context.requires_web:
        tools.extend([web_search, web_fetch])
    return tools
2. 写出高质量的工具描述

工具描述是最重要的 Prompt Engineering 战场。好的工具描述应包含:

  • 一句话概括:这个工具是做什么的

  • 何时使用:2-3 个典型场景

  • 何时不用:明确的能力边界

  • 参数说明:每个参数的含义、格式、约束,附带示例

  • 返回值描述:返回什么、格式如何

python 复制代码
def get_tools_for_context(context: TaskContext) -> list[Tool]:
    tools = []
    if context.requires_file_access:
        tools.extend([read_file, grep, glob])
    if context.requires_execution:
        tools.extend([bash_execute])
    if context.requires_web:
        tools.extend([web_search, web_fetch])
    return tools
3. 提供 Few-Shot 示例

在系统提示中给出 2-3 个工具调用的正确示例,模型对格式和用法的理解会显著提升:

复制代码
示例 1 - 查找用户认证逻辑:
  步骤1:search_code("def login", path="src/", file_types=["py"])
  → 找到 3 个结果
  步骤2:read_file("src/auth/views.py", offset=45, limit=30)
  → 阅读 login 函数实现
​
示例 2 - 修复一个 bug:
  步骤1:grep("NullPointerException", path="logs/")
  → 定位错误日志
  步骤2:read_file("src/service.py", offset=120, limit=40)
  → 查看出错代码
4. 工具返回结果的格式化

工具返回的结果应该结构化且信息密度适中。太长了浪费 token,太短了信息不足:

python 复制代码
# ❌ 不好的返回
"Found it"
​
# ❌ 太冗长的返回
"The file /home/user/project/src/auth/login.py has the following content on line 45: def login(username, password): ...(200 more lines)..."
​
# ✅ 好的返回
{
  "status": "success",
  "matches": 3,
  "results": [
    {"file": "src/auth/login.py", "line": 45, "snippet": "def login(username, password): ..."},
    ...
  ],
  "hint": "使用 read_file 查看完整文件"
}
5. 工具选择验证层(Tool Selection Guard)

在执行工具调用前,加一层规则验证:

python 复制代码
def validate_tool_call(action: Action, context: TaskContext) -> bool:
    # 规则1:不允许在当前上下文中使用的工具
    if action.tool not in context.allowed_tools:
        return False
​
    # 规则2:参数验证
    if action.tool == "read_file" and not os.path.exists(action.args["path"]):
        suggest_alternative(f"文件不存在,尝试用 glob 查找?")
​
    # 规则3:反模式检测
    if action.tool == "web_search" and action.args["query"].startswith("def "):
        # 看起来是在搜代码而不是搜索网页
        suggest_alternative("尝试用 search_code 而不是 web_search")
​
    return True
6. 工具分级与渐进式暴露

将工具分为多个层级,只暴露当前层级及以下的工具:

复制代码
Level 1 (默认):read_file, search_code, glob
Level 2 (需确认):bash_execute, file_write, git_commit
Level 3 (高风险):delete_file, force_push, database_write
7. 并行工具调用优化

鼓励 Agent 在无依赖关系时并行调用工具,减少步数和延迟:

复制代码
不需要等待结果的操作可以同时发出:
  ✅ parallel: [read("a.py"), read("b.py"), read("c.py")]
  ❌ 必须串行: [read("config.py")] → 根据配置决定下一步

5.3 难点三:上下文窗口溢出

问题描述

现代 LLM 的上下文窗口从 4K 增长到了 1M token,看起来很充裕,但在 Agent 场景下消耗速度远超预期。一次典型的 Agent 执行:

复制代码
系统提示:               ~2,000 tokens
工具定义:               ~3,000 tokens
对话历史 (每步):
  - 模型思考+输出:      ~500-2,000 tokens
  - 工具返回:           ~1,000-10,000 tokens  ← 爆炸点
用户指令 + 上下文:      ~2,000 tokens
─────────────────────────────────────────────
20 步之后:              ~50,000-150,000 tokens
50 步之后:              ~150,000-500,000 tokens ← 很多模型开始吃力

上下文溢出的后果:

  • 性能骤降:模型在长上下文中"迷失",对中间信息失忆

  • 成本暴涨:每次请求都要把所有历史重新发送

  • 被截断:超出上下文限制时,最早的信息(往往包含关键指令)被丢弃

  • 注意力稀释:重要指令淹没在噪声中

解决方案

1. 上下文压缩(Context Compression)

对历史对话进行智能摘要,保留关键信息,压缩无关细节:

python 复制代码
def compress_history(messages: list[Message], max_tokens: int = 20000) -> list[Message]:
    """将历史压缩到 max_tokens 以内"""
    if count_tokens(messages) <= max_tokens:
        return messages
​
    # 永远保留系统提示和前两条用户消息(关键指令)
    preserved = messages[:3]
​
    # 对中间步骤做摘要
    middle = messages[3:-2]
    summary = llm.summarize(middle, instruction="提取关键决策、发现和错误")
​
    # 保留最近的交互(局部上下文最重要)
    recent = messages[-2:]
​
    return preserved + [summary] + recent

LangChain 的 ConversationSummaryMemory 和 Anthropic 的 Prompt Caching 都采用了类似思路。

2. 结构化记忆(Structured Memory)

不是简单地把所有历史塞进上下文,而是用外部存储维护结构化的任务状态:

python 复制代码
def compress_history(messages: list[Message], max_tokens: int = 20000) -> list[Message]:
    """将历史压缩到 max_tokens 以内"""
    if count_tokens(messages) <= max_tokens:
        return messages
​
    # 永远保留系统提示和前两条用户消息(关键指令)
    preserved = messages[:3]
​
    # 对中间步骤做摘要
    middle = messages[3:-2]
    summary = llm.summarize(middle, instruction="提取关键决策、发现和错误")
​
    # 保留最近的交互(局部上下文最重要)
    recent = messages[-2:]
​
    return preserved + [summary] + recent

每次推理时,只将精炼后的状态注入上下文,而不是完整历史。实际效果:将 10 万 token 的历史压缩到 3000 token 以内的结构化摘要。

3. 分层上下文管理

把上下文分层,不同层级有不同的生命周期:

复制代码
┌─────────────────────────────────────────┐
│  L1: 永久指令 (全生命周期)              │
│  系统提示、核心规则、工具定义           │
├─────────────────────────────────────────┤
│  L2: 任务记忆 (当前任务)                │
│  任务目标、关键里程碑、重要发现         │
├─────────────────────────────────────────┤
│  L3: 工作上下文 (滑动窗口,最近N步)     │
│  最近的文件内容、工具调用历史           │
├─────────────────────────────────────────┤
│  L4: 即时上下文 (仅当前步)              │
│  当前工具的返回结果                     │
└─────────────────────────────────────────┘
4. 文件引用而非内容内联

指导 Agent 不要直接把整个文件内容输出,而是引用路径和行号:

复制代码
❌ "我在 src/auth.py 中找到了问题代码:def login(self, username,  password):  # 有 bug,应该用 hashed_password == self._hash(password) ... (200 行代码)"
✅ "在 src/auth.py:47, login 方法中存在密码比较逻辑问题,已定位。"

同时,工具返回时也做截断:read_file 默认返回 200 行而不是整个文件。

5. 利用 Prompt Caching

Anthropic 等厂商提供的 Prompt Caching 机制允许缓存系统提示和工具定义等固定前缀,大幅降低延迟和成本。设计时确保:

  • 系统提示和工具定义格式稳定,不要每步动态修改

  • 将频繁读取的参考信息放在缓存边界内

  • 避免在缓存前缀中插入动态内容


5.4 难点四:错误处理与鲁棒性

问题描述

现实世界不是 Happy Path。Agent 在运行时可能遇到各种错误:

错误类型 示例
工具执行失败 文件不存在、网络超时、权限不足
模型输出解析失败 JSON 格式错误、工具参数缺失、调用幻觉工具
环境异常 磁盘满、进程被杀、依赖缺失
语义错误 工具调对了但逻辑完全跑偏
外部依赖故障 API 返回 500、数据库连接断开

一个脆弱的 Agent 遇到任何错误都可能直接崩溃,丢弃已完成的所有工作。用户不仅得不到结果,连发生了什么都不知道。

解决方案

1. 每一层都要有防御
复制代码
┌──────────────────────────────────────┐
│          Agent 编排层                │
│  重试策略 / 降级 / 人工兜底          │
├──────────────────────────────────────┤
│          工具执行层                  │
│  try-catch / 超时 / 格式校验         │
├──────────────────────────────────────┤
│          基础服务层                  │
│  熔断 / 限流 / 健康检查              │
└──────────────────────────────────────┘
2. 优雅降级(Graceful Degradation)

不是每个错误都需要终止任务。设计三级降级策略:

python 复制代码
def handle_tool_error(error: Exception, action: Action, attempt: int) -> Response:
    # Level 1: 重试
    if attempt < MAX_RETRIES and is_retryable(error):
        return retry(action, backoff=attempt * 2)
​
    # Level 2: 备选方案
    alternative = find_alternative(action)
    if alternative:
        return execute(alternative)
​
    # Level 3: 跳过并报告
    return ActionResult(
        success=False,
        error=str(error),
        suggestion="跳过此步骤,继续执行后续任务"
    )

重试策略需要指数退避(Exponential Backoff)和抖动(Jitter):

python 复制代码
import random, time
​
def retry_with_backoff(fn, max_retries=3, base_delay=1):
    for attempt in range(max_retries):
        try:
            return fn()
        except RetryableError as e:
            if attempt == max_retries - 1:
                raise
            delay = base_delay * (2 ** attempt) + random.uniform(0, 1)
            time.sleep(delay)
3. 自愈能力(Self-Healing)

将错误信息反馈给 Agent,让它自己尝试修复。这是 Agent 相比传统软件最独特的优势:

python 复制代码
for attempt in range(3):
    try:
        result = agent.execute_step()
        break
    except ToolError as e:
        # 把错误信息反馈给 Agent
        agent.add_context(f"上一步出错:{e},请尝试用其他方式完成此步骤")
    except ParseError as e:
        agent.add_context(f"输出格式不正确:{e},请按照 JSON Schema 重新输出")

关键:不仅要告诉 Agent "出错了",还要给出错误原因和建议的修复方向

4. 检查点与恢复(Checkpoint & Resume)

保存 Agent 的中间状态,支持断点续跑:

python 复制代码
class CheckpointManager:
    def save(self, agent_state: dict, step: int):
        checkpoint = {
            "step": step,
            "completed": agent_state["completed_steps"],
            "memory": agent_state["memory"].to_dict(),
            "timestamp": time.time()
        }
        with open(f"checkpoints/step_{step}.json", "w") as f:
            json.dump(checkpoint, f)
​
    def restore(self) -> dict:
        checkpoints = sorted(glob("checkpoints/step_*.json"))
        if not checkpoints:
            return None
        with open(checkpoints[-1]) as f:
            return json.load(f)
5. 输出验证与 Schema 约束

对于结构化输出,使用严格校验防止格式错误破坏下游流程:

python 复制代码
from pydantic import BaseModel, Field
​
class AgentAction(BaseModel):
    tool: str = Field(description="工具名称")
    args: dict = Field(description="工具参数")
    reason: str = Field(description="调用此工具的原因")
​
# 使用 Pydantic 做严格校验
try:
    action = AgentAction.model_validate_json(llm_output)
except ValidationError as e:
    # 反馈给 Agent 修正
    retry_with_error_feedback(e)
6. 熔断器(Circuit Breaker)

当某个外部依赖连续失败时,暂时停止调用防止雪崩:

python 复制代码
class CircuitBreaker:
    def __init__(self, failure_threshold=5, recovery_timeout=30):
        self.failures = 0
        self.threshold = failure_threshold
        self.recovery_timeout = recovery_timeout
        self.last_failure_time = None
​
    def call(self, fn):
        if self.is_open():
            raise CircuitBreakerOpenError("熔断器开启,暂时拒绝请求")
​
        try:
            result = fn()
            self.failures = 0  # 成功则重置
            return result
        except Exception:
            self.failures += 1
            self.last_failure_time = time.time()
            raise
​
    def is_open(self):
        if self.failures >= self.threshold:
            if time.time() - self.last_failure_time < self.recovery_timeout:
                return True
            self.failures = 0  # 超时后半开,允许尝试
        return False

5.5 难点五:成本控制

问题描述

Agent 的成本主要来自三个方面:

成本来源 占比估算 典型场景
Token 消耗 60-80% 重复发送长上下文、工具返回过长
推理时间 10-20% 模型反复思考、无效步骤过多
外部 API 调用 5-15% 搜索、代码执行、数据库查询

一次中等复杂度的 Agent 任务(如"审查这个 PR"或"重构这个模块"),如果缺乏控制,可能消耗 50 万到 200 万 token 。以 Claude Opus 定价计算(15/M input tokens, 75/M output tokens),单次任务成本在 10-50 之间。

更可怕的是无限循环 ------ 如果 Agent 陷入循环,成本会线性甚至指数增长,且没有任何产出。

解决方案

1. 预算上限(Budget Cap)

最有效的成本控制手段------设置绝对的 token 预算上限:

python 复制代码
class TokenBudget:
    def __init__(self, max_tokens: int = 200_000):
        self.max_tokens = max_tokens
        self.used_tokens = 0
​
    def consume(self, tokens: int):
        self.used_tokens += tokens
        if self.used_tokens > self.max_tokens:
            raise BudgetExceededError(
                f"Token 预算耗尽: {self.used_tokens}/{self.max_tokens}"
            )
​
    def remaining(self) -> int:
        return max(0, self.max_tokens - self.used_tokens)
​
    def warn_if_low(self, threshold: float = 0.8):
        if self.used_tokens / self.max_tokens > threshold:
            return "预算即将耗尽,请尽快完成当前任务并给出结果"
        return None

将剩余预算注入到 Agent 的上下文中,让模型自己感知紧迫度:

复制代码
⚠️ 剩余 Token 预算: 35,000 / 200,000 (17.5%)
请加速完成任务,优先给出最重要的结果,省略非关键细节。
2. 模型分层策略

不是每个步骤都需要最强的模型。按任务复杂度路由到不同模型:

复制代码
任务复杂度评估 → 模型选择
​
简单任务(文件读取、简单搜索):
  → Haiku / 轻量模型 ($0.80/$4 per MTok)
​
中等任务(代码分析、逻辑推理):
  → Sonnet / 中等模型 ($3/$15 per MTok)
​
复杂任务(架构设计、多步规划):
  → Opus / 最强模型 ($15/$75 per MTok)

实际落地策略:默认使用中等模型,仅在 Agent 自我评估"需要更深推理"时升级。

3. 批量化与缓存

Prompt Caching:工具定义和系统提示通常占据总 token 消耗的 30-50%,使用缓存可节省 90% 的这部分成本。

批量写入:合并多个小修改为一次操作:

复制代码
❌ 分散的 5 次操作:
  write("a.py", new_line_1)  → 500 tokens
  write("a.py", new_line_2)  → 500 tokens
  write("b.py", new_line_3)  → 500 tokens
  write("b.py", new_line_4)  → 500 tokens
  write("c.py", new_line_5)  → 500 tokens
  Total: 2,500 tokens(不含上下文)
​
✅ 合并为 1 次:
  plan(修改 a.py 的 2 处, b.py 的 2 处, c.py 的 1 处)
  → 然后按计划执行
  Total: ~800 tokens(不含上下文)
4. 早期退出(Early Exit)

如果 Agent 在早期步骤就已经完成了核心目标,立即停止:

python 复制代码
def should_early_exit(agent_state: dict) -> bool:
    """检查是否可以提前结束"""
    # 条件1:已收集足够信息
    if len(agent_state["findings"]) >= target_count:
        return True
​
    # 条件2:后续步骤边际收益递减
    if agent_state["steps_without_new_info"] >= 3:
        return True
​
    # 条件3:关键指标已达阈值
    if agent_state["test_pass_rate"] >= 0.95:
        return True
​
    return False
5. 成本监控与告警

实时监控每个 Agent 任务的成本,异常时触发告警:

python 复制代码
class CostMonitor:
    def __init__(self):
        self.tasks: dict[str, CostRecord] = {}
​
    def track(self, task_id: str, tokens_in: int, tokens_out: int, model: str):
        cost = self._calculate_cost(tokens_in, tokens_out, model)
        self.tasks[task_id].add(cost)
​
        # 按任务类型的成本阈值告警
        if cost > self.get_threshold(task_id):
            alert(f"任务 {task_id} 成本异常: ${cost:.2f}")
​
    def daily_report(self):
        """日报:按用户/任务类型/模型维度的成本分布"""
        return self.aggregate(by=["user", "task_type", "model"])
6. 成本感知的 Agent 设计

在设计 Agent 的提示词时,融入成本意识:

复制代码
你是一个高效且注重成本控制的助手:
​
1. 在读取文件时,默认只读 200 行,除非确实需要更多
2. 先搜索定位,再精确读取,不要盲目遍历整个代码库
3. 工具返回的结果只需引用关键片段,不要全文复述
4. 如果任务有 N 个子任务,优先完成最重要的 2-3 个
5. 每次行动前问自己:这步操作能用更便宜的方式完成吗?
​
预算感知:当前任务预算为 100,000 tokens,请合理分配。

总结:构建可靠 Agent 的黄金法则

回顾五大难点与解决方案,可以提炼出构建生产级 Agent 的核心原则:

原则 核心思想
设限 步数上限、Token 预算、超时机制 ------ 永远不要让 Agent 无限运行
分层 工具分层、模型分层、上下文分层 ------ 不同复杂度用不同资源
防御 循环检测、工具验证、熔断器 ------ 每层都要有保护机制
降级 优雅降级、备选方案、检查点恢复 ------ 失败不意味着重来
监控 成本追踪、性能指标、异常告警 ------ 看不见就无法改进
迭代 从简单场景开始,逐步增加复杂度 ------ 不要把 Agent 当成黑盒

最后记住一句话:

Demo 级的 Agent 是魔法,生产级的 Agent 是工程。

要让魔法稳定地工作,你需要工程化的思维、分层的架构,以及面对每一个边界情况的耐心。

构建 Agent 的路上没有银弹,但有了这些方法和工具,你可以少踩很多坑。希望这篇文章能为你的 Agent 开发之旅提供一些帮助。


如果这篇文章对你有帮助,欢迎分享给一起做 Agent 的同事。也欢迎在评论区讨论你在构建 Agent 时遇到的其他难点和解决方案。

相关推荐
Demons_kirit43 分钟前
图库原理(以阿里云OSS为案例)
java·阿里云·云计算
SimonKing1 小时前
那个号称"对标 Spring"的国产框架 Solon,到底行不行?
java·后端·程序员
Lethehong1 小时前
飞算Java:从需求梳理到风险闭环,搭建云盾企业信息安全与权限管理平台
java·开发语言
霸道流氓气质1 小时前
SpringBoot中使用字典驱动的动态路由示例
java·spring boot·后端
2601_958352901 小时前
从智能安防到矿山预警:AR1105声源定位模组的行业应用与架构解析
人工智能·嵌入式硬件·架构·机器人·回音消除·声源定位
苏州邦恩精密1 小时前
蔡司3D扫描仪厂家服务解析:制造企业如何实现精准检测
人工智能·机器学习·3d·自动化·制造
海外数字观察家1 小时前
品未云:泰国华商批发零售一体化 ERP,破解本土软件适配难题|CSDN 技术分享
网络·数据库·人工智能
学计算机的计算基1 小时前
操作系统八股文:进程与线程全面梳理(附调度算法+IPC+锁机制)
java·算法