Dify 中级实验(17):调试监控与性能优化——响应慢和 Token 超支如何定位?

Dify 中级实验(17):调试监控与性能优化------响应慢和 Token 超支如何定位?

Dify 实验系列 · 中级 17/20 | 实验编号:DIFY-102-18

基于 Dify 1.16.1 实测(2026-08)

1. 业务场景

先讲一个我们实际遇到的场景。

一家公司的 AI 客服应用上线一个月,运营团队开始收到三种投诉:一是回答质量时好时坏 ------同一个问题,昨天答得对,今天答得驴唇不对马嘴;二是响应越来越慢 ------原来 3 秒出结果,现在动不动 15 秒,用户等得不耐烦直接关掉;三是成本失控------月底一看账单,Token 消耗比预算翻了 3 倍。技术团队想排查,打开运行日志却不知道从哪看起:哪一步慢、哪一步消耗了多少 Token、LLM 到底收到了什么输入------全是黑盒。

我们第一次接这类需求时,第一反应也是「打开运行日志慢慢翻不就行了」。真正打开才发现------日志堆成山,中间变量却全是黑盒:哪一步慢、消耗了多少 Token、LLM 到底收到了什么输入,全都看不见。

这不是个例。任何「应用上线进入生产运行」的场景都是这个模式:回答质量波动、响应变慢、Token 超支,这三类高频生产问题几乎每个 Dify 应用都会遇到------「出了问题怎么查」和「没问题时怎么盯」是生产运维的两个基本功

2. 场景痛点

这个场景的痛点,在这家公司的客服应用上体现得最直接:

  • 回答质量差,时好时坏:同一问题答案不稳定,用户觉得机器人不可信------但排查时看不到 LLM 的输入上下文,不知道是提示词问题还是检索文档变了。
  • 响应慢,定位不到瓶颈:从 3 秒变 15 秒,不知道慢在哪一步------是 LLM 推理慢、知识库检索慢、还是代码节点卡住,没有节点级耗时数据,只能盲猜。
  • Token 超支,月底才知道:成本翻 3 倍才发现,没有 Token 估算和预警,等账单出来已经来不及优化。
  • 中间变量不可见:节点之间的数据流转是黑盒,出了问题只能靠猜,「输入不对」还是「逻辑不对」分不清。

本质上,「看不见就调不了」------调试的第一原则是把中间变量变成看得见的日志,80% 的问题出在「输入不对」而不是「输出有问题」

3. 方案:为什么是「调试分析工坊 + 系统健康检查」双应用

Dify 里解决「怎么查」和「怎么盯」两个问题,本实验拆成两个可独立运行的应用:调试分析工坊 (诊断链路------类型/长度检查、性能分析、Token 估算、LLM 诊断建议)和系统健康检查(监控链路------LLM 可达性、知识库检索、外部 API、综合评分)。

选它的理由:

  • 检查节点即插即用:把「看不见的中间变量」变成看得见的日志,随时插入到任何应用的关键节点后面,不影响主链路;
  • Token 有估算器兜底:成本失控前先用估算器算出消耗量级,超出 64K 上下文提前预警,而不是月底看账单;
  • 监控链路覆盖核心依赖:LLM、知识库、外部 API 三大件逐一巡检 + 综合评分,没问题时也能持续盯着。

这篇文章我们就用它搭这两个应用:「调试分析工坊」负责出了问题时逐环节体检,「系统健康检查」负责平时持续巡检。

4. 整体架构

