Yuxi-Know icon indicating copy to clipboard operation
Yuxi-Know copied to clipboard

Error:知识库上传文件时出现错误

Open all666666 opened this issue 5 months ago • 1 comments

1️⃣ 描述一下问题

我的虚拟机是arm平台的,系统是ubuntu,部署后创建chroma和lightrag类型的知识库上传文件后出现下面的问题:

Image

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️⃣ 相关截图

#️⃣ 其他相关信息

✅ 如果问题与模型调用相关,请尝试切换到其他在线模型

all666666 avatar Sep 22 '25 03:09 all666666

看日志栈清得很明白:你的 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 兼容接口/本地服务都可):

  1. 如果你是“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 改为 /v1OpenAIEmbeddingFunction 走的是 /v1/embeddings,你原来的 /api/embed 路径不匹配。

  1. 如果你是真正用 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_keybase_url,前提是容器/环境能加载该模型(需要安装 sentence-transformers 及其依赖,且有显存/内存)。


额外提示(容易踩坑的点)

  1. 路径不匹配 你原本的 base_url: http://localhost:11434/api/embed 不符合 OpenAIEmbeddingFunction 的惯例路径。改为 http://localhost:11434/v1,并保证你的服务真有 /v1/embeddings

  2. 维度要对齐 dimension 要与模型真实维度一致,ChromaDB 的 collection 一旦建立了维度就固定,改模型或改维度需要新 collection

  3. 返回 200 但实际失败 日志里:上传接口返回了 200,但实际上插入失败(后端捕获异常后仍返回 200)。前端要以响应体中的状态为准,而不是 HTTP 码;或者把后端改为在异常时返回 4xx/5xx,更直观。

  4. Ollama 使用说明 如果你真用 Ollama:确保启用了 OpenAI 兼容(某些发行版需额外参数或代理层),并用 Ollama 支持的 embedding 模型名(如 nomic-embed-textbge-m3 等),请求体字段为 `{"model":"xxx","input":"..."}。


一键对照清单

  • [ ] 选择方案 A(补配置)或方案 B(改代码)。
  • [ ] 若走 OpenAI 兼容:base_url 统一设为 .../v1,填上 api_key(本地可用 dummy)。
  • [ ] 若走本地句向量:provider=sentence-transformers,删掉 api_key/base_url
  • [ ] 确认 dimension 与模型一致。
  • [ ] 若 collection 已建错维度,新建库或删库重建。
  • [ ] 前端以响应内容判断成功/失败,或让后端异常返回 4xx/5xx。

wxw-123 avatar Sep 22 '25 06:09 wxw-123