调用方式
2026/7/23大约 3 分钟
学习 Function Calling 和 Agent 调用,本质上是学习如何让大模型输出“结构化数据”并与你的 Python 代码逻辑进行“握手”。
以下是目前行业内最常见的三种调用方式,按从底层到高层的顺序排列:
1. 方式一:原生 API 调用 (OpenAI / DashScope 风格)
这是目前最标准、最通用的方式。几乎所有国产模型(DeepSeek, Qwen, GLM)都兼容这一套接口。
- 核心逻辑: 在请求时传入一个
tools列表,模型如果认为需要调用工具,会返回一个tool_calls字段,其中包含函数名和 JSON 格式的参数。 - 优点: 性能最高,没有任何中间商赚差价,最适合理解底层原理。
- 适用场景: 你正在做的分布式日志分析平台的后端核心引擎。
2. 方式二:ReAct Prompting (手动解析模式)
如果某些开源模型不支持官方的 Function Calling 接口,开发者会使用这种“纯文本引导”的方式。
- 核心逻辑: 在 Prompt 中强制规定格式。
Prompt: "如果你需要查日志,请输出:Action: query_log(service='xxx')。我会把结果告诉你。"
- 优点: 兼容性极强,任何能聊天的模型都能用。
- 缺点: 极其不稳定。AI 可能会写错括号、少个引号,导致你的 Python
json.loads()报错。 - 适用场景: 使用一些小型、未经过函数调用微调的本地模型(如 Llama-3-8B 的基础版)。
3. 方式三:框架集成调用 (LangChain / Smolagents)
这是工程化开发最常用的方式,也是你后续进阶的方向。
- 核心逻辑: 框架通过 Python 装饰器 (
**@tool**) 自动帮你完成 JSON Schema 的转换。 - 代码示例 (以 HuggingFace 的 smolagents 为例):
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel
# 只要给函数加个描述,框架自动处理所有的 Function Calling 细节
@tool
def fetch_kafka_status(topic: str) -> str:
"""查询指定 Kafka Topic 的积压情况"""
return f"Topic {topic} 运行正常,积压 0"
agent = CodeAgent(tools=[fetch_kafka_status], model=HfApiModel())
agent.run("帮我看看订单 Topic 的情况")
- 优点: 开发效率极高,代码非常整洁。
- 适用场景: 快速搭建原型,或者构建复杂的多智能体系统。
具体怎么学?(实战建议)
既然你已经到了这个阶段,我建议你按照以下路径刻意练习:
第一步:玩转 JSON Schema
Function Calling 的前提是你得会定义工具。去搜一下 JSON Schema 的基本语法。你需要知道如何定义:
- 必填参数 (
required) - 参数类型 (
type: string/number/array) - 参数描述 (
description):这是给 AI 看的说明书,写得越好,AI 调用越准。
第二步:处理“多轮对话”逻辑
Agent 调用不是一锤子买卖。你需要练习如何把工具的结果(Observation)拼回 messages 列表里再次发给 AI。
- 练习:让 AI 先查 A 服务的日志,根据 A 的结果再去查 B 服务的监控。
第三步:异常处理 (Exception Handling)
这是运维 Agent 的核心。
- 如果 AI 调用的函数报错了怎么办?
- 你需要把错误信息也作为
Observation丢给 AI,厉害的 AI(如 GPT-4 或 Qwen-Max)会根据报错信息自动修正参数并重试。
下一个行动点:
为了让你更有成就感,你想让我给你写一个可以直接复制运行的、基于原生 API 调用的“模拟运维 Agent”脚本吗?
它会包含:
- 一个模拟的
get_server_info工具。 - 完整的
while循环处理逻辑。 - 如何处理 AI 的
tool_calls。
只要你有 API Key,填进去就能跑。要试试吗?
