导航菜单

  • 1.vector
  • 2.milvus
  • 3.pymilvus
  • 4.rag
  • 5.rag_measure
  • ragflow
  • heapq
  • HNSW
  • cosine_similarity
  • math
  • typing
  • etcd
  • minio
  • collections
  • jieba
  • random
  • beautifulsoup4
  • chromadb
  • sentence_transformers
  • numpy
  • lxml
  • openpyxl
  • PyMuPDF
  • python-docx
  • requests
  • python-pptx
  • text_splitter
  • all-MiniLM-L6-v2
  • openai
  • llm
  • BPETokenizer
  • Flask
  • RAGAS
  • BagofWords
  • langchain
  • Pydantic
  • abc
  • faiss
  • MMR
  • scikit-learn
  • Runnable
  • PromptEngineering
  • dataclasses
  • LaTeX
  • rank_bm25
  • TF-IDF
  • asyncio
  • sqlalchemy
  • fastapi
  • Starlette
  • uvicorn
  • argparse
  • Generic
  • ssl
  • urllib
  • python-dotenv
  • RRF
  • CrossEncoder
  • Lost-in-the-middle
  • Jinja2
  • logger
  • io
  • venv
  • concurrent
  • parameter
  • SSE
  • 1. 什么是"Lost-in-the-Middle"问题
    • 1.1 问题现象
    • 1.2 为什么这个问题很重要
    • 1.3 直观类比
  • 2. 前置知识:为什么会出现这个问题
    • 2.1 Transformer架构简介
      • 2.1.1 什么是注意力机制
      • 2.1.2 位置编码的作用
    • 2.2 位置偏差的产生
  • 3. 如何识别"Lost-in-the-Middle"问题
    • 3.1 测试方法
    • 3.2 实际例子
  • 4. 解决方案:文档重排策略
    • 4.1 方案一:奇偶重排算法(LongContextReorder)
      • 4.1.1 算法原理
      • 4.1.2 算法示例
      • 4.1.3 实现代码
      • 4.1.4 运行结果示例
  • 5. 在RAG系统中应用文档重排
    • 5.1 完整的RAG工作流示例
  • 6. 重排效果对比
  • 7. 最佳实践建议
    • 7.1 何时使用文档重排
    • 7.2 实施步骤
    • 7.3 注意事项

1. 什么是"Lost-in-the-Middle"问题 #

"Lost-in-the-Middle"(迷失在中部)是大语言模型(LLM)处理长文本时的一个关键挑战。简单来说,当大量相关信息被放在输入文本的中间部分时,模型的注意力会下降,导致它无法有效提取和使用这些信息,从而影响回答质量。

1.1 问题现象 #

想象一下,你给模型输入了10篇文档,其中第5篇文档包含了最关键的信息。但模型可能会:

  • 很好地利用第1篇和第10篇文档的信息
  • 却忽略了第5篇文档中的关键内容

这就是"Lost-in-the-Middle"问题的典型表现。

1.2 为什么这个问题很重要 #

在以下场景中,这个问题会严重影响系统效果:

  • RAG(检索增强生成):从知识库检索多篇文档后,关键信息可能被放在中间
  • 多文档问答:需要综合多篇文档回答问题时
  • 长文本摘要:对长文档进行摘要时,重要信息可能在中间部分
  • 代码库分析:分析大型代码库时,关键代码可能在中间位置

1.3 直观类比 #

这就像人类的"序列位置效应":

  • 我们更容易记住列表的第一项和最后一项
  • 但中间的项往往容易被遗忘

大语言模型也有类似的"记忆偏好",它们更关注输入的开头和结尾,而容易忽略中间部分。

2. 前置知识:为什么会出现这个问题 #

要理解"Lost-in-the-Middle"问题,我们需要了解一些基础知识。

2.1 Transformer架构简介 #

现代大语言模型(如GPT、BERT、LLaMA)都基于Transformer架构。Transformer使用注意力机制(Attention Mechanism)来处理输入序列。

2.1.1 什么是注意力机制 #

注意力机制让模型能够:

  • 关注输入序列中的不同部分
  • 决定哪些信息对当前任务最重要
  • 动态地分配"注意力权重"

2.1.2 位置编码的作用 #

由于Transformer本身无法感知位置信息,模型使用位置编码(Positional Encoding)来告诉模型每个词在序列中的位置。

2.2 位置偏差的产生 #