调试分析工坊(6 节点 5 边,线性链路):
#mermaid-svg-Ez5Pj61S9Xn3W2Ks{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .error-icon{fill:#552222;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .marker.cross{stroke:#333333;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks p{margin:0;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .cluster-label text{fill:#333;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .cluster-label span{color:#333;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .cluster-label span p{background-color:transparent;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .label text,#mermaid-svg-Ez5Pj61S9Xn3W2Ks span{fill:#333;color:#333;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .node rect,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .node circle,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .node ellipse,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .node polygon,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .rough-node .label text,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .node .label text,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .image-shape .label,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .icon-shape .label{text-anchor:middle;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .rough-node .label,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .node .label,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .image-shape .label,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .icon-shape .label{text-align:center;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .node.clickable{cursor:pointer;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .arrowheadPath{fill:#333333;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .cluster text{fill:#333;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .cluster span{color:#333;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks rect.text{fill:none;stroke-width:0;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .icon-shape,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .icon-shape p,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .icon-shape .label rect,#mermaid-svg-Ez5Pj61S9Xn3W2Ks .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Ez5Pj61S9Xn3W2Ks :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 开始:input_text
类型与长度检查(Code:actual_type/length/preview/issues/passed)
性能分析(Code:total_duration_s/slowest_node/bottleneck)
Token估算(Code:estimated_tokens/pct_of_64k/overflow_64k)
诊断建议(LLM:综合三份检查结果输出诊断)
结束

系统健康检查(6 节点 5 边,串行巡检):
#mermaid-svg-DpRV7QzvVAGv6Gro{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DpRV7QzvVAGv6Gro .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DpRV7QzvVAGv6Gro .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DpRV7QzvVAGv6Gro .error-icon{fill:#552222;}#mermaid-svg-DpRV7QzvVAGv6Gro .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DpRV7QzvVAGv6Gro .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DpRV7QzvVAGv6Gro .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DpRV7QzvVAGv6Gro .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DpRV7QzvVAGv6Gro .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DpRV7QzvVAGv6Gro .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DpRV7QzvVAGv6Gro .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DpRV7QzvVAGv6Gro .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DpRV7QzvVAGv6Gro .marker.cross{stroke:#333333;}#mermaid-svg-DpRV7QzvVAGv6Gro svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DpRV7QzvVAGv6Gro p{margin:0;}#mermaid-svg-DpRV7QzvVAGv6Gro .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DpRV7QzvVAGv6Gro .cluster-label text{fill:#333;}#mermaid-svg-DpRV7QzvVAGv6Gro .cluster-label span{color:#333;}#mermaid-svg-DpRV7QzvVAGv6Gro .cluster-label span p{background-color:transparent;}#mermaid-svg-DpRV7QzvVAGv6Gro .label text,#mermaid-svg-DpRV7QzvVAGv6Gro span{fill:#333;color:#333;}#mermaid-svg-DpRV7QzvVAGv6Gro .node rect,#mermaid-svg-DpRV7QzvVAGv6Gro .node circle,#mermaid-svg-DpRV7QzvVAGv6Gro .node ellipse,#mermaid-svg-DpRV7QzvVAGv6Gro .node polygon,#mermaid-svg-DpRV7QzvVAGv6Gro .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DpRV7QzvVAGv6Gro .rough-node .label text,#mermaid-svg-DpRV7QzvVAGv6Gro .node .label text,#mermaid-svg-DpRV7QzvVAGv6Gro .image-shape .label,#mermaid-svg-DpRV7QzvVAGv6Gro .icon-shape .label{text-anchor:middle;}#mermaid-svg-DpRV7QzvVAGv6Gro .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DpRV7QzvVAGv6Gro .rough-node .label,#mermaid-svg-DpRV7QzvVAGv6Gro .node .label,#mermaid-svg-DpRV7QzvVAGv6Gro .image-shape .label,#mermaid-svg-DpRV7QzvVAGv6Gro .icon-shape .label{text-align:center;}#mermaid-svg-DpRV7QzvVAGv6Gro .node.clickable{cursor:pointer;}#mermaid-svg-DpRV7QzvVAGv6Gro .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DpRV7QzvVAGv6Gro .arrowheadPath{fill:#333333;}#mermaid-svg-DpRV7QzvVAGv6Gro .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DpRV7QzvVAGv6Gro .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DpRV7QzvVAGv6Gro .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DpRV7QzvVAGv6Gro .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DpRV7QzvVAGv6Gro .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DpRV7QzvVAGv6Gro .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DpRV7QzvVAGv6Gro .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DpRV7QzvVAGv6Gro .cluster text{fill:#333;}#mermaid-svg-DpRV7QzvVAGv6Gro .cluster span{color:#333;}#mermaid-svg-DpRV7QzvVAGv6Gro div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DpRV7QzvVAGv6Gro .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DpRV7QzvVAGv6Gro rect.text{fill:none;stroke-width:0;}#mermaid-svg-DpRV7QzvVAGv6Gro .icon-shape,#mermaid-svg-DpRV7QzvVAGv6Gro .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DpRV7QzvVAGv6Gro .icon-shape p,#mermaid-svg-DpRV7QzvVAGv6Gro .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DpRV7QzvVAGv6Gro .icon-shape .label rect,#mermaid-svg-DpRV7QzvVAGv6Gro .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DpRV7QzvVAGv6Gro .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DpRV7QzvVAGv6Gro .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DpRV7QzvVAGv6Gro :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 开始:force_check
LLM可达性检查(LLM:简单 ping)
知识库检索检查(知识检索:真实检索一次)
外部API模拟(Code:api_status/api_latency_ms/cache_mode/retrieved_count)
综合评分(LLM:汇总各组件状态打分)
结束

