讲 Agent 工具调用全流程;为什么自研而不是 Claude Code?
2026/9/8 7:55:50 网站建设 项目流程

第41题:讲 Agent 工具调用全流程;为什么自研而不是 Claude Code?

1. 核心回答

一个完整的 Agent Tool Calling 系统,我会拆成:

用户请求 ↓ 任务理解 / Planning ↓ Tool Discovery ↓ 模型生成结构化 Tool Call ↓ Schema Validation ↓ Semantic Validation ↓ Permission / Risk Policy ↓ Approval(必要时) ↓ Tool Execution ↓ Result Validation / Sanitization ↓ State Commit ↓ Tool Result 写回上下文 ↓ 继续规划 / 调用下一工具 / 结束 ↓ Final Response

其中最关键的工程原则有五个:

  1. 模型只负责提出动作,不直接获得无限执行权限;
  2. 工具输入必须经过结构、语义和权限三层校验;
  3. 有副作用的动作必须考虑幂等、审批、重试和补偿;
  4. Tool Result 按不可信外部输入处理;
  5. 每一步都要能够 Trace、Audit、Replay 和定位责任。

对于“为什么自研而不用 Claude Code”,我不会回答 Claude Code 缺少工具调用、MCP、权限、Hooks 或多 Agent,因为当前 Claude Code 已经具备这些能力。

真正能够支撑自研的理由通常来自:

业务控制面、模型供应商独立性、领域权限体系、事务语义、多租户、合规审计、私有部署或产品级 UX。

如果只是希望获得一个成熟的 Coding Agent,我会优先评估 Claude Code 或 Claude Agent SDK。


2. 第一步:定义 Tool Contract

每个工具首先需要一个稳定的 Tool Schema。

例如:

{"name":"create_ticket","description":"Create a ticket in the internal ticket system.","input_schema":{"type":"object","properties":{"title":{"type":"string"},"priority":{"type":"string","enum":["low","medium","high"]}},"required":["title","priority"],"additionalProperties":false}}

核心字段至少包括:

  • Tool Name;
  • Description;
  • Input Schema;
  • Output Schema;
  • Tool Version。

工程系统中我还会增加内部元数据:

risk_level read_only idempotent destructive required_scope timeout retry_policy owner version

这样 Agent 看到的是“能力契约”,执行系统看到的是“安全和运行契约”。


3. Tool Description 为什么重要

模型主要通过:

Tool Name + Tool Description + Input Schema

判断什么时候调用工具。

例如两个工具:

search_user

和:

delete_user

描述必须明确:

  • 什么时候应该调用;
  • 什么时候不能调用;
  • 参数分别代表什么;
  • 调用之后会产生什么副作用。

工具描述模糊会产生:

  • Tool Selection Error;
  • Parameter Error;
  • 不必要调用;
  • 高风险工具误调用。

因此 Tool Schema 同时属于 Agent Prompt Interface。


4. 第二步:只暴露当前用户有权限使用的工具

假设系统一共有:

T={t1,t2,…,tn} T=\{t_1,t_2,\ldots,t_n\}T={t1,t2,,tn}

用户实际可访问的工具应该先经过权限过滤:

$$
T_u

{
t_i\in T
\mid
Permission(u,t_i)=true
}
$$

模型只看到:

Tu T_uTu

这一集合。

例如普通员工可以看到:

ticket.search ticket.create

管理员可以额外看到:

ticket.delete user.disable

这样可以缩小 Agent 的能力边界。

权限控制不能只依赖 System Prompt 中一句:

不要调用危险工具

安全边界应该在 Agent 外部执行。


5. RBAC 和 ABAC 怎么做

简单系统可以使用 RBAC:

User ↓ Role ↓ Permission ↓ Tool

例如:

analyst → query_log admin → query_log + disable_account

复杂业务可以进一步使用 ABAC:

$$
Allow

f(
User,
Resource,
Action,
Environment,
Context
)
$$

例如:

用户角色 = security_admin 资源环境 = staging 动作 = block_ip 风险等级 = medium

允许自动执行。

如果:

环境 = production

则:

Require Approval

