前言
很多 AI 项目最开始都是这样实现的:
const prompt = `
系统提示词
历史消息
RAG 内容
用户问题
`
然后直接发送给模型。
Demo 阶段没问题。
但是当系统开始支持:
- 多轮对话;
- RAG;
- Memory;
- Tool Calling;
- 多 Agent;
问题会越来越严重。
例如:
- Prompt 越来越长;
- 上下文顺序混乱;
- Tool 输出污染 Prompt;
- Token 成本失控;
- 很难维护;
- 不同模块互相耦合。
这时候,Prompt 已经不应该被看成一个字符串。
而应该被看成:
一个动态生成的上下文系统。
Prompt Builder 正是解决这个问题的核心组件。
Prompt 不应该是字符串
很多开发者:
prompt += memory;
prompt += rag;
prompt += history;
不断 append。
最后:
Prompt 变成几千行。
没有优先级。
没有结构。
没有可维护性。
实际上:
Prompt 应该是一棵树。
而不是字符串。
Prompt 的组成部分
一个成熟系统的 Prompt 通常包含:
System Prompt
↓
Safety Rules
↓
Working Memory
↓
Long-term Memory
↓
RAG Context
↓
Tool Result
↓
History
↓
Current Question
这些部分:
重要性不同。
生命周期不同。
更新频率也不同。
因此:
不应该混在一起。
System Prompt 是最稳定的一层
例如:
你是一名专业技术助手。
不知道时请明确说明。
不要编造答案。
System Prompt 变化频率最低。
通常:
几十天甚至几个月都不会变化。
因此:
可以缓存。
单独维护。
不要和用户消息混在一起。
Working Memory
工作记忆:
最近:
10~20 条消息。
负责:
当前任务。
生命周期:
几分钟。
通常:
Redis。
动态生成。
Long-term Memory
长期偏好。
例如:
使用 TypeScript。
使用 Vue3。
喜欢 Feature First。
不需要每次都加载。
推荐:
Embedding 检索。
按需注入。
否则:
Prompt 会不断膨胀。
RAG Context
知识库内容。
特点:
变化快。
数量大。
不应该全部加入。
推荐:
TopK:
3~5。
控制:
1000 token。
否则:
容易污染上下文。
Tool Result
最容易出问题的一层。
错误做法:
把:
数据库结果。
文件内容。
搜索结果。
全部放进去。
正确方式:
先压缩。
再注入。
例如:
不要:
1000 行 SQL。
而是:
最近 7 天新增订单 35 条。
这样:
Prompt 更干净。
Prompt Builder 的核心思想
不是:
字符串拼接。
而是:
节点组合。
例如:
System Node
Memory Node
RAG Node
Tool Node
History Node
User Node
每个节点:
独立生成。
最后:
统一排序。
生成 Prompt。
这样:
维护成本大幅降低。
Token Budget
Prompt Builder 最重要的能力:
预算。
例如:
总预算:
8000 token。
其中:
System:
1000
Memory:
1000
RAG:
2000
History:
3000
Current Question:
1000
超出预算时:
自动裁剪。
而不是:
无限增长。
Prompt Builder 与 Agent
未来:
Prompt Builder 很可能成为:
Agent Framework 的核心。
因为:
Planner。
Memory。
RAG。
Tool。
最终都需要通过 Prompt Builder 进入模型。
它相当于:
LLM 的操作系统。
总结
Prompt 不应该是字符串。
而应该是:
上下文编排系统。
未来优秀 Agent 的竞争,
很大程度上会变成:
谁拥有更好的 Prompt Builder。
X记录空间