新闻详情

新闻详情

首页 / 资讯中心 / 详情

AI代码学习-Function Calling

发布时间:2026/9/12 20:58:18来源:尧图网络
AI代码学习-Function Calling
AI代码学习-Function Calling1、前篇回顾上一篇先把单次模型请求的能力边界捋了一遍模型和框架可以帮我们约束输出格式但字段有没有实际意义、内容是否可信仍然要由业务代码把关。选择 Agently主要是因为它的链式写法比较直观对熟悉 Android 开发的人来说上手成本也不高。文章接着讲了数据结构化和输出控制。数据结构化是把模型生成的文字变成程序能直接处理的数据输出控制则要靠多层约束配合。Prompt 负责说明任务response_format保证返回合法 JSON应用层校验再检查字段和内容能不能真正使用。示例中我们用.output()声明了一个包含嵌套数组和七个字段的数据结构再通过formatjson拿到解析后的字典。不过格式正确并不等于内容可靠空图片地址和疑似编造的链接都说明后面还需要字段校验、事实核验、异常重试、日志记录和业务规则兜底。本篇就在这个基础上把模型注册、请求发送、结构校验和结果输出完整串起来。2、从面试问题说起什么是 Function Calling这里借用一下之前面试时一位面试官问我的问题先介绍一下什么是 Function Calling大模型本身只负责理解、推理和输出文字和咱们的大脑类似。大脑不能直接完成动作而是向对应的器官发送信号。比如大脑接收到口渴的信号判断需要喝水然后让手拿起装有水的杯子、把杯子放到嘴边最后张嘴喝水。这里和 Function Calling 有一点不同应用还需要判断大模型选择的工具是否在注册列表内以及是否接受这次调用。大模型会根据需要从以结构化格式注册的工具中进行选择生成所需参数最后由对应的代码执行。面试官听到答案后又追问了一个问题Function Calling 解决了哪些痛点给你带来什么启发3、Function Calling 解决什么问题Function Calling 主要补上了模型与外部系统之间的连接能力获取实时信息模型自身无法主动查询最新数据。注册搜索、天气或库存等工具后应用可以把查询结果返回给模型。访问并操作业务系统通过已经注册的接口模型可以提出读取业务数据、生成订单等调用请求再由应用执行。选择合适的工具当系统注册了多个工具时模型可以结合工具描述、用户意图和上下文生成调用意图减少应用层单纯依赖固定分支进行路由。权限校验和业务规则仍然由应用负责。如果任务包含多个存在依赖关系的步骤单次 Function Calling 还不够。应用需要通过“调用、观察、决定下一步”的循环继续编排这部分更接近后面要讲的 ReAct Loop。在真正的开发过程中很多通用问题都有现成方案。但如果业务需要深度定制或者需要操作公司数据库、生成订单、查询企业内部私有文件而现成工具无法直接使用就需要借助 Function Calling。4、先看完整调用流程在看代码之前先通过一张流程图捋顺整体流程。理解各个环节的职责后再看后面的示例会简单一些。5、示例一让模型选择工具下面先注册一个简单的工具让大模型判断是否需要使用它并输出对应的工具信息。importosfromdotenvimportload_dotenv,find_dotenvfromagentlyimportAgently# 预留给后续的 Pydantic 校验:当前文件未使用,# 如需对模型返回的决策结果做强校验,可参考 agently_demo.py 的用法frompydanticimportBaseModel,Field,ValidationError,field_validator# 加载项目根目录下的 .env 环境变量配置文件# find_dotenv() 会自动向上查找最近的 .env 文件load_dotenv(find_dotenv())# 从环境变量中读取 DEEPSEEK API 密钥没有则直接抛错终止# 因为后续的真实模型请求必须依赖该密钥api_keyos.getenv(DEEPSEEK_API_KEY)ifnotapi_key:raiseRuntimeError(未找到 DEEPSEEK_API_KEY否则无法运行真实模型请求。)# 读取模型名称与接口地址OpenAI 兼容协议的 base_urlmodel_nameos.getenv(DEEPSEEK_MODEL_NAME,)base_urlos.getenv(DEEPSEEK_BASE_URL,)# 打印当前加载到的配置便于排查环境变量是否生效print(fAPI Key:{api_key})print(fModel Name:{model_name})print(fBase URL:{base_url})# 用户的原始诉求:需要联网搜索才能回答,模型自身无法完成FUNCTION_CALLING_INPUT搜索2026 年机器人运动会进展的网页候选。# 工具的 JSON Schema 声明,通过 .info() 作为背景信息提供给模型,# 让模型知道有哪些工具可用、每个工具接收什么参数FUNCTION_CALLING_TOOL{name:search_web,description:搜索网页候选,parameters:{type:object,properties:{query:{type:string,description:搜索关键词,},num_results:{type:integer,description:返回的搜索结果数量,default:5,},},required:[query],},}# 期望模型输出的调用决策结构(Agently 格式声明):# - 元组第 3 个元素 not_null 表示该字段不允许为空;# - (search_web, ..., True) 表示枚举值,模型只能从给定值中选择;# 模型不会真的执行工具,只返回 purpose / action_id / arguments 这段决策 JSONFUNCTION_CALLING_OUTPUT{purpose:(str,这次调用要补齐哪项信息,not_null),action_id:(search_web,从 available_tools 选择的工具名,True),arguments:{query:(str,传给 search_web 的搜索词长度为 3-200 字符,not_null),},}defbuild_model():配置 Agently 底层使用的大模型服务OpenAI 兼容协议。Agently.set_settings(OpenAICompatible,{base_url:base_url,# 模型服务的接口地址api_key:api_key,# 鉴权密钥model:model_name,# 使用的模型名称},)defmain():演示 Function Calling 的第一步:让模型输出调用决策。 与 function_calling_demo.py 的完整三步(决策 → 执行 → 回答)不同, 本文件只演示第一步:模型根据用户需求和可用工具声明, 输出调用哪个工具、传什么参数的结构化 JSON,不真正执行工具。 build_model()# .info() 把可用工具的 JSON Schema 作为背景信息传给模型;# .output() 约束模型按 FUNCTION_CALLING_OUTPUT 的结构返回决策结果result(Agently.create_agent().input(FUNCTION_CALLING_INPUT).info({available_tools:[FUNCTION_CALLING_TOOL]}).output(FUNCTION_CALLING_OUTPUT).start())print( Function Calling )print(result)if__name____main__:main()注册工具推理输出结果{purpose:补齐2026年机器人运动会最新进展信息,action_id:search_web,arguments:{query:2026年机器人运动会 进展}}这里可以看出模型已经根据用户输入信息进行推理最终选择使用 search_web 工具。到这里说明注册成功并且通过提示词可以推理出需要使用的工具最终获得结果。6、示例二执行工具并整合结果下面是一条完整的调用链路。这里没有加入复杂的业务流程先把基本过程看清楚后续再根据业务需要扩展。importosfromdotenvimportload_dotenv,find_dotenvfromagentlyimportAgentlyimportjsonfromcollections.abcimportMappingfromtypingimportAny# 真实的工具实现(本地函数),Function Calling 中模型只负责决策调用,# 真正执行由宿主代码完成fromaction_managerimportsearch_web# 加载项目根目录下的 .env 环境变量配置文件# find_dotenv() 会自动向上查找最近的 .env 文件load_dotenv(find_dotenv())# 从环境变量中读取 DEEPSEEK API 密钥没有则直接抛错终止# 因为后续的真实模型请求必须依赖该密钥api_keyos.getenv(DEEPSEEK_API_KEY)ifnotapi_key:raiseRuntimeError(未找到 DEEPSEEK_API_KEY否则无法运行真实模型请求。)# 读取模型名称与接口地址OpenAI 兼容协议的 base_urlmodel_nameos.getenv(DEEPSEEK_MODEL_NAME,)base_urlos.getenv(DEEPSEEK_BASE_URL,)# 打印当前加载到的配置便于排查环境变量是否生效print(fAPI Key:{api_key})print(fModel Name:{model_name})print(fBase URL:{base_url})# 用户的原始诉求:需要联网搜索才能回答,模型自身无法完成FUNCTION_CALLING_INPUT搜索2026 年机器人运动会进展的网页候选。# 工具的 JSON Schema 声明,通过 .info() 作为背景信息提供给模型,# 让模型知道有哪些工具可用、每个工具接收什么参数FUNCTION_CALLING_TOOL{name:search_web,description:搜索网页候选,parameters:{type:object,properties:{query:{type:string,description:搜索关键词,},num_results:{type:integer,description:返回的搜索结果数量,default:5,},},required:[query],},}# 期望模型输出的调用决策结构(Agently 格式声明):# - 元组第 3 个元素 not_null 表示该字段不允许为空;# - (search_web, ..., True) 表示枚举值,模型只能从给定值中选择;# 模型不会真的执行工具,只返回 purpose / action_id / arguments 这段决策 JSONFUNCTION_CALLING_OUTPUT{purpose:(str,这次调用要补齐哪项信息,not_null),action_id:(search_web,从 available_tools 选择的工具名,True),arguments:{query:(str,传给 search_web 的搜索词长度为 3-200 字符,not_null),},}defbuild_model():配置 Agently 底层使用的大模型服务OpenAI 兼容协议。Agently.set_settings(OpenAICompatible,{base_url:base_url,# 模型服务的接口地址api_key:api_key,# 鉴权密钥model:model_name,# 使用的模型名称},)defexecute_command(command:Mapping[str,Any])-dict[str,Any]:宿主分发器:校验模型给出的调用决策,并执行真实的本地函数。 安全要点:模型输出不可信,这里用白名单方式校验 action_id, 只有明确允许的工具才会被执行,其余一律拒绝。 ifcommand.get(action_id)!search_web:raiseValueError(未允许的 action_id)argumentscommand[arguments]# 按模型决策出的参数调用真实工具函数returnsearch_web(queryarguments[query])defmain():演示 Function Calling 功能的调用流程。 整体分三步: 1. 决策:模型根据用户需求和可用工具声明,输出调用哪个工具、传什么参数; 2. 执行:宿主代码校验决策并调用真实函数,拿到工具返回结果; 3. 回答:把工具结果回传给另一个 Agent,由它基于结果生成最终答案。 build_model()# 第一步:让模型输出调用决策(结构化 JSON)# .info() 把可用工具的 JSON Schema 作为背景信息传给模型result(Agently.create_agent().input(FUNCTION_CALLING_INPUT).info({available_tools:[FUNCTION_CALLING_TOOL]}).output(FUNCTION_CALLING_OUTPUT).start())print( Function Calling )print(result)# 第二步:宿主分发器校验并执行真实工具调用commandsexecute_command(result)print( Function Calling Output )print(json.dumps(commands,indent2,ensure_asciiFalse))# 第三步:新建一个 Agent,把调用决策和工具执行结果一起回传,# 让它基于真实搜索结果生成最终回答(而不是凭模型记忆编造)answer(Agently.create_agent(search_web_answer).input(FUNCTION_CALLING_INPUT).info({call_tool:{call_id:call-search-web,result:result},tool_call_output:{call_id:call-search-web,result:commands},}).instruct([只根据 tool_call_output 列出候选标题和 URL,明确这些结果是 discovery_hint尚未读取页面正文,])# .get_text() 直接返回纯文本回答,不做结构化解析.get_text())print( Function Calling Answer )print(answer)if__name____main__:main()获取工具信息后再交给大模型整合并输出结果 Function Calling {purpose: 获取2026年机器人运动会最新进展的网页候选, action_id: search_web, arguments: {query: 2026年机器人运动会 进展}} [INFO] 2026-09-10 15:58:17 | response: https://yandex.com/search/site/?text2026%E5%B9%B4%E6%9C%BA%E5%99%A8%E4%BA%BA%E8%BF%90%E5%8A%A8%E4%BC%9A%E8%BF%9B%E5%B1%95web1searchid5929252 200 Function Calling Tool Output { evidence_level: discovery_hint, query: 2026年机器人运动会 进展, backend: yandex, diagnostics: [], candidates: [ { title: 2026... - YouTube, url: https://www.youtube.com/watch?v9fHKz696JAU }, { title: 跻身世界人形机器人运动会工业场景赛全国前三ROSS Harness..., url: https://m.pedaily.cn/news/568221 }, { title: bilibili.com/video/BV1grb66BEu6, url: https://www.bilibili.com/video/BV1grb66BEu6/ } ] } Function Calling Answer 以下为 discovery_hint 候选结果尚未读取页面正文 1. 标题2026... - YouTube URLhttps://www.youtube.com/watch?v9fHKz696JAU 2. 标题跻身世界人形机器人运动会工业场景赛全国前三ROSS Harness... URLhttps://m.pedaily.cn/news/568221 3. 标题bilibili.com/video/BV1grb66BEu6 URLhttps://www.bilibili.com/video/BV1grb66BEu6/7、从 Function Calling 到 ReAct Loop这张流程图还引出了一个前一阵很火的概念ReAct Loop。最初我只把它理解成一个循环。这时候有人问我这个循环什么时候停止我当时脑袋一片空白直接答不出来。回到家后我开始一点点在网上找资料也咨询了已经从业的老师和他们多次讨论这个问题。我后来把 ReAct Loop 理解为两个大阶段。第一个阶段包括组织提示词、让大模型判断需要借助什么工具以及由宿主通过工具接口获得结果这里会用到 Function Calling。第二个阶段负责验证结果、处理失败并输出最终答案。我给这个阶段起了个名字叫“判题阶段”就像小时候老师批改作业一样。Function Calling 主要解决工具描述、工具选择和参数生成。结果验证、失败重试、继续调用和停止判断属于上层流程控制。ReAct Loop 可以使用 Function Calling但两者不是简单的前后两个阶段。后来我才明白写出循环不难难的是给循环设定明确的边界。每一轮拿到工具结果后都要先判断当前信息能不能回答问题。如果信息还不够而且还有合适的工具可用就继续调用如果工具暂时失败或返回结果不符合要求可以在限定次数内重试如果信息已经足够、没有可用工具或者达到预设的最大轮数就应该停止循环输出当前能够确认的结果。8、工具定义中的几个知识点‌description 写给模型看‌描述触发场景和边界不写实现细节。‌参数类型精确‌能用number就别用string能用enum就限制枚举值减少模型瞎猜。‌区分必填和可选‌全标required会导致模型硬编值合理标记会让模型主动追问缺失信息。‌参数描述带示例‌如果参数含义或格式容易混淆可以在 description 里附上 1-2 个简短示例帮助模型理解预期格式和取值范围。‌明确失败边界‌在描述里写清工具不能做什么防止模型在工具出错时胡言乱语。‌‌9、结束语Function Calling 说到底是把“模型决定做什么”和“程序真正执行”分开。模型根据上下文选择工具、生成参数宿主负责校验参数、调用函数再把结果交回模型。只有把这条边界划清楚模型给出的调用意图才能安全地落到真实业务里。这篇先用搜索示例跑通了最小链路。代码不算复杂但几个关键环节已经齐了工具描述要写清楚参数和工具名称要经过校验真实操作只能由宿主执行搜索得到的候选结果也不能直接当成事实。下一篇会在 Function Calling 的基础上加入 ReAct Loop把这些判断落到代码中串成一个完整循环具体看看程序如何根据工具结果决定继续调用、重试或结束。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ToolJet Text Input 组件完全指南:属性、事件、验证与组件级动作(CSA)详解 2026/9/13 0:52:59