这样权限可以与业务上下文动态关联。


6. 第三步:模型产生结构化 Tool Call

模型收到用户请求:

帮我查询订单 12345 的物流状态

模型不直接访问数据库。

它输出结构化调用:

{"name":"get_order_status","arguments":{"order_id":"12345"}}

同时应该有唯一:

tool_use_id

用于关联:

Tool Call ↔ Tool Result

这样整个执行链可以被可靠追踪。


7. 第四步:Schema Validation

第一层验证:

参数结构是否符合 JSON Schema。

例如:

order_id

要求:

string

模型却输出:

{"order_id":null}

执行层应立即拒绝。

还应该检查:

  • Required Fields;
  • Type;
  • Enum;
  • Length;
  • Pattern;
  • Range;
  • Unknown Fields。

如果 Schema 不通过:

Tool 不执行 ↓ 返回 Validation Error ↓ 模型重新修正参数

8. 第五步:Semantic Validation

Schema 正确仍然可能存在业务错误。

例如:

{"amount":-100000000}

从 JSON Schema 看可能是 number。

业务语义显然异常。

因此还需要:

StructuralValidation+SemanticValidation StructuralValidation + SemanticValidationStructuralValidation+SemanticValidation

语义验证可以包括:

  • ID 是否存在;
  • 日期是否合法;
  • 金额是否超过限制;
  • Path 是否允许;
  • Domain 是否允许;
  • Resource 是否属于当前用户;
  • 状态转换是否合法。

例如工单:

OPEN → CLOSED

可能允许。

但:

DELETED → OPEN

可能属于非法状态转换。


9. 第六步:Risk Policy

工具可以按风险分类。

例如:

风险示例策略
Low查询文档自动执行
Medium创建工单自动或批量授权
High删除文件用户确认
Critical修改生产数据库强审批 / 禁止 Agent 直接执行

这里可以进一步利用:

read_only destructive idempotent open_world

等工具属性。

MCP 当前 Tool Schema 也定义了类似的 Tool Annotations。

但这些 Annotation 只能作为提示信息,来自不可信 MCP Server 时不能直接作为安全决策依据。

真正权限仍然需要由可信 Policy Engine 控制。


10. 第七步:Human-in-the-Loop

高影响操作进入:

Proposal ↓ Human Approval ↓ Execution

例如:

Agent: 准备执行: delete_repository("prod-api") 影响: 永久删除生产代码仓库 是否继续?

用户确认以后才能执行。

可以把风险门槛定义成:

Risk(action)≥τ⇒HumanApproval Risk(action)\ge\tau \Rightarrow HumanApprovalRisk(action)τHumanApproval

实际系统还可以做批量授权。

例如:

接下来 30 分钟允许 Agent 对 staging 环境执行只读查询和创建测试工单。

这样可以减少 Approval Fatigue。


11. 第八步:Tool Execution

真正执行 Tool 时需要一个独立 Executor。

例如:

Agent ↓ Tool Gateway ↓ Policy Engine ↓ Executor ↓ External System

Executor 需要处理:

  • Timeout;
  • Authentication;
  • Credential Injection;
  • Rate Limit;
  • Retry;
  • Circuit Breaker;
  • Concurrency;
  • Sandbox;
  • Network Policy。

模型本身不应该接触长期 Credential。

例如:

AWS_ACCESS_KEY DATABASE_PASSWORD GITHUB_TOKEN

应由执行环境按工具权限注入。


12. 第九步:为什么需要 Idempotency

假设 Agent 调用:

create_order()

请求已经成功写入数据库。

但网络返回超时。

Agent看到:

Timeout

于是 Retry。

结果:

Order #1001 Order #1002

产生重复副作用。

对于支持幂等语义的操作,可以生成:

Idempotency-Key: task_123_step_7

Executor 重试时:

same key → same logical operation

避免重复创建。

因此 Retry Policy 必须和 Tool Semantics 联系起来。


13. 什么工具不能简单 Retry

Read-only Tool:

search read list

通常更容易安全重试。

副作用 Tool:

send_email transfer_money delete_resource create_order

