【Agent Harness 架构手册 #04】企业级 Agent 零信任权限审计与 AST 行级安全注入:防止长对话中途撤权泄密

SqlSugar 是 .NET 开源的 ORM 框架,由 Fructose 大数据技术团队维护和更新,开箱即用最易用的 ORM 低代码 高性能 超级简单 功能全面 [多数据库兼容] SqlSugar 是 .NET 开源的 ORM 框架,由 Fructose 大数据技术团队维护和更新,开箱即用最易用的 ORM。[低代码] [高性能] [超级简单] [功能全面] [多数据库兼容] [合适产品]。支持.NET.net framework.net core3.1.ne5.net6.net7.net8 .net9 .net10。支持数据库 MySql、SqlServer、Sqlite、Oracle、postgresql、达梦、Mongodb 人大金仓(国产推荐)、神通数据库、瀚高、Access DB2、DuckDb、Hana、OceanBase TDengine QuestDb Clickhouse MySqlConnector、华为 GaussDB 南大通用 GBase、MariaDB、Tidb、Odbc、Percona Server, Amazon Aurora、Azure Database for MySQL、 Google Cloud SQL for MySQL、自定义数据库。真正实现零SQL ORM表构建、索引和CRUD支持。Support.NET 数百万大数据写入、更新、子表,拥有数十亿查询统计数据成熟解决方案。支持SAAS完整应用:跨数据库查询、审计、租户子数据库、租户子表和租户数据隔离。支持低代码 + 工作流程(动态类构建、动态表构建、非实体多库兼容 CRUD、JSON TO SQL、CUSTOM XML 等)。支持 ValueObject、判别器、仓库、UnitOfWork、DbContext、AOP 立即下载

玄同 765

AI Engineer


  中国传媒大学 | 数字媒体技术(游戏设计技术方向)

  ▍深耕领域  AI Agent 架构设计 Agent Harness 工程 Context Engineering 多智能体协同 & RAG
  ▍技术底座  Python TypeScript · LangChain MCP & Skills · FastAPI Milvus Docker
  ▍工程能力  专注 Agent 运行时架构、长上下文与 Prompt Cache 优化、LLM 全链路评测与工程化落地

     

「 让 AI 交互更智能,让技术落地更高效 」   |   欢迎技术探讨 / 项目合作,关注解锁大模型与智能交互的无限可能!

【Agent Harness 架构手册 #04】企业级 AI Agent 零信任权限审计链(Permission Evidence)与 AST 行级安全注入:防止长对话中途“权限收回后越权泄密”

📚 《Agent Harness 架构手册:构建高可靠 AI 智能体运行时》五篇连载导航