在长序列处理中,模型会出现位置偏差(Position Bias):

  1. 开头位置优势:模型倾向于给序列开头的token分配更多注意力
  2. 结尾位置优势:序列结尾的token也容易获得较高注意力
  3. 中间位置劣势:中间位置的token获得的注意力相对较少

这种偏差是Transformer架构在处理长序列时的固有特性,不是bug,而是架构设计带来的副作用。

3. 如何识别"Lost-in-the-Middle"问题 #

在实际应用中,你可以通过以下方式识别这个问题:

3.1 测试方法 #

  1. 对比测试:将关键信息放在不同位置(开头、中间、结尾),观察模型回答质量
  2. 注意力可视化:分析模型的注意力权重分布
  3. 性能评估:在长文本任务中,如果中间位置的信息提取准确率明显低于首尾,可能就是这个问题

3.2 实际例子 #

假设你有一个RAG系统,检索到了5篇相关文档:

文档1: 关于Python基础语法(相关性:0.6)
文档2: 关于Python数据结构(相关性:0.5)
文档3: 关于Python高级特性(相关性:0.9)← 最关键
文档4: 关于Python性能优化(相关性:0.4)
文档5: 关于Python最佳实践(相关性:0.3)

如果按相关性顺序直接输入给模型,文档3在中间位置,模型可能会忽略它,导致回答质量下降。

4. 解决方案:文档重排策略 #

最常用且有效的解决方案是文档重排(Document Reordering)。核心思想是:不改变文档本身,而是调整文档的输入顺序,将最重要的文档放在模型注意力最强的位置(开头和结尾)。

4.1 方案一:奇偶重排算法(LongContextReorder) #

这是最经典且广泛使用的重排策略。

4.1.1 算法原理 #

  1. 假设文档已经按相关性从高到低排序
  2. 提取所有奇数位置的文档(1, 3, 5, 7...)
  3. 提取所有偶数位置的文档(2, 4, 6, 8...),并反向排列
  4. 将两部分拼接:奇数部分在前,反向的偶数部分在后

4.1.2 算法示例 #

假设有6篇文档,按相关性排序为:[D1, D2, D3, D4, D5, D6]

重排过程:

  • 奇数位:D1, D3, D5
  • 偶数位(反向):D6, D4, D2
  • 最终顺序:[D1, D3, D5, D6, D4, D2]

这样,最重要的文档D1在开头,次重要的文档D2在结尾,都能获得模型的高度关注。

4.1.3 实现代码 #

  • Lost-in-the-Middle
# 定义一个函数,用于对文档列表进行奇偶重排
def long_context_reorder(documents):
    """
    使用奇偶重排算法对文档列表进行重排

    参数:
        documents: 已经按相关性从高到低排序的文档列表

    返回:
        重排后的文档列表,最重要的文档在开头和结尾
    """
    # 如果文档数量为0或1,直接返回原列表
    if len(documents) <= 1:
        return documents

    # 提取所有奇数位置(索引为0, 2, 4, ...)的文档
    # Python列表切片[::2]可取得偶数索引的元素(注意索引从0算)
    odd_docs = documents[::2]

    # 提取所有偶数位置(索引为1, 3, 5, ...)的文档
    # [1::2]取得奇数索引的元素
    even_docs = documents[1::2]

    # 将偶数位置文档列表反转
    even_docs_reversed = even_docs[::-1]

    # 拼接奇数位文档和反转后的偶数位文档,得到最终顺序
    reordered_docs = odd_docs + even_docs_reversed

    # 返回重排后的文档列表
    return reordered_docs


"""
测试奇偶重排算法
"""
# 构造测试文档列表,按相关性从高到低排序
documents = [
    "文档1(相关性最高)",
    "文档2",
    "文档3",
    "文档4",
    "文档5",
    "文档6(相关性最低)"
]
# 打印原始顺序
print("原始顺序(按相关性排序):")
for i, doc in enumerate(documents, 1):
    # 按顺序打印每个文档及其位置
    print(f"  位置{i}: {doc}")
# 调用重排函数
reordered = long_context_reorder(documents)
# 打印重排后的结果
print("\n重排后的顺序:")
for i, doc in enumerate(reordered, 1):
    # 按顺序打印每个文档及其新位置
    print(f"  位置{i}: {doc}")

4.1.4 运行结果示例 #

运行上述代码,你会看到类似这样的输出:

