【AI】大语言模型处理长文本:附件上传为何能突破Token限制?

547 阅读2分钟

一、传统Token限制的本质困境

直接粘贴就是全量处理输入的每一个token,确保信息完整,但受限于上下文窗口(通常4k-32k tokens),无法扩展到更大规模。

当您将一段3000个tokens的文本直接粘贴到对话框中,大语言模型的处理流程非常直接:文本被分词(tokenized)为一个个tokens,直接计入模型的上下文窗口。模型通过Transformer架构处理这些tokens,每个token与上下文中的其他tokens进行自注意力计算,时间复杂度为O(n²)。例如,3000个tokens需要计算约900万个注意力关系。以GPT-3为例,每个token被转换为768维向量,经过12层Transformer处理,显存需求随输入长度平方增长。若上下文窗口为4096 tokens,单次推理可能占用数GB显存,处理超长文本(如10万tokens)几乎不可行。这种机制决定了token限制的必然性:首先是硬件受限,因为GPU显存和算力无法支持无限长的上下文。其实是效率问题,O(n²)复杂度导致延迟随长度指数级增加,3000 tokens可能需要几秒,10万tokens则可能耗时数分钟。

二、上传附件的革命性突破

上传附件(如一个10万字的文档)时,系统采用完全不同的策略:通过分块编码和动态检索,将大规模文档“压缩”为少量相关片段,突破token限制,但牺牲部分信息完整性。

  1. 文本分块:文档被按固定大小(例如512 tokens)切割成多个块。一个3000 tokens的文档可能被分为6个块(512×5 + 余数)。
    def chunk_text(text, chunk_size=512):
        tokens = tokenizer.encode(text)
        return [tokens[i:i+chunk_size] for i in range(0, len(tokens), chunk_size)]
    
  2. 向量化存储:每个文本块通过嵌入模型(如BERT)生成低维嵌入向量(例如128维),公式为: Ei=BERT768128(Ti)E_i = \text{BERT}_{768\to128}(T_i) 。这些向量存储在向量数据库中(如FAISS),通过倒排索引加速检索。
  3. 动态检索:用户提问时,问题被转换为查询向量QQ。系统计算QQ与所有文本块向量的余弦相似度: similarity=QEiQEi\text{similarity} = \frac{Q \cdot E_i}{||Q|| \cdot ||E_i||},召回top-k相关块(例如3个块,约1536 tokens),拼接后输入模型。
  4. 生成回答:模型仅处理这1536 tokens,而不是整个文档,生成回答。

这种流程正是**RAG(Retrieval-Augmented Generation)**的体现:

  • 检索阶段:通过向量数据库找到相关片段。
  • 生成阶段:基于检索结果生成回答。
  • 突破限制:即使文档有10万tokens,模型每次只处理几千tokens的上下文,显存占用恒定,延迟稳定。
指标直接粘贴上传附件
上下文长度严格受限(4k-32k tokens)理论无上限(依赖检索)
信息保真度100%原始文本动态选择的30%-70%内容
响应延迟O(n²)随长度平方增长恒定(取决于索引速度)
硬件消耗显存随长度平方增长固定显存+磁盘存储
语义连贯性完整全局理解局部片段拼接

三、信息损失的数学建模

直接粘贴保留100%信息(3000 tokens),但受限于上下文。上传附件保留约35%信息(1050 tokens),但可扩展到更大文档。设文档总信息量为ItotalI_{total},附件模式的信息保留量为: Iretained=αItotalkNI_{retained} = \alpha \cdot I_{total} \cdot \frac{k}{N}

  • α\alpha:嵌入模型的表征效率(约0.7)。
  • kk:检索返回的块数(例如3)。
  • NN:文档总块数(例如6)。
  • 示例:3000 tokens文档,Itotal=3000I_{total}=3000k=3k=3N=6N=6,保留信息: Iretained=0.7300036=1050 tokensI_{retained} = 0.7 \cdot 3000 \cdot \frac{3}{6} = 1050 \text{ tokens}

四、典型实现架构剖析

以ChatGPT的文件分析功能为例:

用户文件
   ↓
[预处理层]
   ├─ 文本提取(PDF解析)
   ├─ 分块(512-token滑动窗口,步长256)
   └─ 向量化(text-embedding-3-small生成128维向量)
        ↓
[向量数据库](FAISS或HNSW索引)
        ↓
[查询时]
   ├─ 问题向量化
   ├─ 近似最近邻搜索(召回top-3)
   └─ 上下文拼接(约1500 tokens)
        ↓
[语言模型](处理约2k tokens)