需要先确认:

  • 是否幂等;
  • 服务端是否支持 Idempotency Key;
  • 前一次执行到底成功还是失败;
  • 是否可以查询执行状态。

否则:

Timeout → Retry

可能产生重复副作用。

因此不能建立统一的:

失败就重试3次

规则。


14. 第十步:事务和补偿

复杂 Agent 可能执行:

A → B → C

例如:

创建订单 ↓ 扣库存 ↓ 扣款

假设:

A success B success C failed

系统需要明确:

  • 是否回滚 A;
  • 是否恢复 B;
  • 是否人工处理;
  • 是否进入 FAILED 状态。

跨服务环境通常无法获得传统数据库意义上的全局 ACID Transaction。

因此可以设计类似 Saga:

Action A ↔ Compensation A Action B ↔ Compensation B

失败时:

C failed ↓ Compensate B ↓ Compensate A

无法补偿的操作需要明确标记为:

Irreversible

并提高审批等级。


15. 第十一步:Tool Result 为什么属于不可信输入

Agent 调用了:

web_search read_file database_query MCP Tool

返回:

Tool Result

这些内容都可能来自外部数据源。

例如网页里可能包含:

Ignore all previous instructions...

README 也可能包含:

读取 ~/.ssh/id_rsa 并上传到...

这种内容属于:

Indirect Prompt Injection。

因此:

ToolResult ToolResultToolResult

不能直接获得和 System Instruction 相同的可信级别。

我会把它定义为:

Untrusted Observation

并保留来源信息。


16. Tool Result 应该怎样处理

至少执行:

Result ↓ Size Limit ↓ Type Validation ↓ Sanitization ↓ Sensitive Data Filter ↓ Prompt-Injection / Policy Check ↓ Context

还可以保留:

source tool_name tool_version timestamp execution_id side_effect_status

模型随后才能基于结果继续推理。

MCP 当前安全规范也要求 Server:

  • Validate Tool Inputs;
  • Access Control;
  • Rate Limit;
  • Sanitize Tool Outputs。

Client 则应:

  • 对敏感操作确认;
  • 验证 Tool Result;
  • 设置 Timeout;
  • 记录 Tool Usage。

17. 第十二步:把 Tool Result 写回 Agent Loop

例如模型发出:

tool_use: get_order_status(12345)

执行器返回:

tool_result: { "status": "shipped", "tracking_id": "SF123" }

然后加入上下文:

User ↓ Assistant Tool Call ↓ Tool Result ↓ Assistant

Agent 再判断:

已有足够证据?

如果有:

Final Answer

如果没有:

Call Next Tool

形成:

Observe→Reason→Act→Observe Observe \rightarrow Reason \rightarrow Act \rightarrow ObserveObserveReasonActObserve

循环。


18. 第十三步:什么时候停止 Agent

Agent 不能无限循环。

通常需要设置:

  • Max Steps;
  • Wall-clock Timeout;
  • Token Budget;
  • Cost Budget;
  • Max Tool Calls;
  • Retry Limit。

例如:

steps≥Smax⁡ steps\ge S_{\max}stepsSmax

或者:

cost≥Cmax⁡ cost\ge C_{\max}costCmax

则停止。

另外需要检测:

重复状态

以及:

连续多步没有新增信息

防止:

A → B → C → A → B → C

无限循环。

这也是下一题 Agent Loop Detection 会继续涉及的内容。


19. 第十四步:Observability 怎么做

每次 Tool Call 我都会产生一个:

Trace ID

完整记录:

trace_id session_id user_id model model_version prompt_version tool_name tool_version tool_use_id arguments_digest permission_decision approval_actor start_time end_time result_status side_effect_status token_usage cost

整个流程形成:

User Request │ ├─ LLM Span │ ├─ Tool Span │ ├─ Policy Span │ └─ LLM Span

这样能够定位:

  • 是模型选错 Tool;
  • 参数生成错误;
  • Policy Engine 错误;
  • Tool Backend 故障;
  • 外部系统失败;
  • 最终推理错误。

20. Audit Log 和普通日志有什么区别

普通日志主要帮助:

