摘要:很多开发者搞不清Agent到底如何调用工具:是Agent主动调用?还是LLM决策?流式FunctionCall如何拼接解析?参数报错如何兜底?本文拆解生产级Agent解析、校验、执行FunctionCall的完整底层逻辑。
市面上多数教程只讲概念,不讲工程细节。真实生产环境中,FunctionCall存在流式分片、JSON非法、参数幻觉、工具不存在、权限不足等大量问题,需要框架层完整兜底。
一、前置:Skill预加载注册
会话初始化时,框架加载当前租户可使用的所有Skill元数据,将工具描述、参数Schema注入Prompt上下文。工具选择决策永远由LLM完成,Agent仅负责解析与执行。
二、LLM响应接收与流式拼接
大模型返回分为普通文本与tool_calls结构体。SSE流式场景下,工具名称、参数JSON会被分片传输,框架需通过缓冲区拼接完整内容,禁止分片解析导致JSON报错。
特别注意:arguments为JSON字符串,需要二次反序列化为参数对象,是高频踩坑点。
三、三层校验机制(核心工程亮点)
1、工具合法性校验:根据工具名匹配注册的Skill,拦截模型编造的不存在工具,返回可用工具列表引导修正。
2、参数Schema校验:基于Skill定义的JSON-Schema,校验必填、类型、范围,拦截非法参数。
3、权限与租户校验:校验用户、租户是否具备工具调用权限,杜绝越权访问。
四、Skill执行与结果回传
校验通过后组装上下文信息,执行内部/MCP Skill,捕获所有异常并友好封装,截断超长返回内容防止token爆炸。最终将工具执行结果重新送入LLM,循环多轮调用或生成最终答案。
五、线上问题兜底策略
所有解析异常、参数异常、执行异常均不中断会话,统一封装为工具错误结果回传给LLM,让模型自主修正重试,极大提升Agent对话稳定性。