返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

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

[复制链接]
链载Ai 显示全部楼层 发表于 半小时前 |阅读模式 打印 上一主题 下一主题

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 20px;font-weight: bold;display: table;margin: 2em auto 1.5em;padding-top: 6px;padding-bottom: 6px;padding-left: 16.7472px;background-image: linear-gradient(135deg, rgb(113, 23, 234), rgba(113, 23, 234, 0.667), rgba(234, 96, 96, 0.533), rgba(217, 57, 205, 0.267), rgba(217, 57, 205, 0));background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;color: rgb(255, 255, 255);border-radius: 8px;width: 318.246px;">概念

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;margin: 1em 8px;letter-spacing: 0.1em;color: rgb(33, 37, 41);padding: 8px 12px;background: rgba(237, 242, 255, 0.8);border-radius: 8px;">自动合并检索使用父子结构来强化召回。

    ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin-left: 8px;padding-left: 1em;list-style: circle;color: rgb(63, 63, 63);" class="list-paddingleft-1">
  • •将文件分割成大块(父块

  • •然后讲大块分割成小块(子块

  • •匹配的时候仍然使用基本的RAG策略匹配子块

  • •然后根据一定策略判断是否把父块召回,一般是根据子块匹配的数量占比

    • ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin-left: 8px;padding-left: 1em;list-style-position: initial;list-style-image: initial;" class="list-paddingleft-1">
    • •同时也可能丢弃部分子块(子块的兄弟节点被匹配到较少)

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;margin: 1em 8px;letter-spacing: 0.1em;color: rgb(33, 37, 41);padding: 8px 12px;background: rgba(237, 242, 255, 0.8);border-radius: 8px;">文件拆分如下,一般三层就够了,当然也可以多级拆分,多级拆分的话上层文件快的大小会变得比较大。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;color: rgb(63, 63, 63);">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;border-radius: 8px;display: block;margin: 0.1em auto 0.5em;border-width: 0px;border-style: solid;border-color: initial;height: auto !important;" title="null" src="https://api.ibos.cn/v4/weapparticle/accesswximg?aid=83085&url=aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9hZzdaM2RDcTdMbXI0REk0MGNMaDZUeW5OelpoZ2NqejRJdHFTMmljeUI1MXB1ZzYxTXBTUlNzcVJiVk1weTByRFdMN1U4QmMwcnNoeDczelRydkRYc1EvNjQwP3d4X2ZtdD1wbmcmYW1w;from=appmsg"/>

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;margin: 1em 8px;letter-spacing: 0.1em;color: rgb(33, 37, 41);padding: 8px 12px;background: rgba(237, 242, 255, 0.8);border-radius: 8px;">下图展示了召回的过程:

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;color: rgb(63, 63, 63);">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;border-radius: 8px;display: block;margin: 0.1em auto 0.5em;border-width: 0px;border-style: solid;border-color: initial;height: auto !important;" title="null" src="https://api.ibos.cn/v4/weapparticle/accesswximg?aid=83085&url=aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9hZzdaM2RDcTdMbXI0REk0MGNMaDZUeW5OelpoZ2NqelFnVG0xaWNERGF6eFBaZVdpY29YbUNQdkJLTVQzdUt3UU1QdjFQREljSkRxbk04bWlhRnpMNnVSUS82NDA/d3hfZm10PXBuZyZhbXA=;from=appmsg"/>

程序实现

下面展示下程序怎么实现自动合并检索 RAG。

读取合并文档

读取文档就不赘述了,前面文章演示过很多次,把文档合并起来。

fromllama_indeximportDocument

document=Document(text="\n\n".join([doc.textfordocindocuments]))

使用HierarchicalNodeParser这个节点解析器,把文档解析成父子层次结构, 指定Chunk 的大小分别是2048512128,就像我们前面图示的那样。

fromllama_index.node_parserimportHierarchicalNodeParser

#createthehierarchicalnodeparserw/defaultsettings
node_parser=HierarchicalNodeParser.from_defaults(
chunk_sizes=[2048,512,128]
)

平时开发测试的时候,可以通过get_leaf_nodes来查看子节点:

fromllama_index.node_parserimportget_leaf_nodes

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

构建索引

使用 OpenAI 作为 LLM 检索,

fromllama_index.llmsimportOpenAI

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

使用本地模型来嵌入:

fromllama_indeximportServiceContext

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

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

fromllama_indeximportVectorStoreIndex,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来实现:

fromllama_index.indices.postprocessorimportSentenceTransformerRerank
fromllama_index.retrieversimportAutoMergingRetriever
fromllama_index.query_engineimportRetrieverQueryEngine

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]
)

执行查询并打印结果:

fromllama_index.response.notebook_utilsimportdisplay_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 ---


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