第 58 页 / 共 100 页 / 飞书修订版 8

8.Reranking results

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

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

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

FGXSbiS24oDr7ixh7S3cTTT3nDc.bin

我们构建的混合检索方法效果不错,但仍存在一些薄弱环节。当搜索"工程团队对 INC-2023-Q4-011 做了什么?"时,我们可能期望软件工程部分排名更高,因为它明确提到了工程团队和该事件。然而,当前系统仍然首先返回网络安全部分。

这就是重新排序发挥作用的地方——这是一种添加额外后处理步骤来提高检索准确性的技术。

重新排序的工作原理

重新排序在概念上很简单。在运行向量索引和 BM25 索引并合并结果后,你需要添加一个步骤:使用 Claude 智能地重新排列搜索结果的重新排序器。

image1.jpeg

该过程的工作流程如下:

  • 获取混合搜索的合并结果
  • 将结果连同用户的原始问题一起发送给 Claude
  • 要求 Claude 按相关性递减的顺序返回最相关的文档
  • 使用 Claude 重新排序的列表作为最终结果

重新排序提示词

提示结构很简单直接。你向Claude提供用户的问题和所有看起来相关的文档,然后要求执行一个简单的任务:

你的任务是找到与用户问题最相关的文档。

<user_question>

INC-2023-Q4-011发生了什么?

</user_question>

以下是可能相关的文档:

<documents>

<document>第10节...</document>

<document>第2节...</document>

<document>第7节...</document>

<document>Section 6...</document>

</documents>

返回3个最相关的文档,按相关性递减的顺序排列。

效率考虑

在实现重新排序时有一个重要的效率考虑。如果你要求Claude返回每个相关块的完整文本,实际上就是要求它将大量文本复制回给你。这既浪费又缓慢。

更好的方法是提前为每个文本块分配一个唯一ID,然后要求Claude只返回按正确顺序排列的这些ID:

<documents>

<document>

<id>ab84</id>

<content>Section 10...</content>

</document>

<document>

<id>51n3</id>

<content>第8节...</content>

</document>

</documents>

然后Claude可以返回一个简单的列表,如["1p5g", "51n3", "ab83"],而不是复制整个文本块。

Implementation

重排序函数会在初始混合搜索完成后由您的检索器自动调用。基本结构如下:

def reranker_fn(docs, query_text, k):

# 使用ID格式化文档

joined_docs = "\n".join([

f"""

<document>

<document_id>{doc["id"]}</document_id>

<document_content>{doc["content"]}</document_content>

</document>

"""

for doc in docs

])

# 创建提示并获取Claude的响应

prompt = f"""..."""

messages = []

add_user_message(messages, prompt)

add_assistant_message(messages, """```json""")

result = chat(messages, stop_sequences=["""```"""])

return json.loads(result["text"])["document_ids"]

Results

在使用"工程团队对 INC-2023-Q4-011 做了什么?"这个查询测试重新排序方法时,软件工程部分现在出现在结果的首位。Claude 成功识别出用户的查询特别关注工程团队以及他们与该事件的关系。

Trade-offs

重新排序带来了明显的权衡:

  • 延迟增加:现在需要等待对 Claude 的额外 API 调用
  • 准确性提升:Claude 能够以纯向量相似性无法做到的方式理解上下文和相关性

对于大多数应用来说,准确性的提升值得付出延迟的代价,特别是在处理复杂查询时,语义理解比纯粹的关键词匹配更为重要。

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



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