链路很清晰:调试工坊是「输入 → 类型检查 → 性能分析 → Token 估算 → LLM 诊断」的线性体检台;健康检查是「LLM → 知识库 → 外部 API → 综合评分」的串行巡检线------一个回答「出了问题怎么查」,一个回答「没问题时怎么盯」。

5. 模块设计

5.1 调试检查节点(Code)

在关键节点后插入检查节点,把「看不见的中间变量」变成看得见的日志------这是调试的第一原则(80% 的问题出在「输入不对」而不是「输出有问题」):

python 复制代码
def main(input_value: str) -> dict:
    actual_type = type(input_value).__name__
    is_string = isinstance(input_value, str)
    length = len(input_value) if is_string else "N/A"
    preview = str(input_value)[:200] if input_value else ""
    issues = []
    if not is_string:
        issues.append("类型不匹配: 期望 str, 实际 {}".format(actual_type))
    if is_string and len(input_value) == 0:
        issues.append("空字符串")
    if is_string and len(input_value) > 10000:
        issues.append("内容过长: {} 字符".format(len(input_value)))
    issues_text = "; ".join(issues) if issues else "无问题"
    return {
        "actual_type": actual_type,
        "length": str(length),
        "preview": preview,
        "issues": issues,
        "issues_text": issues_text,
        "passed": "true" if len(issues) == 0 else "false"
    }

注意:passed 必须展平成 string "true"/"false"(boolean 在节点间不可见);issues 数组给结构消费,issues_text 给 LLM 直接引用。

5.2 Token 估算节点(Code)

Token 是钱------成本失控前先用估算器兜底。中英文混合按 1.8 字符/token 折中:

python 复制代码
def main(input_text: str) -> dict:
    total_chars = len(input_text or "")
    estimated_tokens = int(total_chars / 1.8)
    pct_64k = round(estimated_tokens / 64000 * 100, 1)
    overflow_64k = estimated_tokens > 64000
    if overflow_64k:
        capacity_note = "超出 64K 上下文容量,需要精简输入"
    else:
        capacity_note = "在 64K 上下文容量内,运行正常"
    return {
        "estimated_tokens": estimated_tokens,
        "context_chars": total_chars,
        "pct_of_64k": pct_64k,
        "overflow_64k": "true" if overflow_64k else "false",
        "capacity_note": capacity_note
    }

5.3 知识库检索检查(系统健康检查)

健康检查里的知识库探测要用真实检索节点 ,而不是代码模拟------检索节点配 output_retrieval_result: true,否则 result 返回空列表,下游拿不到任何东西:

