53(下) LlamaIndex中的可组合对象(Composable Objects)的作用和工作原理

LlamaIndex中的可组合对象(Composable Objects)是一种强大的工具,它允许用户将多个对象组合成一个顶级的索引,从而实现更复杂和灵活的查询和检索功能。以下是可组合对象的作用和具体工作原理:

作用

  1. 灵活组合:可组合对象允许用户将不同的查询引擎、检索器、查询管道或其他节点组合在一起,形成一个统一的顶级索引。
  2. 增强检索能力:通过组合不同的检索器(如向量检索器和BM25检索器),可以提高检索的准确性和多样性。
  3. 简化查询流程:用户可以通过一个顶级的索引对象来管理和查询多个子对象,简化了查询流程。

具体工作原理

1. 创建IndexNode对象

首先,用户需要创建IndexNode对象,每个对象的obj字段可以指向以下内容:

  • 查询引擎
  • 检索器
  • 查询管道
  • 另一个节点!
object = IndexNode(index_id="my_object", obj=query_engine, text="some text about this object")
2. 数据准备

用户需要准备数据,包括安装必要的库和下载示例数据:

%pip install llama-index-storage-docstore-mongodb
%pip install llama-index-vector-stores-qdrant
%pip install llama-index-storage-docstore-firestore
%pip install llama-index-retrievers-bm25
%pip install llama-index-storage-docstore-redis
%pip install llama-index-storage-docstore-dynamodb
%pip install llama-index-readers-file pymupdf
!wget --user-agent "Mozilla" "https://arxiv.org/pdf/2307.09288.pdf" -O "./llama2.pdf"
!wget --user-agent "Mozilla" "https://arxiv.org/pdf/1706.03762.pdf" -O "./attention.pdf"
3. 检索器设置

设置OpenAI API密钥并加载文档:

import os
os.environ["OPENAI_API_KEY"] = "sk-..."
from llama_index.core.node_parser import TokenTextSplitter
from llama_index.readers.file import PyMuPDFReader

llama2_docs = PyMuPDFReader().load_data(file_path="./llama2.pdf", metadata=True)
attention_docs = PyMuPDFReader().load_data(file_path="./attention.pdf", metadata=True)

nodes = TokenTextSplitter(chunk_size=1024, chunk_overlap=128).get_nodes_from_documents(llama2_docs + attention_docs)
4. 文档存储设置

使用SimpleDocumentStore存储节点:

from llama_index.core.storage.docstore import SimpleDocumentStore

docstore = SimpleDocumentStore()
docstore.add_documents(nodes)
5. 向量存储和检索器设置

使用QdrantVectorStore和BM25Retriever:

from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.retrievers.bm25 import BM25Retriever
from llama_index.vector_stores.qdrant import QdrantVectorStore
from qdrant_client import QdrantClient

client = QdrantClient(path="./qdrant_data")
vector_store = QdrantVectorStore("composable", client=client)
storage_context = StorageContext.from_defaults(vector_store=vector_store)

index = VectorStoreIndex(nodes=nodes)
vector_retriever = index.as_retriever(similarity_top_k=2)
bm25_retriever = BM25Retriever.from_defaults(docstore=docstore, similarity_top_k=2)
6. 组合对象

创建IndexNode对象并设置SummaryIndex:

from llama_index.core.schema import IndexNode

vector_obj = IndexNode(index_id="vector", obj=vector_retriever, text="Vector Retriever")
bm25_obj = IndexNode(index_id="bm25", obj=bm25_retriever, text="BM25 Retriever")

from llama_index.core import SummaryIndex

summary_index = SummaryIndex(objects=[vector_obj, bm25_obj])
7. 查询

使用tree_summarize模式进行查询,确保并发执行和快速响应:

query_engine = summary_index.as_query_engine(response_mode="tree_summarize", verbose=True)

response = await query_engine.aquery("How does attention work in transformers?")
print(str(response))

response = await query_engine.aquery("What is the architecture of Llama2 based on?")
print(str(response))

response = await query_engine.aquery("What was used before attention in transformers?")
print(str(response))
8. 保存和加载

由于对象不是可序列化的,保存和加载时需要在加载时提供它们:

保存
docstore.persist("./docstore.json")
加载
from llama_index.core.storage.docstore import SimpleDocumentStore
from llama_index.vector_stores.qdrant import QdrantVectorStore
from qdrant_client import QdrantClient

docstore = SimpleDocumentStore.from_persist_path("./docstore.json")

client = QdrantClient(path="./qdrant_data")
vector_store = QdrantVectorStore("composable", client=client)
index = VectorStoreIndex.from_vector_store(vector_store)
vector_retriever = index.as_retriever(similarity_top_k=2)
bm25_retriever = BM25Retriever.from_defaults(docstore=docstore, similarity_top_k=2)

from llama_index.core.schema import IndexNode

vector_obj = IndexNode(index_id="vector", obj=vector_retriever, text="Vector Retriever")
bm25_obj = IndexNode(index_id="bm25", obj=bm25_retriever, text="BM25 Retriever")

from llama_index.core import SummaryIndex

summary_index = SummaryIndex(objects=[vector_obj, bm25_obj])

通过这种方式,LlamaIndex中的可组合对象提供了一种强大的工具,用于构建和查询知识库,从而提高检索结果的准确性和相关性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要重新演唱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值