llama_index [问题]:VectorStoreIndex中存储了哪些信息?我在哪里可以查看这些信息?为什么print(index.index_struct)只显示index_id?

ttisahbt  于 2个月前  发布在  其他
关注(0)|答案(3)|浏览(31)

问题验证

  • 我已在文档和Discord中寻找答案。

问题

from weaviate.classes.config import Configure, Property, DataType
import time
import weaviate
import chromadb
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.vector_stores.weaviate import WeaviateVectorStore
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.ingestion import IngestionPipeline
from llama_index.readers.file import PyMuPDFReader
from llama_index.core import Settings
from llama_index.core import StorageContext
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core.postprocessor import SentenceTransformerRerank
from llama_index.core.retrievers import QueryFusionRetriever
from llama_index.retrievers.bm25 import BM25Retriever
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.chat_engine import CondenseQuestionChatEngine
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from dotenv import load_dotenv, find_dotenv

# 加载环境变量
_ = load_dotenv(find_dotenv())
import nest_asyncio
nest_asyncio.apply() # 只在Jupyter笔记环境中需要此操作,否则会报错

# 连接到local,需要启动docker
weaviate_client = weaviate.connect_to_local(host="localhost", port=8080, grpc_port=50051, skip_init_checks=True)
# weaviate_client = weaviate.connect_to_local(host="localhost", port=8080, grpc_port=50051)
# 指定全局llm与embedding模型
Settings.llm = OpenAI(temperature=0, model="gpt-4o")
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small", dimensions=512)
# Settings.embed_model = HuggingFaceEmbedding(model_name=r"C:\Users\79033\.cache\huggingface\hub\models--BAAI--bge-m3\snapshots\5617a9f61b028005a4858fdac845db406aefb181", )

splitter = SentenceSplitter(chunk_size=512, chunk_overlap=100)

# 加载 pdf 文档
documents = SimpleDirectoryReader("./data1", file_extractor={".pdf": PyMuPDFReader()}).load_data()

# 切分nodes
nodes = splitter.get_nodes_from_documents(documents)

# 创建 Vector Store
# vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
vector_store = WeaviateVectorStore(weaviate_client=weaviate_client, index_name="LlamaIndex1")
# 指定 Vector Store 用于 index
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex(
    nodes, storage_context=storage_context
)
print(index.index_struct)

query_engine = index.as_query_engine()
while True:
    question = input("User:")
    if question.strip() == "":
        break
    start_time = time.time()
    response = query_engine.query(question)
    for node in response.source_nodes:
        print(f"Text: {node.node.text}")
        print(f"Score: {node.score}")
        print(f"Metadata: {node.node.metadata}")
        print("---")
    end_time = time.time()
    print(end_time-start_time)
    print(f"AI: {response}")
nwlqm0z1

nwlqm0z11#

VectorStoreIndex 存储输入文本块的嵌入表示以及诸如文档ID和节点ID等元数据。可以通过查询索引或直接检查底层向量存储来查看此信息。
命令 print(index.index_struct) 仅输出 index_id ,因为 index_struct 是索引结构的最小表示形式,主要用于识别目的。详细嵌入和其他存储信息由向量存储后端管理,不直接通过 index_struct 暴露。
要查看详细信息,通常会直接与向量存储交互,或使用 VectorStoreIndex 提供的查询功能。
查询索引的示例:

query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)

此外, index_struct 不仅包含 index_id 。它还包括一个将节点IDMap到其相应嵌入的 nodes_dict Map,一个将文档IDMap到其关联节点ID的 doc_id_dict Map,以及一个存储实际嵌入的 embeddings_dict 。然而,默认情况下,这些详细信息不会通过 print(index.index_struct) 打印。
以下是结构示例:

{
  "index_struct": {
    "__type__": "simple_dict",
    "__data__": {
      "index_id": "9343c0c6-8313-4549-a423-1348960b6958",
      "summary": null,
      "nodes_dict": {
        "ddb890e7-82d5-4dc5-a950-b498c3ef2494": "ddb890e7-82d5-4dc5-a950-b498c3ef2494",
        "5a03268d-b654-48a4-b3ea-b9620a5ec614": "5a03268d-b654-48a4-b3ea-b9620a5ec614",
        "8d29350a-a932-4665-b436-a810e66def48": "8d29350a-a932-4665-b436-a810e66def48",
        "6b151549-3bcc-4e11-a181-c1ac4dd34c8a": "6b151549-3bcc-4e11-a181-c1ac4dd34c8a",
        "e2ac2af1-b59f-4c83-b365-f0205ba1f732": "e2ac2af1-b59f-4c83-b365-f0205ba1f732",
        "307b2feb-5b0a-4b86-aec7-994074c94d29": "307b2feb-5b0a-4b86-aec7-994074c94d29"
      },
      "doc_id_dict": {
        "707af1fd-62af-4693-93e1-01433b900aca": [
          "ddb890e7-82d5-4dc5-a950-b498c3ef2494",
          "5a03268d-b654-48a4-b3ea-b9620a5ec614",
          "8d29350a-a932-4665-b436-a810e66def48",
          "6b151549-3bcc-4e11-a181-c1ac4dd34c8a",
          "e2ac2af1-b59f-4c83-b365-f0205ba1f732",
          "307b2feb-5b0a-4b86-aec7-994074c94d29"
        ]
      },
      "embeddings_dict": {}
    }
  }
}

LlamaIndex框架中的 VectorStoreIndex 类旨在与现有的向量存储一起工作,并包括用于嵌入节点、将节点添加到索引以及查询索引的方法。有关节点及其嵌入的详细信息由向量存储管理,可以通过向量存储的API或使用提供的查询方法 1(https://github.com/run-llama/llama_index/blob/main/docs/docs/community/integrations/vector_stores.md)2(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/vector_stores/index_simple.json)3(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/indices/vector_store/base.py) 访问。

  • 要继续与 Dosu 对话,请提及 @dosu。*
cidc1ykv

cidc1ykv2#

存储分为结构化存储、文档存储和向量存储。这些都包含在存储上下文中。
如果你使用向量数据库集成,只使用向量存储(所有内容都放在里面)以简化存储。

u59ebvdq

u59ebvdq3#

通过向量存储,如果我想要使用index.delete_nodes()方法删除一些特定的节点,我该如何获取相应的节点id?希望你能再次帮助我解答这个问题。

相关问题