如何本地持久化LlamaIndex的VectorStoreIndex?加载遇OpenAI密钥错误
问题解决:加载本地持久化索引时的OpenAI密钥错误
错误原因
加载索引时未指定自定义的ServiceContext,LlamaIndex默认尝试初始化OpenAI模型,但你未配置其API密钥,因此触发报错。你的索引是基于本地LlamaCPP模型构建的,加载时必须关联对应的LLM和嵌入模型配置。
修正方案
加载索引前,需重新初始化你的LLM和嵌入模型,创建ServiceContext后传入load_index_from_storage方法中。
完整修正代码
1. 构建并持久化索引(原代码保留,确保持久化步骤正确)
import logging import sys from llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext from llama_index.llms import LlamaCPP from llama_index.llms.llama_utils import messages_to_prompt, completion_to_prompt from langchain.embeddings import HuggingFaceEmbeddings from llama_index.embeddings import LangchainEmbedding from llama_index import StorageContext logging.basicConfig(stream=sys.stdout, level=logging.INFO) logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout)) # 初始化本地LLM llm = LlamaCPP( model_url='https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.1-GGUF/resolve/main/mistral-7b-instruct-v0.1.Q4_K_M.gguf', model_path=None, temperature=0.1, max_new_tokens=256, context_window=3900, generate_kwargs={}, model_kwargs={"n_gpu_layers": -1}, messages_to_prompt=messages_to_prompt, completion_to_prompt=completion_to_prompt, verbose=True, ) # 初始化嵌入模型 embed_model = LangchainEmbedding( HuggingFaceEmbeddings(model_name="thenlper/gte-large") ) # 创建ServiceContext service_context = ServiceContext.from_defaults( chunk_size=256, llm=llm, embed_model=embed_model ) # 加载文档并构建索引 documents = SimpleDirectoryReader("/content/Data/").load_data() index = VectorStoreIndex.from_documents(documents, service_context=service_context) # 持久化索引 index.storage_context.persist("/content/pers")
2. 加载已持久化的索引(关键:传入自定义ServiceContext)
from llama_index import StorageContext, load_index_from_storage from llama_index.llms import LlamaCPP from llama_index.llms.llama_utils import messages_to_prompt, completion_to_prompt from langchain.embeddings import HuggingFaceEmbeddings from llama_index.embeddings import LangchainEmbedding from llama_index import ServiceContext # 重新初始化LLM和嵌入模型(必须和构建索引时一致) llm = LlamaCPP( model_url='https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.1-GGUF/resolve/main/mistral-7b-instruct-v0.1.Q4_K_M.gguf', model_path=None, temperature=0.1, max_new_tokens=256, context_window=3900, generate_kwargs={}, model_kwargs={"n_gpu_layers": -1}, messages_to_prompt=messages_to_prompt, completion_to_prompt=completion_to_prompt, verbose=True, ) embed_model = LangchainEmbedding( HuggingFaceEmbeddings(model_name="thenlper/gte-large") ) # 创建和构建索引时一致的ServiceContext service_context = ServiceContext.from_defaults( chunk_size=256, llm=llm, embed_model=embed_model ) # 加载存储上下文并传入ServiceContext加载索引 storage_context = StorageContext.from_defaults(persist_dir="/content/pers") new_index = load_index_from_storage(storage_context, service_context=service_context) # 创建查询引擎 new_query_engine = new_index.as_query_engine()
关键注意点
- 加载索引时的LLM和嵌入模型配置必须和构建索引时完全一致,否则会出现不兼容问题。
- 如果是在同一个Python会话中加载,可直接复用之前创建的
service_context,无需重新初始化。
内容的提问来源于stack exchange,提问作者6core
相关产品推荐
相关产品推荐

