RelayVano

← 全部明信片

上海团队周五上线前:给会议室助手接上函数调用

协议与登机口 ZH

周五上线的会议室助手,缺的是实时数据

假设你在上海的一支小团队工作,周五要交付一个会议室助手。同事输入:“明天下午三点,有没有能坐六个人的会议室?”模型能理解这句话,却不知道公司的会议室是否已经被预订。让它直接回答,很可能得到一个听起来合理、实际无法使用的房间。

函数调用就是连接这两部分的约定:模型负责理解需求并提出调用请求,你的程序负责访问日历或会议室系统,再把真实结果交给模型组织成回答。它不是让模型凭空获得数据库权限,也不是把业务函数上传后交给模型自由运行。

工具声明是一张给模型看的能力说明

先准备一个只查询、不预订的函数,名字叫 find_available_rooms。它接收日期、开始时间、结束时间和人数,返回符合条件的会议室。接着,在请求的 tools 字段中声明这个函数,包括名称、用途,以及用 JSON Schema 描述的参数结构。

  • 名称要具体:find_available_rooms 比 run_task 更容易让模型选对工具。
  • 描述要说明边界:查询空闲会议室,不创建或修改预订。
  • 参数要明确类型:人数是整数,日期和时间是字符串,并说明格式。
  • 必填项要列清楚:缺少结束时间时,应追问用户,而不是随便假定会议长度。

业务函数由你实现,工具声明只是说明书。模型读到说明后,才知道遇到哪些问题可以请求你的程序帮忙。

一次查询需要走完两个模型请求

在常见的 Chat Completions 工具调用流程里,第一次请求携带用户消息和工具声明。模型可能直接回答,也可能返回 tool_calls。后者表示“请执行这些工具”,并不表示工具已经执行成功。

  • 保存模型返回的助手消息,其中包含工具调用记录。
  • 读取每个调用的函数名称,把 arguments 中的 JSON 字符串解析成参数对象。
  • 校验参数和用户权限,再调用你自己实现的查询函数。
  • 将结果作为 role 为 tool 的消息追加到历史中,用 tool_call_id 对应原来的调用。
  • 把更新后的消息再次提交给模型,让它根据真实结果回答用户。

如果查询返回“松柏会议室,六人,十五点至十六点空闲”,模型才能据此给出可靠建议。不要跳过结果回传,也不要把模型生成的参数当成会议室系统已经确认的事实。

上海时间和六个人,都需要程序检查

“明天”依赖当前日期,“下午三点”依赖时区。应用应提供明确的日期背景,并统一使用团队约定的时区,例如 Asia/Shanghai。若同事没有说明会议时长,先补问一句,比悄悄默认一小时更稳妥。

参数符合 JSON 格式,不等于业务上有效。程序仍要检查人数是否为正数、结束时间是否晚于开始时间,以及用户是否有权查询目标办公室。函数名称也应经过允许列表匹配,不能把模型返回的任意名称直接当作可执行入口。

OpenAI 兼容端点接入时,先核对三件事

使用 OpenAI 兼容 SDK 时,通常需要配置 API 密钥、base_url 和模型标识。RelayVano 的 API 基础地址是 https://api.relayvano.com;具体是否需要版本路径,应按照其接入文档和所用 SDK 的要求设置,不要重复拼接。

兼容接口不代表每个模型都支持完全相同的工具能力。接入前,应确认所选模型是否接受 tools、支持哪些 tool_choice 选项,以及工具结果的消息格式。模型标识也应从平台当前提供的列表复制,不要根据展示名称猜测。

如果团队希望通过统一入口按量使用模型,可以考虑 RelayVano:它提供面向开发者的多模型中转服务。欢迎注册 RelayVano,先用一个只读查询跑通完整流程,再决定是否扩展到更多业务。

第一次联调,重点看调用链而非措辞

建议先关闭流式输出,让请求和响应更容易观察。日志记录请求标识、工具名称、校验结果、耗时和错误类别即可;避免直接保存密钥、完整日历内容或其他敏感信息。

  • 没有触发工具:检查工具描述是否清楚,以及当前模型是否支持工具调用。
  • 参数无法解析:记录错误并安全结束或重试,不要执行残缺参数。
  • 工具查不到结果:明确返回空列表,让助手说明没有合适房间。
  • 查询服务超时:返回清晰的失败状态,不要让助手声称查询成功。

最后给工具循环设置次数上限,并处理一次响应中的多个调用。等只读查询稳定后,再考虑预订操作;涉及真实写入时,还应加入用户确认和防重复提交机制。函数调用的基础不是让模型“做更多事”,而是让理解、执行和结果各有明确的负责人。

同一条航线上的其他明信片