<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>RAG加速 - 南极滑稽的博客</title>
	<atom:link href="https://blog.nanjihuaji.top/tag/rag%e5%8a%a0%e9%80%9f/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.nanjihuaji.top</link>
	<description>一个学术垃圾的博客</description>
	<lastBuildDate>Fri, 11 Apr 2025 05:53:45 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.nanjihuaji.top/wp-content/uploads/2024/08/cropped-Cache_45925d60c206ddd8-150x150.jpg</url>
	<title>RAG加速 - 南极滑稽的博客</title>
	<link>https://blog.nanjihuaji.top</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>RaLMSpec论文导读：使用推测方法加速RAG</title>
		<link>https://blog.nanjihuaji.top/2024/08/02/ralmspec%e8%ae%ba%e6%96%87%e5%af%bc%e8%af%bb%ef%bc%9a%e4%bd%bf%e7%94%a8speculative%e6%96%b9%e6%b3%95%e5%8a%a0%e9%80%9frag/</link>
					<comments>https://blog.nanjihuaji.top/2024/08/02/ralmspec%e8%ae%ba%e6%96%87%e5%af%bc%e8%af%bb%ef%bc%9a%e4%bd%bf%e7%94%a8speculative%e6%96%b9%e6%b3%95%e5%8a%a0%e9%80%9frag/#respond</comments>
		
		<dc:creator><![CDATA[Nanjihuaji]]></dc:creator>
		<pubDate>Thu, 01 Aug 2024 18:58:32 +0000</pubDate>
				<category><![CDATA[论文]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[RAG]]></category>
		<category><![CDATA[RAG加速]]></category>
		<guid isPermaLink="false">https://blog.nanjihuaji.top/?p=220</guid>

					<description><![CDATA[<p>居然可以将缓存的概念用在RAG上！</p>
<p>The post <a href="https://blog.nanjihuaji.top/2024/08/02/ralmspec%e8%ae%ba%e6%96%87%e5%af%bc%e8%af%bb%ef%bc%9a%e4%bd%bf%e7%94%a8speculative%e6%96%b9%e6%b3%95%e5%8a%a0%e9%80%9frag/">RaLMSpec论文导读：使用推测方法加速RAG</a> first appeared on <a href="https://blog.nanjihuaji.top">南极滑稽的博客</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>原文标题：ACCELERATING RETRIEVAL-AUGMENTED LANGUAGE MODEL SERVING WITH SPECULATION</p>



<p>Zhihao Zhang1†, Alan Zhu1, Lijie Yang1, Yihua Xu2, Lanting Li1, Hitchaya Mangpo Phothilimthana3, Zhihao Jia1‡</p>



<p>1Carnegie Mellon University, School of Computer Science<br>2 University of California, Berkeley 3 Google DeepMind<br>† zhihaoz3@andrew.cmu.edu,<br>‡ zhihao@cmu.edu</p>



<p>注：本文相当部分的内容是我根据自己的理解写的，如有错误，敬请谅解，也欢迎指正与讨论。</p>



<p>原文摘要：</p>



<p>检索增强语言模型 （RaLM） 已经证明了通过将非参数知识库与参数语言模型相结合来解决知识密集型自然语言处理 （NLP） 任务的潜力。RaLM 不是对完全参数化的模型进行微调，而是作用在低成本地适应最新数据和更好的源归因机制方面。在各种 RaLM 方法中，由于检索器和语言模型之间的交互更频繁，迭代 RaLM 提供了更好的生成质量。尽管有这些好处，但由于频繁的检索步骤，迭代 RaLM 通常会遇到高开销。为此，我们提出了 RaLMSpec，这是一个受推测启发的框架，它为迭代 RaLM 提供通用加速，同时通过推测检索和批量验证保留相同的模型输出。通过进一步结合预取、最优推测步幅调度器和异步验证，RaLMSpec 可以自动充分利用加速潜力。对于朴素迭代的RaLM服务，在4个下游QA数据集上对三种语言模型的广泛评估表明，当检索器为精确密集检索器、近似密集检索器和稀疏检索器时，RaLMSpec的加速比分别为1.75-2.39×、1.04-1.39×和1.31-1.77×与基线相比。对于 KNN-LM 服务，当检索器是精确的密集检索器和近似的密集检索器时，与baseline相比，RaLMSpec 可以实现高达 7.59× 和 2.45× 的加速比。</p>



<p></p>



<p>方法简析：</p>



<p>一般的RaLM从知识库中查找与用户输入相似度最高的文档（它们都会被转化成向量进行相似性比较），但是由于知识库中的文档数量很多，查找所需的时间长，所以迭代RaLM会因为冗长的查找流程而遇到堪忧的性能问题。</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="401" src="http://migrate.nanjihuaji.top/wp-content/uploads/2024/08/image-1024x401.png" alt="" class="wp-image-222" srcset="https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-1024x401.png 1024w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-300x118.png 300w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-768x301.png 768w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-1536x602.png 1536w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-670x262.png 670w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image.png 1672w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>对此，作者等人想到，可以<strong>推测一部分可能会用到的文献</strong>，提前存放在本地缓存中（这就是Speculative的地方），在本地缓存中查找文档与在知识库中查找文档的方法相似，但由于本地缓存的文档数远远小于知识库中的文档数，因此，查找会变得<strong>非常快速</strong>（这就是Speculative Retrieval）。</p>



<p>具体来说，RaLM有一个本地缓存，如果这个本地缓存是空的，就进行一次Initial Query，查找一些文档放入其中。随后查找的时候就只从这个缓存里面查找了。</p>



<p>但是本地缓存毕竟不是知识库（除非它有着和知识库几乎一样的文档，但是这样就没意义了），所以这样子查找会出错。作者们想到了一个法子，可以先查s个文档，然后再批量对这些文档进行验证（也就是从知识库批量对比这些文档是不是最相似的那些，这就是Batched Verification），如果发现某s个文档中的第i个文档出错了，就回滚到第i个文档，然后代之以正确的文档并将之加入到本地缓存里，随后再用新的文档生成新的prompt。这里的s被称为<strong>推测步长</strong>，而且s要取一个比较好的值，如果s太短，比如我们让s=1，那每从本地缓存里查出来一个文档，就要从知识库里查这个文档对不对，不管用不用这个方法，每查一次文档都要上一次知识库，那这岂不是白用这个方法了（笑）；如果s太长，假如s=114514，但s从第二个开始就错了，那后面的114512个文档就白查了。至于怎么取，后文有所介绍。</p>



<p>此外，检索步骤和验证步骤可以<strong>异步进行</strong>，这样效率会更高。</p>



<p>现在我们来说一说s是怎么实现的，作者们称这个方法为Optimal Speculation Stride Scheduler(OS<sup>3</sup>)，它能自动地确定最好的s。原理是这样的：</p>



<div class="wp-block-wp-mathjax-block mathjax">


考虑a代表一个检索步骤的耗时，b代表一个验证步骤的耗时, \\\gamma(X)=p(d_i=\hat{d}_i|X)代表着在上下文X中\\猜测文档d_i与正确文档\hat{d}_i相匹配的概率. \\记目标函数为\mathbb{E}(匹配文档数|X, s)\\为在上下文X中，推测步长为s时\\匹配到正确的文档的数学期望。
\\
对于同步验证，\\\mathbb{E}=1+\sum_{i=1}^{s-2}i\gamma(X)^i(1-\gamma(X))+(s-1)\gamma(X)^{(s-1)}\\=\frac{1-\gamma(X)^s}{1=\gamma(X)}\\
对于异步验证，\\\mathbb{E}=\frac{1-\gamma(X)^s}{(1-\gamma(X))[\gamma(X)^s((s-1)a+max(a,b))+(1-\gamma(X)^s)(sa+b)]}\\
只需要令s=arg\space max\space \mathbb{E}，即可求出最优的步长了。


</div>



<p>至于这个数学期望是怎么算出来的，就超出我的理解范围了（叹气）。</p>



<p>但是事情到这里还没有完，我们之前定义了三个参数，现在我们要讨论怎么估计它们了。对于a和b，可以直接依靠RaLM最近的表现来预测。但对于γ(X)，我们需要用到对数最大似然估计。作者们所用的式子是这样的：</p>



<div class="wp-block-wp-mathjax-block mathjax">


\hat{\gamma}(X)=\frac{\sum_tM(s(t),X)}{\sum_tM(s(t),X)+\sum_t\mathbb{I}(M(s(t),X) < s(t))}\\
其中，\mathbb{I}(·)是指标函数，表明若M(s(t), X) < s(t)，则其值为1，反之则为0.  \\s(t)， t \in [w] 表示第 t 个最近验证步骤中的推测步长，\\M(s(t),X)表示相应数量的匹配文档



</div>



<p>无论如何，我们已经有办法确定最优步长s了。下面就是RaLMSpec的流程：</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="368" src="http://migrate.nanjihuaji.top/wp-content/uploads/2024/08/image-2-1024x368.png" alt="" class="wp-image-225" srcset="https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-2-1024x368.png 1024w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-2-300x108.png 300w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-2-768x276.png 768w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-2-1536x552.png 1536w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-2-670x241.png 670w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-2.png 1612w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>他们先进行3个Speculative Retrieval(i.e. q0, q1, q2, 所查询到的文档为A, B, A)，随后对这些文档进行批量验证，在这里，q3所对应的A出错了（其实应该是C），所以将之修改为C，并将C存入到本地缓存中，然后重新进行LM Decoding环节。更精确的说，这段过程的伪代码是这样的：</p>



<pre class="wp-block-code"><code>1: Input: Input tokens X = {x0, x1,... , xt−1}, external corpus C, language model f(·)
2: Output: RaLM generated outputs
3: Initialize local cache Q = {}, speculation stride s, model generation stride k
4: q = encode(X), Q.insert(C.retrieve(q)) ▷ cache prefetching
5: <strong>while</strong> EOS <strong>not in</strong> X <strong>do</strong>
6: <strong>for</strong> i = 1 <strong>to</strong> s <strong>do</strong>
7: qi = encode(X),ˆdi = Q.retrieve(qi) ▷ speculative retrieval
8: Xˆi = f(X, ˆdi, k) ▷ model generation step that generates k new tokens
9: X = &#91;X, Xˆi]
10: <strong>end for</strong>
11: d1,... , ds = C.retrieve(q1,... , qs) ▷ batched verification
12: m = arg miniˆdi != di
13: <strong>if</strong> m ≤ s <strong>then</strong> ▷ do correction if needed
14: Roll X back to the m-th speculation step
15: Xˆ = f(X, di, k)
16: X = &#91;X, Xˆ]
17: <strong>end if</strong>
18: <strong>end while</strong></code></pre>



<p>大体上来说，这段代码主要是在：初始化本地缓存，并进行初始预取。在主循环中，进行推测性检索和生成新的token。每经过s次推测后，进行批量验证。如有需要，进行校正，确保生成结果的准确性。直到生成结束符 (EOS)，生成过程结束。</p>



<p></p>



<p>评估：</p>



<p>实验设置如下：</p>



<p>•<strong>LLMs</strong>: GPT2-medium, OPT-1.3B, LLaMA-2-7B. 对于KNN-LM服务，采用了16 layers, decoder-only, 247M的LLM</p>



<p>•<strong>Datasets:</strong></p>



<p>•四个 QA 数据集：Wiki-QA、Web Questions、Natural Question, Trivia-QA;</p>



<p>•外部知识库: Wikipedia Corpus;</p>



<p>•KNN-LM评估: Wikitext-003.</p>



<p>•<strong>Retrievers:</strong></p>



<p>•Exact Dense Retrievers(EDR): Dense Passage Retriever(DPR);</p>



<p>•Approximate Dense Retriever(ADR): DPR-HNSW;</p>



<p>•Sparse Retriever(SR): BM25 Retriever.</p>



<p>•<strong>Baseline:</strong></p>



<p>•Naïve Iterative RaLM: 使用RaLMSeq作为基准，在每个LLM生成4个token后执行检索;</p>



<p>•KNN-LM:对生成的每个token执行检索.</p>



<p>评估结果：</p>



<ol class="wp-block-list">
<li>RaLMSpec对EDR提升效果最显著，OS<sup>3</sup>对ADR，SR的提升作用最大</li>
</ol>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="770" src="http://migrate.nanjihuaji.top/wp-content/uploads/2024/08/image-3-1024x770.png" alt="" class="wp-image-226" style="width:593px;height:auto" srcset="https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-3-1024x770.png 1024w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-3-300x226.png 300w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-3-768x578.png 768w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-3-670x504.png 670w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-3.png 1150w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="639" src="http://migrate.nanjihuaji.top/wp-content/uploads/2024/08/image-4-1024x639.png" alt="" class="wp-image-227" style="width:638px;height:auto" srcset="https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-4-1024x639.png 1024w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-4-300x187.png 300w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-4-768x479.png 768w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-4-670x418.png 670w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-4.png 1411w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>2. EDR使用较大步长效果较好，但ADR则需要使用OS<sup>3</sup>。</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="629" src="http://migrate.nanjihuaji.top/wp-content/uploads/2024/08/image-5-1024x629.png" alt="" class="wp-image-228" style="width:612px;height:auto" srcset="https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-5-1024x629.png 1024w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-5-300x184.png 300w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-5-768x472.png 768w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-5-670x411.png 670w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-5.png 1334w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="587" src="http://migrate.nanjihuaji.top/wp-content/uploads/2024/08/image-6-1024x587.png" alt="" class="wp-image-229" style="width:603px;height:auto" srcset="https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-6-1024x587.png 1024w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-6-300x172.png 300w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-6-768x440.png 768w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-6-670x384.png 670w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-6.png 1490w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>3. EDR相较ADR和SR表现较好，在1.70x~1.85x.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="239" src="http://migrate.nanjihuaji.top/wp-content/uploads/2024/08/image-7-1024x239.png" alt="" class="wp-image-230" srcset="https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-7-1024x239.png 1024w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-7-300x70.png 300w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-7-768x179.png 768w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-7-1536x358.png 1536w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-7-2048x478.png 2048w, https://blog.nanjihuaji.top/wp-content/uploads/2024/08/image-7-670x156.png 670w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure><p>The post <a href="https://blog.nanjihuaji.top/2024/08/02/ralmspec%e8%ae%ba%e6%96%87%e5%af%bc%e8%af%bb%ef%bc%9a%e4%bd%bf%e7%94%a8speculative%e6%96%b9%e6%b3%95%e5%8a%a0%e9%80%9frag/">RaLMSpec论文导读：使用推测方法加速RAG</a> first appeared on <a href="https://blog.nanjihuaji.top">南极滑稽的博客</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.nanjihuaji.top/2024/08/02/ralmspec%e8%ae%ba%e6%96%87%e5%af%bc%e8%af%bb%ef%bc%9a%e4%bd%bf%e7%94%a8speculative%e6%96%b9%e6%b3%95%e5%8a%a0%e9%80%9frag/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