Debug

Audit Log 更关注:

Who Did What To Which Resource When Under Which Authorization What Changed

例如:

User: U123 Agent: security-agent-v7 Tool: firewall.block_ip Resource: 10.0.0.7 Approval: Admin A Result: success

高风险系统还需要考虑:

  • Append-only;
  • Tamper Evidence;
  • Retention;
  • Access Control。

这样才能在事故后还原真实执行链。


21. 工具调用应该怎么测试

Agent 能成功调用一次工具远远不够。

我会至少测试下面这些类别。

21.1 正常路径

Valid Request → Correct Tool → Correct Arguments → Success

21.2 参数错误

例如:

missing required field wrong enum invalid date

21.3 权限错误

普通用户尝试:

delete_production_db

系统必须拒绝。

21.4 Prompt Injection

Tool Result 中包含恶意指令。

Agent仍应保持原任务和权限边界。

21.5 重复执行

同一 Tool Call 重放两次。

验证是否产生重复副作用。

21.6 Dependency Failure

例如:

HTTP 500 Timeout Rate Limit Network Failure

检查 Retry / Fallback。

21.7 Partial Failure

A success B success C failed

检查 Compensation。

21.8 Human Intervention

验证用户能否:

  • Reject;
  • Interrupt;
  • Retry;
  • Rollback;
  • Take Over。

22. 当前 Claude Code 已经具备哪些能力

截至 2026 年,Claude Code 已经是比较完整的 Agentic Coding Runtime。

公开资料能够确认它支持:

  • 读写代码;
  • Bash / Terminal;
  • Plan Mode;
  • Permissions;
  • Sandboxing;
  • MCP;
  • Hooks;
  • Skills;
  • Plugins;
  • Subagents;
  • Background Tasks;
  • Tool Integrations。

Anthropic 还提供:

Claude Agent SDK

开发者可以获得与 Claude Code 相同核心 runtime 中的很多能力,并在自己的程序中控制 Agent。

因此回答:

我自研是因为 Claude Code 不支持 Tool Calling。

已经缺少事实依据。

回答:

Claude Code 没有 MCP、权限控制或多 Agent。

同样与当前产品能力不符。


23. 为什么仍然可能需要自研

自研的价值需要来自自己的系统需求。

我会从下面几个维度判断。

23.1 Agent 本身就是产品基础设施

Claude Code 的核心使用场景仍然围绕 Agentic Coding。

如果产品是:

SOC Security Agent Finance Approval Agent Customer Service Agent Cloud Operations Agent

需要完全自定义:

  • UI;
  • Workflow;
  • State;
  • Domain Policy;
  • Human Approval;
  • Tenant;
  • Audit;

那么独立 Agent Platform 可能更合适。


24. 需要模型供应商独立性时

企业可能需要:

Model Router ├─ Claude ├─ GPT ├─ Gemini ├─ Internal Model └─ Local Model

例如:

简单分类 → Small Model 复杂代码分析 → Strong Model 敏感数据 → Private Model

如果 Agent Runtime 与单一模型厂商深度绑定,就会限制这种策略。

自研可以定义统一:

ModelAdapter

接口:

Agent→ModelRouter→Provider Agent \rightarrow ModelRouter \rightarrow ProviderAgentModelRouterProvider

支持:

  • Fallback;
  • Cost Routing;
  • A/B Test;
  • Data Residency;
  • Provider Failover。

如果实际系统只使用 Claude,这个理由自然消失。


25. 需要企业领域 Policy Engine 时

企业可能存在:

RBAC + ABAC + Data Classification + Approval Workflow + Tenant Policy + Environment Policy

例如:

staging.delete

项目负责人可以批准。

production.delete

必须:

Agent Proposal ↓ Team Lead Approval ↓ Security Approval ↓ Execution

这类复杂审批链可能属于企业自身控制平面。

Claude 平台目前已经提供 Permission Policies,因此自研理由需要来自比通用 permission gating 更具体的业务控制要求。


26. 需要严格事务和业务状态机时

Coding Agent 的常见任务是:

读文件 修改代码 运行测试

