CH3_03_llamaindex_vector
1198 字
6 分钟
CH3_03_llamaindex_vector
1. LlamaIndex 示例
from llama_index.core import VectorStoreIndex, Document, Settingsfrom llama_index.embeddings.huggingface import HuggingFaceEmbeddingllama_index.core:这是 LlamaIndex 的核心基础包,这里我们导入了三个核心组件:VectorStoreIndex:向量索引类。它是 LlamaIndex 的入口核心,接收文档 → 自动调用嵌入模型转向量 → 构建可检索的索引。类似 LangChain 的FAISS.from_documents();Document:文档数据类。与 LangChain 的Document类似,封装文本内容和元数据。注意这里用法是Document(text=t),而 LangChain 是Document(page_content=t);Settings:全局配置对象。用来设置整个 LlamaIndex 的共享配置,比如嵌入模型、LLM、分块大小等。一次设置,全局生效。
llama_index.embeddings.huggingface:Hugging Face 嵌入模型的集成包:HuggingFaceEmbedding:将 Hugging Face 上的 Embedding 模型封装成 LlamaIndex 统一的嵌入接口。用法与 LangChain 版的HuggingFaceEmbeddings类似,只需指定model_name.
# 1. 配置全局嵌入模型Settings.embed_model = HuggingFaceEmbedding("BAAI/bge-small-zh-v1.5")# 2. 创建示例文档texts = [ "张三是法外狂徒", "LlamaIndex是一个用于构建和查询私有或领域特定数据的框架。", "它提供了数据连接、索引和查询接口等工具。"]docs = [Document(text=t) for t in texts]# 3. 创建索引并持久化到本地index = VectorStoreIndex.from_documents(docs)persist_path = "./llamaindex_index_store"index.storage_context.persist(persist_dir=persist_path)print(f"LlamaIndex 索引已保存至: {persist_path}")LlamaIndex 默认会将数据存储为透明可读的 JSON 格式,运行上述代码会创建以下文件:
1.1 文件总览
llamaindex_index_store/├── default__vector_store.json (35 KB) ← 核心:向量数据├── docstore.json (3.7 KB) ← 文档原文├── index_store.json (499 B) ← 索引元信息├── graph_store.json (18 B) ← 图关系(空)└── image__vector_store.json (72 B) ← 图片向量(空)1.2 逐文件分析
1️⃣ docstore.json — 文档原文存储 ⭐️ 最直观
这是我们输入的 3 段原始文本:
| Node ID | 文档内容 |
|---|---|
fd58b5... | 张三是法外狂徒 |
ee8dc7... | LlamaIndex是一个用于构建和查询私有或特定数据的框架。 |
62bfb2... | 它提供数据连接、索引和查询接口等工具。 |
除了文本,它还记录每个文档的 doc_hash(哈希值校验)和 ref_doc_id(父子文档关系)。
2️⃣ default__vector_store.json — 向量存储 ⭐️ 核心
存储了 3 个节点的嵌入向量,每个向量:
| 属性 | 值 |
|---|---|
| 维度 | 512 维(由 bge-small-zh-v1.5 模型决定) |
| 数据类型 | 浮点数数组 |
| 节点数 | 3 个(三句话各一个) |
例如第一句”张三是法外狂徒”的向量前 5 个值:
[-0.0185, -0.0261, -0.0099, -0.0121, -0.0539, ...]3️⃣ index_store.json — 索引元信息
记录索引的结构信息:
{ "index_id": "5edfdf61-...", "nodes_dict": { "fd58b5...": "fd58b5...", // 节点 ID → 自身 "ee8dc7...": "ee8dc7...", "62bfb2...": "62bfb2..." }}作用是把向量存储和文档存储关联起来。
4️⃣ graph_store.json — 图关系存储(空)
{"graph_dict": {}}因为本示例没有使用知识图谱功能,所以为空。
5️⃣ image__vector_store.json — 图片向量存储(空)
{"embedding_dict": {}, "text_id_to_ref_doc_id": {}, "metadata_dict": {}}因为没有处理图片,所以为空。
1.3 完整数据流转示意图
你输入的3段文本 LlamaIndex 的持久化┌─────────────────────┐│ "张三是法外狂徒" │ ──→ docstore.json (原始文本)├─────────────────────┤│ "LlamaIndex是..." │ ──→ default__vector_store.json (512维向量)├─────────────────────┤│ "它提供数据连接..." │ ──→ index_store.json (关联映射)└─────────────────────┘对比 FAISS(上一节):FAISS 用 Pickle 二进制保存(不可读、有安全风险),而 LlamaIndex 用纯 JSON,你可以直接用文本编辑器打开查看,安全且透明。
2. 实现对 LlamaIndex 存储数据的加载和相似性搜索
# 1. 配置全局嵌入模型Settings.embed_model = HuggingFaceEmbedding("BAAI/bge-small-zh-v1.5")首先我们需要重新设置嵌入模型。虽然我们在前面介绍 Settings 时提到这是一个全局配置,但它只存在于 当前运行的 Python 进程中,不会随 JSON 文件一起持久化。
from llama_index.core import StorageContextfrom llama_index.core import load_index_from_storage
# 2. 加载存储上下文storage_context = StorageContext.from_defaults(persist_dir=persist_path)
# 3. 从存储上下文加载索引loaded_vector_store = load_index_from_storage(storage_context)StorageContext:存储上下文类,相当于统一管理 5 个 JSON 文件的”总管”。它知道你的docstore.json、default__vector_store.json等文件在哪,负责读取和恢复这些数据。可以理解为”打开仓库大门的钥匙”;load_index_from_storage:从存储恢复索引的函数,接收StorageContext,把 JSON 文件中的数据”还原”成一个可用的VectorStoreIndex对象。
# 4. 执行相似度搜索retriever = loaded_vector_store.as_retriever(similarity_top_k=2) # 设置返回相似度最高的前2条结果query = "什么是LlamaIndex?"
nodes = retriever.retrieve(query)as_retriever:转化为检索器,将loaded_vector_store索引转化为检索器模式,等待接收查询语句,返回值类型为VectorIndexRetriever;retrieve:执行检索,返回值为List[NodeWithScore]:- 每个元素包含
.text(匹配文本)和.score(相似度分数); - 作用是把查询语句用嵌入模型转成向量 → 去向量库中做相似度匹配 → 返回最相似的文档节点。
- 每个元素包含
print(f"\n查询: '{query}'")print("相似度最高的文档:")for doc in nodes: print(f"- {doc.get_text()}")文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
CH3_03_llamaindex_vector
https://datawhalechina.github.io/all-in-rag/#/chapter1/03_get_start_rag 相关文章 智能推荐
1
CH3_04_multi_milvus
all-in-rag 使用 Milvus 进行多模态检索
2
CH3_02_langchain_faiss
all-in-rag 使用 LangChain 和 FAISS 完成一个完整的“创建 -> 保存 -> 加载 -> 查询”流程
3
CH3_01_bge_visualized
all-in-rag 常用多模态嵌入模型,以 bge-visualized-m3 为例
4
CH2_02_character_splitter
all-in-rag LangChain 中文本分割器的几种核心策略
5
CH2_01_unstructured_example
all-in-rag 如何直接使用 Unstructured 库的示例
随机文章 随机推荐