CH3_03_llamaindex_vector

1198 字
6 分钟
CH3_03_llamaindex_vector

1. LlamaIndex 示例#

from llama_index.core import VectorStoreIndex, Document, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
  • llama_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 StorageContext
from 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.jsondefault__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
作者
HAC
发布于
2026-06-28
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
HAC
观之非易,行且克难
Greetings
欢迎来到我的博客!这里主要分享我的学习笔记与兴趣爱好。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
32
分类
5
标签
13
总字数
79,889
运行时长
0
最后活动
0 天前

文章目录