微信扫码
与创始人交个朋友
我要投稿
自动合并检索使用父子结构来强化召回。
• 将文件分割成大块(父块)
• 然后讲大块分割成小块(子块)
• 匹配的时候仍然使用基本的RAG策略匹配子块
• 然后根据一定策略判断是否把父块召回,一般是根据子块匹配的数量占比
• 同时也可能丢弃部分子块(子块的兄弟节点被匹配到较少)
文件拆分如下,一般三层就够了,当然也可以多级拆分,多级拆分的话上层文件快的大小会变得比较大。
下图展示了召回的过程:
下面展示下程序怎么实现自动合并检索 RAG。
读取文档就不赘述了,前面文章演示过很多次,把文档合并起来。
from llama_index import Document
document = Document(text="\n\n".join([doc.text for doc in documents]))
使用 HierarchicalNodeParser
这个节点解析器,把文档解析成父子层次结构, 指定Chunk 的大小分别是 2048
、512
和 128
,就像我们前面图示的那样。
from llama_index.node_parser import HierarchicalNodeParser
# create the hierarchical node parser w/ default settings
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)
使用 OpenAI 作为 LLM 检索,
from llama_index.llms import OpenAI
llm = OpenAI(model="gpt-3.5-turbo", temperature=0.1)
使用本地模型来嵌入:
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:人工智能中的网络至关重要,
因为它允许个人建立一个强大的专业社区,
可以提供有价值的信息、支持和机会。
通过与该领域的其他人建立联系,
个人可以获得指导、建议和潜在的雇主推荐。
此外,网络有助于识别专业知识、
鼓励持续发展并培养人工智能社区内的归属感。
我们构建两个应用进行评估,
app_0
把文件切分成两层,块大小分别是 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",
save_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,
)
app_1
把文件切分成三层,块大小分别是 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",
save_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 ---
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-05-28
2024-04-26
2024-08-21
2024-08-13
2024-04-11
2024-07-09
2024-07-18
2024-10-25
2024-07-01
2024-06-16