Function calling的过程

文章目录

    • 逐段讲清 **LLM Function Calling(函数调用)** 的典型链路。
    • 1. 角色与概念 | Actors & Concepts
    • 2. 全流程时序 | End-to-End Sequence
    • 3. 关键细节 | Key Implementation Notes
    • 4. 最小可用示例(伪代码) | Minimal Example (Pseudo-Python)
    • 5. 常见坑 / FAQ
      • TL;DR

逐段讲清 LLM Function Calling(函数调用) 的典型链路。

1. 角色与概念 | Actors & Concepts

ZH

  • 开发者 (Developer):用 JSON-Schema 描述可调用函数。
  • 用户 (User):提出自然语言请求。
  • 模型 (LLM):在推理时决定是否调用函数、选哪一个、填什么参数。
  • 执行器 (Caller / Tool Runtime):真正跑代码或访问外部 API,把结果回给模型。

EN

  • Developer supplies JSON-Schema definitions of callable functions.
  • User sends a request in natural language.
  • LLM decides whether, and how, to call a function.
  • Caller / Tool Runtime executes the function and returns results to the model.

2. 全流程时序 | End-to-End Sequence

#步骤 (ZH)Step (EN)
1注册函数:开发者在 functions 字段传入 JSON-Schema,示例:
{"name":"weather","parameters":{"type":"object","properties":{"location":{"type":"string"}}}}
Register functions via the functions array in the API call, giving JSON-Schema for each.
2输入消息messages=[{"role":"user","content":"今天天气如何?"}]User message is sent in messages.
3模型推理:LLM 读取系统+用户信息,若判断需要函数→输出 role:"assistant", "name":"weather", "arguments":{...}Model reasoning: If it decides a function is needed, it emits a tool call with role:"assistant" and name, arguments.
4执行器调用:客户端检测到 name 字段→调用本地或远程函数→得到返回值,如 {"temp":25}Caller executes detected function, obtains result JSON.
5结果回注:把结果作为 role:"function", "name":"weather", "content":"{\"temp\":25}" 再塞进 messagesInject result back as a function role message so the model can see it.
6模型二次生成:LLM 看到函数输出后,再生成最终自然语言回答。Second pass: model crafts the final user-visible response, informed by result.

从开发者视角看,就是 “定义 → 监听 → 调用 → 回注” 四件事。
From the dev perspective: define → watch → call → inject.


3. 关键细节 | Key Implementation Notes

  1. JSON-Schema 精度

    • 字段类型、必选/可选决定模型填参质量。尽量用 enum, minimum, pattern 等约束减少幻觉。
    • Use rich JSON-Schema constraints (enum, minimum, pattern) to steer the model toward valid args.
  2. 多轮调用

    • 模型可串联多次函数:例如先 search_flightsbook_flight。保持每轮都把结果作为 function role 回注即可。
    • Chained calls work: keep injecting each result back as a function message.
  3. 流式 (Streaming)

    • 在 OpenAI 流接口(stream=true)里,tool_calls δ块先到,客户端可即时触发执行。
    • With streaming, tool-call deltas arrive early, enabling near-real-time actions.
  4. 错误处理

    • 若执行失败,把错误描述同样作为 function 消息交给模型,让它决定重试/解释。
    • Return errors as function role messages so the model can handle retries or apologies.
  5. 安全与权限

    • 在执行器侧校验参数,避免模型注入恶意 shell 字符串。
    • Validate args server-side; the JSON schema itself is not a security boundary.

4. 最小可用示例(伪代码) | Minimal Example (Pseudo-Python)

# 1. define schema
functions = [{"name": "weather","description": "Get current weather","parameters": {"type": "object","properties": {"location": {"type": "string"}},"required": ["location"]}
}]# 2. first API call
messages = [{"role":"user","content":"帮我查一下北京天气"}]
resp = openai.ChatCompletion.create(model="gpt-4o",messages=messages,functions=functions)# 3. if resp.choices[0].finish_reason == "tool_call":
tool_call = resp.choices[0].message
args = json.loads(tool_call["arguments"])
result = get_weather(args["location"])# 4. feed back
messages += [tool_call,{"role":"function","name":"weather","content":json.dumps(result)}
]
final = openai.ChatCompletion.create(model="gpt-4o",messages=messages)
print(final.choices[0].message["content"])

