Error:知识库上传文件时出现错误
1️⃣ 描述一下问题
我的虚拟机是arm平台的,系统是ubuntu,部署后创建chroma和lightrag类型的知识库上传文件后出现下面的问题:
2️⃣ 报错日志
09-22 10:57:51 DEBUG server.routers.knowledge_router:146: Add documents for db_id kb_8a53b1b08199fd8e41b5118c1c1546a0: ['saves/knowledge_base_data/chroma_data/kb_8a53b1b08199fd8e41b5118c1c1546a0/uploads/员工行为规范_d9fc.xlsx'] params={'chunk_size': 1000, 'chunk_overlap': 200, 'enable_ocr': 'disable', 'use_qa_split': False, 'qa_separator': '\n\n\n', 'content_type': 'file'} 09-22 10:57:51 INFO src.knowledge.chroma_kb:57: Creating ChromaDB collection for kb_8a53b1b08199fd8e41b5118c1c1546a0 09-22 10:57:51 ERROR src.knowledge.kb_utils:135: Error in get_embedding_config: 'api_key', {'name': 'bge-m3', 'base_url': 'http://localhost:11434/api/embed', 'dimension': 1024} 09-22 10:57:51 ERROR src.knowledge.chroma_kb:134: Failed to create vector collection for kb_8a53b1b08199fd8e41b5118c1c1546a0: Error in get_embedding_config: 'api_key' 09-22 10:57:51 ERROR src.knowledge.chroma_kb:135: Traceback: Traceback (most recent call last): File "/app/src/knowledge/kb_utils.py", line 122, in get_embedding_config config_dict["api_key"] = os.getenv(embed_info["api_key"], embed_info["api_key"]) ~~~~~~~~~~^^^^^^^^^^^ KeyError: 'api_key'
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/app/src/knowledge/chroma_kb.py", line 127, in _get_chroma_collection collection = await self._create_kb_instance(db_id, {}) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/app/src/knowledge/chroma_kb.py", line 63, in _create_kb_instance embedding_function = self._get_embedding_function(embed_info) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/app/src/knowledge/chroma_kb.py", line 109, in _get_embedding_function config_dict = get_embedding_config(embed_info) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/app/src/knowledge/kb_utils.py", line 136, in get_embedding_config raise ValueError(f"Error in get_embedding_config: {e}") ValueError: Error in get_embedding_config: 'api_key'
09-22 10:57:51 ERROR server.routers.knowledge_router:157: Failed to process files: Failed to get ChromaDB collection for kb_8a53b1b08199fd8e41b5118c1c1546a0, Traceback (most recent call last): File "/app/server/routers/knowledge_router.py", line 151, in add_documents processed_items = await knowledge_base.add_content(db_id, items, params=params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/app/src/knowledge/kb_manager.py", line 194, in add_content return await kb_instance.add_content(db_id, items, params or {}) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/app/src/knowledge/chroma_kb.py", line 169, in add_content raise ValueError(f"Failed to get ChromaDB collection for {db_id}") ValueError: Failed to get ChromaDB collection for kb_8a53b1b08199fd8e41b5118c1c1546a0
09-22 10:57:51 INFO: 192.169.4.7:54030 - "POST /api/knowledge/databases/kb_8a53b1b08199fd8e41b5118c1c1546a0/documents HTTP/1.1" 200 09-22 10:57:51 INFO: 127.0.0.1:33300 - "GET /api/system/health HTTP/1.1" 200 09-22 10:58:21 INFO: 127.0.0.1:49720 - "GET /api/system/health HTTP/1.1" 200 09-22 10:58:51 INFO: 127.0.0.1:60852 - "GET /api/system/health HTTP/1.1" 200 09-22 10:59:21 INFO: 127.0.0.1:38870 - "GET /api/system/health HTTP/1.1" 200 09-22 10:59:51 INFO: 127.0.0.1:36078 - "GET /api/system/health HTTP/1.1" 200 09-22 11:00:21 INFO: 127.0.0.1:53176 - "GET /api/system/health HTTP/1.1" 200 09-22 11:00:24 INFO: 192.169.4.7:54602 - "GET /api/knowledge/types HTTP/1.1" 200 09-22 11:00:24 INFO: 192.169.4.7:54586 - "GET /api/knowledge/databases HTTP/1.1" 200 09-22 11:00:52 INFO: 127.0.0.1:53124 - "GET /api/system/health HTTP/1.1" 200 09-22 11:01:22 INFO: 127.0.0.1:58244 - "GET /api/system/health HTTP/1.1" 200 09-22 11:01:52 INFO: 127.0.0.1:43064 - "GET /api/system/health HTTP/1.1" 200 09-22 11:02:22 INFO: 127.0.0.1:46558 - "GET /api/system/health HTTP/1.1" 200
3️⃣ 相关截图
#️⃣ 其他相关信息
✅ 如果问题与模型调用相关,请尝试切换到其他在线模型
看日志栈清得很明白:你的 embed_info 里没有 api_key 字段,get_embedding_config() 又直接用 embed_info["api_key"] 去取,结果触发 KeyError: 'api_key',后续就一路失败,导致 Failed to get ChromaDB collection...。
下面给你两条可选的“立刻可用”的修法(任选其一)——先说快速修,再给更稳的代码补丁。
方案 A|补齐配置(最少改动,最快恢复)
你的 embed_info 现在是:
{"name": "bge-m3", "base_url": "http://localhost:11434/api/embed", "dimension": 1024}
这个项目的写法显然期望 api_key 存放的是“环境变量名”,函数里会 os.getenv(embed_info["api_key"], embed_info["api_key"]) 二次取值。所以请把配置改成这样(举例用 OpenAI 兼容接口/本地服务都可):
- 如果你是“OpenAI 兼容接口”(含 Ollama 的
/v1/embeddings兼容端点):
{
"name": "bge-m3",
"provider": "openai",
"api_key": "OPENAI_API_KEY",
"base_url": "http://localhost:11434/v1",
"dimension": 1024
}
并设置环境变量(本地服务通常不校验 key,给任意非空字符串即可):
export OPENAI_API_KEY="dummy"
注意把
base_url改为/v1,OpenAIEmbeddingFunction走的是/v1/embeddings,你原来的/api/embed路径不匹配。
- 如果你是真正用 OpenAI/硅基流动之类的云端:
{
"name": "text-embedding-3-large", // 或你的实际模型名
"provider": "openai",
"api_key": "OPENAI_API_KEY",
"base_url": "https://api.openai.com/v1",
"dimension": 3072 // 对应模型维度
}
同样确保 OPENAI_API_KEY 在环境里。
做完这一步,一般就能过 get_embedding_config 这一关了。
方案 B|改代码(让 api_key 可选 & 自适配本地)
让代码更健壮,不要求配置里必须有 api_key:
src/knowledge/kb_utils.py
import os
def get_embedding_config(embed_info: dict) -> dict:
try:
config_dict = {}
# 统一参数聚合
if "name" in embed_info:
config_dict["model"] = embed_info["name"]
if embed_info.get("base_url"):
config_dict["base_url"] = embed_info["base_url"]
if "dimension" in embed_info:
config_dict["dimension"] = embed_info["dimension"]
# 关键改动:api_key 可选
api_key_name = embed_info.get("api_key")
if api_key_name: # 如果提供的是“环境变量名”
config_dict["api_key"] = os.getenv(api_key_name, api_key_name)
# 若没提供,就不要写入,让下游按需处理(本地服务通常不需要)
# 可选:provider 透传
if embed_info.get("provider"):
config_dict["provider"] = embed_info["provider"]
return config_dict
except Exception as e:
raise ValueError(f"Error in get_embedding_config: {e}")
src/knowledge/chroma_kb.py(决定用哪个 EmbeddingFunction)
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction, SentenceTransformerEmbeddingFunction
def _get_embedding_function(self, embed_info: dict):
config = get_embedding_config(embed_info)
provider = embed_info.get("provider", "openai").lower()
model = config.get("model") or embed_info.get("name")
if provider == "sentence-transformers":
# 纯本地 HuggingFace 模型,比如 BAAI/bge-m3
return SentenceTransformerEmbeddingFunction(model_name=model)
# 默认 OpenAI 兼容
return OpenAIEmbeddingFunction(
api_key=config.get("api_key", "dummy"), # 给个占位,防止空指针
model_name=model,
api_base=config.get("base_url", "http://localhost:11434/v1"), # 走 /v1
)
如何配置使用本地 bge-m3(不需要 api_key):
{
"name": "BAAI/bge-m3",
"provider": "sentence-transformers",
"dimension": 1024
}
这会走 SentenceTransformerEmbeddingFunction,完全离线,无需 api_key 和 base_url,前提是容器/环境能加载该模型(需要安装 sentence-transformers 及其依赖,且有显存/内存)。
额外提示(容易踩坑的点)
-
路径不匹配 你原本的
base_url: http://localhost:11434/api/embed不符合OpenAIEmbeddingFunction的惯例路径。改为http://localhost:11434/v1,并保证你的服务真有/v1/embeddings。 -
维度要对齐
dimension要与模型真实维度一致,ChromaDB 的 collection 一旦建立了维度就固定,改模型或改维度需要新 collection。 -
返回 200 但实际失败 日志里:上传接口返回了 200,但实际上插入失败(后端捕获异常后仍返回 200)。前端要以响应体中的状态为准,而不是 HTTP 码;或者把后端改为在异常时返回 4xx/5xx,更直观。
-
Ollama 使用说明 如果你真用 Ollama:确保启用了 OpenAI 兼容(某些发行版需额外参数或代理层),并用 Ollama 支持的 embedding 模型名(如
nomic-embed-text、bge-m3等),请求体字段为 `{"model":"xxx","input":"..."}。
一键对照清单
- [ ] 选择方案 A(补配置)或方案 B(改代码)。
- [ ] 若走 OpenAI 兼容:
base_url统一设为.../v1,填上api_key(本地可用 dummy)。 - [ ] 若走本地句向量:
provider=sentence-transformers,删掉api_key/base_url。 - [ ] 确认
dimension与模型一致。 - [ ] 若 collection 已建错维度,新建库或删库重建。
- [ ] 前端以响应内容判断成功/失败,或让后端异常返回 4xx/5xx。