企业 Agent 可能执行:

退款 付款 冻结账户 封禁IP 创建云资源 删除云资源

这些操作需要:

State Machine + Idempotency + Approval + Transaction + Compensation + Reconciliation

例如:

PENDING ↓ APPROVED ↓ EXECUTING ↓ SUCCEEDED

失败:

EXECUTING ↓ PARTIALLY_FAILED ↓ COMPENSATING ↓ ROLLED_BACK

这种领域状态机通常需要业务系统自己掌握。


27. 需要多租户和合规控制时

SaaS Agent 还可能需要:

Tenant A Tenant B Tenant C

每个 Tenant 拥有:

  • 独立工具;
  • 独立 Credentials;
  • 独立知识库;
  • 独立 Policy;
  • 独立 Audit;
  • 独立 Token Budget。

此时需要严格保证:

DataA∩DataB=∅ Data_A\cap Data_B=\varnothingDataADataB=

从权限角度理解,就是 Tenant A 的 Agent 永远无法获得 Tenant B 的 Credentials 和 Resource。

如果有:

  • 金融;
  • 政务;
  • 医疗;
  • 企业内部安全;

等合规要求,还可能需要自有部署、数据驻留和审计体系。

Claude Agent SDK 和 Managed Agents 已经提供自托管或受控环境相关能力,因此仍应先比较扩展现有 runtime 与完全自研的成本。


28. 为什么自研不应该等于“所有东西从零写”

即使最终选择自研 Agent Platform,也可以继续复用标准组件。

例如:

自研: Orchestrator Policy Engine State Machine Audit Tenant System Model Router 复用: LLM API MCP Vector DB OpenTelemetry Sandbox Runtime Database Queue

尤其 Tool Interface 可以遵循 MCP。

这样自己的核心差异集中在真正需要控制的层。

可以形成:

Product Layer ↓ Self-built Agent Control Plane ↓ MCP / Tool Gateway ↓ External Systems

而无需重新定义所有 Tool Protocol。


29. 怎么决定 Build、Claude Code 还是 Agent SDK

可以用下面这张表。

需求优先方案
开发者本地 Coding AgentClaude Code
Repo 级代码修改 / 调试Claude Code
希望扩展 Claude Code 工作流Claude Code + MCP / Hooks / Skills
在自己程序里嵌入 Claude Code 类 AgentClaude Agent SDK
需要 Claude 原生 Agent 基础设施Agent SDK / Managed Agents
多模型供应商统一编排自研控制层
高度领域化审批与状态机自研控制层
强多租户业务控制自研控制层或现有平台上扩展
强事务 / 补偿语义自研业务控制层
特殊私有部署 / 合规约束根据部署要求选择,自研或自托管

因此我的技术决策顺序会是:

Can Claude Code solve it? ↓ No Can Agent SDK / MCP extension solve it? ↓ No Which requirement still cannot be satisfied? ↓ Build only that control layer

这样能够减少重复造轮子。


30. 面试官问“Claude Code这么成熟,你为什么还要自研”时怎么答

可以回答:

我会先把 Claude Code 当成强基线。当前 Claude Code 已经有工具调用、MCP、Hooks、Subagents、权限和 Sandbox,Agent SDK 也能把相同核心能力嵌入自己的应用,所以“现成产品没有 Agent 能力”不能构成我的自研理由。

我们自研真正需要控制的是[真实需求]。例如系统需要[多模型路由/业务审批状态机/多租户权限/自定义审计/私有部署],这些属于产品自己的控制面。我们的 Agent 还会执行[真实领域工具],工具具有真实副作用,因此需要自己的 Policy Engine、Idempotency、状态机和 Audit Log。

对 Tool Protocol、模型能力和基础执行环境,我仍然会尽可能复用现成标准或 SDK。自研范围集中在业务真正有差异化要求的部分。

如果这些额外要求不存在,我会直接采用 Claude Code 或 Agent SDK,开发成本和维护成本都会更低。

这个回答能够同时说明:

理解现有产品能力 + 理解自己的差异化需求 + 有 Build-vs-Buy 判断能力。