5. 常见坑 / FAQ

问题处理建议
模型拒绝填参数检查 system prompt 是否允许工具;确保 schema 名称易懂;给示例调用。
参数格式错位使用 json.loads() 校验;在 schema 里加 format, pattern
连续调用失序每轮都把 完整历史+最新函数结果发回;保持 deterministic。

TL;DR

  • Function Calling = LLM decides + runtime executes + LLM finishes
  • 只需掌握 JSON-Schema 定义、工具消息注入、循环两轮,即可把“智能体”接入任意后端逻辑。

Master the pattern once and you can wire your Llama/GPT/Claude agent to databases, SaaS APIs, or even a coffee machine.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GlobalExceptionHandler 自定义异常类 + 处理validation的异常

在 Spring Boot 项目中,​自定义异常通常用于处理特定的业务逻辑错误,并结合全局异常处理器(ControllerAdvice)统一返回结构化的错误信息。 一.全局异常处理器: 1. 自定义异常类​ 定义一个继承自 RuntimeExceptio…

软件测试过程中如何定位BUG

在软件测试过程中,定位BUG是确保软件质量的关键环节。有效的BUG定位不仅能帮助开发人员快速修复问题,还能提升整个软件项目的效率。以下是软件测试中定位BUG的系统性方法和策略: 一、复现BUG 步骤: 收集信息:记录BUG…

如何优化Elasticsearch的搜索性能?

