ContextCache: Context-Aware Semantic Cache for Multi-Turn Queries in Large Language Models

作者/机构: 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)

A1 主要贡献

核心问题: 大语言模型(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,从而减少了响应时间和运营成本。

A3 背景知识

语义缓存的改进: 语义缓存通过对查询的“含义”而非其确切的“词语”进行操作,改进了传统缓存方法。这使得系统能够识别语义上等同但措辞不同的问题,并重用答案以提高效率。

嵌入生成: 系统的核心是嵌入生成器,它将查询转换为向量表示。该生成器采用基于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。

A2 方法细节

系统概述

工作流程

利用对话上下文进行优化: 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)\}$ 则从先前的计算中重用,从而消除了冗余计算。

  • 两阶段检索机制: 该机制通过渐进式优化来提高缓存命中准确性。

    • 粗粒度阶段使用余弦相似度阈值 $θ_1$ 筛选候选者 $C_1 = \{i | \cos(v_c, v_i) > θ_1\}$,其中 $v_i$ 代表缓存条目的查询向量。
    • 细粒度阶段使用存储在缓存中的预先计算的上下文表示。对于每个候选者,从先前的缓存更新中检索全局表示 $g_i$。系统生成当前对话的全局表示 $g_{current} = \text{SelfAttention}(V_{current})$,其中 $V_{current} = \{v_c\} \cup v_h$。这种自注意力机制分析轮次间的关系,产生一个统一的上下文表示。最终的相似度评估使用余弦相似度:$s_i = \cos(g_{current}, g_i)$。系统选择超过阈值 $θ_2$ 的最优匹配 $i_{best} = \arg \max_{i \in C_1} s_i$,从而在确保上下文适当响应的同时保持效率。
  • 缓存更新模块: 采用双重存储架构。新的响应 $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%。

A4 实验环境与结果

实验环境

  • 数据集: 使用了来自ShareGPT数据集【1, ShareGPT, 2024, https://sharegpt.com/】的1000个查询进行评估。缓存使用30%的原始对话样本进行初始化。测试查询是通过GPT-4对原始查询进行转述生成的,以模拟真实世界中的语言多样性 。
  • 模型架构: 使用Albert【4, Albert: A lite bert for self-supervised learning of language representations, 2019, arXiv】作为语义编码器。
  • 硬件配置: 论文未明确提及。
  • 软件配置: 系统基于GPTCache【2, Gptcache: An open-source semantic cache for llm applications enabling faster answers and cost savings, 2023, NLP-OSS 2023 Workshop】进行增强。前端界面基于Vue开发。采用双数据库架构,结合了SQL关系型存储和FAISS向量索引进行检索。

实验结果

演示系统概述

本文提出了ContextCache,一个通过上下文感知扩展LLM查询缓存的系统。该系统提供了一个基于Vue的用户界面,并展示了其在实际应用场景中的能力和优势,如图4所示。


图4: ContextCache用户界面及演示场景

场景1: 缓存命中

  • 实验内容: 该演示旨在评估系统在存在显著语言差异的情况下识别语义相似查询的能力。系统预先填充了100个问答对,包括“什么是关系数据库?”及其关键特征。测试时,用户提交一个语义等价但措辞不同的查询:“请解释关系数据库的重要特征”。
  • 实验结果:

    1. 系统成功识别查询并从缓存中检索响应,界面显示绿色的“Cache Hit”指示。
    2. 性能指标显示响应时间为0.65秒,并节省了302个token的计算量。
  • 分析结论: 此场景表明,上下文感知的语义缓存能有效区分表面的语言差异和深层的语义意图,成功地在特定对话上下文中识别语义等价性,将响应延迟从秒级降低到毫秒级,同时保证了响应的恰当性。

场景2: 缓存未命中

  • 实验内容: 该演示旨在解决一个关键挑战:正确处理那些因对话历史不同而需要不同响应的相似查询。用户首先发起一个关于云计算的对话,输入“什么是云计算?”后,接着提问“它的关键特征是什么?”——这个查询与先前缓存的关于关系数据库的查询完全相同,但需要一个与当前上下文匹配的响应。
  • 实验结果:

    1. 当提交查询时,系统识别出上下文差异,并显示“Cache Miss”指示。
    2. 在LLM生成响应后,数据库面板更新,显示新存储的对话及其保留的上下文。
  • 分析结论: 此场景突显了ContextCache通过有效的上下文区分来防止语义混淆的能力。通过将对话历史纳入匹配过程,系统成功区分了在不同上下文设置中出现的相似查询,从而减少了假阳性匹配。

演示互动与性能

  • 实验内容: 为了量化系统效果,集成了一个交互式仪表盘(图5),实时可视化ContextCache的运行指标,包括缓存真/假命中、LLM API调用、查询量和内存使用情况。
  • 实验结果: 通过执行日志分析,用户可以清晰地观察到,缓存服务的响应延迟比直接调用LLM低约10倍,同时在多轮对话中保持了高的语义匹配精度。
  • 分析结论: 这表明ContextCache是降低LLM应用计算成本和响应延迟的有效解决方案。


图5: 演示互动结果

A5 结论

本文介绍了ContextCache,一个上下文感知的语义缓存系统,它能够降低LLM的推理成本,有助于推动LLM应用的更广泛采用。