共计 1674 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:上下文限制的挑战
大型语言模型(LLM)的上下文窗口限制直接影响实际业务场景的落地效果。以 GPT- 4 为例,其 32k tokens 的限制意味着:

- 处理标准 A4 纸双倍行距文档时,仅能容纳约 50 页内容
- 持续对话超过 20 轮后可能丢失早期关键信息
- 法律合同分析、学术论文阅读等场景需要频繁截断文本
这种限制会导致三种典型问题:
- 关键信息被硬截断(Hard Cut-off)
- 长距离语义依赖断裂
- 多轮对话中出现事实性矛盾
技术方案对比
分块处理(Chunking)
- 实现原理 :将输入文本分割为模型可接受的片段
- 优点 :
- 实现简单,计算成本低
- 适合处理结构化文档(如 Markdown 章节)
- 缺点 :
- 跨块语义关联弱
- 边界位置信息丢失风险高
记忆压缩(Memory Compression)
- 核心思想 :使用小模型提炼关键信息再传递给主模型
- 典型方案 :
- 关键实体提取
- 摘要生成压缩
- 向量空间投影
- 时延对比 :比原始处理增加 15-30% 推理时间
层次化注意力(Hierarchical Attention)
- 架构设计 :
- 局部注意力处理分块内容
- 全局注意力层整合跨块信息
- 动态权重分配机制
- 效果对比 :在长文档 QA 任务中比基础分块方案提升 23% 准确率
核心实现:文档分块处理示例
from typing import List
import re
def semantic_chunking(
text: str,
chunk_size: int = 2000,
overlap: int = 200
) -> List[str]:
"""
基于语义边界的分块处理
:param text: 输入文本
:param chunk_size: 单块最大 token 数
:param overlap: 块间重叠 token 数
:return: 分块结果列表
"""
# 优先按段落分割
paragraphs = re.split(r'\n\s*\n', text)
chunks = []
current_chunk = []
current_len = 0
for para in paragraphs:
para_len = len(para.split()) # 简易 token 估算
if current_len + para_len > chunk_size and current_chunk:
chunks.append('\n'.join(current_chunk))
# 保留重叠部分
current_chunk = current_chunk[-int(overlap/50):]
current_len = sum(len(p.split()) for p in current_chunk)
current_chunk.append(para)
current_len += para_len
if current_chunk:
chunks.append('\n'.join(current_chunk))
return chunks
关键实现细节:
- 重叠区域设置需考虑文档类型(技术文档建议 10-15% 重叠)
- 优先在自然段落边界处分割
- 维护块间上下文通过重叠内容和元数据传递
生产环境考量
非结构化数据处理
- PDF 解析使用 PyPDF2 时需处理:
- 页面页脚干扰
- 多栏布局错乱
- 表格内容提取
- HTML 文档建议先提取
标签内容
向量检索优化
- 分块嵌入时添加位置编码元数据
- 构建层次化索引结构
- 实现混合检索策略(关键词 + 向量)
对话状态保持
- 关键信息缓存设计:
- 实体记忆库
- 对话主题跟踪
- 用户偏好记录
- 使用 KV Cache 减少重复计算
避坑指南
信息丢失检查点
- 文档开头 / 结尾是否被完整保留
- 数字序列(如条款编号)的连续性
- 跨多块的引用关系是否断裂
特殊领域处理
- 法律文本:
- 保持条款编号完整
- 不得修改原始措辞
- 医疗记录:
- 保留时间戳信息
- 处理药品剂量精度
成本控制
- 动态分块策略(重要章节细粒度分块)
- 冷热数据分层处理
- 异步预处理流水线
延伸思考
优化方向
- 如何实现动态分块大小调整?
- 能否通过强化学习优化分块策略?
工具推荐
- LangChain 的 Refine 链式处理
- LlamaIndex 的层次化索引
- Haystack 的预处理管道
实际应用表明,结合分块策略与记忆压缩的方案,在保持 90% 原始效果的同时,可将长文本处理成本降低 40%。关键在于根据业务场景选择合适的技术组合,而非追求单一方案的完美。
正文完
