DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

LLM 已经换成本地模型,LlamaIndex 为什么还要 OpenAI API key

LlamaIndex 的 LLM 与 embedding 分别配置。全本地建索引时明确指定已安装的本地 embedding;继续用远程向量服务时配置真实凭据,换模型后重新评估旧索引。

LLM 已经换成本地模型,LlamaIndex 为什么还要 OpenAI API key

本地聊天模型单独测试正常,调用 VectorStoreIndex 建索引时却提示:

Could not load OpenAI embedding model.

这时先顺着堆栈找 resolve_embed_model。在 LlamaIndex 中,生成回答用的 LLM 和把文本转成向量的 embedding 是两份配置。只改 Settings.llm,没有同时指定 embedding,建索引仍可能走默认 OpenAI 路径。

官方 issue #10402 的历史环境是 llama-index 0.9.40。下方代码使用后来的 core/集成包拆分接口,不把旧版 ServiceContext 示例和新版 Settings 写法混在一起。开始前运行 python -m pip show llama-index-core llama-index-embeddings-huggingface,把实际版本记进问题记录。

全本地项目,把向量模型也写明

以下需要 llama-index-core、llama-index-embeddings-huggingface,以及已经下载到本机的 Sentence Transformers 兼容模型目录。运行前将 LOCAL_EMBED_MODEL_DIR 设为真实目录;代码不负责下载权重。HF_HUB_OFFLINE 用于避免模型加载过程临时访问远端。

import os
from pathlib import Path

os.environ["HF_HUB_OFFLINE"] = "1"
from llama_index.core import Document, VectorStoreIndex
from llama_index.embeddings.huggingface import HuggingFaceEmbedding

model_dir = Path(os.environ["LOCAL_EMBED_MODEL_DIR"]).resolve()
if not model_dir.is_dir():
    raise FileNotFoundError(model_dir)
embed_model = HuggingFaceEmbedding(model_name=str(model_dir))
vector = embed_model.get_text_embedding("订单记录保存三十天")
assert len(vector) > 0

index = VectorStoreIndex.from_documents(
    [Document(text="订单记录保存三十天。")],
    embed_model=embed_model,
)
hits = index.as_retriever(similarity_top_k=1).retrieve("订单保留多久?")
assert hits
assert "三十天" in hits[0].node.get_content()
print(type(embed_model).__name__, len(vector), len(hits))

这里用 retriever 验收,是为了先把 embedding 与向量检索这条路径跑通。如果立即调用 query engine 生成答案,还会同时涉及 LLM 配置,第二个错误容易盖住第一个。

想让全项目共用这个模型,可在创建任何索引前明确设置 Settings.embed_model = embed_model。示例采用每个索引显式传参,便于查出究竟是哪一份配置生效。服务中途随意修改全局 Settings 会让并发请求的行为更难判断。

继续用 OpenAI embedding 也可以

如果项目本来就计划“本地 LLM + 远程 embedding”,应配置真实的 OpenAI embedding 凭据和对应集成,而不是为了去掉报错塞一个假 key。凭据校验过了以后仍会请求接口,假 key 只会把错误推到网络调用阶段。

同样不要拿 MockEmbedding 当生产修复。它适合测试管线是否接通,无法证明检索语义正确。换一个真实 embedding 模型后,即使向量维度碰巧相同,也不能直接与旧模型生成的向量混用;应重新评估并重建相应索引。

最终验收包括:实际 embedding 类符合配置、单条文本成功向量化、索引能检索出已知文本、全本地部署不再访问 OpenAI embedding 端点。仅仅看“没有 key 错误”不够。

官方依据:历史问题 #10402、默认 embedding 解析逻辑、Embedding 配置文档。