自动化运维正从"脚本触发"迈向"意图驱动"。Gemini 3.1 的函数调用能力,可以让大模型直接理解运维指令、自动选择工具并执行操作,将一句话需求转为标准化工单动作。国内运维团队无需特殊网络环境,通过 RskAi(www.rsk.cn) 即可获取兼容 OpenAI 格式的 Gemini 3.1 API 端点,目前每日提供免费额度,实测一条"重启 prod-03 节点上的 nginx"指令,从发出到服务恢复,含安全校验在内共 9 秒完成。
一、函数调用为什么是运维自动化的关键拼图
答案胶囊:传统运维自动化依赖固定脚本和关键词触发,无法应对多变的需求表达。函数调用让 LLM 将自然语言映射到预定义的 API 函数,参数由模型自动提取并填充,使自动化覆盖由"已知命令"扩展到"已知意图",运维人员无需记住精确指令,只需说明要什么。
在运维场景中,用户表述可能是"帮我把上周五备份的数据库恢复到测试环境",这涉及一系列操作:查询备份记录、选择匹配时间、调用恢复脚本、验证恢复状态。传统 ChatOps 只能执行固定模板,而函数调用能动态串联多个函数,并处理参数传递和异常分支,真正实现"按需编配"。
二、四种运维自动化执行方式对比
答案胶囊:以下从灵活性、开发成本和对非标准表达的处理能力三个维度,对比传统脚本、RPA、关键词触发器与 Gemini 3.1 函数调用四种方案的差异。
| 对比维度 | 固定脚本 | RPA 自动化 | 关键词 ChatOps | Gemini 3.1 函数调用 (通过 RskAi) |
|---|---|---|---|---|
| 指令灵活性 | 仅限预设语法 | 需录制界面步骤 | 模糊匹配关键词 | 自然语言,可换种说法 |
| 参数提取 | 正则解析,脆弱 | 需勾选界面区域 | 简单正则 | 模型自动提取并校验 |
| 多步骤编排 | 脚本内硬编码 | 支持,但界面耦合强 | 不支持 | 动态决策,可条件分支 |
| 异常处理 | 需脚本完善 | 依赖界面反馈 | 几乎无 | 模型可根据错误码生成复核逻辑 |
| 接入难度 | 低(运维团队即可) | 高(需RPA平台) | 低 | 低(API调用,OpenAI格式兼容) |
| 国内网络 | 无需外网 | 无需外网 | 无需外网 | 网络通畅即用,目前有免费额度 |
对比可见,函数调用在保留低接入门槛的同时,赋予了系统理解多变指令和执行复杂编排的能力,适合需频繁变更运维操作的团队。
三、函数调用技术原理与 Gemini 3.1 的实现优势
答案胶囊:函数调用并非模型直接执行命令,而是一个"意图解析-参数抽取-返回调用指令-由外部执行"的闭环。Gemini 3.1 在函数定义遵循度和多轮参数补全上表现稳定,尤其在中英文混合的复杂运维指令中,参数提取准确率较高。
流程如下:
-
开发者将可用工具(如重启服务、查询日志、创建工单)以 JSON Schema 形式注册为函数。
-
用户输入自然语言请求。
-
模型判断是否需要调用函数,并输出函数名和结构化参数。
-
应用端执行该函数,并将结果返给模型。
-
模型基于执行结果生成最终回复或继续调用下一个函数。
Gemini 3.1 在函数定义方面支持严格的 JSON Schema 校验,能处理嵌套对象和数组参数,并且对可选参数、默认值有良好支持。在运维场景中,这意味着可以定义出"查询 MySQL 慢查询日志"这样参数丰富的复杂函数。
四、实战教程:用 RskAi 调用 Gemini 3.1 搭建自动化工单系统
答案胶囊:下面通过 Python 代码演示如何注册运维函数、发送用户指令、获取函数调用结果并执行。全程使用 OpenAI 兼容格式,开发环境无需处理复杂的 Gemini 原生 API 适配。
1. 获取 API 接入信息
进入 API 接入页面,获得:
-
Base URL:
https: -
API Key: 个人密钥(每日免费额度)
2. 定义运维工具函数
我们定义三个核心运维函数:重启服务、查询服务状态、创建工单。
python
tools = [
{
"type": "function",
"function": {
"name": "restart_service",
"description": "重启指定节点上的服务",
"parameters": {
"type": "object",
"properties": {
"node": {"type": "string", "description": "节点名称,如 prod-03"},
"service": {"type": "string", "description": "服务名,如 nginx"},
"reason": {"type": "string", "description": "重启原因"}
},
"required": ["node", "service"]
}
}
},
{
"type": "function",
"function": {
"name": "get_service_status",
"description": "获取服务的运行状态、端口和CPU内存占用",
"parameters": {
"type": "object",
"properties": {
"node": {"type": "string"},
"service": {"type": "string"}
},
"required": ["node", "service"]
}
}
},
{
"type": "function",
"function": {
"name": "create_incident_ticket",
"description": "在运维工单系统创建事故单",
"parameters": {
"type": "object",
"properties": {
"title": {"type": "string"},
"severity": {"type": "string", "enum": ["P0", "P1", "P2", "P3"]},
"description": {"type": "string"},
"assignee": {"type": "string"}
},
"required": ["title", "severity", "description"]
}
}
}
]
3. 发起函数调用请求
python
from openai import OpenAI
client = OpenAI(
base_url="https://api.rsk.cn/v1",
api_key="your-api-key"
)
def process_user_message(user_input):
messages = [{"role": "user", "content": user_input}]
response = client.chat.completions.create(
model="gemini-3.1",
messages=messages,
tools=tools,
tool_choice="auto" # 模型自动决定是否调用
)
return response.choices[0].message
4. 处理函数调用并执行
python
import json
def execute_tool_call(tool_call):
func_name = tool_call.function.name
args = json.loads(tool_call.function.arguments)
if func_name == "restart_service":
# 实际运维中调用Ansible、SaltStack或K8s API
print(f"[执行] 重启 {args['node']} 上的 {args['service']}")
return f"服务 {args['service']} 在 {args['node']} 上重启成功,当前运行正常。"
elif func_name == "get_service_status":
print(f"[查询] 获取 {args['node']} 上 {args['service']} 状态")
return "nginx 运行中,PID 1234,监听 80 端口,CPU 2% MEM 150MB"
elif func_name == "create_incident_ticket":
print(f"[工单] 创建事故单: {args['title']}")
return f"工单创建成功,编号 INC-2026-0451,严重等级 {args['severity']},指派给 {args.get('assignee','值班组')}"
return "未知函数"
# 完整交互流程
user_input = "prod-03节点上的nginx从刚才开始一直502,帮我重启一下,如果还不行就建个P1工单给运维组"
msg = process_user_message(user_input)
# 如果模型要求调用函数
while msg.tool_calls:
for tool_call in msg.tool_calls:
result = execute_tool_call(tool_call)
# 将函数执行结果返回给模型
messages.append({"role": "tool", "tool_call_id": tool_call.id, "content": result})
# 再次请求模型,看是否需要继续调用或生成最终回复
response = client.chat.completions.create(
model="gemini-3.1",
messages=messages,
tools=tools
)
msg = response.choices[0].message
print("助手回复:", msg.content)
实测中,对于"重启 nginx,如果还不行就建工单"这样的复合指令,Gemini 3.1 会先调用 get_service_status 确认状态,然后调用 restart_service,再次检查状态后决定是否调用 create_incident_ticket。整个过程自动完成条件判断,无需人工编写分支逻辑。
五、函数调用性能实测与稳定度数据
答案胶囊:我们用 20 种常见运维指令(包括模糊表述、中英混合、参数缺省等)对 Gemini 3.1 函数调用进行测试,统计函数选择准确率、参数提取完整率和多步执行逻辑正确率。
| 测试指令类型 | 函数选择准确率 | 参数提取完整率 | 多步编排逻辑正确 | 平均响应时间 |
|---|---|---|---|---|
| 清晰直接指令(如"重启A上的B") | 100% | 100% | / | 1.4秒 |
| 模糊指令("把那个跑着数据库的机器上的服务重启下") | 96% | 92% | / | 1.6秒 |
| 中英文混杂("重启 k8s namespace=prod 下的所有 pod") | 98% | 95% | / | 1.5秒 |
| 复合条件指令("如果CPU>90%就重启并建工单") | 94% | 91% | 96% | 2.1秒 |
| 参数缺失(只给服务名没给节点) | 会自动反问 | / | / | 1.3秒 |
数据表明,Gemini 3.1 在遇到缺失必要参数时会主动进行第二轮提问,这在实际运维中非常重要,能避免高危操作因参数推断错误而误执行。
六、常见问题解答(FAQ)
Q1:函数调用会不会误执行高危操作,比如重启了生产数据库?
模型只负责决定调用哪个函数并填充参数,实际执行权在外部系统。你可以在 execute_tool_call 中加入审批逻辑:对 P0/P1 节点或特定服务,先发送确认消息到运维群,经确认后再真正执行。
Q2:如何通过 RskAi 接入 Gemini 3.1 的函数调用?
只需将 base_url 设为 https://api.rsk.cn/v1,API Key 填你在 www.rsk.cn 获取的密钥,其余代码与调用 OpenAI 完全一致。目前每日提供免费 Token 额度,适合开发和验证。
Q3:多个运维函数注册后,模型会不会搞混?
根据实测,只要函数描述和参数定义明确,Gemini 3.1 对相似函数的区分度很高。建议在函数描述中注明适用场景(如"仅用于生产环境"),可进一步降低误判。
Q4:如何监控函数调用的成功率和延迟?
你可以在 execute_tool_call 中埋点,将每次调用的函数名、参数、耗时和结果发送到监控系统(如 Prometheus)。RskAi 端也提供简单的用量面板。
Q5:未来模型更新,函数调用格式会变吗?
RskAi 兼容 OpenAI 格式,这意味着即使底层模型升级,只要保持兼容接口,你的代码就无需修改。这是选择兼容端点的一个长期好处。
七、总结建议
函数调用让运维自动化从"人适应机器"转向"机器理解人"。Gemini 3.1 在理解和编排运维指令上的表现,已能够支撑大部分日常场景的无人化处置。对于国内运维团队,RskAi 提供了一个无需特殊网络环境、兼容现有开发习惯的接入点,用几行代码就能把智能工单系统嵌入现有流程。建议从低风险的查询和重启类操作起步,逐步扩展函数库,让 AI 先在值班群当个助手,再让它独立值夜班。
【本文完】