原始顺序(按相关性排序):
  位置1: 文档1(相关性最高)
  位置2: 文档2
  位置3: 文档3
  位置4: 文档4
  位置5: 文档5
  位置6: 文档6(相关性最低)

重排后的顺序:
  位置1: 文档1(相关性最高)
  位置2: 文档3
  位置3: 文档5
  位置4: 文档6(相关性最低)
  位置5: 文档4
  位置6: 文档2

效果说明:
  - 最重要的文档1现在在开头(位置1)
  - 次重要的文档2现在在结尾(位置6)
  - 这样模型能更好地关注到关键信息

5. 在RAG系统中应用文档重排 #

现在让我们看一个完整的RAG系统示例,展示如何在实际应用中使用文档重排。

5.1 完整的RAG工作流示例 #

# 定义一个文档类,用于存储文档内容和相关性分数
class Document:
    """
    文档类,用于存储文档内容和元数据
    """
    # 初始化方法,传入文档内容和分数
    def __init__(self, content: str, score: float = 0.0):
        # 文档内容
        self.content = content
        # 相关性分数(越高越相关)
        self.score = score

    # 定义类的字符串显示方式
    def __repr__(self):
        return f"Document(score={self.score:.2f}, content='{self.content[:30]}...')"


# 定义检索文档的函数,根据query和知识库生成文档列表
def retrieve_documents(query: str, knowledge_base):
    """
    模拟文档检索过程

    参数:
        query: 用户查询
        knowledge_base: 知识库中的文档列表

    返回:
        检索到的文档列表,按相关性分数排序
    """
    # 这里简化处理,实际应用中会使用嵌入模型进行相似度计算
    # 我们模拟一个检索结果,假设已经按相关性排序
    documents = []

    # 遍历知识库,对每个文档计算相关性分数
    for i, doc in enumerate(knowledge_base):
        # 如果文档包含查询关键词,分数较高
        if query.lower() in doc.lower():
            score = 0.9 - i * 0.1  # 相关性分数递减
        else:
            score = 0.5 - i * 0.05  # 不相关时分数较低

        # 创建Document对象并添加到文档列表
        documents.append(Document(doc, score))

    # 按照得分高到低排序
    documents.sort(key=lambda x: x.score, reverse=True)

    # 返回排序后的文档列表
    return documents


# 定义长上下文的奇偶重排算法
def apply_long_context_reorder(documents):
    """
    对检索到的文档应用奇偶重排算法

    参数:
        documents: 已按相关性排序的文档列表

    返回:
        重排后的文档列表
    """
    # 如果文档数量为0或1,直接返回
    if len(documents) <= 1:
        return documents

    # 提取奇数位置的文档(索引0, 2, 4, ...)
    odd_docs = documents[::2]

    # 提取偶数位置的文档(索引1, 3, 5, ...)并反向
    even_docs = documents[1::2][::-1]

    # 拼接奇数与偶数文档
    return odd_docs + even_docs


# 定义格式化上下文的函数,用于给LLM输入
def format_context_for_llm(documents):
    """
    将文档列表格式化为LLM可以理解的上下文字符串

    参数:
        documents: 文档列表

    返回:
        格式化后的上下文字符串
    """
    # 用于收集所有文档字符串部分
    context_parts = []

    # 遍历所有文档,添加编号和内容
    for i, doc in enumerate(documents, 1):
        context_parts.append(f"文档{i}(相关性分数:{doc.score:.2f}):\n{doc.content}\n")

    # 用空行分隔所有文档拼成一个字符串
    return "\n\n\n".join(context_parts)


# 定义完整的RAG流程,包含检索、重排、格式化三步
def rag_pipeline(query: str, knowledge_base, use_reorder: bool = True):
    """
    完整的RAG流程,包含文档重排步骤

    参数:
        query: 用户查询
        knowledge_base: 知识库
        use_reorder: 是否使用文档重排(默认True)

    返回:
        格式化后的上下文,可以直接输入给LLM
    """
    # 步骤1:检索相关文档
    print("步骤1:检索相关文档...")
    # 检索文档
    documents = retrieve_documents(query, knowledge_base)
    # 输出检索到的文档数量
    print(f"检索到 {len(documents)} 篇文档")

    # 步骤2:(可选)应用文档重排
    if use_reorder and len(documents) > 1:
        print("\n步骤2:应用文档重排...")
        # 应用奇偶重排算法
        documents = apply_long_context_reorder(documents)
        # 提示重排完成
        print("重排完成,关键文档已移至开头和结尾")
    else:
        # 不应用文档重排
        print("\n步骤2:跳过文档重排")

    # 步骤3:格式化上下文
    print("\n步骤3:格式化上下文...")
    # 格式化文档列表
    context = format_context_for_llm(documents)

    # 返回格式化后的上下文
    return context


