Prompt Assembly

Prompt Assembly 是将各个上下文组件(System Prompt、对话历史、检索结果、工具描述等)组装成最终发给 LLM 的完整消息列表的过程。

#type / concept #status / evergreen #tech / ai

[!info] related notes

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)

常见坑

  1. 顺序不对: 检索知识放在最近消息之后,LLM 可能忽略
  2. 不做 token 控制: 组装后超过上下文窗口
  3. 格式不统一: 有的用 Markdown,有的用纯文本
  4. 不测试组装结果: 不知道最终发给 LLM 的是什么

参考资料

创建于 2026/6/30 更新于 2026/7/15