ToolJet Text Input 组件完全指南:属性、事件、验证与组件级动作(CSA)详解

ToolJet Text Input 组件完全指南:属性、事件、验证与组件级动作(CSA)详解 【免费下载链接】ToolJet Open-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applicatio…

阅读更多 →
Claude Code Game Studios 资产审计技能(/asset-audit)完全指南:命名规范、格式与尺寸预算合规检查 2026/9/13 0:49:58

Claude Code Game Studios 资产审计技能(/asset-audit)完全指南:命名规范、格式与尺寸预算合规检查

Claude Code Game Studios 资产审计技能(/asset-audit)完全指南:命名规范、格式与尺寸预算合规检查 【免费下载链接】Claude-Code-Game-Studios Turn Claude Code into a full game dev studio — 49 AI agents, 72 workflow skills, and a c…

阅读更多 →
高质量数据集从0到1系统化建设:定义、采集、清洗、标注与验收全链路 2026/9/13 0:49:58

高质量数据集从0到1系统化建设:定义、采集、清洗、标注与验收全链路

前几天在一个技术群里看到有人问:yolov8训练自己的数据集,迭代了两百多个epoch,mAP0.5还是只有0.2,是不是模型有问题?我随口问了一句:你的数据集是怎么建的?对面沉默了很久,最后回了…

