
我记得刚开始学习大模型开发时,会陷入了一个误区:拼命钻研提示词技巧,却忽略了最核心的底层逻辑。也总觉得大模型回答不准、容易失忆、长篇对话跑偏、复杂任务翻车,是Prompt写得不够好,后来才发现,绝大多数情况,问题根本不在“怎么提问”,而在“给模型看什么、怎么管理信息”。
同样的模型、同样的问题,有人实现流畅连贯的超长对话、精准的知识库问答、稳定的智能体任务,有人却频繁出现上下文溢出、信息丢失、逻辑混乱。核心差距就在于是否掌握上下文工程。如果说提示词工程是教模型“怎么做事”,那上下文工程就是管控模型的“全部信息输入与记忆体系”,是大模型落地应用的底层基石。不同于零散的调参、改提示词,上下文工程是一套系统化、可落地、可复用的方法论,核心围绕窗口管理、消息编排、记忆压缩、检索增强四大核心策略展开。不管是做AI对话机器人、企业知识库问答,还是智能体自动化任务,这套体系都是刚需。

1.1 上下文工程核心定义
一套系统性设计、调度、优化大模型推理阶段全部信息状态的工程方法论,核心目标是在模型有限的Token预算内,最大化信息利用率,保障模型输出精准、稳定、高效。简单来说,就是大模型的“信息管家”和“内存管理器”。
1.2 与提示词工程的区别
接触的不深很容易会混淆提示词工程和上下文工程,这里做一个通俗的区分,帮大家彻底理清边界:
1.3 无上下文工程的痛点
在大模型实际落地中,模型的所有认知、推理、回答,完全依赖输入的上下文信息。模型本身没有独立长期记忆,不会主动筛选有效信息,也无法自主规避冗余、冲突内容。如果没有上下文工程的管控,随着对话变长、知识库内容增多,必然会出现三大核心问题:
1.4 上下文工程核心价值
它不再靠人工微调Prompt碰运气,而是用标准化策略,实现上下文信息的有序流转、高效利用,让大模型在超长对话、复杂问答、智能体任务中,始终保持稳定、精准的输出效果,这也是企业级大模型应用和个人简单应用的核心区别。
上下文工程不是单一技术,而是一套完整的技术体系,全程围绕四大核心模块闭环运转,覆盖上下文信息从加载、整理、优化到复用的全生命周期,各模块能力分工清晰、层层递进:

四大模块构成上下文工程完整骨架,初学者无需死记硬背,只需牢记核心落地逻辑:先管容量、再理结构、再做精简、最后补全知识。

上下文窗口基础定义:
Token通俗换算规则:
常见认知误区:
很多人认为超大窗口可随意使用,无需管理上下文,这是致命错误。工程落地中,窗口大小绝不等于可用容量:
窗口管理核心逻辑
在应用实践中,四类主流窗口管理策略由简到繁、适配不同业务场景:

滑动窗口策略(基础通用):
固定阈值截断策略(精准控容):
动态预算分配策略(企业级核心):
分层窗口隔离策略(定制化必备):
示例演示滑动窗口上下文管理:先按中文2Token/字、英文1.3Token/词估算每条消息开销,再从最新消息往前累计裁剪——保留system指令和近期对话轮次,超出上限的早期历史自动丢弃,确保多轮对话在有限的LLM上下文窗口内稳定运行。
import math
# 简易模拟Token计算(中文2Token/字,英文1.3Token/词)
def calc_token_count(text: str) -> int:
cn_chars = len([c for c in text if '\u4e00' <= c <= '\u9fff'])
en_words = len(text.split()) - cn_chars
return math.ceil(cn_chars * 2 + en_words * 1.3)
# 滑动窗口上下文裁剪:保留最新N轮对话,控制总Token不超限
def slide_window_clip(messages: list, max_token: int = 2048) -> list:
"""
messages: 对话消息列表 [{"role":"user","content":""}, ...]
max_token: 上下文窗口最大Token上限
"""
total_token = 0
# 从后往前遍历,保留最新对话
new_messages = []
for msg in reversed(messages):
token = calc_token_count(msg["content"])
if total_token + token <= max_token:
new_messages.append(msg)
total_token += token
else:
break
# 恢复正序
return list(reversed(new_messages))
# 测试用例
if __name__ == "__main__":
test_msgs = [
{"role": "system", "content": "你是专业的AI助手,回答简洁精准。"},
{"role": "user", "content": "讲解什么是上下文工程?"},
{"role": "assistant", "content": "上下文工程是大模型信息系统化管理方法论。"},
{"role": "user", "content": "窗口管理有哪些策略?"}
]
max_tok = 1500
print(f"上下文窗口上限:{max_tok} Token\n")
# 第1步:逐条估算 Token
print("--- 第1步:逐条估算 Token ---")
for i, msg in enumerate(test_msgs):
tok = calc_token_count(msg["content"])
print(f" 消息{i}: [{msg['role']}] {msg['content'][:30]}... -> {tok} Token")
print(" [说明] 中文按2 Token/字、英文按1.3 Token/词估算,模拟真实tokenizer行为")
# 第2步:滑动窗口裁剪
print(f"\n--- 第2步:从后往前滑动窗口裁剪(上限={max_tok})---")
total = 0
kept = []
for msg in reversed(test_msgs):
tok = calc_token_count(msg["content"])
if total + tok <= max_tok:
kept.append(msg)
total += tok
print(f" 保留[{msg['role']}]: {msg['content'][:30]}... ({tok} Token) -> 累计 {total}/{max_tok}")
else:
print(f" 丢弃[{msg['role']}]: {msg['content'][:30]}... ({tok} Token) -> 超限,停止")
break
print(" [说明] 从最新消息往前保留,优先保留近期对话,超出上限的历史消息被裁切")
print(f"\n最终保留 {len(kept)}/{len(test_msgs)} 条消息,总 Token={total}")
print(" [说明] 保留system指令+最近几轮对话,丢弃早期历史,保证窗口不超限")输出结果:
上下文窗口上限:1500 Token --- 第1步:逐条估算 Token --- 消息0: [system] 你是专业的AI助手,回答简洁精准。... -> 11 Token 消息1: [user] 讲解什么是上下文工程?... -> 9 Token 消息2: [assistant] 上下文工程是大模型信息系统化管理方法论。... -> 15 Token 消息3: [user] 窗口管理有哪些策略?... -> 8 Token [说明] 中文按2 Token/字、英文按1.3 Token/词估算,模拟真实tokenizer行为 --- 第2步:从后往前滑动窗口裁剪(上限=1500)--- 保留[user]: 窗口管理有哪些策略?... (8 Token) -> 累计 8/1500 保留[assistant]: 上下文工程是大模型信息系统化管理方法论。... (15 Token) -> 累计 23/1500 保留[user]: 讲解什么是上下文工程?... (9 Token) -> 累计 32/1500 保留[system]: 你是专业的AI助手,回答简洁精准。... (11 Token) -> 累计 43/1500 [说明] 从最新消息往前保留,优先保留近期对话,超出上限的历史消息被裁切 最终保留 4/4 条消息,总 Token=43 [说明] 保留system指令+最近几轮对话,丢弃早期历史,保证窗口不超限

1.1 消息编排的本质
了解窗口容量后,消息编排是提升模型回答精度的关键。其本质是结构化组织上下文信息,优化信息位置、顺序、层级,适配大模型专属的注意力机制,让有限窗口内的信息发挥最大价值。
1.2 大模型注意力核心规律
核心特性:模型对上下文头部信息和尾部信息关注度最高,中间内容注意力权重极低,极易被忽略。简单来说,首尾内容会被重点读取,中间内容大概率被遗忘。
1.3 编排核心落地逻辑
基于注意力规律,形成固定编排思路:将最高优先级的核心信息放在首尾,次要辅助信息放置中间,同时对杂乱消息分层、标注、排序,降低模型信息识别成本。如果说窗口管理是管控“容量”,消息编排就是优化“结构”。
1.4 常见错误问题
常见错误会杂乱堆砌消息,将系统指令、历史闲聊、业务知识、用户提问混为一体,无结构、无顺序,导致模型注意力被无效内容分散,核心指令和关键知识被忽略,最终输出结果偏差、逻辑混乱。标准化编排可彻底规避此类问题。
根据经验总结整理了可直接落地、高性价比的消息编排技巧,覆盖绝大多数大模型应用场景,简单易操作、优化效果显著:

多轮复杂对话可采用优先级排序规则,优先级排序:系统规则>核心历史对话>实时参考知识>普通闲聊内容,高优先级信息永久保留、优先展示,低优先级信息按需删减,保障上下文全程有效。
示例演示标准化消息编排:先过滤空消息等无效历史,再按"system指令(置顶)→有效历史(居中)→参考资料(尾部植入)→用户提问(末尾)"四层结构组装上下文,利用LLM对首尾注意力偏好的特性,让关键约束和知识落在最佳信息位置。
def message_arrange(system_prompt: str, history: list, reference_text: str, query: str) -> list:
"""
标准化消息编排
:param system_prompt: 固定系统指令(置顶)
:param history: 历史对话
:param reference_text: 检索参考知识(尾部植入)
:param query: 当前用户问题
:return: 结构化排序后的上下文消息
"""
# 1. 过滤无效闲聊、空消息
valid_history = [
msg for msg in history
if msg["content"].strip() and len(msg["content"]) > 2
]
# 2. 固定层级:系统指令 - 有效历史 - 参考知识 - 用户提问
messages = [{"role": "system", "content": system_prompt}]
messages.extend(valid_history)
# 3. 尾部植入核心参考知识
if reference_text.strip():
messages.append({"role": "system", "content": f"本次参考资料:{reference_text}"})
messages.append({"role": "user", "content": query})
return messages
# 测试
if __name__ == "__main__":
sys_prompt = "你是大模型技术博主,用通俗语言解答技术问题。"
history_msgs = [
{"role": "user", "content": "什么是消息编排?"},
{"role": "assistant", "content": "是优化上下文结构的技术。"},
{"role": "user", "content": " "} # 无效空消息,会自动过滤
]
ref_text = "消息编排核心是利用大模型首尾注意力偏好,结构化排序信息。"
user_query = "消息编排有哪些落地技巧?"
print(f"原始历史消息:{len(history_msgs)} 条\n")
# 第1步:过滤无效消息
valid = [m for m in history_msgs if m["content"].strip() and len(m["content"]) > 2]
print("--- 第1步:过滤无效消息 ---")
for i, msg in enumerate(history_msgs):
is_valid = msg["content"].strip() and len(msg["content"]) > 2
status = "保留" if is_valid else "淘汰"
print(f" 消息{i}: [{msg['role']}] '{msg['content']}' -> {status}")
print(f" 过滤后:{len(valid)} 条有效历史")
print(" [说明] 空消息和过短内容被剔除,避免干扰模型输出质量")
# 第2步:层级编排
final_msgs = message_arrange(sys_prompt, history_msgs, ref_text, user_query)
print(f"\n--- 第2步:四层结构化编排 ---")
layers = [
("置顶层", f"[system] {sys_prompt[:40]}..."),
("历史层", f"{len(valid)} 条有效对话"),
("知识层", f"[system] 参考资料: {ref_text[:30]}..."),
("提问层", f"[user] {user_query}"),
]
for name, desc in layers:
print(f" {name}: {desc}")
print(" [说明] 利用LLM首尾注意力偏好:system指令置顶引导行为,参考资料尾部植入加强召回,历史居中保持连贯")输出结果:
原始历史消息:3 条 --- 第1步:过滤无效消息 --- 消息0: [user] '什么是消息编排?' -> 保留 消息1: [assistant] '是优化上下文结构的技术。' -> 保留 消息2: [user] ' ' -> 淘汰 过滤后:2 条有效历史 [说明] 空消息和过短内容被剔除,避免干扰模型输出质量 --- 第2步:四层结构化编排 --- 置顶层: [system] 你是大模型技术博主,用通俗语言解答技术问题。... 历史层: 2 条有效对话 知识层: [system] 参考资料: 消息编排核心是利用大模型首尾注意力偏好,结构化排序信息。... 提问层: [user] 消息编排有哪些落地技巧? [说明] 利用LLM首尾注意力偏好:system指令置顶引导行为,参考资料尾部植入加强召回,历史居中保持连贯

技术适用场景:
记忆压缩核心定义:
技术落地必要性:
核心落地价值:
实际应用中主流记忆压缩策略分为轻量、中阶、高阶三个等级,适配不同精度与场景需求,可循序渐进落地:

关键词摘要压缩(轻量通用):
滚动摘要压缩(中阶常用):
层级语义压缩(高阶高精度):
向量轻量化压缩(大规模高阶):
核心压缩原则:所有压缩策略必须优先保留指令规则、核心数据、用户关键诉求、业务结论,仅删减修饰、重复、铺垫类冗余内容,严禁为了精简牺牲语义准确性。
示例演示滚动摘要记忆压缩:当对话轮数超过阈值时,将远期历史提炼为一条系统摘要消息,近期对话原样保留,在保持上下文连贯性的同时大幅降低Token消耗,适用于多轮对话的长会话场景。
def rolling_compress_dialogue(history: list, compress_interval: int = 4) -> list:
"""
滚动摘要压缩对话记忆
:param history: 完整历史对话列表
:param compress_interval: 每N轮压缩一次
:return: 压缩后的精简对话
"""
# 不足轮次不压缩
if len(history) < compress_interval:
return history
# 截取需要压缩的历史记录
need_compress = history[:-compress_interval]
keep_latest = history[-compress_interval:]
# 极简智能摘要(工程轻量化方案,可替换大模型摘要接口)
summary_content = "历史对话总结:用户主要咨询上下文工程相关技术,包含窗口管理、消息编排基础问题。"
summary_msg = {"role": "system", "content": summary_content}
# 压缩后 = 历史摘要 + 最新完整对话
return [summary_msg] + keep_latest
# 测试
if __name__ == "__main__":
interval = 4
# 模拟8轮长对话
long_history = [{"role": "user", "content": f"问题{i}"} for i in range(8)]
print(f"原始对话轮数:{len(long_history)},压缩间隔:每{interval}轮\n")
# 第1步:判断是否需要压缩
print(f"--- 第1步:判断是否触发压缩 ---")
print(f" 历史轮数 {len(long_history)} >= 压缩间隔 {interval} -> 触发压缩")
print(" [说明] 超过指定轮数时自动触发,避免上下文持续膨胀")
# 第2步:拆分近期保留 vs 远期压缩
recent = long_history[-interval:]
old = long_history[:-interval]
print(f"\n--- 第2步:拆分历史 ---")
print(f" 远期历史(需压缩): 前 {len(old)} 轮 -> {[m['content'] for m in old]}")
print(f" 近期历史(保留): 后 {len(recent)} 轮 -> {[m['content'] for m in recent]}")
print(" [说明] 近期4轮完整保留保证连贯,远期4轮压缩为摘要节省Token")
# 第3步:压缩结果
res = rolling_compress_dialogue(long_history)
print(f"\n--- 第3步:压缩结果 ---")
print(f" 压缩前: {len(long_history)} 条消息")
print(f" 压缩后: {len(res)} 条消息 (摘要1条 + 近期{len(recent)}条)")
for msg in res:
print(f" [{msg['role']}] {msg['content'][:50]}{'...' if len(msg['content'])>50 else ''}")
print(" [说明] 远期对话被提炼为一条摘要消息替代,近期对话原样保留,大幅降低Token消耗")输出结果:
原始对话轮数:8,压缩间隔:每4轮 --- 第1步:判断是否触发压缩 --- 历史轮数 8 >= 压缩间隔 4 -> 触发压缩 [说明] 超过指定轮数时自动触发,避免上下文持续膨胀 --- 第2步:拆分历史 --- 远期历史(需压缩): 前 4 轮 -> ['问题0', '问题1', '问题2', '问题3'] 近期历史(保留): 后 4 轮 -> ['问题4', '问题5', '问题6', '问题7'] [说明] 近期4轮完整保留保证连贯,远期4轮压缩为摘要节省Token --- 第3步:压缩结果 --- 压缩前: 8 条消息 压缩后: 5 条消息 (摘要1条 + 近期4条) [system] 历史对话总结:用户主要咨询上下文工程相关技术,包含窗口管理、消息编排基础问题。 [user] 问题4 [user] 问题5 [user] 问题6 [user] 问题7 [说明] 远期对话被提炼为一条摘要消息替代,近期对话原样保留,大幅降低Token消耗
前置技术局限:
检索增强核心定义:
技术体系定位:
核心落地优势:
检索增强的完整实践落地流程分为四大核心步骤,全程贴合上下文工程体系,逻辑清晰、可直接应用:

知识库预处理:
向量化存储:
实时检索匹配:
上下文注入推理:
高阶优化联动:实际落地中可结合记忆压缩技术,对检索到的长文本知识进行轻量化精简,仅保留与当前问题强相关的核心内容,进一步优化上下文质量,大幅提升模型回答精准度,实现四大模块完整闭环。
示例实现轻量化RAG检索增强:先用固定窗口切分知识文档(overlap防断裂),再用字符集交集/并集比计算问题与分块的相似度,无需嵌入模型即可检索TopK最相关片段,适合快速原型和轻量级检索场景。
import numpy as np
# 1. 文本分块(适配上下文窗口)
def text_chunk_split(text: str, chunk_size: int = 200, overlap: int = 20) -> list:
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunks.append(text[start:end])
start = end - overlap
return chunks
# 2. 简易相似度计算(替代嵌入模型,新手友好)
def calc_similarity(a: str, b: str) -> float:
set_a, set_b = set(a), set(b)
return len(set_a & set_b) / max(len(set_a), len(set_b))
# 3. 检索增强主流程
def rag_retrieve(question: str, doc_text: str, top_k: int = 2) -> str:
# 文档分块
chunks = text_chunk_split(doc_text)
# 相似度匹配
score_list = [(chunk, calc_similarity(question, chunk)) for chunk in chunks]
# 取TopK高相关内容
top_chunks = sorted(score_list, key=lambda x: x[1], reverse=True)[:top_k]
# 拼接参考知识
return "\n".join([c[0] for c in top_chunks])
# 测试落地
if __name__ == "__main__":
# 企业专属知识库文本
knowledge = "上下文工程包含四大核心模块:窗口管理负责Token资源管控;消息编排优化信息结构;记忆压缩突破窗口限制;检索增强拓展知识边界。四大模块层层递进,构成完整落地体系。"
user_q = "上下文工程有哪些核心模块?"
chunk_size, overlap, top_k = 200, 20, 2
print(f"用户提问:{user_q}")
print(f"文档长度:{len(knowledge)} 字符\n")
# 第1步:文本分块
chunks = text_chunk_split(knowledge, chunk_size, overlap)
print(f"--- 第1步:文本分块 (chunk_size={chunk_size}, overlap={overlap}) ---")
for i, c in enumerate(chunks):
print(f" 分块{i}: {c}...")
print(f" 共 {len(chunks)} 个分块")
print(" [说明] 文档按固定窗口切分,相邻分块有重叠避免语义断裂")
# 第2步:相似度匹配
print(f"\n--- 第2步:字符集重叠相似度匹配 ---")
score_list = [(chunk, calc_similarity(user_q, chunk)) for chunk in chunks]
for chunk, score in score_list:
print(f" 相似度={score:.3f} | {chunk[:40]}...")
print(" [说明] 用字符集合交集/并集计算相似度,无需嵌入模型,适合轻量级场景")
# 第3步:TopK筛选
top_chunks = sorted(score_list, key=lambda x: x[1], reverse=True)[:top_k]
print(f"\n--- 第3步:Top{top_k} 筛选与拼接 ---")
for rank, (chunk, score) in enumerate(top_chunks, 1):
print(f" Top{rank}: 相似度={score:.3f} | {chunk}")
ref_knowledge = "\n".join([c[0] for c in top_chunks])
print(f"\n最终参考知识:{ref_knowledge}")
print(" [说明] 取最相关片段作为检索增强的上下文,注入LLM prompt中补充领域知识")输出结果:
用户提问:上下文工程有哪些核心模块? 文档长度:81 字符 --- 第1步:文本分块 (chunk_size=200, overlap=20) --- 分块0: 上下文工程包含四大核心模块:窗口管理负责Token资源管控;消息编排优化信息结构;记忆压缩突破窗口限制;检索增强拓展知识边界。四大模块层层递进,构成完整落地体系。... 共 1 个分块 [说明] 文档按固定窗口切分,相邻分块有重叠避免语义断裂 --- 第2步:字符集重叠相似度匹配 --- 相似度=0.132 | 上下文工程包含四大核心模块:窗口管理负责Token资源管控;消息编排优化信息结构... [说明] 用字符集合交集/并集计算相似度,无需嵌入模型,适合轻量级场景 --- 第3步:Top2 筛选与拼接 --- Top1: 相似度=0.132 | 上下文工程包含四大核心模块:窗口管理负责Token资源管控;消息编排优化信息结构;记忆压缩突破窗口限制;检索增强拓展知识边界。四大模块层层递进,构成完整落地体系。 最终参考知识:上下文工程包含四大核心模块:窗口管理负责Token资源管控;消息编排优化信息结构;记忆压缩突破窗口限制;检索增强拓展知识边界。四大模块层层递进,构成完整落地体系。 [说明] 取最相关片段作为检索增强的上下文,注入LLM prompt中补充领域知识
大模型应用的核心竞争力,从来不在于花哨的单点Prompt技巧,而在于系统化的上下文工程能力。Prompt工程仅能实现单次对话的单点优化,而上下文工程是全局体系化赋能,是大模型稳定、高效、精准落地的底层核心支撑。

四大上下文工程模块层层递进、互补闭环,构成完整的大模型信息管理体系:
当下大模型落地日趋成熟,单纯的提示词优化已无法满足企业级业务需求,上下文工程已成为AI开发、模型优化、智能体搭建的必备核心能力。未来大模型应用的竞争,本质是上下文调度能力与信息优化能力的竞争。理解透了上下文工程,才能真正驾驭大模型,让AI能力稳定落地、高效赋能各类业务场景。
如果初学无需急于上手高阶复杂策略,可循序渐进迭代落地,稳步搭建标准化体系:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。