你值星的尴尬时刻

上周我用 CopilotKit 给一个电商后台加 AI 助手,结果用户问「最近成交额多少」,AI 答「请告诉我您的数据源」—— 它根本不知道自己在哪个 App 里!

这种「失忆」问题,其实是没给 AI 灌输「我是谁」。CopilotKit 提供了 copilot:context 机制,可以注入应用数据,但很多同学只把它当聊天框架用,没利用好这个杀手锏。

今天我就分享一组实战验证过的提示词模板,让你的 AI 助手秒懂业务上下文。

核心思路:用系统提示词绑定应用 DNA

CopilotKit 本质上是一个前端 Agent 框架,它把 LLM 调用、组件渲染、数据流都封装好了。难点在于:AI 怎么知道用户当前页面是什么?订单状态怎么查?

答案是:在系统提示词里动态注入应用状态

你可以在每次用户输入时,把页面信息、用户权限、业务规则拼成一个字符串,塞进 copilot:contextsystemPrompt 里。这样 AI 每次思考都带着完整上下文。

完整提示词模板(可直接复制)

下面是我在电商后台用的模板,替换 {{}} 里的内容即可。

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
你是一个 {{应用名称}} 的 AI 助手,帮助用户查询/操作业务数据。

### 当前用户信息
- 用户角色:{{role}}(例如:admin/editor/viewer)
- 当前页面:{{currentPage}}(例如:订单列表/商品详情/数据看板)

### 业务规则
- 可以使用的 API 端点:
  - GET /api/orders?status={{}} (查询订单)
  - POST /api/orders/:id/refund (退货)
- 禁止操作:{{restrictions}}(例如:viewer 不可发起退货)

### 数据示例(最近 5 条订单)
{{recentOrdersSample}}

请注意:
1. 如果用户要求操作,先检查权限。
2. 回答时引用具体数据,比如「您有 3 笔待发货订单,单号 20250329XX」。
3. 如果数据不足,建议用户去「订单列表」页面查看。

这个模板直接在代码里用字符串模板拼装即可:

tsx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import { CopilotKit } from "@copilotkit/react-core";

function MyApp() {
  const page = useCurrentPage(); // 你自定义的 hook
  const user = useUser();

  const systemPrompt = `
    你是一个电商后台的 AI 助手...
    当前页面:${page.name}
    用户角色:${user.role}
    最近订单:${JSON.stringify(recentOrders.slice(0,5))}
  `;

  return (
    <CopilotKit runtimeUrl="/api/copilot" systemPrompt={systemPrompt}>
      <MainLayout />
    </CopilotKit>
  );
}

效果演示:有上下文 vs 无上下文

我拿同一组问题测试,AI 模型用的是 GPT-4o-mini。

❌ 差 Prompt(无上下文)

text
1
系统提示词:你是一个 AI 助手,帮助用户处理问题。

用户:帮我查一下上周的退货率。
AI:对不起,我无法直接查询数据,请提供相关信息。
用户:我昨天创建了一个新商品,怎么还没上架?
AI:上架时间取决于平台审核,建议您耐心等待。

✅ 好 Prompt(注入上下文)

text
1
系统提示词:你是一个电商后台的 AI 助手。当前页面:数据看板。用户角色:admin。可用 API:GET /api/orders?dateRange=&status=...。

用户:帮我查一下上周的退货率。
AI:上周(3/24-3/30)总订单 152 笔,退货 11 笔,退货率 7.24%。退货原因前三名:尺寸不合适(5 笔)、质量问题(3 笔)、物流延迟(2 笔)。需要查看详情吗?
用户:我昨天创建了一个新商品,怎么还没上架?
AI:您昨天(3/30)创建的商品「春季卫衣」当前状态为「待审核」,通常审核时间 1-2 个工作日。如果着急,可以联系运营同事加急处理。需要我发送提醒给审核组吗?

差别在哪里?

  • 差 Prompt 的 AI 只能「猜」或「推诿」,因为不知道 app 的数据接口。
  • 好 Prompt 的 AI 直接调用真实数据(示例中模拟),回答具体且有操作建议。

变体和注意事项

变体 1:多页面切换时动态更新

如果你有多个页面(订单、商品、客户),不要写死上下文。用 useEffect 监听路由变化,重新注入:

tsx
1 2 3 4 5 6 7 8 9
const [systemPrompt, setSystemPrompt] = useState("");
useEffect(() => {
  // 根据页面拼装不同提示词
  if (pathname === "/orders") {
    setSystemPrompt(`你正在订单管理页面……`);
  } else if (pathname === "/products") {
    setSystemPrompt(`你正在商品管理页面……`);
  }
}, [pathname]);

变体 2:带 RAG 的上下文

如果数据太多(比如上千条),不要直接全塞进提示词。用 CopilotKit 的 useCopilotAction 触发后台查询,然后只把查询结果放进去:

tsx
1 2 3 4 5 6 7 8
const action = useCopilotAction({
  name: "searchOrders",
  handler: async ({ query }) => {
    const result = await fetch(`/api/orders?q=${query}`);
    const data = await result.json();
    return `查询结果:${JSON.stringify(data)}`;
  }
});

然后在系统提示词里加一句:「你可以调用 searchOrders 来查询订单数据。」

注意事项

  1. Token 限制:系统提示词建议控制在 2000 tokens 以内,太长会消耗上下文窗口。数据示例只给最近 5 条,完整的用 action 动态拿。
  2. 敏感信息:不要在提示词里写密码、API Key。角色权限靠后端校验,前端只传角色名。
  3. 模型选择:同样模板,GPT-4o 比 GPT-3.5 更听话,但成本高。可以先在开发环境用 4o,生产用 3.5 结合 prompt 压缩。

写在最后

CopilotKit 给了我很大的自由度,但真正让它「聪明」起来的,是你对业务的理解。提示词就是你和 AI 之间的「沟通协议」—— 你越懂你的 App,AI 越懂你的用户。

你现在就可以去项目里试一下:把它当作一个「动态说明书」来写,而不是一句「你是一个助手」。如果遇到坑,欢迎留言交流,我有时间都会回。

提示词上下文对比