你值星的尴尬时刻
上周我用 CopilotKit 给一个电商后台加 AI 助手,结果用户问「最近成交额多少」,AI 答「请告诉我您的数据源」—— 它根本不知道自己在哪个 App 里!
这种「失忆」问题,其实是没给 AI 灌输「我是谁」。CopilotKit 提供了 copilot:context 机制,可以注入应用数据,但很多同学只把它当聊天框架用,没利用好这个杀手锏。
今天我就分享一组实战验证过的提示词模板,让你的 AI 助手秒懂业务上下文。
核心思路:用系统提示词绑定应用 DNA
CopilotKit 本质上是一个前端 Agent 框架,它把 LLM 调用、组件渲染、数据流都封装好了。难点在于:AI 怎么知道用户当前页面是什么?订单状态怎么查?
答案是:在系统提示词里动态注入应用状态。
你可以在每次用户输入时,把页面信息、用户权限、业务规则拼成一个字符串,塞进 copilot:context 的 systemPrompt 里。这样 AI 每次思考都带着完整上下文。
完整提示词模板(可直接复制)
下面是我在电商后台用的模板,替换 {{}} 里的内容即可。
你是一个 {{应用名称}} 的 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. 如果数据不足,建议用户去「订单列表」页面查看。
这个模板直接在代码里用字符串模板拼装即可:
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(无上下文)
系统提示词:你是一个 AI 助手,帮助用户处理问题。
用户:帮我查一下上周的退货率。
AI:对不起,我无法直接查询数据,请提供相关信息。
用户:我昨天创建了一个新商品,怎么还没上架?
AI:上架时间取决于平台审核,建议您耐心等待。
✅ 好 Prompt(注入上下文)
系统提示词:你是一个电商后台的 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 监听路由变化,重新注入:
const [systemPrompt, setSystemPrompt] = useState("");
useEffect(() => {
// 根据页面拼装不同提示词
if (pathname === "/orders") {
setSystemPrompt(`你正在订单管理页面……`);
} else if (pathname === "/products") {
setSystemPrompt(`你正在商品管理页面……`);
}
}, [pathname]);
变体 2:带 RAG 的上下文
如果数据太多(比如上千条),不要直接全塞进提示词。用 CopilotKit 的 useCopilotAction 触发后台查询,然后只把查询结果放进去:
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 来查询订单数据。」
注意事项
- Token 限制:系统提示词建议控制在 2000 tokens 以内,太长会消耗上下文窗口。数据示例只给最近 5 条,完整的用 action 动态拿。
- 敏感信息:不要在提示词里写密码、API Key。角色权限靠后端校验,前端只传角色名。
- 模型选择:同样模板,GPT-4o 比 GPT-3.5 更听话,但成本高。可以先在开发环境用 4o,生产用 3.5 结合 prompt 压缩。
写在最后
CopilotKit 给了我很大的自由度,但真正让它「聪明」起来的,是你对业务的理解。提示词就是你和 AI 之间的「沟通协议」—— 你越懂你的 App,AI 越懂你的用户。
你现在就可以去项目里试一下:把它当作一个「动态说明书」来写,而不是一句「你是一个助手」。如果遇到坑,欢迎留言交流,我有时间都会回。
