首页 > 教程攻略 > ai资讯 >《构建和评估高级RAG》: 自动合并检索(AMR)

《构建和评估高级RAG》: 自动合并检索(AMR)

来源:互联网 时间:2026-08-11 17:00:17

概念

自动合并检索的核心思路其实很直观,它利用了

父子结构

来强化召回效果。说直白点,就是把文件拆分成不同粒度,再根据子块的匹配情况决定是否拉回父块,这样既能保证细粒度的精准检索,又能保留上下文的完整性。

《构建和评估高级RAG》: 自动合并检索(AMR)

  • 将文件分割成大块,也就是

    父块

  • 然后把大块再细分成小块,即

    子块

  • 匹配时仍采用基本RAG策略,先

    匹配子块

  • 根据子块匹配的数量占比等策略,判断是否

    召回父块

    ——同时可能会丢弃那些匹配度较低的兄弟子块。

文件一般拆分成三层就够用了,当然也可以继续往下拆,但越往上父块越大,得权衡一下。下图展示了这个召回过程:

程序实现

下面具体看看怎么用代码实现自动合并检索 RAG。

读取合并文档

读取文档这部分之前已经演示过很多次了,这里直接合并成一个 Document 对象:

from llama_index import Document

document = Document(text="
".join([doc.text for doc in documents]))

然后用 HierarchicalNodeParser 把文档解析成父子层次结构。这里指定 chunk 大小分别为 2048512128,正好对应前面图示的三层:

from llama_index.node_parser import HierarchicalNodeParser

node_parser = HierarchicalNodeParser.from_defaults(
    chunk_sizes=[2048, 512, 128]
)

平时开发测试时,可以用 get_leaf_nodes 查看叶子节点(最小子块):

from llama_index.node_parser import get_leaf_nodes

nodes = node_parser.get_nodes_from_documents([document])
leaf_nodes = get_leaf_nodes(nodes)

构建索引

LLM 使用 OpenAI 的 GPT-3.5-turbo:

from llama_index.llms import OpenAI

llm = OpenAI(model="gpt-3.5-turbo", temperature=0.1)

嵌入模型则用本地的 BAAI/bge-small-en-v1.5:

from llama_index import ServiceContext

auto_merging_context = ServiceContext.from_defaults(
    llm=llm,
    embed_model="local:BAAI/bge-small-en-v1.5",
    node_parser=node_parser,
)

构建 Index 并设置本地持久化:

from llama_index import VectorStoreIndex, StorageContext

storage_context = StorageContext.from_defaults()
storage_context.docstore.add_documents(nodes)

automerging_index = VectorStoreIndex(
    leaf_nodes, storage_context=storage_context, service_context=auto_merging_context
)

automerging_index.storage_context.persist(persist_dir="./merging_index")

检索器

定义检索器来执行查询。LlamaIndex 提供了高级检索器 AutoMergingRetriever,可以直接拿来用:

from llama_index.indices.postprocessor import SentenceTransformerRerank
from llama_index.retrievers import AutoMergingRetriever
from llama_index.query_engine import RetrieverQueryEngine

automerging_retriever = automerging_index.as_retriever(
    similarity_top_k=12
)

retriever = AutoMergingRetriever(
    automerging_retriever, 
    automerging_index.storage_context, 
    verbose=True
)

rerank = SentenceTransformerRerank(top_n=6, model="BAAI/bge-reranker-base")

auto_merging_engine = RetrieverQueryEngine.from_args(
    automerging_retriever, node_postprocessors=[rerank]
)

执行查询并打印结果:

from llama_index.response.notebook_utils import display_response

auto_merging_response = auto_merging_engine.query(
    "网络在人工智能中的重要性是什么?"
)
display_response(auto_merging_response)

输出如下:

Final Response:人工智能中的网络至关重要,
因为它允许个人建立一个强大的专业社区,
可以提供有价值的信息、支持和机会。
通过与该领域的其他人建立联系,
个人可以获得指导、建议和潜在的雇主推荐。
此外,网络有助于识别专业知识、
鼓励持续发展并培养人工智能社区内的归属感。

评估

接下来构建两个应用来做对比评估。App0 把文件切成两层,块大小分别 2048 和 512:

auto_merging_index_0 = build_automerging_index(
    documents,
    llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1),
    embed_model="local:BAAI/bge-small-en-v1.5",
    sa ve_dir="merging_index_0",
    chunk_sizes=[2048,512],
)
auto_merging_engine_0 = get_automerging_query_engine(
    auto_merging_index_0,
    similarity_top_k=12,
    rerank_top_n=6,
)

App1 则切成三层,块大小分别是 2048、512 和 128:

auto_merging_index_1 = build_automerging_index(
    documents,
    llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1),
    embed_model="local:BAAI/bge-small-en-v1.5",
    sa ve_dir="merging_index_1",
    chunk_sizes=[2048,512,128],
)
auto_merging_engine_1 = get_automerging_query_engine(
    auto_merging_index_1,
    similarity_top_k=12,
    rerank_top_n=6,
)

然后执行评估,并通过 Dashboard 查看结果。可以看到 App1 的

忠实性

(通常解释为事实性)明显更高:

--- END ---