优化 Elasticsearch 的搜索性能需要从索引设计、查询优化、硬件配置和集群调优等多方面入手。以下是系统化的优化策略和实操建议: 一、索引设计优化 1. 合理设置分片数 分片大小:单个分片建议 10-50GB(超过50GB会影响查询性能)。分片数量: 总分片数 ≤ 节点数 1000(避免…

台式电脑CPU天梯图_2025年台式电脑CPU天梯图

CPU的选择绝对是重中之重,它关乎了一台电脑性能好坏。相信不少用户,在挑选CPU的时候不知道谁强谁弱,尤其是intel和AMD两款CPU之间。下面通过2025年台式电脑CPU天梯图来了解下这两款cpu. 2025年台式电脑CPU天梯图 2025年台式电脑CPU天梯图包含了老旧型号以及12代、13代、14代…

HarmonyOS_ArkTs_API(1)

HarmonyOS_ArkTs_API(1) 概述 此API服务模块是独自开发的应用程序的核心骨架,提供了鸿蒙OS ArkTS客户端组件和Java Spring Boot后端之间的强大通信接口。该模块采用清晰的架构方法处理所有HTTP请求、响应解析和错误处理,确保系统各部分间通信的一致性和…

matlab雷达定位仿真

一、边扫描边跟踪雷达仿真 边扫描边跟踪(BISTAR)雷达仿真是一种实时雷达信号处理的技术,用于模拟雷达系统的操作过程,特别是那些具备连续扫描能力的雷达。它的基本原理和流程可以分为以下几个步骤: (1&…

互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

一:并发 1.1MySQL并发事务访问相同记录 (1)读-读 不影响 (2)写-写 写的数据需要一个一个来,排队执行 (3)读-写 两次读…

KEYSIGHT N9320B是德科技N9320B频谱分析仪

KEYSIGHT N9320B是德科技N9320B频谱分析仪 附加功能&#xff1a; 频率范围&#xff1a;9 kHz 至 3 GHz 分辨率带宽&#xff1a;10 Hz 至 1 MHz DANL&#xff1a;-130 dBm&#xff0c;-148 dBm&#xff0c;带可选前置放大器 整体幅度精度&#xff1a;<1.5 dB 最小非零扫…

零基础开始的网工之路第十四天------Linux程序管理

目录 一、Linux程序与进程 1、程序,进程,线程的概念 2、程序和进程的区别 3、进程和线程的区别 二、Linux进程基础(生命周期) 1、进程生命周期 2、父子进程的关系 三、程序管理 1、常见的软件包类型 四、Linux操作系统启动流程详解 1、概述 2、启动流程核心阶段 1…

群辉(synology)NAS老机器连接出现网页端可以进入,但是本地访问输入一样的账号密码是出现错误时解决方案

群辉&#xff08;synology&#xff09;NAS老机器连接出现网页端可以进入&#xff0c;但是本地访问输入一样的账号密码是出现错误时解决方案 老机器 装的win7 系统 登入后端网页端的时候正常&#xff0c;但是本地访问登入时输入登入网页端一样的密码时候出现问题解决方案 1.登…

单例模式的隐秘危机

引言 单例模式作为设计模式中的基石&#xff0c;广泛应用于配置管理、线程池、缓存系统等关键场景。然而&#xff0c;许多开发者误以为“私有构造函数”足以保障其唯一性&#xff0c;却忽视了反射机制、对象克隆、序列化反序列化这三把“隐形利刃”——它们能绕过常规防御&…

DMBOK对比知识点对比(3)

1.数据仓库建设方法(Inmon、Kimball) 数据仓库建设方法(Inmon、Kimball)P293方法

Python+VR:如何让虚拟世界更懂你?——用户行为分析的实践

友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…

游戏引擎学习第311天:支持手动排序

仓库: https://gitee.com/mrxiao_com/2d_game_7(已满) 新仓库: https://gitee.com/mrxiao_com/2d_game_8 回顾并为今天的内容定下基调 我们接下来要继续完成之前开始的工作&#xff0c;上周五开始的部分内容&#xff0c;虽然当时对最终效果还不太确定&#xff0c;但现在主要任…

数据结构第2章绪论 (竟成)

第 2 章 绪论 本章主要介绍数据结构相关的一些基本概念&#xff0c;是后续章节的基础。我们也将 408 考试大纲中&#xff0c;关于数据结构部分的考查目标罗列在这里&#xff0c;供各位考生参考&#xff1a; 1.掌握数据结构的基本概念、基本原理和基本方法。 2.掌握数据的逻辑结…

spring boot 拦截器HandlerInterceptor 不生效的原因排查

public class UserInterceptor implements HandlerInterceptor项目添加一个拦截器&#xff0c;发现未生效 1、排查拦截本身是否注入了springbean 容器 Slf4j Component public class LoginInterceptor implements HandlerInterceptor {2、排查springboot 项目扫描范围是否包含…

用Python绘制动态爱心:代码解析与浪漫编程实践

用Python绘制动态爱心:代码解析与浪漫编程实践 一、摘要二、整体架构流程1. 初始化配置模块2. 几何绘制引擎3. 动画控制系统4. 辅助功能模块三、技术细节解析1. Turtle性能优化2. 数学公式应用3. 颜色渐变算法4. 异常处理机制5. 动画节奏控制四、结论与展望附:完整代码一、摘…

WPS 免登录解锁编辑

遇到 WPS 需要登录才能启用编辑功能&#xff1f; 如何免登录使用编辑功能&#xff1f; 方法一 解锁方法 1、关闭 WPS&#xff1b; 2、桌面右键→ “新建”→“文本文档”&#xff0c;粘贴以下内容&#xff08;见最下面&#xff09;&#xff1b;编码保持默认&#xff08;ANSI …

ORDER BY子句在一个 SQL 查询中只能出现一次

order by A.create_time,A.update_time desc和 order by A.create_time desc,A.update_time desc有区别吗&#xff1f; 关键区别 第一个排序中 create_time 是升序(默认是ASC)&#xff0c;第二个是降序(DESC) 只有在 DESC 关键字紧跟在列名后面时&#xff0c;该列才会按降序排…

02-BTC-密码学原理 对hash算法如果出现漏洞的思考

如果比特币中某个哈希函数的抗碰撞性出现了漏洞怎么办&#xff0c;怎么补救&#xff1f; 答&#xff1a;&#xff08;1&#xff09;攻击场景&#xff1a; 伪造交易&#xff1a;攻击者可构造两个不同的交易&#xff08;如正常交易和恶意双花交易&#xff09;具有相同的TxID&…