阅读更多 →
从数据可视化到影视数据分析大屏:建模、SQL与ECharts实践 2026/9/13 0:49:58

从数据可视化到影视数据分析大屏:建模、SQL与ECharts实践

简介:这是面向数据可视化学习与二次开发的影视数据分析展示系统压缩包,围绕影视数据的采集、处理、建模与可视化展示形成完整案例,既适合新手按照资料动手练习,也方便开发者在此基础上扩展功能。压缩包共273个文件,大小…

阅读更多 →
Crawlee 在 AWS Lambda 上运行 Playwright 爬虫:浏览器二进制、存储与部署完整指南 2026/9/13 0:49:58

Crawlee 在 AWS Lambda 上运行 Playwright 爬虫:浏览器二进制、存储与部署完整指南

Crawlee 在 AWS Lambda 上运行 Playwright 爬虫:浏览器二进制、存储与部署完整指南 【免费下载链接】crawlee Crawlee—A web scraping and browser automation library for Node.js to build reliable crawlers. In JavaScript and TypeScript. Extract data for A…

阅读更多 →
Zulip 全文搜索架构解析:从 PostgreSQL 内置 FTS 到 PGroonga 多语言支持 2026/9/13 0:49:58

Zulip 全文搜索架构解析:从 PostgreSQL 内置 FTS 到 PGroonga 多语言支持

Zulip 全文搜索架构解析:从 PostgreSQL 内置 FTS 到 PGroonga 多语言支持 【免费下载链接】zulip Zulip server and web application. Open-source team chat that helps teams stay productive and focused. 项目地址: https://gitcode.com/GitHub_Trending/zu/z…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