# 模拟知识库,包含多条Python相关中文知识
knowledge_base = [
    "Python是一种高级编程语言,具有简洁的语法。",
    "Python支持面向对象编程和函数式编程。",
    "Python的列表、字典、元组是常用的数据结构。",
    "Python的装饰器是高级特性,可以增强函数功能。",
    "Python的性能优化可以通过使用NumPy等库来实现。",
    "Python的最佳实践包括遵循PEP 8编码规范。"
]
# 用户查询内容
query = "Python高级特性"
# 输出不使用文档重排的RAG流程
print("RAG流程测试(不使用文档重排)")
context_without_reorder = rag_pipeline(query, knowledge_base, use_reorder=False)
# 打印部分上下文字符串
print("\n生成的上下文:")
print(context_without_reorder[:500] + "...")
# 输出使用文档重排的RAG流程
print("RAG流程测试(使用文档重排)")
context_with_reorder = rag_pipeline(query, knowledge_base, use_reorder=True)
# 打印部分上下文字符串
print("\n生成的上下文:")
print(context_with_reorder[:500] + "...")

6. 重排效果对比 #

让我们创建一个可视化对比,展示重排前后的差异:

# 导入List类型用于类型注解
from typing import List
# 导入matplotlib库用于绘图
import matplotlib.pyplot as plt

# 导入matplotlib以设置中文显示和负号
import matplotlib
# 设置matplotlib全局字体为黑体,支持中文
matplotlib.rcParams['font.family'] = ['SimHei']
# 设置matplotlib可正常显示负号
matplotlib.rcParams['axes.unicode_minus'] = False

# 定义奇偶重排函数,对文档顺序进行重排
def long_context_reorder(documents):
    """
    使用奇偶重排算法对文档列表进行重排

    参数:
        documents: 已经按相关性从高到低排序的文档列表

    返回:
        重排后的文档列表,最重要的文档在开头和结尾
    """
    # 如果文档数量小于等于1,则无需重排,直接返回
    if len(documents) <= 1:
        return documents

    # 取出所有偶数索引(从0开始)位置的文档(原本相关性高)
    odd_docs = documents[::2]
    # 取出所有奇数索引位置的文档(原本相关性次高)
    even_docs = documents[1::2]
    # 对所有奇数索引位置文档进行反转
    even_docs_reversed = even_docs[::-1]
    # 将偶数索引文档与反转后的奇数索引文档拼接
    reordered_docs = odd_docs + even_docs_reversed
    # 返回重排后的文档列表
    return reordered_docs

