第 59 页 / 共 100 页 / 飞书修订版 7

9.Contextual retrieval

此文档由 学习AI的1000天 翻译制作(抖音,B站,YouTube)

邮箱: szqshan@gmail.com | 微信: szqshan
网址: www.xueai.org

==================================================

JYyYbqedjoPpcXxw1fKcdlCKn5c.bin

上下文检索是一种提高RAG管道准确性的技术,它解决了一个根本问题:当你将文档分割成块时,每个块都失去了与更广泛文档上下文的连接。

标准分块的问题

当你获取源文档并将其分解成块放入向量数据库时,每个单独的片段不再知道它来自哪里或与文档其余部分的关系。这可能会损害检索准确性,因为这些块缺乏重要的上下文信息。

image1.jpeg

上下文检索的工作原理

上下文检索在将块插入检索器数据库之前添加了一个预处理步骤。具体过程如下:

  • 获取每个单独的块和原始源文档
  • 将两者都发送给Claude,并使用特定的提示
  • 要求Claude编写一个简短的片段,将该块置于整个文档的上下文中
  • 将此上下文与原始块结合,创建一个"上下文化块"
  • 在你的向量和BM25索引中使用上下文化块
image2.jpeg

该提示要求Claude分析文档块并编写上下文,解释该块在整个文档中的作用。例如,如果你有一个关于软件工程的章节提到了2023年的某个事件,Claude可能会生成上下文来解释这个章节来自一个更大的报告,并且同一事件在其他章节中也有提及。

处理大型文档

一个常见问题是当你的源文档太大,无法与Claude一起放入单个提示中。在这种情况下,你可以提供一个精简的上下文集合,而不是整个文档。

image3.jpeg

策略是包含:

  • 文档开头的几个块(通常包含摘要或概要)
  • 你正在上下文化的块之前的块
  • 跳过中间与当前块关联性较低的块

这种方法为Claude提供了足够的上下文来理解文档的内容以及当前块如何融入其中,而不会用不必要的文本使提示过载。

实现示例

这里是一个为单个块添加上下文的基本函数:

def add_context(text_chunk, source_text):

prompt = """

编写一段简短而简洁的文本片段,将此文本块置于

整个源文档的上下文中,以改善该文本块的搜索检索效果。

以下是原始源文档:

<document>

{source_text}

</document>

以下是我们想要在整个文档中定位的文本块:

<chunk>

{text_chunk}

</chunk>

只回答简洁的上下文,不要其他内容。

"""

messages = []

add_user_message(messages, prompt)

result = chat(messages)

return result["text"] + "\n" + text_chunk

对于处理具有有限上下文的多个文本块,你可以选择特定的文本块来包含:

# 为每个文本块添加上下文,然后添加到检索器中

num_start_chunks = 2

num_prev_chunks = 2

for i, chunk in enumerate(chunks):

context_parts = []

# 从文档开头获取初始的块集合

context_parts.extend(chunks[: min(num_start_chunks, len(chunks))])

# 在我们正在上下文化的当前块之前添加额外的块

start_idx = max(0, i - num_prev_chunks)

context_parts.extend(chunks[start_idx:i])

context = "\n".join(context_parts)

contextualized_chunk = add_context(chunk, context)

retriever.add_document({"content": contextualized_chunk})

Expected Results

当你使用上下文检索运行搜索查询时,你会得到包含生成的上下文和原始块内容的结果。上下文帮助检索系统更好地理解每个块的内容以及它与整个文档的关系。

例如,一个上下文化的块可能以这样的内容开头:"这个块是年度跨学科研究评审的第2节,详细描述了解决Phoenix项目稳定性问题的软件工程工作...",然后跟着原始块的文本内容。

这种技术对于复杂文档特别有价值,因为这些文档中的各个部分之间有许多相互连接和对文档其他部分的引用。添加的上下文有助于确保即使搜索查询与块的原始文本不完全匹配,也能检索到相关的块。

==================================================



此文档由 学习AI的1000天 翻译制作(抖音,B站,YouTube)
邮箱: szqshan@gmail.com | 微信: szqshan
网址: www.xueai.org