1. 上下文工程实战:LLM生产环境稳定输出的六大核心技术
在构建基于大语言模型(LLM)的生产级应用时,许多开发者都会遇到这样的困境:明明RAG系统返回了看似完美的文本块,提示词也经过精心设计,但模型输出仍然充满幻觉;随着文档数量的增加,回复质量不升反降。这些问题的根源往往不在提示工程(Prompt Engineering),而在于上下文工程(Context Engineering)的缺失。
1.1 什么是上下文工程
Context Engineering是在运行时决定AI模型看到什么信息、何时看到、以何种结构看到的工程实践。如果说提示工程关注的是"如何提问",那么上下文工程关注的就是"提供什么信息"。
在实际生产系统中,大语言模型出错往往不是因为理解不了指令,而是因为:
- 看到了太多不相关的信息
- 接收到相互矛盾的数据
- 缺失了关键事实
上下文工程将上下文视为一条动态管道而非静态文本,通过以下方式优化信息流:
- 选择性检索相关文档而非全量灌入
- 将长文档压缩为面向任务的摘要
- 在检索前重新表述模糊的用户查询
- 跨会话注入记忆和用户状态
- 用实时工具和数据锚定答案
- 结构化组织所有输入以引导模型注意力
关键洞察:上下文工程做得好的系统,小模型也能表现出色;做得差的系统,再强大的模型也会产生幻觉。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 选择性检索:精准控制信息输入
2.1 为什么需要选择性检索
直接将大量文档塞入上下文窗口会导致两个主要问题:
- "Lost in the Middle"效应:模型对开头和结尾的Token分配更多注意力,中间部分容易被忽略
- 信息过载:无关内容会稀释模型对关键信息的关注度
实验数据显示,移除噪声上下文后:
- 准确率提高15-30%
- Token消耗降低20-40%
- 系统可调试性显著提升
2.2 三步过滤法实现精准检索
2.2.1 相关性重排
初始搜索基于向量相似度或关键词匹配返回前50个结果后,使用交叉编码器(Cross-Encoder)进行重排。虽然速度较慢(约100-200ms/查询),但准确度显著提高。
技术实现:
python复制from sentence_transformers import CrossEncoder
# 初始化交叉编码器
cross_encoder = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
# 对查询和每个文档进行联合评分
scores = cross_encoder.predict([(query, doc) for doc in documents])
# 按分数降序排列
reranked_docs = [doc for _, doc in sorted(zip(scores, documents), reverse=True)]
2.2.2 冗余消除
使用Embedding对相似文本块聚类,余弦相似度超过0.9的视为重复内容。实现方案:
python复制from sklearn.cluster import DBSCAN
from sentence_transformers import SentenceTransformer
# 生成嵌入向量
encoder = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = encoder.encode(documents)
# 聚类分析
clustering = DBSCAN(eps=0.1, min_samples=1).fit(emb
