Skip to content
LlamaIndex 文档版本 跟随上游 源快照 664d099f 更新于 2026-10-18

本 notebook 将演示如何使用 ObjectBox 作为 LlamaIndex 的高效设备端向量存储。我们将考虑一个简单的 RAG 用例:给定文档,用户可以提问并从 LLM 获得自然语言的相关答案。RAG 流水线将按照以下纵向组件进行配置:

1) 安装依赖项

我们安装 HuggingFace 和 Gemini 的集成,以便与 LlamaIndex 一起使用

!pip install llama_index_vector_stores_objectbox --quiet
!pip install llama-index --quiet
!pip install llama-index-embeddings-huggingface --quiet
!pip install llama-index-llms-gemini --quiet
[?25l   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/1.6 MB ? eta -:--:--

[2K [91m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m[90m╺[0m[90m━━[0m [32m1.5/1.6 MB[0m [31m40.2 MB/s[0m eta [36m0:00:01[0m [2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m1.6/1.6 MB[0m [31m25.4 MB/s[0m eta [36m0:00:00[0m [2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m4.0/4.0 MB[0m [31m44.0 MB/s[0m eta [36m0:00:00[0m [2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m1.5/1.5 MB[0m [31m38.9 MB/s[0m eta [36m0:00:00[0m [2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m1.1/1.1 MB[0m [31m37.5 MB/s[0m eta [36m0:00:00[0m [2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m76.4/76.4 kB[0m [31m5.2 MB/s[0m eta [36m0:00:00[0m [2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m77.9/77.9 kB[0m [31m4.9 MB/s[0m eta [36m0:00:00[0m [2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m49.3/49.3 kB[0m [31m3.1 MB/s[0m eta [36m0:00:00[0m [2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m58.3/58.3 kB[0m [31m3.4 MB/s[0m eta [36m0:00:00[0m [?25h

2) 下载文档

!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'

3) 为 RAG 设置 LLM(Gemini)

我们使用 Google Gemini 的云端 API 作为 LLM。你可以从控制台获取 API 密钥。

from llama_index.llms.gemini import Gemini
import getpass

gemini_key_api = getpass.getpass("Gemini API Key: ")
gemini_llm = Gemini(api_key=gemini_key_api)

4) 为 RAG 设置嵌入模型(HuggingFace bge-small-en-v1.5)

HuggingFace 托管了多种嵌入模型,可从 MTEB 排行榜查看。

from llama_index.embeddings.huggingface import HuggingFaceEmbedding

hf_embedding = HuggingFaceEmbedding(model_name="BAAI/bge-base-en-v1.5")
embedding_dim = 384

5) 准备文档和节点

在 RAG 流水线中,第一步是读取给定文档。我们使用 SimpleDirectoryReader,它通过检查目录中的文件扩展名来选择最佳的文件读取器。

接下来,我们从 SimpleDirectoryReader 读取的文档内容中生成分块(文本子序列)。SentenceSplitter 是一种文本分割器,它在将文本分割成大小为 chunk_size 的分块时保留句子边界。

from llama_index.core import SimpleDirectoryReader
from llama_index.core.node_parser import SentenceSplitter

reader = SimpleDirectoryReader("./data/paul_graham")
documents = reader.load_data()

node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=20)
nodes = node_parser.get_nodes_from_documents(documents)

6) 配置 ObjectBoxVectorStore

ObjectBoxVectorStore 可以使用多个选项进行初始化:

  • embedding_dim(必需):向量数据库将保存的嵌入维度
  • distance_type:从 COSINE、DOT_PRODUCT、DOT_PRODUCT_NON_NORMALIZED 和 EUCLIDEAN 中选择
  • db_directory:应在其中创建 .mdb ObjectBox 数据库文件的目录路径
  • clear_db:如果 db_directory 上存在现有数据库文件,则将其删除
  • do_log:启用 ObjectBox 集成的日志记录
from llama_index.vector_stores.objectbox import ObjectBoxVectorStore
from llama_index.core import StorageContext, VectorStoreIndex, Settings
from objectbox import VectorDistanceType

vector_store = ObjectBoxVectorStore(
    embedding_dim,
    distance_type=VectorDistanceType.COSINE,
    db_directory="obx_data",
    clear_db=False,
    do_log=True,
)

storage_context = StorageContext.from_defaults(vector_store=vector_store)

Settings.llm = gemini_llm
Settings.embed_model = hf_embedding

index = VectorStoreIndex(nodes=nodes, storage_context=storage_context)

7) 与文档对话

query_engine = index.as_query_engine()
response = query_engine.query("Who is Paul Graham?")
print(response)

可选:将 ObjectBoxVectorStore 配置为检索器

LlamaIndex 检索器负责根据查询从向量数据库中获取相似的分块。

retriever = index.as_retriever()
response = retriever.retrieve("What did the author do growing up?")

for node in response:
    print("Retrieved chunk text:\n", node.node.get_text())
    print("Retrieved chunk metadata:\n", node.node.get_metadata_str())
    print("\n\n\n")

可选:使用 delete_nodes 移除与单个查询关联的分块

我们可以使用 ObjectBoxVectorStore.delete_nodes 方法,传入一个包含节点 ID 的列表作为参数,从向量数据库中移除分块(节点)。

response = retriever.retrieve("What did the author do growing up?")

node_ids = []
for node in response:
    node_ids.append(node.node_id)
print(f"Nodes to be removed: {node_ids}")

print(f"No. of vectors before deletion: {vector_store.count()}")
vector_store.delete_nodes(node_ids)
print(f"No. of vectors after deletion: {vector_store.count()}")

可选:从向量数据库中移除单个文档

ObjectBoxVectorStore.delete 方法可用于移除与单个文档关联的分块(节点),该文档的 id_ 作为参数提供。

document = documents[0]
print(f"Document to be deleted {document.id_}")

print(f"No. of vectors before deletion: {vector_store.count()}")
vector_store.delete(document.id_)
print(f"No. of vectors after document deletion: {vector_store.count()}")

BytesRouter 是社区翻译站点,所有译文仅供参考,一切以官方英文原文为准。