Dify 内置了两种 Agent 策略:Function Calling 和 ReAct,但二者有什么区别呢?在使用时又该如何选择呢?接下来我们一起来看。
摘要:本文通过一个从零构建的本地编程助手Agent项目,详解FunctionCalling如何与ReAct(推理-行动)模式协同工作,实现大模型对文件系统的增删改查操作。 2025年开始智能体这个概念异常火热,从上半年的FunctionCalling、MCP到下半年的Skills。 本文不探究技术层面以外的影响,这系列博客目标是个人AI转型期间的所有经验积累,因此言归正传,回到主题:FunctionCalling理解。 c) system_prompt.py,从名称就可以看出这里承载的就是Agent的系统提示词,使用FunctionCalling来完成任务,为了避免模型幻觉和内容陈旧,一般都是结合ReAct模式一起来使用 根据观察继续下一轮思考或给出最终回答 4、FunctionCalling 从上面例子已经可以明确FunctionCalling就是Agent解析大模型的返回后,调用Agent自身支持的一些列函数,来实现与外部世界
FunctionCalling就像给厨师一张精确的食谱卡片:"材料:鸡蛋2个、番茄1个;步骤:1.打蛋2.切番茄3.炒蛋4.加番茄"。 FunctionCalling是结构化的:你告诉模型"有一个叫get_weather的函数,接受city参数,返回天气数据"。模型只负责在合适的时候生成调用指令,实际执行由你的代码完成。 可以把它理解成两层抽象:Tool是动词(能做什么)Skill是剧本(在什么场景下按什么顺序用这些动词)实际工作流程示例当用户说"帮我看看GitHub上有没有新的PR":FunctionCalling方式 FunctionCalling代表的哲学:"AI作为决策层,代码作为执行层"职责清晰分离需要开发者为每种能力预先写好执行代码适合传统软件工程思维强调可靠性和可维护性Skill代表的哲学:"AI既是决策层也是执行层 ,追求快速迭代希望降低非技术用户的参与门槛混合使用策略实际上,最好的方案往往是混合使用:核心能力用FunctionCalling保证可靠性复杂场景用Skill提供灵活性底层Tool保持结构化,上层Skill
说到这儿,可能有人会问:FunctionCalling和MCP又是啥?跟AgentSDK有啥关系? ###FunctionCalling:最基础的工具调用FunctionCalling其实是最底层的机制,说白了就是:**大模型输出一个JSON,告诉你"我要调用这个函数,参数是这些",然后你自己去执行。 **```python#OpenAI的FunctionCalling示例response=client.chat.completions.create(model="gpt-4",messages=[{ **FunctionCalling只负责"大模型说要调用函数"这一步,剩下的执行、循环、结果处理都得你自己写。 用FunctionCalling:你需要完全控制每一个细节你的工具很特殊,不适合标准化你在做一些底层的研究或实验用MCP:你想使用社区已有的工具你想让你的工具能被别人使用你需要跨平台兼容用AgentSDK
第六章:从“只会说”到“开始做”——FunctionCalling如果说RAG让AI成了“百晓生”,那么FunctionCalling(函数调用)则让AI拿起了“工具箱”。 这个本质上跟训练如何识别FunctionCalling是一样的,所以有人说MCP就是基于FunctionCalling的。 FunctionCalling(函数调用)机制的高级应用。 按需执行:依照指令执行任务,过程中可继续通过FunctionCalling调用脚本或读取资源。。。 所以FunctionCalling可以算是AIAgent的基础能力了,任何跟外界返回结构化数据的程序打交道,都要需要这个能力。所以Skill跟FunctionCalling属于协作关系。
FunctionCalling:FunctionCalling 是一种自然语言理解能力的技术,开发者可以定义一组函数,并将这些函数的描述传递给模型。
设计紧耦合特定模型(如gpt-4o),切换成本高;类型缺失:providerOptions参数缺乏强类型校验,错误往往运行时才暴露;生态割裂:ReactSolidSvelte各自为政,难以复用核心逻辑;工具调用(FunctionCalling 高级能力:工具调用(FunctionCalling)LLM的知识是静态的——如何让它“联网”?TanStackAI提供了一套声明式+类型安全的工具调用方案。
这就要说到RAG和FunctionCalling技术了。RAG(检索增强生成)通过检索外部知识库获取与问题相关的实时信息并将其注入模型提示词,生成更精准、时效性更强的回答。 图片来源:ailydoseofds而FunctionCalling(函数调用)拓展了模型执行动作的能力,解决纯文本交互的局限性,即模型解析用户意图后生成结构化指令,调用预定义外部函数或API(如发送邮件 而我们可以认为,MCP是在FunctionCalling的基础上做了进一步的抽象,目的是让应用更加简单、高效、安全地对接外部资源,更好地为大模型补充上下文信息。 这种参数化设计方式提高了工具调用的灵活性,降低了FunctionCalling的开发复杂度。 在AIAgent架构中:RAG充当知识中枢,FunctionCalling为执行手段,MCP则是连接内外的“神经枢纽”。
OpenClaw内容结构(6大部分)AI应用基础—形态、技术栈、何时用工具vs纯PromptLLM与提示工程—能力边界、上下文窗口、成本控制Agent核心—ReAct、Plan-and-Execute、FunctionCalling
当前AI工程最痛的不是LLM不够聪明,而是每个Agent框架、每家厂商的FunctionCalling格式都是私有孤岛。OpenClaw要做的事类比HTTP之于Web——不生产内容,但决定谁能互通。
pageAgent || new PageAgentConfig(); // 函数调用配置 this.functionCalling = data?. functionCalling || []; // 交互定义 this.interactions = data?.
function argument:') fn()>>> dosomething(lambda : print('Hello World')) # passing anonymous functionCalling
pageAgent || new PageAgentConfig(); this.functionCalling = data?. functionCalling || []; this.interactions = data?.
openai.ToolTypeFunction, Function: &f2}, {Type: openai.ToolTypeFunction, Function: &f3}, } } 接着,我们定义 functionCalling func functionCalling(input string, client *utils.OpenAI) string { tools := createTools() dialogue = nil { return fmt.Sprintf("执行操作失败: %v", err) } return result } 在 functionCalling 中,我们调用了 callFunction 调用 OpenAI Function calling response := functionCalling(input, client) return response } 最后,在 startChat
全权限的“钢铁侠”智能体Memu——会“记住”你的主动式助手Nanobot——开发者的“瑞士军刀”三、核心能力深度解析联网搜索:让AI获取实时信息知识库检索(RAG):让AI读懂你的专属文档工具调用(FunctionCalling bge-m3(硅基流动提供)配置重排模型:选用BAAI/bge-reranker-v2-m3(提升检索精度)创建知识库:上传文档(PDF/TXT等),系统自动切片和向量化在工作流中引用知识库节点工具调用(FunctionCalling
它通过可视化的Agent工作流设计,将原本需要代码实现的复杂功能调用(FunctionCalling)和链式思考(Chain-of-Thought)封装成了用户友好的交互界面。
2.工具调用模式(ToolUse)通过FunctionCalling让LLM具备操作物理世界的能力。模型不再猜测答案,而是生成工具调用的JSON参数,由后台执行并将结果反馈给模型。
与FunctionCalling的本质区别:OpenAI的FunctionCalling等方案要求开发者将工具定义硬编码到提示词中,这会消耗宝贵的上下文窗口,并且难以管理。
return chatService.chat(userMessage); } @PostMapping("/function-calling") public String functionCalling retriever) .build(); return chain.execute(userMessage); } public String functionCalling
你可能会说,FunctionCalling不是早就有了吗?确实,GPT系列从2023年就支持FunctionCalling了。 但FunctionCalling有个根本问题——每个模型的函数调用格式不一样,每个平台的工具定义方式不一样,每换一个模型你就得重写一遍工具接入代码。