Prompt Assembly
Prompt Assembly 是将各个上下文组件(System Prompt、对话历史、检索结果、工具描述等)组装成最终发给 LLM 的完整消息列表的过程。
#type / concept
#status / evergreen
#tech / ai
[!info] related notes
- 所属 MOC: Context Engineering MOC
- 相关: Context Builder, Prompt Budgeting
Prompt Assembly
一句话定义
Prompt Assembly 是将各个上下文组件组装成最终发给 LLM 的完整消息列表的过程。它不是简单地拼接字符串,而是要控制顺序、格式、token 预算和信息密度。
核心原理
组装顺序
def assemble_prompt(
system_prompt: str,
user_profile: str,
conversation_summary: str,
recent_messages: list,
retrieved_knowledge: str,
tool_results: list,
current_input: str,
) -> list[dict]:
messages = []
# 1. System Prompt(最前面)
messages.append({"role": "system", "content": system_prompt})
# 2. 用户画像(注入 system prompt 或单独消息)
if user_profile:
messages.append({"role": "system", "content": f"用户信息:\n{user_profile}"})
# 3. 对话摘要(如果有的话)
if conversation_summary:
messages.append({"role": "system", "content": f"之前的对话摘要:\n{conversation_summary}"})
# 4. 检索知识(注入 system prompt 或单独消息)
if retrieved_knowledge:
messages.append({"role": "system", "content": f"参考资料:\n{retrieved_knowledge}"})
# 5. 最近对话历史
messages.extend(recent_messages)
# 6. 工具调用结果
for tr in tool_results:
messages.append({"role": "tool", "content": tr})
# 7. 当前用户输入
messages.append({"role": "user", "content": current_input})
return messages
Python 实现
class PromptAssembler:
def __init__(self, window_manager: ContextWindowManager):
self.window_manager = window_manager
def assemble(self, context: ContextBundle) -> list[dict]:
# 1. 分配 token 预算
budget = self.window_manager.allocate({
"system_prompt": (context.system_prompt, 2000),
"user_profile": (context.user_profile, 500),
"conversation_summary": (context.summary, 1000),
"recent_messages": (format_messages(context.recent_messages), 10000),
"retrieved_knowledge": (context.knowledge, 5000),
"current_input": (context.current_input, 1000),
})
# 2. 按顺序组装
return assemble_prompt(**budget)
常见坑
- 顺序不对: 检索知识放在最近消息之后,LLM 可能忽略
- 不做 token 控制: 组装后超过上下文窗口
- 格式不统一: 有的用 Markdown,有的用纯文本
- 不测试组装结果: 不知道最终发给 LLM 的是什么