# 定义函数,用于可视化文档重排效果
def visualize_reorder_effect(documents: List[str]):
    """
    可视化文档重排的效果

    参数:
        documents: 文档列表(已按相关性排序)
    """
    # 初始化原始重要性得分列表
    original_importance = []
    # 遍历每一个文档索引
    for i in range(len(documents)):
        # 如果是第一个文档(最重要)
        if i == 0:
            importance = 1.0  # 开头最重要
        # 如果是最后一个文档(次重要)
        elif i == len(documents) - 1:
            importance = 0.8  # 结尾次重要
        # 其他文档按照距离中心点递减分配重要性
        else:
            mid_point = len(documents) / 2
            distance_from_mid = abs(i - mid_point)
            max_distance = len(documents) / 2
            importance = 0.3 + 0.2 * (1 - distance_from_mid / max_distance)
        # 将重要性评分添加到列表中
        original_importance.append(importance)

    # 对文档执行奇偶重排,得到新顺序
    reordered_docs = long_context_reorder(documents)

    # 初始化重排后每个文档的重要性
    reordered_importance = []
    # 遍历重排后文档及其新索引
    for i, doc in enumerate(reordered_docs):
        # 找到每个文档在原始列表中的索引
        original_index = documents.index(doc)
        # 新顺序中的第一个文档赋最高重要性
        if i == 0:
            importance = 1.0
        # 新顺序中的最后一个文档赋次高重要性
        elif i == len(reordered_docs) - 1:
            importance = 0.8
        # 其他按距离中心点递减
        else:
            mid_point = len(reordered_docs) / 2
            distance_from_mid = abs(i - mid_point)
            max_distance = len(reordered_docs) / 2
            importance = 0.3 + 0.2 * (1 - distance_from_mid / max_distance)
        # 保存原始索引和重要性
        reordered_importance.append((original_index, importance))

    # 按照文档原始顺序对重排后重要性排序
    reordered_importance.sort(key=lambda x: x[0])
    # 提取排序后的重要性评分
    reordered_importance_values = [imp[1] for imp in reordered_importance]

    # 创建一个新图形,设置尺寸
    plt.figure(figsize=(12, 6))

    # 设置横坐标为文档数量范围
    x = range(len(documents))
    # 设置柱状图宽度
    width = 0.35

    # 绘制重排前的重要性柱状图(红色,微微左移)
    plt.bar([i - width/2 for i in x], original_importance, width,
            label='重排前', alpha=0.7, color='red')
    # 绘制重排后的重要性柱状图(绿色,微微右移)
    plt.bar([i + width/2 for i in x], reordered_importance_values, width,
            label='重排后', alpha=0.7, color='green')

    # 设置x轴标签
    plt.xlabel('文档索引(按相关性排序)')
    # 设置y轴标签
    plt.ylabel('位置重要性(模型关注度)')
    # 设置图表标题
    plt.title('文档重排效果对比:关键文档的位置重要性变化')
    # 展示图例
    plt.legend()
    # 显示网格线,设置透明度
    plt.grid(True, alpha=0.3)
    # 设置x轴刻度标签,显示文档编号
    plt.xticks(x, [f'文档{i+1}' for i in x])

    # 自动调整子图参数,避免标签遮挡
    plt.tight_layout()
    # 保存图像到本地文件
    plt.savefig('reorder_comparison.png', dpi=150)
    # 控制台输出保存提示
    print("对比图已保存为 reorder_comparison.png")
    # 展示绘制好的图表
    plt.show()

# 运行此代码前需确保已安装matplotlib库
# 可用命令: pip install matplotlib

# 构造6个测试文档,名称为文档1~6
documents = [f"文档{i+1}" for i in range(6)]

# 调用函数,可视化重排前后每个文档的重要性分布
visualize_reorder_effect(documents)

7. 最佳实践建议 #

7.1 何时使用文档重排 #

文档重排特别适合以下场景:

  1. 文档数量较多(通常5篇以上):文档少时效果不明显
  2. 文档已按相关性排序:重排算法假设输入已经排序
  3. 关键信息分散:如果所有文档都同等重要,重排意义不大

7.2 实施步骤 #

在实际RAG系统中,建议按以下步骤实施:

# 定义一个文档类,用于存储文档内容和相关性分数
class Document:
    """
    文档类,用于存储文档内容和元数据
    """
    # 初始化方法,传入文档内容和分数
    def __init__(self, content: str, score: float = 0.0):
        # 保存文档内容
        self.content = content
        # 保存相关性分数(越高越相关)
        self.score = score

    # 定义实例的字符串显示方式
    def __repr__(self):
        # 返回自定义的字符串,显示分数和内容前30字符
        return f"Document(score={self.score:.2f}, content='{self.content[:30]}...')"

# 定义检索文档的函数,根据query和知识库生成文档列表
def retrieve_documents(query: str, knowledge_base):
    """
    模拟文档检索过程

    参数:
        query: 用户查询
        knowledge_base: 知识库中的文档列表

    返回:
        检索到的文档列表,按相关性分数排序
    """
    # 初始化文档列表
    documents = []

    # 遍历知识库,对每个文档计算相关性分数
    for i, doc in enumerate(knowledge_base):
        # 如果文档包含查询关键词,则分数较高
        if query.lower() in doc.lower():
            # 相关性分数递减,最相关为0.9,其后逐步降低
            score = 0.9 - i * 0.1
        else:
            # 不相关则分数更低
            score = 0.5 - i * 0.05

        # 创建Document对象并添加到文档列表
        documents.append(Document(doc, score))

    # 对文档按照分数从高到低排序
    documents.sort(key=lambda x: x.score, reverse=True)

    # 返回排序后的文档列表
    return documents