yaml 复制代码
type: knowledge-retrieval
dataset_ids:
- 459c4981-6b76-43e7-b44f-c430f33ef035   # 导入后按实际知识库替换
retrieval_mode: single
output_retrieval_result: true            # ⚠️ 漏了它,result 恒为空

6. 运行验证

应用 输入 预期 实测结果
调试分析工坊 空字符串 passed=false,issues 含「空字符串」 类型检查正确标记 ✓
调试分析工坊 长文本(如 5 万字文章) Token 估算超 64K,overflow_64k=true,提示精简 估算值与人工估算一致 ✓
系统健康检查 勾选 force_check 四组件全部巡检,综合评分输出 LLM 汇总各组件状态生成评分 ✓

7. 实战坑

现象 修复
code 里 "\n" 被拆成跨行字符串 Python 源码 SyntaxError: unterminated string literal,节点运行 failed 分隔符必须单行写 "\n";写完用本地 exec() 实跑一遍再导入
调试节点不本地实跑直接导入 报错要到运行日志才暴露,来回改浪费轮次 提取 code + mock 输入本地 exec() 验证(CSV/JSON 解析、统计逻辑尤其要跑)
检查文本变量用 text-input 粘贴长文本报「must be less than 48 characters」 改 paragraph + max_length: 10000
知识库检索节点漏 output_retrieval_result [kb, result] 返回空列表,下游拿不到文档 显式设 true(chatflow 的 context 模式可省略,workflow 必查)
诊断 LLM 未开推理标签分离 输出混入思考过程,展示给用户的是「草稿+答案」 LLM 输出直接展示/被下游判断的,一律 reasoning_format: separated
回答质量差的排查顺序 只盯着 LLM 提示词改,问题依旧 先看日志里 LLM 输入上下文是否一致 → 再看知识库每次检索文档是否一致 → 最后调 Temperature(0.8→0.3)

采坑点来自本实验 DSL 生成与运行验证的真实记录(跨行字符串 5 处、本地实跑自检法、output_retrieval_result、reasoning_format)。

8. 实验文档及源码获取

文章聚焦核心配置与采坑点;实验文档还包含日志阅读技巧、节点级耗时分析、质量评分子工作流(5 维度打分)与定时健康检查(trigger-schedule)的完整设计。


下一篇:Dify 中级实验(18):插件开发入门------如何把工作流变成 Agent 可调用的工具?

💬 你在这个实验的场景里踩过什么坑?欢迎评论区分享你的实战经验。

相关推荐
小田学Python3 小时前
重新定义 Agent:为什么大模型不能直接干活,需要一层“壳”
大模型·api·ai agent
jufeng13074 小时前
【系列:手搓自主 AI Agent:Hermes 架构原理剖析 · 第 7 篇】
python·ai agent·权限系统
啾啾Fun4 小时前
【AI原生组织】6-AI Native团队组建与基础设施搭建
人工智能·chatgpt·ai-native·ai agent·ai原生组织·人机混编
阿图灵4 小时前
Agentic AI 架构入门(九):Agent 通信协议全景——ACP/A2A/AG-UI/MCP
人工智能·ui·架构·ai agent·智能体·mcp·agentic ai
鱼日先生7 小时前
Dify 高级实验(09):测试用例生成——如何让 AI 自动产出测试用例?
人工智能·测试用例·工作流·dify·ai agent·大模型应用·ai 训练
鱼日先生7 小时前
Dify 企业级实验(03):事件驱动流水线——Webhook 与定时触发如何组成异步处理链?
人工智能·工作流·dify·ai agent·大模型应用·ai 训练
阿图灵11 小时前
Agentic AI 架构完整学习手册(课程精华全收录)
架构设计·ai agent·智能体·agentic ai·完整手册
阿图灵11 小时前
Agentic AI 架构入门(十二·完结):ADLC、AgentOps 与企业级平台蓝图
人工智能·架构·ai agent·智能体·agentops·agentic ai·adlc
可乐ea11 小时前
MCP 是什么:Agent 如何通过标准协议连接工具和外部服务
ai agent·mcp·tool calling