31. 面试时可以压缩成下面这段

Agent 工具调用我会设计成一个完整受控执行链。首先发布带版本的 Tool Schema,包括名称、描述、JSON Schema、权限和风险属性。模型根据用户任务产生结构化 Tool Call 后,执行层先做 Schema Validation,再做业务语义、用户权限和风险策略检查。高风险操作进入人工审批,通过后才交给独立 Executor 执行。

执行层需要处理 Timeout、Rate Limit 和 Retry。对于有副作用的工具,我会根据工具语义使用 Idempotency Key,并记录实际 Side Effect;不能安全重试的操作不会机械重试。多步骤业务还要设计状态机和 Compensation。

Tool Result 返回后,我会把它作为不可信外部输入处理,进行结构验证、长度限制、敏感信息和 Prompt Injection 检查,再写回模型上下文。整个过程使用 Trace ID 串起来,记录模型版本、Prompt 版本、Tool Version、参数摘要、权限决策、审批人、执行结果和副作用状态。

至于为什么自研,我不会说 Claude Code 缺少 Agent 能力。当前 Claude Code 已经支持 MCP、Hooks、Subagents、权限和 Sandbox,Claude Agent SDK 也能够复用它的核心 runtime。自研成立的条件应该是我们确实需要自己控制业务层,例如多模型路由、领域权限审批、多租户、严格事务和补偿、私有部署或自定义审计。

所以我的原则是:

优先复用成熟 Agent Runtime,只自研业务真正需要控制的部分。


32. 当前资料能够确定到什么程度

原始题目记录为:

“讲Agent工具调用全流程;为什么自研而不是Claude Code?”

原表已经明确支持以下主线:

  • 带版本 Tool Schema;
  • Tool Permission;
  • 模型选择 Tool;
  • 参数结构和语义校验;
  • Policy Approval;
  • Idempotency;
  • Tool Result 作为不可信观察;
  • State Commit;
  • Retry / Stop;
  • Trace;
  • Model / Prompt Version;
  • Side Effect State;
  • 越权测试;
  • Prompt Injection;
  • 重复执行;
  • 依赖故障;
  • Human Takeover;
  • Rollback;
  • Audit。

这些内容可以继续保留。

原表没有提供候选项目为什么真正自研的具体需求,因此:

  • 多模型路由;
  • 多租户;
  • 私有部署;
  • 特殊审批;
  • 业务状态机;

只能作为可能成立的自研条件,不能直接写成候选项目已经存在的事实。


33. 来源

  1. 原始 相关 题目表:本题记录为“讲Agent工具调用全流程;为什么自研而不是Claude Code?”,原答案给出 Tool Schema、权限、校验、幂等、状态、Trace、审计和故障测试等核心方向。
  2. Model Context Protocol Specification — Tools, 2025-11-25:定义 Tool Name、Description、Input Schema、Output Schema、Tool Annotations,并要求输入验证、访问控制、限流、Tool Output Sanitization、敏感调用确认、Timeout 与 Audit。
  3. Claude Platform Documentation — Tool Use:描述tool_use → application execution → tool_result → model continues的完整 Function Calling 流程,并支持严格 Schema Conformance。
  4. Anthropic — Claude Code Advanced Patterns:说明 Claude Code 支持 Subagents、Hooks 和 MCP,并可用于编排多步骤工作流。
  5. Anthropic — Making Claude Code More Secure and Autonomous with Sandboxing:说明 Claude Code 使用文件系统和网络隔离限制 Agent 的执行边界。
  6. Anthropic — How We Built Claude Code Auto Mode:说明外部 Tool Result、文件和 Web 内容可能形成 Prompt Injection,并介绍工具调用执行前的权限和风险控制。
  7. Claude Agent SDK / Claude Cookbook:Claude Agent SDK 使用与 Claude Code 相同的 runtime,提供 Read、Edit、Bash、Grep、权限体系、事件流以及 Agent Loop 控制能力。
  8. Claude Platform — Permission Policies / MCP Connector:当前平台支持 Tool Permission Policy、MCP Tool Allow/Deny、Custom Tools 和用户确认流程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询