大模型实现工具调用的方式

大模型实现工具调用的方式

大模型只有文字输出能力,它是不具备工具调用等能力的,如果要给大模型扩充这个能力,就需要在把用户消息提交给大模型之前,做点别的事情。

如何让大模型支持工具调用呢?

因为大模型只会文字输出,所以要实现工具调用,我们只能是在它之前做这些事情。具体怎么做呢?

得先在系统提示词(systemMessage)这里加上类似这样的提示语:"如果用户请求需要调用函数,请按以下格式输出:{"name": "函数名", "arguments": {}}"

接下来我们定义好一个函数描述:

json 复制代码
{
    "name": "get_weather",
    "description": "获取指定城市的天气",
    "parameters": {
        "type": "object",
        "properties": {
            "location": {"type": "string", "description": "城市名称"},
            "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
        },
        "required": ["location"]
    }
}

然后再定义get_weather函数:

js 复制代码
async function getWeather(location, unit) {
    const url = `https://weather.api?city=${location}&unit=${unit}`;
    const response = await fetch(url);
    const data = await response.json();
    return data.temperature;
}

准备好函数后,这时用户提问:"上海现在多少度?"

这时就把用户的问题先提交给大模型,让大模型决策是否需要工具调用。

此时大模型根据系统提示词可能给我们这样的回复:

json 复制代码
{
  "name": "get_weather",
  "arguments": {
    "location": "上海",
    "unit": "celsius"
  }
}

我们得到这样的回复后,就可以解析这个 JSON 内容了并做工具调用了:

js 复制代码
const funcObj = JSON.parse(answer);
let res;
if (funcObj.name === 'get_weather') {
  res = await getWeather(funcObj.arguments.location, funcObj.arguments.unit);
}

这个 res 的返回值可能是这样的:

json 复制代码
{"temperature": 28, "unit": "celsius"}

然后我们根据函数的返回值再去组合一下提示词:

text 复制代码
用户问:上海现在多少度?
工具返回:{"temperature": 28, "unit": "celsius"}
请生成友好回复:

把提示词提交给大模型后,得到的回复可能是这样的:上海当前气温28摄氏度。

到此我们就完整的实现了一个大模型的工具调用了。

当然,上述原理和示例都比较简单,属于一个大概的流程。要能够在生产环境下面使用,还得使用一些做的比较完备的工具,比如使用 OpenAI 的 function_call 功能,或者使用 LangChain 这些做的比较好的工具。

再来说说 MCP,可以看到上面的函数调用的形式,我可以自己手写,也可以用别人的工具,都没有一个统一的规范,也不太好把自己的工具分享给别人使用。

于是做 Claude 产品的这家公司就定义了一套规范,让工具使用端与工具提供端统一了一套接口规范,这样只要你提供的工具符合这个规范,我就可以按照这个规范去调用你的工具。这属于一个比较高的抽象层面了。他们官网提供了客户端实现和提供端实现,使用起来也比较方便。

相关推荐
公谨2 分钟前
MasterGo AI 生成设计图及代码
前端·人工智能
不会Android潘潘2 分钟前
HTTP2.0之Header 入门版、面试版 一看就懂
前端
心态与习惯4 分钟前
c++ 中的可变参数模板与折叠表达式
前端·c++·可变参数模板·折叠表达式
高端章鱼哥4 分钟前
Java的volatile和sychronized底层实现
前端
前端叭叭说6 分钟前
下去沉淀一下,最近开发中遇到的技术问题分享【前端】
前端
小璞9 分钟前
webpack 国际化Loader
前端·webpack
小藤神10 分钟前
鸿蒙ArkTS 关于相册,二维码生成、截图保存、真机扫码、上传相册内的图片(重点) ,语音识别搜索功能实现
前端·harmonyos·arkts
一个爱挣扎的旺崽11 分钟前
Cursor实践-集中视频监控管理系统
前端·cursor
南雨北斗13 分钟前
html meta标签里的viewport
前端
冰夏之夜影39 分钟前
【css酷炫效果】纯CSS实现按钮流光边框
前端·css