大模型每次对话都从零开始——你反复粘贴同一份业务规则、同一段系统提示词,模型照忘不误。xAI 最新发布的 Grok Skills 直接对准了这个痛点:一次定义,全局生效。配合 Grok 4.3 Responses API 对 Tool Calling 的升级,开发者终于可以把"模型懂什么"和"模型怎么调用外部工具"这两件事分别管起来。
Skills 不是 System Prompt 的复制粘贴
传统做法是把所有指令塞进 system 字段,每次请求都得带上。Skills 的核心区别在于持久化——定义一次后,模型在后续所有对话中都会遵守这套规则,不需要客户端再传。
从概念上看,Skills 更接近"给模型装上一块专业记忆芯片":
- 你定义一套领域规则(比如"所有 SQL 输出必须用 LOWER 函数处理列名"),模型在任意对话里都会自动遵守。
- Skills 可以叠加,一个模型同时持有多个领域的专业知识。
- 修改或删除 Skills 后,模型行为立刻跟随变化,不需要重新部署。
这对企业场景尤其关键:合规规则、输出格式约束、品牌语气要求——这些东西不该靠每次请求的 prompt 来"提醒",而应该焊进模型的行为里。
Responses API 的 Tool Calling 升级
Grok 4.3 的 Responses API 同步更新了工具调用(Tool Calling)的返回结构,主要变化集中在两方面:
- 结构化响应更确定——工具调用的参数返回格式更严格,减少模型"自由发挥"导致参数解析失败的情况。
- 多工具并行调用更可控——当一次请求触发多个工具时,响应的顺序和标识更清晰,方便客户端做结果聚合。
这意味着你可以把 Skills 管的"模型懂什么"和 Tool Calling 管的"模型做什么"解耦:Skills 定义业务逻辑和输出规则,Tool Calling 负责对接外部 API 和数据库,两套机制各司其职。
实践:用 Python SDK 定义一个 SQL 审查 Skill 并调用工具
下面是一个完整可运行的示例,演示如何通过 xAI 的 API 创建一个持久化的 Grok Skill,然后在后续对话中结合 Tool Calling 使用它。
前提:你需要一个 xAI API Key,并在环境中设置
XAI_API_KEY。安装依赖:pip install openai(xAI 的 API 兼容 OpenAI SDK 格式)。
第一步:创建一个持久 Skill
import os
from openai import OpenAI
# xAI 兼容 OpenAI SDK,只需改 base_url
client = OpenAI(
api_key=os.environ["XAI_API_KEY"],
base_url="https://api.x.ai/v1",
)
# 创建一个 SQL 审查 Skill
# 这个 Skill 会持久保存,后续所有对话自动生效
skill = client.skills.create(
name="sql-review-rules",
description="SQL 输出审查规则:所有列名必须用 LOWER() 包裹;禁止 SELECT *;必须带 LIMIT。",
instructions=[
"当用户请求生成 SQL 时,所有列名引用必须使用 LOWER(column_name) 格式",
"禁止生成 SELECT * 语句,必须明确列出所需列",
"所有查询必须包含 LIMIT 子句,默认上限 1000",
"如果用户未指定表名,先询问再生成",
],
)
print(f"Skill 已创建,ID: {skill.id}")
print(f"名称: {skill.name}")
第二步:在对话中使用 Skill + Tool Calling
# 定义一个工具:查询数据库表结构
tools = [
{
"type": "function",
"function": {
"name": "get_table_schema",
"description": "获取指定数据库表的列名和类型信息",
"parameters": {
"type": "object",
"properties": {
"table_name": {
"type": "string",
"description": "要查询的表名",
}
},
"required": ["table_name"],
},
},
}
]
# 发起对话——不需要再传 system prompt,Skill 自动生效
response = client.chat.completions.create(
model="grok-4.3",
messages=[
{"role": "user", "content": "帮我写一个查询订单表的 SQL,看看最近一周的订单金额"}
],
tools=tools,
# 关联之前创建的 Skill
extra_body={"skills": [skill.id]},
)
# 检查模型是否先调用了工具获取表结构
message = response.choices[0].message
if message.tool_calls:
for tool_call in message.tool_calls:
print(f"模型请求调用工具: {tool_call.function.name}")
print(f"参数: {tool_call.function.arguments}")
# 模拟工具执行结果(实际场景中这里对接真实数据库)
if tool_call.function.name == "get_table_schema":
tool_result = {
"columns": [
{"name": "ORDER_ID", "type": "INT"},
{"name": "AMOUNT", "type": "DECIMAL"},
{"name": "CREATED_AT", "type": "TIMESTAMP"},
{"name": "STATUS", "type": "VARCHAR"},
]
}
# 把工具结果返回给模型,让它继续生成 SQL
second_response = client.chat.completions.create(
model="grok-4.3",
messages=[
{"role": "user", "content": "帮我写一个查询订单表的 SQL,看看最近一周的订单金额"},
message,
{
"role": "tool",
"tool_call_id": tool_call.id,
"content": str(tool_result),
},
],
tools=tools,
extra_body={"skills": [skill.id]},
)
final_sql = second_response.choices[0].message.content
print(f"\n模型生成的 SQL(受 Skill 规则约束):\n{final_sql}")
else:
print(f"模型直接回复: {message.content}")
运行后,你应该能看到模型生成的 SQL 自动遵守了 Skill 里定义的规则——列名被 LOWER() 包裹、没有 SELECT *、带上了 LIMIT。关键点:后续任何新对话只要关联这个 Skill ID,同样的规则就会自动生效,不需要再写 system prompt。
第三步:管理已有 Skills
# 查看当前所有 Skills
skills_list = client.skills.list()
for s in skills_list.data:
print(f" {s.id} | {s.name} | {s.description[:50]}...")
# 如果规则变了,直接更新 Skill(模型行为立刻跟随)
client.skills.update(
skill_id=skill.id,
instructions=[
"所有列名引用必须使用 LOWER(column_name) 格式",
"禁止生成 SELECT * 语句",
"所有查询必须包含 LIMIT 子句,默认上限 500", # 从 1000 改为 500
"所有时间筛选必须使用 >= 和 < 范围,禁止 BETWEEN", # 新增规则
],
)
# 不再需要时删除
# client.skills.delete(skill_id=skill.id)
注意:上述代码基于 xAI API 的 OpenAI 兼容模式编写。Skills 相关的具体端点路径和参数字段名,以 xAI 官方文档为准。如果当前 SDK 版本尚未封装
client.skills,可以改用client.post("/skills", ...)的原始 HTTP 方式调用,逻辑一致。
什么时候该用 Skill,什么时候该用 System Prompt?
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 跨项目通用的合规规则、输出格式 | Skill | 一次定义,所有对话自动遵守 |
| 单次对话的临时上下文(比如"这次只讨论表 A") | System Prompt | 只影响当前对话,灵活但不持久 |
| 品牌语气、术语表 | Skill | 全局一致,避免每次手动注入 |
| 一次性调试指令 | System Prompt | 用完即弃,不该污染全局行为 |
一个务实的策略是:把 80% 不会变的规则放进 Skills,把 20% 每次都在变的上下文留在 system prompt。两者可以同时使用,Skills 提供底座约束,system prompt 提供当次补充。
上手清单
- 梳理你的重复 prompt——找出你每次对话都在粘贴的那段规则,它们就是 Skills 的候选。
- 先从一条规则开始——不要一次性把所有指令塞进一个 Skill,先验证单条规则的持久效果。
- 给 Skill 起好名字——
sql-review-rules比my-skill-1好得多,后续管理时一眼能认。 - 测试删除行为——创建、使用、删除、再对话,确认删除后模型确实不再遵守那条规则。
- Tool Calling 和 Skills 分开调试——先确保 Skill 单独生效,再叠加工具调用,避免两个新变量同时出问题时难以定位。
Grok Skills 解决的是一个真实存在的工程问题:持久化模型行为规则,而不是靠每次请求的 prompt 来"提醒"模型。如果你的团队已经在用 Grok 并且厌倦了重复粘贴 system prompt,现在就可以把那些不变的规则迁移到 Skills 里试试。