# 定义长上下文的奇偶重排算法
def apply_long_context_reorder(documents):
    """
    对检索到的文档应用奇偶重排算法

    参数:
        documents: 已按相关性排序的文档列表

    返回:
        重排后的文档列表
    """
    # 如果文档数量为0或1,则直接返回无需重排
    if len(documents) <= 1:
        return documents

    # 提取偶数索引(0,2,4...)的文档,属于“奇数位置”
    odd_docs = documents[::2]

    # 提取奇数索引(1,3,5...)的文档,并进行反转
    even_docs = documents[1::2][::-1]

    # 拼接奇数位和反转后的偶数位文档
    return odd_docs + even_docs

# 定义格式化上下文的函数,用于给LLM输入
def format_context_for_llm(documents):
    """
    将文档列表格式化为LLM可以理解的上下文字符串

    参数:
        documents: 文档列表

    返回:
        格式化后的上下文字符串
    """
    # 初始化用于存储每篇文档信息的列表
    context_parts = []

    # 遍历所有文档,并添加编号与内容字符串
    for i, doc in enumerate(documents, 1):
        # 采用编号+分数+内容的格式加入列表
        context_parts.append(f"文档{i}(相关性分数:{doc.score:.2f}):\n{doc.content}\n")

    # 通过三个换行符连接所有文档组成总上下文
    return "\n\n\n".join(context_parts)

# 定义完整的RAG(检索增强生成)工作流
def complete_rag_workflow(query: str, knowledge_base):
    """
    完整的RAG工作流,包含所有优化步骤

    参数:
        query: 用户查询
        knowledge_base: 知识库

    返回:
        包含所有步骤结果的字典
    """
    # 步骤1:基础检索(使用嵌入模型)
    print("【步骤1】使用嵌入模型进行初步检索...")
    # 检索相关文档
    retrieved_docs = retrieve_documents(query, knowledge_base)
    print(f"   检索到 {len(retrieved_docs)} 篇文档")

    # 步骤2:精细排序(此处可为可选/模拟)
    print("\n【步骤2】对检索结果进行精细排序...")
    # 按相关性分数重新排序
    sorted_docs = sorted(retrieved_docs, key=lambda x: x.score, reverse=True)
    print(f"   排序完成,最高相关性分数: {sorted_docs[0].score:.2f}")

    # 步骤3:应用文档重排(对抗Lost-in-the-Middle问题)
    print("\n【步骤3】应用文档重排策略...")
    # 文档数量大于1则做重排
    if len(sorted_docs) > 1:
        # 调用奇偶重排函数
        reordered_docs = apply_long_context_reorder(sorted_docs)
        print(f"   重排完成,关键文档已优化位置")
    else:
        # 少量文档不重排
        reordered_docs = sorted_docs
        print(f"   文档数量较少,跳过重排")

    # 步骤4:格式化上下文并返回
    print("\n【步骤4】格式化上下文...")
    # 生成用于LLM的上下文字符串
    context = format_context_for_llm(reordered_docs)

    # 返回各步骤结果
    return {
        "retrieved_count": len(retrieved_docs),
        "top_score": sorted_docs[0].score if sorted_docs else 0.0,
        "reordered": len(reordered_docs) > 1,
        "context": context,
        "documents": reordered_docs
    }


# 构造知识库列表
knowledge_base = [
    "Python基础语法介绍",
    "Python数据结构详解",
    "Python高级特性:装饰器、生成器、上下文管理器",
    "Python性能优化技巧",
    "Python最佳实践和编码规范"
]
# 用户输入的检索查询
query = "Python高级特性"
# 执行完整的RAG流程
result = complete_rag_workflow(query, knowledge_base)
# 打印分割线
print("\n" + "=" * 60)
# 打印最终结果摘要
print("最终结果摘要")
print("=" * 60)
# 打印检索文档数
print(f"检索文档数: {result['retrieved_count']}")
# 打印最高相关性分数
print(f"最高相关性: {result['top_score']:.2f}")
# 打印是否进行了重排
print(f"是否重排: {'是' if result['reordered'] else '否'}")
# 打印上下文的前200字符预览
print(f"\n上下文预览(前200字符):\n{result['context'][:200]}...")

7.3 注意事项 #

  1. 不要过度重排:如果文档已经很少(1-3篇),重排意义不大
  2. 保持相关性排序:重排前确保文档已按相关性排序
  3. 测试效果:在实际应用中,通过A/B测试验证重排是否真的提升了效果
  4. 结合其他优化:文档重排只是优化手段之一,可以结合其他技术(如提示词优化、模型选择等)
← 上一节 logger 下一节 lxml →

访问验证

请输入访问令牌

Token不正确,请重新输入