在前几篇连载中,我们先后搭建了 动态工具配额守卫(#01)、声明式 Action Feed 实时动态流(#02) 与 L1~L4 四级无损历史投影引擎(#03)。当这套 Agent 系统真正进入金融、电商、政企等生产环境时,信息安全团队(SecOps)往往会抛出三个能直接一票否决上线的灵魂拷问:

  1. 长对话中途“权限撤回”引发的上下文残留泄密:
    假设分析师小张在第 1 轮对话时拥有 华东区 + 华南区 权限,Agent 调用工具查出了华东区的核心营收明细并留在了多轮对话历史里;到了第 3 轮,管理员在后台紧急收回了小张的 华东区 权限。此时小张不调任何新工具,直接问一句:“把你第 1 轮查出来的华东区前 5 名大客户再给我列一下”——如果只拦截工具调用而不治理历史消息,大模型会直接看着第 1 轮的历史记录把已撤权的机密数据背出来!
  2. 工具执行一半时权限发生变更(TOCTOU 竞态漏洞):
    某条复杂 SQL 查询耗时 6 秒,在第 1 秒发起查询时用户还有权限,第 3 秒管理员撤回了权限,第 6 秒查询结果返回——怎么保证这条“执行中途失权”的数据绝对不会进入 ToolMessage 和前端事件流?
  3. 靠 Prompt 叮嘱模型“记得加 WHERE region = '华南'”形同虚设:
    把行级权限(Row-Level Security)写在 System Prompt 里让大模型自己拼 SQL,一旦遇到 UNION ALL、公用表表达式(WITH cte AS ...)或子查询,模型极易漏加过滤条件甚至被 Prompt 注入绕过!

本文将带你从零实现企业级 「三重零信任权限审计链中间件(Permission Evidence Middleware)」 + 「基于权限代次(Grant Epoch)的旧上下文自动隔离」 + 「基于 sqlglot AST 语法树的确定性行级过滤强制注入」,打造滴水不漏的 Fail-Closed 安全防线!


一、为什么“只在工具入口查一次权限”挡不住大模型泄密?(原理拆解篇)

1.1 从“机密档案室的门禁卡注销”与“手里已复印出的旧文件”说起

为什么传统 Web 后端那套“在 API 入口加一个 @require_permission 装饰器”的做法,搬到多轮对话 AI Agent 里会彻底失效?

想象一下机密档案室的管理制度:

  • 传统 Web 接口(单次无状态请求):你刷门禁卡进门,拿一份文件出来。只要把你的门禁卡注销,你下一次就进不去门了。
  • 多轮对话 AI Agent(带记忆的有状态推理):
    1. 手里还捏着上一轮复印出来的旧档案(历史消息残留):小张虽然门禁卡被改成了“仅限华南区”,但他和小秘书(LLM)的办公桌上(messages 历史上下文里),还摊着 5 分钟前刚印出来的《华东区绝密名单》。只要小张开口问小秘书,小秘书根本不用再去刷门禁卡调工具,低头看一眼桌面就能把名单念出来!
    2. 进门时卡有效,出门时卡已注销(工具执行期竞态):小秘书刷卡进档案室找资料花了 10 秒钟,第 5 秒时保安在后台注销了这张卡。如果不在出门(结果写入 ToolMessage 并推送前端)前再验一次卡,绝密资料照样会被带出房间!

因此,生产级 Agent 的权限控制必须升级为 「全生命周期权限纪元(Grant Epoch)+ 三重实时核验 + AST 语法树硬改写」 架构:

升级为零信任 Agent 安全底座

✅ 生产级 Fail-Closed 方案:零信任权限审计链 + 代次隔离 + AST 注入

权限版本号 permission_grant_version
变更即开启新代次 (New Epoch)
自动遮罩旧代次敏感工具输出

三重实时核验:
1. 模型调用前 (awrap_model_call)
2. 工具执行前 3. 结果发布前

可信证据戳 (Evidence Stamp)
仅通过发布前复核的结果才向前端派发

sqlglot AST 语法树改写
将视图引用安全包裹为带行级过滤的子查询

❌ 传统脆弱方案:Prompt 软约束 + 仅在工具入口查一次权限

在 Prompt 里叮嘱模型加 WHERE
遇子查询或注入瞬间绕过

仅在工具执行前查一次权限
无法拦截执行中途的权限撤回

权限变更后旧轮次 ToolMessage 仍在上下文中
模型直接复述历史机密数据


1.2 四种 Agent 数据安全与权限控制方案全景对比

在企业级 Data Agent 架构选型中,我们将四种常见的权限控制层级对比如下:

方案名称行级过滤实现方式能否防御长对话中途撤权泄密?能否防御工具执行期并发撤权(TOCTOU)?对复杂 SQL(CTE / UNION)安全性推荐指数
方案 A:Prompt 软提示词约束让 LLM 自己往生成的 SQL 里拼 WHERE否否极差(100% 可被诱导绕过)⭐
方案 B:正则表达式拼接 WHERE用字符串替换在 SQL 末尾追加 AND ...否否差(遇到 GROUP BY / LIMIT / UNION 直接语法报错或逻辑错乱)⭐⭐
方案 C:仅在工具函数入口做 RBAC 校验工具执行前查表级权限否(历史轮次里的旧结果仍对模型可见)否(长耗时查询返回时不复核)中⭐⭐⭐
方案 D:三重证据链 + 权限代次隔离 + AST 注入(本文方案)sqlglot AST 将目标表替换为受限安全子查询100% 防御(版本变更自动遮罩旧代次结果并注入证据清单)100% 防御(工具返回后、入模前二次复核 verify_grant_still_valid)极高(语法树级等价重写,天然免疫注入)⭐⭐⭐⭐⭐

💡 核心安全铁律:

  1. 永远只从受保护的隐藏运行时上下文(runtime.context)读取用户身份与权限,严禁从大模型生成的工具参数或对话消息中推导权限!
  2. 任何未经“发布前二次核验”的工具输出,严禁进入 ToolMessage 或通过 on_tool_end 暴露给前端!

二、基础篇:3 分钟实现“三重实时权限核验”与可信证据戳(RealtimeAccessEnforcerMiddleware)

我们先来构建第一道核心防线:怎么保证在一次 agent.run() 的每一个关键节点(调模型前、调工具前、工具返回后),一旦后台权限发生任何风吹草动,立即阻断或标记证据状态?

2.1 为什么要单独派发 permission_tool_result 而不是直接用 on_tool_end?

这是一个极其关键的工程细节!
在 LangChain / LangGraph 中,BaseTool 自身的 on_tool_end 回调是在工具函数 func() 刚刚 return 的那一瞬间触发的——此时外层的 AgentMiddleware.awrap_tool_call 还没来得及执行“结果发布前二次权限核验(Post-Execution Check)”!
如果在那短短几秒内管理员刚刚撤回了用户的权限,直接监听 on_tool_end 的宿主服务就会把未通过二次核验的数据泄露给前端!

因此,我们在中间件里遵循如下严格时序:

  1. await run.verify_grant_still_valid()(第 1 次核验:工具执行前);
  2. result = await handler(request)(执行底层工具);
  3. await run.verify_grant_still_valid()(第 2 次核验:工具返回后、结果发布前!若此时发现权限版本号 permission_grant_version 已变更,直接抛出异常中断,绝不让结果进入 ToolMessage);
  4. 为结果打上不可伪造的 [可信证据标识](Permission Evidence Record),并显式派发经过二次核验的自定义事件 permission_tool_result!
2.2 完整可复用代码:ZeroTrustAccessGuard 与三重核验中间件
from __future__ import annotations
import hashlib, json, time
from dataclasses import asdict, dataclass, field
from typing import Any, Awaitable, Callable
from langchain_core.messages import SystemMessage, ToolMessage

# 需要纳入零信任权限审计链监管的敏感数据工具集合
PROTECTED_DATA_TOOLS = frozenset({
    "execute_sql_query",
    "search_data_catalog",
    "inspect_table_schema",
    "run_python_sandbox",
    "read_sandbox_output",
})

class AccessRevokedException(RuntimeError):
    """当检测到用户权限版本号(permission_grant_version)在运行期发生变更时抛出。"""

@dataclass(frozen=True)
class AccessAuditEntry:
    """单次受保护工具调用的可信权限证据戳。"""
    op_name: str
    tool_call_id: str
    permission_grant_version: str
    output_sha256: str
    verified_at: float
    status: str = "valid"

@dataclass
class ZeroTrustAccessGuard:
    """绑定在单次运行隐藏上下文(runtime.context)中的权限核验器。"""
    user_id: str
    tenant_space_id: str
    initial_grant_version: str
    fetch_current_grant_version: Callable[[], Awaitable[str]]
    prior_valid_refs: list[str] = field(default_factory=list)
    revoked_refs: list[str] = field(default_factory=list)
    audit_log_entries: list[AccessAuditEntry] = field(default_factory=list)

    async def verify_grant_still_valid(self) -> None:
        """实时向权限中心/缓存核对当前最新 permission_grant_version,若不一致立即 Fail-Closed 中断。"""
        latest_rev = await self.fetch_current_grant_version()
        if latest_rev != self.initial_grant_version:
            raise AccessRevokedException(
                f"用户 {self.user_id} 权限版本已在运行期变更 ({self.initial_grant_version} -> {latest_rev}),已安全中止当前操作。"
            )

    def append_audit_entry(self, op_name: str, tool_call_id: str, text: str, status: str = "success") -> AccessAuditEntry | None:
        if status == "error" or text.lstrip().lower().startswith(("error:", "sql error:")):
            return None
        digest = hashlib.sha256(text.encode("utf-8")).hexdigest()[:16]
        rec = AccessAuditEntry(
            op_name=op_name,
            tool_call_id=tool_call_id,
            permission_grant_version=self.initial_grant_version,
            output_sha256=digest,
            verified_at= round(time.time(), 3),
        )
        self.audit_log_entries.append(rec)
        return rec

    def build_evidence_prompt(self) -> str:
        """生成注入到 SystemMessage 尾部的可信权限证据清单提示。"""
        if not self.prior_valid_refs and not self.revoked_refs:
            return ""
        lines = ["\n## 零信任权限审计链安全约束(Fail-Closed)"]
        lines.append(f"- 当前生效权限版本纪元(Epoch):`{self.initial_grant_version}`")
        if self.revoked_refs:
            lines.append(
                f"- 已失效/被撤权的历史调用引用:`{', '.join(self.revoked_refs)}`"
                "(严禁引用、复述或推断上述已失效调用的任何数据内容,需重新调用工具获取当前授权范围内的数据!)"
            )
        return "\n".join(lines)

class RealtimeAccessEnforcerMiddleware:
    """在模型调用前、受保护工具执行前后分别执行 Fail-Closed 权限核验的中间件。"""

    @staticmethod
    def _get_run(request: Any) -> ZeroTrustAccessGuard | None:
        # 严禁从模型消息或工具参数中读取权限对象,仅从宿主隐藏 runtime.context 读取
        ctx = getattr(getattr(request, "runtime", None), "context", None)
        return ctx.get("access_audit_trail") if isinstance(ctx, dict) else None

    async def awrap_model_call(self, request: Any, handler: Callable[[Any], Awaitable[Any]]) -> Any:
        run = self._get_run(request)
        if run is not None:
            # 核验点 1:每次请求大模型前校验实时权限版本,并注入新旧证据可信清单
            await run.verify_grant_still_valid()
            prompt_addon = run.build_evidence_prompt()
            if prompt_addon:
                sys_msg = request.system_message
                old_text = sys_msg.content if sys_msg and isinstance(sys_msg.content, str) else ""
                request = request.override(system_message=SystemMessage(content=old_text + prompt_addon))
        return await handler(request)

    async def awrap_tool_call(self, request: Any, handler: Callable[[Any], Awaitable[Any]]) -> Any:
        run = self._get_run(request)
        op_name = request.tool_call["name"]
        if run is None:
            return await handler(request)

        # 核验点 2:工具真实执行前校验权限
        await run.verify_grant_still_valid()
        result = await handler(request)
        # 核验点 3:工具执行返回后、写入 ToolMessage 前二次复核!杜绝执行期并发撤权泄密
        await run.verify_grant_still_valid()

        if op_name not in PROTECTED_DATA_TOOLS or not isinstance(result, ToolMessage):
            return result

        text = result.content if isinstance(result.content, str) else json.dumps(result.content, ensure_ascii=False)
        rec = run.append_audit_entry(op_name, request.tool_call["id"], text, getattr(result, "status", "success"))
        if rec is not None:
            artifact = dict(result.artifact) if isinstance(result.artifact, dict) else {}
            artifact["access_audit_trail"] = asdict(rec)
            suffix = "\n[可信证据标识] " + json.dumps(asdict(rec), ensure_ascii=False)
            result = result.model_copy(update={"content": text + suffix, "artifact": artifact})
        return result

三、进阶篇:权限代次(Grant Epoch)隔离与历史上下文自动脱敏实战

现在我们解决文章开头提出的第 1 个尖锐问题:当用户在第 1~2 轮时的权限版本是 rev_v1,到了第 3 轮管理员改了他的权限,使他的实时权限版本变成了 rev_v2(开启了新的权限代次 Grant Epoch)。此时回放第 1~2 轮历史消息时,怎么防止旧代次的机密数据流入第 3 轮的大模型?

3.1 全链路架构拆解:跨权限代次(Cross-Epoch)的历史证据清洗与压缩继承

我们在回放历史消息(结合上一篇 #03 的 Context Engine v2)时,对每一条历史 ToolMessage 检查它身上的 [可信证据标识]:

  1. 同代次放行(Same Epoch):如果历史工具结果的 permission_grant_version == current_grant_version,说明权限未发生变更,正常按 L1/L2 规则回放;
  2. 跨代次自动遮罩(Cross-Epoch Redaction):如果历史工具结果的 permission_grant_version != current_grant_version(或者缺失可信证据标识),说明该结果产出于已过期的旧权限代次!系统立即将其正文替换为:
    [历史结果已因权限版本变更而隔离|tool=execute_sql_query|old_rev=rev_v1 -> current_rev=rev_v2|请重新调用工具获取当前权限范围的数据],同时将该 tool_call_id 记入 revoked_refs!
  3. 新代次内恢复压缩(Epoch-Scoped Compaction):在做上下文检查点摘要压缩时,摘要生成器的采样起点自动锚定在当前最新权限代次的第一条消息,绝不把旧代次的敏感数字混入新代次的文本摘要中!

当前轮大模型推理 (Fail-Closed)

模型看到旧轮次已被安全隔离

自动重新调用 execute_sql_query
在最新 rev_v2 权限下仅查出华南区数据!

跨代次历史回放清洗器 (Grant Epoch Sanitizer)

否 (属于旧代次 rev_v1)

是 (同代次有效证据)

扫描历史 ToolMessage 的证据戳
对比 msg.rev 与 current_rev (rev_v2)

msg.rev === rev_v2 ?

1. 遮罩旧 ToolMessage 正文为隔离提示
2. 剥离旧 Assistant 回答中的具体敏感数值
3. 记入 revoked_refs 清单

正常进入 L1~L4 预算投影回放

数据库中存储的多轮历史记录 (含不同时期的权限证据戳)

Turn 1 (权限版本 = rev_v1)
ToolMessage: 华东+华南完整明细
[可信证据标识: rev_v1]

管理员在后台收回华东区权限
用户实时权限版本升为 rev_v2

Turn 2 (当前新提问)
实时权限版本 = rev_v2

3.2 完整可复用代码:跨权限代次(Grant Epoch)历史清洗器
EVIDENCE_MARKER = "\n[可信证据标识] "

def parse_message_evidence(content: str) -> tuple[str, dict[str, Any] | None]:
    """从 ToolMessage 内容尾部解析并分离 (纯正文, 可信证据字典)。"""
    text = str(content or "")
    if EVIDENCE_MARKER not in text:
        return text, None
    body, raw_json = text.rsplit(EVIDENCE_MARKER, 1)
    try:
        ev = json.loads(raw_json.strip())
        return body, ev if isinstance(ev, dict) else None
    except Exception:
        return body, None

def sanitize_history_by_permission_epoch(
    messages: list[dict[str, Any]],
    *,
    current_grant_version: str,
) -> tuple[list[dict[str, Any]], list[str], list[str]]:
    """
    按当前实时权限版本号(current_grant_version)清洗历史消息链:
    - 同代次(grant_version 一致)的受保护工具结果予以保留;
    - 跨代次(旧 grant_version 或无证据戳)的受保护工具结果强制遮罩,防止撤权后上下文残留泄密。
    返回: (清洗后的消息列表, 有效引用列表 prior_valid_refs, 已撤权引用列表 revoked_refs)
    """
    sanitized: list[dict[str, Any]] = []
    valid_refs: list[str] = []
    revoked_refs: list[str] = []
    tainted_turn = False

    for msg in messages:
        role = msg.get("role")
        if role == "user":
            tainted_turn = False
            sanitized.append(dict(msg))
            continue

        if role == "tool":
            t_name = str(msg.get("name") or "")
            call_id = str(msg.get("tool_call_id") or "")
            body, ev = parse_message_evidence(str(msg.get("content") or ""))

            if t_name in PROTECTED_DATA_TOOLS:
                msg_rev = ev.get("permission_grant_version") if ev else None
                if msg_rev == current_grant_version:
                    valid_refs.append(call_id)
                    sanitized.append({**msg, "content": body})
                else:
                    # 检测到跨权限代次!立即执行 Fail-Closed 遮罩
                    revoked_refs.append(call_id)
                    tainted_turn = True
                    masked_text = (
                        f"[安全隔离:该历史工具结果产出于旧权限版本 ({msg_rev or 'unverified'}),"
                        f"当前生效权限版本为 ({current_grant_version})。旧数据已隐藏,请重新调用 {t_name} 查询最新授权数据。]"
                    )
                    sanitized.append({**msg, "content": masked_text})
            else:
                sanitized.append({**msg, "content": body})
            continue

        if role == "assistant" and tainted_turn and not msg.get("tool_calls"):
            # 若该轮包含已被撤权隔离的敏感查询,对当时生成的最终文本回答同步加上重查警示
            sanitized.append({
                **msg,
                "content": "[注:本轮历史回答基于变更前的旧权限数据生成,数值已隐藏,后续提问请重新调用查询工具核实。]",
            })
            continue

        sanitized.append(dict(msg))

    return sanitized, valid_refs, revoked_refs

四、高阶技巧:基于 sqlglot AST 语法树的确定性行级安全(RLS)强制注入

解决了上下文层的权限代次隔离后,我们再来加固最底层的 SQL 执行引擎:当模型生成了一条复杂的 SQL 查询(可能包含多表 JOIN、子查询、CTE (WITH ...) 甚至 UNION)时,怎么在不依赖大模型自觉性的前提下,100% 强制把用户的行级权限过滤条件(如 region IN ('华南', '西南') AND dept_id = 102)注入进去?

4.1 为什么不能直接往外层 WHERE 拼字符串,而必须做“表节点子查询包裹”?

假设用户的行级权限规则是:访问订单视图 dw_orders 时,必须满足 region = '华南'。
如果大模型写了一条带 LEFT JOIN 或 WITH 的 SQL:

WITH top_regions AS (
    SELECT region, SUM(amount) AS total_amt FROM dw_orders GROUP BY region
)
SELECT * FROM top_regions

如果你只是呆板地在整条 SQL 的最外层加一个 WHERE region = '华南',在有些聚合或排名(如 RANK() OVER (ORDER BY amount DESC))场景下,模型依然能通过排名序号推算出华东区的业绩排第几!
更安全、更彻底的做法是:利用 sqlglot 将 SQL 解析为抽象语法树(AST),遍历所有 exp.Table 节点(排除 CTE 别名),直接把目标表 dw_orders 原地替换为一个内联受限子查询 (SELECT * FROM dw_orders WHERE region = '华南') AS dw_orders!

3. 最终发往数据库的受控 SQL (支持跨方言转译)

在数据源最底层先完成行级裁剪
上层聚合、窗口函数与 JOIN 绝对看不到越权行!

2. sqlglot AST 语法树级安全改写器 (Row-Level Filter Policy)

解析为 sqlglot AST 语法树
校验仅允许单条 SELECT / UNION 查询

收集所有 WITH (CTE) 临时表名
避免误替换内部 CTE 别名

定位真实物理表/视图节点 dw_orders
读取当前用户对该表的 RowFilter 规则

将该 Table 节点原地替换为受限子查询:
(SELECT * FROM dw_orders WHERE region = '华南') AS dw_orders

1. 模型生成的原始查询 SQL (含 CTE 与聚合窗口函数)

SELECT region, RANK() OVER (ORDER BY gmv DESC)
FROM dw_orders

4.2 完整可复用代码:基于 sqlglot 的 AST 行级权限重写与方言转译器
import sqlglot
from sqlglot import exp

@dataclass(frozen=True)
class RowFilterRule:
    """结构化行级权限过滤规则(支持 =, !=, IN, NOT IN 等安全算子)。"""
    filter_col_name: str
    operator: str  # "eq" | "in" | "not_in"
    values: tuple[str | int | float, ...]

    def to_sql_condition(self) -> exp.Expression:
        col_expr = exp.filter_col_name(self.filter_col_name)
        literals = [exp.Literal.string(str(v)) if isinstance(v, str) else exp.Literal.number(v) for v in self.values]
        if self.operator == "eq":
            return exp.EQ(this=col_expr, expression=literals[0])
        if self.operator == "in":
            return exp.In(this=col_expr, expressions=literals)
        if self.operator == "not_in":
            return exp.Not(this=exp.In(this=col_expr, expressions=literals))
        raise ValueError(f"Unsupported row filter operator: {self.operator}")

def apply_ast_row_level_security(
    sql: str,
    table_policies: dict[str, list[RowFilterRule]],
    *,
    read_dialect: str = "postgres",
    write_dialect: str = "postgres",
) -> str:
    """
    使用 sqlglot 在 AST 语法树层将受保护表原地替换为带 WHERE 过滤的内联子查询,
    确保任何 CTE、JOIN、窗口函数都只能在授权行子集上运算。
    """
    parsed_list = sqlglot.parse(sql, read=read_dialect)
    if len(parsed_list) != 1 or parsed_list[0] is None:
        raise ValueError("安全拦截:仅允许执行单条 SELECT 查询语句")

    root = parsed_list[0]
    if not isinstance(root, (exp.Select, exp.Union)):
        raise ValueError("安全拦截:禁止执行非查询类(DDL/DML)SQL 语句")

    # 1. 收集所有 CTE 别名,防止把 WITH 临时表误当成物理表包裹
    cte_names = {cte.alias_or_name.lower() for cte in root.find_all(exp.CTE) if cte.alias_or_name}

    # 2. 收集语法树中的所有真实 Table 节点并原地改写
    for table_node in list(root.find_all(exp.Table)):
        t_name = (table_node.name or "").lower()
        if not t_name or t_name in cte_names or t_name not in table_policies:
            continue

        rules = table_policies[t_name]
        if not rules:
            continue

        # 组合多条过滤规则为 AND 表达式
        conditions = [r.to_sql_condition() for r in rules]
        where_expr = conditions[0]
        for cond in conditions[1:]:
            where_expr = exp.And(this=where_expr, expression=cond)

        # 保留原表的别名(若原表写了 FROM dw_orders AS o,则子查询别名仍为 o;否则别名为原表名)
        effective_alias = table_node.alias or table_node.name
        clean_table = exp.Table(this=exp.Identifier(this=table_node.name), db=table_node.args.get("db"))
        subquery_select = exp.select("*").from_(clean_table).where(where_expr)
        wrapped_subquery = exp.Subquery(this=subquery_select, alias=exp.TableAlias(this=exp.Identifier(this=effective_alias)))
        table_node.replace(wrapped_subquery)

    return root.sql(dialect=write_dialect)

五、实战避坑指南:高频报错与一键解决速查表

在将零信任权限审计链与 AST 行级安全注入落地到生产环境时,如果遇到以下典型问题,可对照下表快速排查:

序号遇到的报错或现象背后的真正原因一句话解决办法
01AST 改写后报 ambiguous column name 或找不到原表名引用(如 SELECT dw_orders.gmv FROM ...)将 dw_orders 替换为子查询时忘了给子查询加上与原表名(或原别名)完全一致的 AS dw_orders 别名在构造 exp.Subquery 时必须设置 alias = table_node.alias or table_node.name,保持外部列引用 100% 兼容
02SQL 中定义了 WITH sales AS (...),结果 AST 改写器在 sales 引用处又套了一层过滤导致循环报错未区分物理表与 WITH (CTE) 定义的临时视图名在遍历 root.find_all(exp.Table) 前,先提取 {cte.alias_or_name.lower() for cte in root.find_all(exp.CTE)} 并跳过
03某张受保护视图配置了行级权限,但用户当前被分配的 values 列表为空(没有任何可访问区域),生成的 IN () 报 SQL 语法错误空列表直接拼接成 col IN () 在标准 SQL 中是非法语法当检测到某张表的受限规则 values 为空集时,直接在 AST 改写前 Fail-Closed 抛出“无任何行级访问权限”或生成 WHERE 1 = 0
04权限变更后,ToolMessage 虽然被遮罩了,但大模型还是从上一轮 Assistant 的文字回答里读到了旧数据跨代次清洗时只遮罩了 role == "tool",漏掉了同一轮里复述了该数据的 role == "assistant" 最终总结在 sanitize_history_by_permission_epoch 中标记 tainted_turn = True,将该轮对应的 Assistant 结论同步替换为重查提示
05业务库是 MySQL / ClickHouse,模型写出了 Postgres 方言的 DATE_TRUNC 导致查询报错AST 改写与方言转译未打通在 apply_ast_row_level_security 的最后一步 root.sql(dialect=write_dialect) 中直接传入目标数据库方言,一步完成安全注入与跨方言转译

结语

回顾本篇《Agent Harness 架构手册 #04》,我们构建了一套真正经得起红蓝对抗检验的企业级 AI Agent 零信任数据安全防线:

  1. 三重实时核验(RealtimeAccessEnforcerMiddleware):在模型调用前、工具执行前、结果发布前三次校验 permission_grant_version,彻底消灭工具执行中途撤权的 TOCTOU 竞态漏洞;
  2. 权限代次隔离(Grant Epoch):为每条敏感输出加盖不可伪造的权限证据戳,一旦权限版本变更,自动隔离旧代次历史数据,防止大模型“凭记忆越权背诵”;
  3. sqlglot AST 语法树级行级过滤注入:把受保护表在语法树层原地替换为受限子查询,无论 SQL 多复杂都绝不漏行、绝不越权。

👉 下一篇收官预告(#05):当我们的 Agent 拥有了强大的安全底座与上下文引擎后,怎么让它具备 “从用户的每一次点赞与纠错中自动提炼沉淀新技能/新视图提案的自进化能力(Knowledge Flywheel)”?又怎么实现 “哪怕用户刷新浏览器页面也能无缝续接流式输出的 SSE 断点续传与中途控向(Replayable Stream & Steer)”?收官篇我们一探究竟!

基于热成像的土壤水分反馈MATLAB实现,以及用于灌溉调度的模型预测控制。.zip 1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 立即下载

相关推荐

基于netty框架下的推送系统,支持websocket,android,ios,桌面应用,系统应用等多端接入支持,应用于移动应用,物联网,智能家居,嵌入式开发,WEB应用以及后台系统之间的即时消服务

基于netty框架下的推送系统,或许有一些企业有着自己一套即时通讯系统的需求,那么CIM为您提供了一个解决方案,目前CIM支持websocket,android,ios,桌面应用,系统应用等多端接入支持,可应用于移动应用,物联网,智能家居,嵌入式开发,桌面应用,WEB应用以及后台系统之间的即时消服务。

【Agent Harness 架构手册 #05】AI Agent 自进化经验蒸馏飞轮与 SSE 游标断点重连实战

《Agent Harness 架构手册:构建高可靠 AI 智能体运行时》连载第05篇收官之作。本文拆解两大生产级高阶能力:受控的正负向三模经验蒸馏飞轮(单次交付锁+14步查重上限)与基于asyncio.Condition内存游标缓冲池的SSE断点重连(ReplayableEventBus)及运行中实时控向(Steer)。

玄同765的AI应用开发博客 104

WeVisOne-VL一套模型,把检测、分割、抠图和OCR都接到了一起

WeVisOne-VL 想解决的不是单点能力更强,而是把目标级理解和像素级理解放进同一套视觉语言模型里:从点、框,到 mask,再到连续 alpha matte,都能统一生成。 它覆盖检测、指代表达定位、计数、点选、OCR、分割和抠图,最大的看点是输出粒度可以按需求切换,而且遇到图里根本不存在的目标时,能直接返回 None,尽量避免“看错了还硬答”的幻觉。 技术上,它把任务统一写成结构化文本预测,再配一个只有 960 万参数的轻量像素解码器,不依赖 SAM,也能把框进一步细化成 mask 和 alpha matte。项目同时放出了 2B、4B 权重、推理包、Cookbooks、评测流程和 Gradio Demo;按仓库给出的结果,4B 版本在检测、指代定位、计数、OCR、分割和抠图等多项基准上都压过一批强开源基线。 更值得琢磨的是它背后的数据引擎:用知识图谱驱动概念发现,再结合专家模型与 VLM 校验,把框扩展到 mask 和高质量透明度标注,累计覆盖超过 1 亿张图像。这类工作真正有价值的地方,不只是又做出一个大模型,而是让“看见什么”和“精确到哪一层”第一次被放进一条顺滑的产品链路里。

【Agent Harness 架构手册 #03】多轮对话上下文引擎实战:L1~L4 四级预算投影与无损回放

《Agent Harness 架构手册:构建高可靠 AI 智能体运行时》连载第03篇。本文剖析多轮工具调用下的追问失忆难题,手把手实现四级无损历史投影引擎:原始消息不可变,按Token预算实时计算L1预览、L2结果卡片、L3结构化台账与L4折叠提问,削减85%开销且100%保留SQL筛选条件。

玄同765的AI应用开发博客 270

【化工设备防腐】基于BF凝水除铁缓蚀剂的螺旋板换热器腐蚀与冷凝水发红问题综合治理技术应用

内容概要:本文针对氯碱厂盐水螺旋板预热器腐蚀渗漏及蒸汽冷凝水发红、偏酸性的问题,提出并实施了采用BF凝水除铁缓蚀剂成膜法的综合治理方案。通过分析腐蚀原因,确认主要为二氧化碳引起的酸性腐蚀和溶解氧导致的氧腐蚀。在原有阴极保护与局部防腐涂层改造基础上,进一步投加BF凝水除铁缓蚀剂,该药剂能在金属表面形成单分子保护膜,有效阻隔腐蚀介质,实现全系统气液两相的协同防护。经72小时试验,冷凝水pH值恢复至8.5以上,铁离子浓度降至0.07mg/L以下,颜色清澈透明,达到回用标准,实现了设备安全运行与冷凝水高效回收。; 适合人群:从事化工、电力、锅炉系统管理及相关工业设备维护的技术人员与工程管理人员,尤其适用于面临换热器腐蚀、冷凝水水质异常问题的企业技术人员。; 使用场景及目标:①解决工业蒸汽系统中冷凝水发红、铁离子超标、pH偏低等腐蚀问题;②提升冷凝水回收率,降低能耗与水资源浪费,实现节能减排与降本增效;③替代传统除氧剂与末端过滤设备,优化现有水处理工艺。; 阅读建议:此资源结合实际案例提供系统性解决方案,读者应重点关注问题诊断逻辑、药剂作用机制与实施流程,可将其作为类似工况下腐蚀治理的技术参考,并结合自身系统特点进行可行性评估与小试验证。

数字化供应链AI智能体平台规划及场景应用方案.pptx

数字化供应链AI智能体平台规划及场景应用方案.pptx

【Agent Harness 架构手册 #02】AI Agent 实时动态流(Action Feed)与阶段性结论合成引擎实战

《Agent Harness 架构手册:构建高可靠 AI 智能体运行时》连载第02篇。本文详解如何告别满屏生硬JSON,从零构建双轨制可观测交互引擎:涵盖声明式工具元数据挂载、Running/Done双态语义转换器、每3步滑动窗口阶段性结论合成器(含嵌套流Tag静默隔离与确定性规则兜底)。

玄同765的AI应用开发博客 325

数字雕刻基于CatmulI-Clark细分与笔刷位移场的ZBrush流程建模:月哨兵角色精细度上限分析

内容概要:本文以“月哨兵”科幻角色数字雕刻工程为实例,系统构建了从程序化粗模到高精度雕刻的完整数学模型。研究涵盖重拓扑、Catmul-Clark细分、笔刷位移场建模、多部件组装及精细度上限分析等核心环节。通过ZRemesher将304,050顶点粗模重拓扑为28,600顶点的全四边形网格,并逐级细分至732万面,实测面数递推F(k)=F₀·4ᵏ完全符合理论。利用ZBrush Python接口注入Standard笔刷操作,首次通过同拓扑OBJ逐顶点差分获得真实位移场数据,实测最大位移0.454873,8.756%顶点发生显著位移。提出“理论-内存-拓扑-视觉”四层精细度上限模型,指出在24GB内存条件下工程合理上限为10⁷~10⁸面,视觉收益受渲染分辨率制约趋于饱和。最终完成755万面的组装网格并经工程文件回读验证一致性。; 适合人群:具备三维建模与数字雕刻基础,熟悉ZBrush工作流,从事角色资产开发或程序化内容生成的技术美术、图形学研究人员及高阶数字艺术家。; 使用场景及目标:①理解Catmul-Clark细分曲面在工业级雕刻流程中的数学机制;②掌握基于脚本驱动的可复核雕刻工程构建方法;③评估高面数模型的内存代价与视觉收益平衡;④学习重拓扑、位移场量化、多部件合并等关键技术的工程实现。; 阅读建议:本文强调数学建模与实证闭环,建议结合附录中的脚本与数据文件进行复现实践,重点关注逐顶点差分、细分递推验证与四层上限模型的构建逻辑,以深入掌握高精度数字雕刻的系统性工程方法。

【Agent Harness 架构手册 #01】LangGraph 动态工具配额守卫实战:根治无限探索与 return_direct 报错不自愈

《Agent Harness 架构手册:构建高可靠 AI 智能体运行时》连载第01篇。本文深入拆解生产级AI Agent工具调用配额控制核心难题,手把手教你实现支持四维探索配额、验证后锁定、return_direct结束工具报错自愈(Command回跳重试)与阶段性进展自动合成的动态工具配额守卫中间件。

玄同765的AI应用开发博客 303

通信行业CentOS 7系统性能调优关键技术:电信级服务器优化配置与自动化运维实践

内容概要:本文围绕CentOS 7在通信行业的系统性能调优实践,深入探讨了从默认配置到满足电信级高可用性(如“五个九”)要求的优化路径。文章系统阐述了内存、网络、磁盘IO、服务精简与可观测性五大维度的调优策略,并通过一个完整的内核参数调优脚本实例,逐行解析其设计逻辑,涵盖备份机制、内存管理、网络连接容量、TCP缓冲区设置、文件句柄限制及中断均衡等关键技术点。同时展望了自动化基线管理、Ansible批量运维、向CentOS Stream/Rocky Linux迁移以及AIOps智能调参等未来趋势。; 适合人群:具备Linux系统管理基础,从事通信行业运维、系统架构或性能优化工作的技术人员,尤其是负责核心网元、5G UPF、计费系统等高负载场景的工程师;也适用于追求高可用、高性能系统部署的中高级运维人员。; 使用场景及目标:①应对5G基站控制器快速部署、话务高峰连接风暴及话单批量写入等典型通信业务挑战;②掌握如何通过系统级调优保障服务稳定性与响应性能,达成电信级SLA指标;③构建可复制、可自动化的性能优化方案,提升大规模服务器集群的运维效率与可靠性。; 阅读建议:学习时应结合实际生产环境逐步验证各项参数效果,重点关注变更安全(如配置备份)、业务语义(如信令进程保护)与压测验证环节,避免盲目套用参数。建议配合监控工具与自动化平台推进调优落地。

Python自动化数据处理程序-V2

Python自动化数据处理程序-V2

三相PWM整流器双闭环仿真(Simulink仿真实现)

内容概要:本文详细介绍了一种基于Simulink的三相PWM整流器双闭环控制系统仿真模型,重点实现了电压外环与电流内环的协同控制策略,通过构建完整的主电路、控制器模块、坐标变换环节及PWM生成机制,全面展示系统在稳态运行与动态响应下的性能表现。文档进一步涵盖了VOC(虚拟同步发电机控制)、SVPWM空间矢量调制技术的应用,并拓展至电网不平衡条件下的功率平衡控制、自抗扰控制与模型预测控制等先进控制算法,提供了从基础建模到高级优化的全流程仿真解决方案,适用于电力电子变换器的科研分析与教学实践。; 适合人群:电气工程、自动化、新能源技术等相关专业的本科生、研究生,以及从事电力电子系统研发的工程师和科研人员。; 使用场景及目标:①深入理解三相PWM整流器的工作原理及其双闭环控制的设计方法;②开展课程设计、毕业设计或科研项目中的系统建模与仿真验证;③对比传统PID、模糊PID、自抗扰及模型预测等多种控制策略的动态性能与鲁棒性;④研究电网不平衡条件下系统的功率补偿与稳定性控制问题; 阅读建议:建议结合MATLAB/Simulink环境动手搭建并调试仿真模型,按照文档结构逐步掌握各模块功能与参数整定方法,同时可延伸学习SVPWM调制、VOC控制及高级非线性控制策略,以提升对现代电力电子系统控制理论的理解与应用能力。

无刷直流电机BLDC无感+滑模观测器+转速电流双闭环PI控制(总共三个仿真模型)(Simulink仿真实现)

内容概要:本文档系统阐述了无刷直流电机(BLDC)在无位置传感器条件下的高性能控制策略,基于Simulink平台构建了三个相互关联的仿真模型,重点实现无感控制与滑模观测器(Sliding Mode Observer, SMO)相结合的转速电流双闭环PI控制系统。该资源摒弃了传统的霍尔传感器,利用滑模观测器实时估算转子的位置与转速信息,有效降低了系统成本并提升了在恶劣环境下的运行可靠性。仿真模型完整涵盖了逆变电路、空间矢量脉宽调制(SVPWM)、三相电流采样、坐标变换(Clark & Park)、PI调节器以及滑模观测器等核心模块,形成了一个闭环的、高动态响应的电机驱动系统。此外,文档还集成了模糊PID、传统PID等多种控制算法的对比仿真模型,便于研究者深入分析不同控制策略在动态响应、抗干扰能力和稳态精度方面的性能差异,为电机控制算法的研究与工程化应用提供了坚实的仿真验证基础。; 适合人群:具备自动控制理论、电机拖动原理及电力电子技术基础知识,并熟悉MATLAB/Simulink软件操作的电气工程、自动化、机电一体化等专业的高年级本科生、硕士研究生,以及从事电机驱动、新能源汽车、工业自动化等领域的研发工程师和技术人员。; 使用场景及目标:①深入学习和掌握无刷直流电机无位置传感器控制的基本原理与实现方法;②系统性地理解滑模观测器的设计思想、稳定性分析及其在转子位置与速度估计中的关键技术;③对比研究传统PI控制、模糊PID控制及滑模观测器在BLDC调速系统中的综合性能,分析其在不同工况下的鲁棒性与适应性;④为毕业设计、科研课题或工业项目中的电机控制系统开发提供可复用的仿真平台与技术参考。; 阅读建议:本资源以Simulink仿真为核心载体,建议使用者结合文档中提供的详细说明报告与参考文献,循序渐进地理解各功能模块的设计逻辑与参数整定方法。在学习过程中,务必动手运行并调试仿真模型,仔细观察并记录在不同负载突变、转速指令变化等工况下,电机的三相电流、转速响应曲线及滑模观测器输出的转子位置与速度的动态波形,从而深刻理解控制算法的内在机理。为进一步提升实践与创新能力,可尝试修改控制器参数(如PI增益、滑模增益),或替换不同的控制策略进行对比实验,探究其对系统性能的影响。

个人关于acl的配置作业

个人关于acl的配置作业

(报告+仿真)基于永磁同步电机的飞轮储能系统控制(网侧逆变+机侧整流)仿真

内容概要:本文针对含分布式电源的配电网在多线路故障情况下的恢复问题,提出了一种将网络重构、孤岛划分与检修进度统一纳入多时段优化框架的故障恢复模型。该模型以最小化网损和甩负荷惩罚为目标,采用混合整数二阶锥规划方法,结合虚拟流思想与二阶锥松弛技术,实现对支路投切状态、负荷保留比例、节点电压、功率分布等变量的协同优化,确保各供电区域的连通性与辐射状结构。模型在IEEE33节点系统上进行验证,支持动态调整孤岛范围,充分利用联络开关转供能力和分布式电源的黑启动能力,提升了配电网的韧性与恢复效率。同时,文章对建模细节进行了深入评述,并提出了在负荷分级、无功处理、辐射状约束精确性等方面的改进建议。; 适合人群:电力系统自动化、智能电网、配电系统优化等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于研究含高比例分布式电源的主动配电网在故障后的快速恢复策略;②为配电网重构、孤岛划分与多时段动态恢复的联合优化提供建模范式;③作为学术论文复现与改进的基础模型,推动配电网韧性提升技术的发展。; 阅读建议:建议读者结合文中提到的参考文献与仿真代码,深入理解虚拟流建模、二阶锥松弛等关键技术的应用逻辑,并尝试在模型中引入负荷等级权重、储能系统、分布式电源出力调控等要素,以增强模型的实用性与完整性。

双闭环PWM整流器VOC控制 +SVPWM调制仿真(Simulink仿真实现)

内容概要:本文详细介绍了基于Simulink的双闭环PWM整流器电压定向控制(VOC)与空间矢量脉宽调制(SVPWM)的仿真建模方法,重点实现电流内环与电压外环协同控制策略,以实现电网侧单位功率因数运行、低谐波畸变及快速动态响应。通过构建完整的控制框图,集成锁相环(PLL)、坐标变换、PI调节器、SVPWM模块及Park反变换等关键环节,系统化展示三相PWM整流器在理想与不平衡电网条件下的高性能控制机制。该模型不仅适用于常规工况分析,还可拓展用于电网故障、功率平衡控制等复杂场景的研究,具备较高的科研价值与工程参考意义,尤其支持高水平EI期刊论文的复现与创新验证。; 适合人群:电气工程、自动化、电力电子与电力传动方向的高校本科生、研究生,以及从事新能源变换器、工业整流装置研发的工程技术人员。; 使用场景及目标:①深入理解PWM整流器双闭环控制原理与VOC控制策略的设计流程;②掌握SVPWM调制技术在Simulink环境中的实现方法与波形生成机制;③为高性能电力电子变换系统(如储能变流器、电机驱动器)的控制算法开发提供仿真验证平台;④支撑学术研究中对先进控制策略(如PR控制、重复控制、模型预测控制)的对比测试与性能评估。; 阅读建议:建议结合《电力电子技术》《自动控制理论》《电机与拖动》等基础知识进行学习,优先运行并调试仿真模型,观察dq坐标系下电流跟踪、直流母线电压稳定、网侧电流正弦性等关键波形,深入理解控制器参数整定规律,有条件者可进一步对接dSPACE或DSP控制器实现实物验证。

阻尼器磁流变阻尼器MR Damper非线性(阻尼、滞回)特性研究(Matlab代码实现)

内容概要:本文系统研究磁流变阻尼器(MR Damper)的非线性动力学特性,重点聚焦其阻尼力输出与滞回行为的建模与仿真分析。基于Matlab平台,构建了能够准确描述MR阻尼器非线性、强耦合及滞后特性的数学模型,并通过仿真代码实现了在不同激励条件下的动态响应模拟。研究涵盖模型建立、参数辨识、仿真验证全过程,深入剖析滞回环的形成机制与系统对频率、幅值等输入信号的敏感性,为高精度振动控制提供理论支撑和数据基础。资源包含完整可调试代码,有助于用户掌握智能材料器件的非线性建模方法。; 适合人群:具备控制系统理论基础和Matlab编程能力的机械工程、车辆工程、土木结构或自动化等相关专业的研究生及科研工程师,特别适用于从事智能材料驱动器建模、半主动悬挂系统或结构振动控制研究的专业技术人员。; 使用场景及目标:①掌握磁流变阻尼器非线性力学特性的建模思路与实现方法;②学习利用Matlab进行复杂非线性系统仿真与滞回曲线可视化技术;③为设计高性能半主动控制器(如模糊PID、滑模控制、自适应控制等)构建精确的被控对象模型;④支撑学位论文课题、科研项目申报或工程样机开发中的关键仿真验证环节。; 阅读建议:建议结合所提供的Matlab代码逐行调试运行,采用典型激励信号(如正弦位移输入)观察输出阻尼力的变化规律,重点关注滞回非线性特征的表现形式与关键参数的影响机制,并可进一步拓展至与先进控制算法的联合仿真研究,深化对系统动态性能的理解。

无刷直流电机(BLDCM)转速电流双闭环控制、三相桥式星型全控电机研究(Simulink仿真实现)

内容概要:本文围绕无刷直流电机(BLDCM)的转速电流双闭环控制系统展开研究,基于Simulink平台构建三相桥式星型全控电机的仿真模型,系统阐述了电流环与转速环双闭环控制结构的设计原理及其在电机调速系统中的核心作用。研究重点对比了传统PID控制与模糊PID控制在动态响应速度、抗负载扰动能力及稳态精度等方面的性能差异,通过仿真验证了模糊PID控制器在提升系统鲁棒性与控制品质方面的显著优势。内容涵盖电机数学建模、PI调节器设计、PWM驱动控制、反馈信号检测与处理等关键环节,为高性能电机控制系统的分析与优化提供了完整的仿真解决方案和技术支撑。; 适合人群:自动化、电气工程、机电一体化等相关专业的本科生、研究生,以及从事电机控制、电力电子、运动控制等领域研发工作的工程师和科研人员。; 使用场景及目标:①用于高校课程设计或实验教学,帮助学生深入理解双闭环控制机制与PID参数整定方法;②为科研项目中电机控制器的设计与性能优化提供仿真验证平台;③对比分析传统PID与智能控制策略(如模糊PID)在实际系统中的控制效果,提升无刷直流电机在复杂工况下的动态与稳态性能表现。; 阅读建议:建议结合提供的Simulink仿真模型同步操作,重点关注控制器结构搭建、参数调试过程与波形分析,配合电机控制理论教材深化理解,可进一步拓展至无位置传感器控制、滑模观测器、FOC矢量控制等先进控制技术的研究与实现。

上一篇: 【Agent Harness 架构手册 #03】多轮对话上下文引擎实战:L1~L4 四级预算投影与无损回放
下一篇: 【Agent Harness 架构手册 #05】AI Agent 自进化经验蒸馏飞轮与 SSE 游标断点重连实战
玄同765
玄同765 新星创作者: 人工智能技术领域 新星创作者: 人工智能技术领域
博客等级 码龄6年 1万+粉丝 262原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值