news 2026/10/18 13:50:32

Go 实现 Function Calling 工具调用:从工具定义到参数解析保姆级教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Go 实现 Function Calling 工具调用:从工具定义到参数解析保姆级教程

Go 实现 Function Calling 工具调用:从工具定义到参数解析保姆级教程

系列第 1 篇 · Go + Function Calling 写 AI Agent。本文只讲一件事:工具怎么定义、怎么注册给大模型、参数怎么解析。

目录

  • Go 实现 Function Calling 工具调用:从工具定义到参数解析保姆级教程
    • 一个工具需要四样东西
    • 怎么注册给大模型
    • 参数解析:最容易踩的坑
    • Params 的 JSON Schema 怎么写
    • 一句话总结

一个工具需要四样东西

很多 Go 教程把 Function Calling 讲得云里雾里,其实在 Go 里落地,一个工具就是一个结构体:

// tools/tool.gotypeToolDefstruct{Namestring// 工具名,模型靠它点名Descriptionstring// 工具说明,模型靠它决定什么时候用Params openai.FunctionParameters// JSON Schema,告诉模型传什么参数Fnfunc(ctx context.Context,argsmap[string]any)(string,error)// 真正干活的函数}

小提醒:这里的openai和shared都来自OpenAI 官方 Go SDK,不是什么厂商私有库——任何兼容 OpenAI 接口的服务都能用。四个导入一个都不能少:

import("context""encoding/json""github.com/openai/openai-go/v3""github.com/openai/openai-go/v3/shared")

就这四样:名字、描述、参数格式、执行函数。缺一不可,后面的无数坑都源于对这四个字段理解不深。

怎么注册给大模型

光有结构体模型不认识,得把它翻译成 OpenAI API 能懂的格式:

func(t*ToolDef)ToChatParam()openai.ChatCompletionToolUnionParam{returnopenai.ChatCompletionToolUnionParam{OfFunction:&openai.ChatCompletionFunctionToolParam{Function:shared.FunctionDefinitionParam{Name:t.Name,Description:openai.String(t.Description),Parameters:t.Params,},},}}

注册后,把它塞进请求的Tools字段,模型就知道"我有这些工具可以调用"。

参数解析:最容易踩的坑

模型决定调用工具后,会把参数用JSON 字符串传回来,长这样:

"{\"sql\":\"select * from users\"}"

注意:它是字符串,不是对象。里面的引号是转义的。所以必须先json.Unmarshal成 Go 的 map,才能取值:

func(t*ToolDef)Call(ctx context.Context,argsJSONstring)(string,error){varargsmap[string]anyiferr:=json.Unmarshal([]byte(argsJSON),&args);err!=nil{return"",err}returnt.Fn(ctx,args)}

很多人卡在这里,直接把argsJSON当对象用,结果永远nil。记住这一句:模型给你的是字符串,先反序列化,再干活。

Params 的 JSON Schema 怎么写

Params字段告诉模型该传什么参数,格式是固定的三段:

Params:openai.FunctionParameters{"type":"object","properties":map[string]any{"sql":map[string]any{"type":"string","description":"要执行的 SQL 语句",},},"required":[]string{"sql"},}
  • type: “object” —— 外层永远是对象
  • properties—— 里面有哪些字段
  • required—— 哪些字段必填

哪怕工具不要参数,这三个键也要存在,内容填空就行。这是很多教程漏讲的细节。

一句话总结

Function Calling 的落地就是:定义结构体 → 翻译成 API 格式 → 反序列化模型传来的 JSON 参数 → 执行真正的函数。把这四步走通,你就已经会写 80% 的工具调用代码了。

下一篇讲:怎么把这些工具串成一个 Agent 主循环——那才是 Agent 真正的骨架。

系列导航:第 1 篇(本文)· [第 2 篇:Go 手写 Agent 主循环] · [第 3 篇:SQL 安全四道锁]

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 13:49:51

Agent安全审计:从检测准确率到可观测性边界的测绘

1. 这套Agent安全审计流程,不是为了“测出漏洞”,而是为了暴露“测不准”的真相我开源了一套 agent 安全审计流程——这句话听起来像技术公告,但实际发布当天,我在 README 第一行就写了:“本流程在真实测试中&#xff…

作者头像 李华
网站建设 2026/10/18 13:49:39

artcraft:浏览器优先的轻量化创意工作台架构与性能优化实践

1. 项目缘起与整体设计思路1.1 为什么会有 artcraft 这个想法做创意工具这些年,我最大的感受是:市面上要么是给专业设计师用的重型软件,功能全但上手门槛高得离谱;要么是给普通人玩的轻量应用,点几下就没了&#xff0c…

作者头像 李华
网站建设 2026/10/18 13:46:22

GEO搜索获客实战:从AI知识科普到生成式引擎优化

这两年做内容营销和搜索获客的朋友,应该都有一个很明显的体感:传统搜索带来的流量越来越难做,平台调整算法的频率越来越快,关键词排上去的难度成倍增加。与此同时,打开各类 AI 问答助手的人越来越多,大家遇…

作者头像 李华
网站建设 2026/10/18 13:44:21

NFC碰一碰同城拓客系统源码解析:微信小程序把到店流量变客户资产

简介:一套基于小程序与手机NFC(近场通信)技术的同城拓客系统完整源码包,面向本地商户、营销服务商及具备小程序开发基础的工程师。系统通过NFC碰一碰标签快速唤起营销页面,支持一键发布短视频到抖音、种草文案到小红书…

作者头像 李华
网站建设 2026/10/18 13:44:19

Qt Creator调试启动崩溃?一文讲透lib与dll的部署关系

最近有朋友发来一个求助:某个 Qt 项目用 Qt Creator 一点“调试”就崩,报错信息五花八门,有“During startup program exited with code 0xc0000135”,有“The inferior stopped because it received a signal”,甚至直…

作者头像 李华
网站建设 2026/10/18 13:43:17

URP Kawase模糊模块:可调、可测、可进管线的生产级实现

简介:这是一份面向Unity中高级开发者与URP渲染管线学习者的Kawase模糊后处理实验项目,聚焦于ScriptableRenderFeature在URP中的实践应用,解决自定义多Pass后处理效果开发难、调试门槛高的问题。资源共66个文件,含20个核心asset&am…

作者头像 李华