作者/机构: Jianxin Yan (Zhejiang University), Wangze Ni (Zhejiang University), Lei Chen (HKUST (GZ) & HKUST), Xuemin Lin (Shanghai Jiaotong University), Peng Cheng (Tongji University), Zhan Qin (Zhejiang University), Kui Ren (Zhejiang University)
核心问题: 大语言模型(LLM)的推理需要大量的计算资源,导致高昂的运营成本。语义缓存通过存储和重用先前生成的响应来优化这一过程,但现有系统主要依赖于匹配单个查询,缺乏对多轮对话上下文的感知。这导致在不同对话场景中出现相似查询时,会发生错误的缓存命中。例如,简单地拼接历史查询会导致注意力稀释,而对轮次嵌入进行平均则会造成表示扁平化,掩盖特定轮次的语义特征,这两种方法都因为句子级监督不足而导致语义区分能力不足。
研究目标: 本文旨在开发一个能够感知上下文的语义缓存系统,以解决在多轮对话中准确匹配语义的挑战。核心目标是建立一种机制,既能有效建模上下文,又能以最小的计算开销保持精确的语义关系检测。
创新点: 为应对上述挑战,本文提出了ContextCache,一个用于多轮对话系统的上下文感知语义缓存框架,其核心创新点包括:
* 动态上下文建模(Dynamic Context Modeling): 实现了一种分层的自注意力机制,用于捕捉跨轮次的语义依赖关系。这种方法既减轻了拼接长文本序列时出现的注意力稀释问题,又保留了通过表示扁平化(平均嵌入)会丢失的特定轮次特征。
* LLM增强训练(LLM-enhanced training): 采用困难负样本挖掘来提高匹配精度,通过强大的句子级监督解决了语义区分能力不足的问题。
* 两阶段动态检索架构(Two-Stage Dynamic Retrieval Architecture): 该架构结合了高效的向量检索(用于候选选择)和精确的基于注意力的上下文匹配(用于精确匹配),从而在计算效率和语义准确性之间取得了平衡。
实验评估表明,ContextCache在精确率和召回率上均优于现有方法,并且缓存服务的响应延迟比直接调用LLM低约10倍。
图1: 使用语义缓存优化LLM响应
图1说明了LLM语义缓存的工作原理。左侧显示了没有缓存的情况,每个查询都需要完整的LLM推理周期,消耗大量计算资源并增加延迟。右侧显示了使用缓存的情况,当用户提交的查询Q2与之前缓存的查询Q1在语义上相似时,系统直接检索现有响应,而无需调用LLM,从而减少了响应时间和运营成本。
语义缓存的改进: 语义缓存通过对查询的“含义”而非其确切的“词语”进行操作,改进了传统缓存方法。这使得系统能够识别语义上等同但措辞不同的问题,并重用答案以提高效率。
嵌入生成: 系统的核心是嵌入生成器,它将查询转换为向量表示。该生成器采用基于Transformer的架构【8, Attention is all you need, 2017, Advances in neural information processing systems】来编码语义信息:$E(Q) = T(Q)$,其中向量空间中的几何邻近度对应于语义相似性【4, Albert: A lite bert for self-supervised learning of language representations, 2019, arXiv】。
相似度量化: 这一步骤为缓存提供了决策机制。它使用余弦相似度来衡量两个嵌入向量之间的角度接近度,公式为:$similarity(v_1, v_2) = \frac{v_1 \cdot v_2}{||v_1|| \cdot ||v_2||}$。当此相似度值超过预定阈值时,系统将查询分类为等效,并检索缓存的响应,而不是调用LLM。
利用对话上下文进行优化: ContextCache通过利用对话上下文进行语义缓存来优化大型语言模型应用。图2展示了该系统的架构,包含六个关键组件:
1. 查询拦截: 用户查询在传输到LLM之前被拦截。
2. 上下文收集: 系统捕获当前查询并检索历史对话,以构建全面的对话上下文。
3. 语义表示生成: 系统仅为当前查询生成嵌入向量,同时重用先前计算的历史对话嵌入。
4. 两层检索: 系统首先利用当前查询的嵌入进行初步相似性搜索,以识别潜在匹配项。对于筛选出的候选者,它随后整合来自当前查询和历史对话的嵌入,并应用自注意力机制来分析轮次间的关系,生成统一的上下文表示以进行精确匹配。
5. 响应确定: 当找到具有匹配语义和上下文的缓存条目时,系统返回缓存的响应;否则,将查询转发给LLM。
6. 缓存更新: 对于LLM生成的响应,系统在将其返回给用户之前,会存储响应以及查询嵌入和上下文表示。
图2: ContextCache的架构
基于GPTCache的增强: 我们通过一个集成对话上下文的架构增强了GPTCache【2, Gptcache: An open-source semantic cache for llm applications enabling faster answers and cost savings, 2023, NLP-OSS 2023 Workshop】:
查询预处理模块: 该模块对查询进行标准化,并融入对话上下文。历史对话记录 $C = \{h_1, h_2, ..., h_n\}$ 建立了对话上下文。Albert【4, Albert: A lite bert for self-supervised learning of language representations, 2019, arXiv】嵌入模型 $E$ 仅为当前查询生成语义表示 $v_c = E(c)$,而历史对话向量 $v_h = \{E(h_1), E(h_2), ..., E(h_n)\}$ 则从先前的计算中重用,从而消除了冗余计算。
两阶段检索机制: 该机制通过渐进式优化来提高缓存命中准确性。
缓存更新模块: 采用双重存储架构。新的响应 $r$ 和相关元数据作为上下文元组 $(c, r)$ 存储在关系型数据库中,而查询向量 $v_c$ 和全局表示 $g_{current}$ 则在向量数据库中进行索引,以实现高效的相似性搜索。这种分离优化了存储和检索性能。
评估方法: 我们的评估使用了源自ShareGPT数据集【1, ShareGPT, 2024, https://sharegpt.com/】的1000个查询。我们用原始对话样本的30%来初始化缓存 【3, Privacy-Aware Semantic Cache for Large Language Models, 2024, arXiv】【5, On caching search engine query results, 2001, Computer Communications】,然后通过基于GPT-4的释义创建语义上等效的变体来生成测试查询,以引入语言多样性,同时保留语义意图。这种方法模拟了真实世界场景,即用户使用不同措辞重新提问,而不改变潜在的对话上下文。
上下文集成: 我们的自注意力机制建模了对话轮次间的语义关系,生成了捕捉轮次间依赖关系的统一上下文表示。图3a表明,我们的方法通过保留特定轮次的语义特征并建模其上下文关系,显著优于拼接和平均方法。与GPTCache相比,这种上下文感知方法实现了10.9%的更高精确率和14.8%的更高召回率,尤其是在区分出现在不同对话上下文中的语义相似查询方面表现出色。
图3: 性能指标:ContextCache vs. GPTCache
效率优化: 我们的系统通过两阶段检索机制和双重存储架构减少了计算开销。与直接调用LLM相比,该设计提供的缓存服务响应延迟降低了约10倍,从而大幅减少了运营成本(图5)。此外,如图3b所示,尽管我们加入了提高语义精度的上下文处理,但与GPTCache相比,平均缓存命中时间减少了3%。
本文提出了ContextCache,一个通过上下文感知扩展LLM查询缓存的系统。该系统提供了一个基于Vue的用户界面,并展示了其在实际应用场景中的能力和优势,如图4所示。
图4: ContextCache用户界面及演示场景
实验结果:
分析结论: 此场景表明,上下文感知的语义缓存能有效区分表面的语言差异和深层的语义意图,成功地在特定对话上下文中识别语义等价性,将响应延迟从秒级降低到毫秒级,同时保证了响应的恰当性。
实验结果:
分析结论: 此场景突显了ContextCache通过有效的上下文区分来防止语义混淆的能力。通过将对话历史纳入匹配过程,系统成功区分了在不同上下文设置中出现的相似查询,从而减少了假阳性匹配。
图5: 演示互动结果
本文介绍了ContextCache,一个上下文感知的语义缓存系统,它能够降低LLM的推理成本,有助于推动LLM应用的更广泛采用。