微信扫码
添加专属顾问
我要投稿
深入探索LLM工具调用的灵活性和效率,揭示Prompt和API限定法的实操技巧。 核心内容: 1. 介绍Prompt结构化输出的工作原理和优势 2. 展示如何通过正则表达式从模型输出中提取结构化信息 3. 分析Prompt和API限定法在实际工具调用中的应用实例
实现工具调用的第二种常用方法,也是灵活性最高的方法,就是通过Prompt中引导模型输出特定的格式(譬如JSON)文本,然后通过正则表达式技术从输出文本中提取结构化信息,用于后续的工具调用。看下面例子:
你是一个航班查询助理,根据用户基于自然语言表达的航班查询需求,按需调用工具完成查询并回复。
【工具定义】
工具名称:flight_search
功能描述:根据用户需求查询实时航班信息
输入参数:
- departure_city(必填,出发城市)
- arrival_city(必填,到达城市)
- date(必填,日期格式YYYY-MM-DD)
- passengers(可选,默认1成人)
}
请用JSON格式返回以下信息:
{
"toolname": "flight_search",
"params": {
"departure_city": "出发城市",
"arrival_city": "到达城市",
"date": "YYYY-MM-DD"
}
}
用户问题:帮我查下后天上海飞广州的航班
该方法的工具清单,以及工具调用回复等等行为全都在Prompt中进行了限定,因此无需依赖Function Calling的支持,任何模型都适用,因此灵活性是最好的。在收到模型的回复后,通过第三方开源的LLM Output Parser,或者通过正则表达式,可以很轻松地从输出文本中解析出json文本。如下伪代码所示:
import llm_output_parser from'xxxx';
import {flight_search} from'./tools';
// 解析响应中的输出文本
asyncfunctionparseOutput(responseText){
try{
const toolCall = llm_output_parser.parse(responseText);
if(toolCall?.toolname){
return toolCall;
}else{
returnnull;
}
}catch(e){
}
}
// 根据响应中的函数调用,执行对应的函数
asyncfunctioninvokeFunction(){
const toolCall = parseOutput(responseText);
if(toolCall){
if(toolCall.toolname == 'flight_search'){
const params = toolCall.params;
if(isValidFlightSearchParams(params)){
returnawaitflight_search(params);
}else{
// 返回参数不合格的校验结果
}
}else {
//。。。。
}
}
}
functionisValidFlightSearchParams(params){
// 检查params是否符合参数格式和必填要求
// ...
}
优点:
缺点:
《五台山朝拜之路》
与Prompt结构化输出方法实现工具调用的路径相似,还有一种变种,就是借助部分模型支持的response_format(强制结构化输出)能力来实现,这是OpenAI在2024年8月份推出的一项API的新功能,可以保证模型100%按照预设的JSON格式输出,为开发者提供确定性。我们把这种方法叫做通过API参数约束法,就如同给模型带上“格式紧箍咒”一样。
OpenAI API的response_format功能通过严格模式(strict mode)实现了对输出结构的精确控制,开发者可通过两种方式启用该功能:
该功能还引入了动态递归支持,例如处理嵌套的anyOf类型或递归数据结构(如树状目录),通过上下文无关文法(CFG)实现复杂模式的动态约束。开发者甚至可为每个对象类型设置独立校验规则,例如在数据库查询中,conditions数组的每个元素必须包含column、operator、value三要素,且value允许字符串、数字或子对象的灵活组合。
此外,SDK集成优化显著简化了开发流程:
// 1.定义工具函数(模拟天气查询)
async function getCurrentWeather({ location }) {
return {
temperature: Math.random()*30 + 10, // 模拟温度数据
condition: ["晴天","多云","小雨"][Math.floor(Math.random()*3)] // 模拟天气状态
};
}
// 2.配置工具调用参数
const tools = [{
type: "function",
function: {
name: "getCurrentWeather",
description: "获取指定城市的天气信息",
parameters: {
type: "object",
properties: { location: { type: "string" } },
required: ["location"]
},
// 启用结构化输出
strict: true// 强制匹配参数结构
}
}];
// 3.执行工具调用
async function queryWeather(message) {
const completion = await openai.chat.completions.create({
model: "gpt-4o-2024-08-06", // 必须使用支持结构化输出的模型
messages: [{ role: "user", content: message }],
tools,
response_format: { // 强制结构化响应
type: "json_object",
schema: {
type: "object",
properties: {
temp: { type: "number" },
condition: { type: "string" }
}
}
}
});
// 4.解析并执行工具调用
const toolCall = completion.choices[0].message.tool_calls[0];
return await getCurrentWeather(JSON.parse(toolCall.function.arguments));
}
// 示例调用
queryWeather("北京明天的天气如何").then(console.log); // 输出示例:{ temperature: 25.3, condition: "多云" }
算法层面主要是通过以下两种手段来组合实现:
意图识别实现工具调用的技术路径在大语言模型出现之前就已经被广泛应用,几乎传统的AI助手,如智能音箱、车机语音助手,基本上都是基于这套技术方案实现的。例如早期的Siri的实现方式为:
通过自然语言理解(NLU)模块将用户指令映射到预定义的意图标签,再调用固定的API接口。例如,用户说“播放周杰伦的歌”,系统解析出意图MusicPlay,触发音乐播放工具。此过程需人工编写大量意图-动作映射规则
大语言模型出现之后,这种技术路径也有了很多的变体:
软件开发领域有一句话叫:“软件开发没有银弹”。意思是没有任何单一技术或管理方法能彻底解决软件开发中的根本性复杂问题,这句话在这里依然适用。
任何一种实现大语言模型调用工具的方法,都有其特殊的优势和无法忽略的问题。开发Agent选择工具调用的技术方案不仅仅要了解各种实现方案的优缺点,还要结合自身的场景的特点来判断。更重要的是,优秀的软件需要给用户提供确定性,在一种方法失效或者无法正常工作的时候,是否有降级的方法来兜底,而不是直接报错或者拒绝服务。
在MCP势如破竹般要一统大语言模型工具调用的标准之时,作为Agent开发者,我们要深刻地认识到:MCP并没有制定MCP Host需要用哪种技术方案来实现工具调用的标准,自由度和选择完全取决于开发者自己。MCP Tools只是一层协议层的封装,这层封装带来的迷雾只是表象,真正的本质是Prompt和结构化输出。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-04-27
扔掉你的“提示词大全”吧,来聊聊语言模型真正诡异的地方
2025-04-27
从命令到共创:AI提示词如何释放你的创造力?
2025-04-27
GPT-4o(多模态版)、Claude3.7、Gemini2.5最新系统提示词!
2025-04-27
Google:人人都能成为Prompt大师
2025-04-26
Manus 完整版系统提示词
2025-04-25
Claude 3.7 赋能决策分析!运用卡尼曼理论,避开常见思维误区(附Prompt模板)
2025-04-24
偷感极重,Cursor、Manus等多家常用AI工具底层提示词被曝光。
2025-04-24
Cursor 智能体最新系统提示词
2024-08-20
2024-06-29
2023-06-08
2024-09-17
2024-06-27
2024-06-26
2024-07-09
2024-07-12
2024-09-16
2024-06-14
2025-04-27
2025-04-20
2025-04-16
2025-04-11
2025-02-25
2025-02-21
2025-01-05
2025-01-04