模型选择层级
模型选择层级
相关源文件
本章引用的主要源码文件:
backend/alembic/versions/f0db5f1c6370_optional_llm_provider_name.pybackend/ee/onyx/server/seeding.pybackend/ee/onyx/server/tenants/provisioning.pybackend/onyx/configs/model_configs.pybackend/onyx/db/llm.pybackend/onyx/llm/constants.pybackend/onyx/llm/factory.pybackend/onyx/llm/models.pybackend/onyx/llm/multi_llm.pybackend/onyx/llm/utils.pybackend/onyx/llm/well_known_providers/auto_update_service.pybackend/onyx/llm/well_known_providers/constants.pybackend/onyx/llm/well_known_providers/llm_provider_options.pybackend/onyx/server/manage/image_generation/models.pybackend/onyx/server/manage/llm/api.pybackend/onyx/server/manage/llm/models.pybackend/onyx/server/manage/llm/utils.pybackend/tests/external_dependency_unit/llm/test_llm_provider.pybackend/tests/external_dependency_unit/llm/test_llm_provider_api_base.pybackend/tests/external_dependency_unit/llm/test_llm_provider_auto_mode.pybackend/tests/external_dependency_unit/llm/test_llm_provider_default_model_protection.pybackend/tests/integration/tests/llm_provider/test_llm_provider.pybackend/tests/integration/tests/llm_provider/test_llm_provider_persona_access.pybackend/tests/unit/onyx/db/test_llm_sync.pybackend/tests/unit/onyx/llm/test_model_map.pybackend/tests/unit/onyx/llm/test_multi_llm.pybackend/tests/unit/onyx/llm/test_token_limit_lookups.pybackend/tests/unit/onyx/server/manage/llm/test_fetch_models_api.pybackend/tests/unit/onyx/server/manage/llm/test_llm_provider_utils.pyweb/src/sections/modals/languageModels/VertexAIModal.tsxweb/src/sections/modals/languageModels/shared.tsx
目的与范围
本文档描述了 Onyx 在处理用户请求时用于确定使用哪个大语言模型(LLM)的优先级系统。该选择层级允许用户在多个层级上覆盖模型设置,同时保持合理的默认值。这套逻辑确保专用助手使用其优化后的模型,同时允许高级用户尝试不同的后端。
选择层级总览
Onyx 通过一个五级优先级系统来解析当前活跃的 LLM 模型,按优先级从高到低依次评估。解析逻辑主要在前端的 useLlmManager 钩子和后端的 get_llm_for_persona 工厂中实现。
- 用户手动覆盖:通过聊天输入界面显式选择的模型。
- 聊天会话覆盖:锁定到特定现有聊天会话的模型选择。
- 助手(Persona)覆盖:在助手配置中定义的模型。
- 用户偏好:用户在其个人资料中设置的个人默认模型。
- 系统默认:全局默认提供商的默认模型。
模型选择逻辑流程
来源: backend/onyx/llm/factory.py:131-154, backend/onyx/llm/factory.py:156-194, web/src/lib/hooks.ts:542-636
优先级层级详情
层级 1:用户手动覆盖
最高优先级是用户在当前聊天会话界面中显式选择的模型。这由 ModelSelector 组件处理。
- 实现方式:由前端状态中的
userHasManuallyOverriddenLLM布尔标志管理。 - 行为:当用户从下拉菜单中选择模型时,此标志变为
true,所选模型在当前交互期间持续生效,直到助手被更改。
来源: web/src/lib/hooks.ts:564-565, backend/onyx/llm/factory.py:146-148
层级 2:聊天会话覆盖
如果用户返回到现有对话,Onyx 会尝试使用该特定会话之前活跃的模型。
- 数据模型:存储在
ChatSession数据库实体中。 - 字段:
current_alternate_model。 - 上下文:这确保了消息线程内的一致性,防止同一历史记录中消息之间出现意外行为变化。
来源: web/src/lib/hooks.ts:606-609, backend/onyx/llm/factory.py:131-141
层级 3:助手(Persona)覆盖
管理员可以为助手(Persona)配置特定模型,使其更适合其任务(例如,"创意写作助手"使用 Claude 3.5 Opus,而"代码助手"使用 GPT-4o)。
- 逻辑:如果
Persona对象设置了default_model_configuration_id,它会指向一个与LLMProvider关联的ModelConfiguration条目。 - 解析:后端的
_resolve_provider_and_model函数会获取与此 ID 关联的提供商和模型名称。
助手模型解析
来源: backend/onyx/onyx/llm/factory.py:87-129, backend/onyx/db/llm.py:165-179
层级 4:用户偏好
用户可以在其账户设置中定义自己的默认模型。如果助手没有特定的模型要求,则会使用此设置。
- 实现方式:存储在
User模型的preferencesJSON 字段中,键为default_model。
来源: web/src/lib/hooks.ts:618-619
层级 5:系统默认
最终的降级方案是系统管理员配置的全局默认 LLM 提供商。
- 配置:通过
fetch_default_llm_model函数设置,该函数查询数据库中被标记为默认的提供商。 - 默认模型:使用与该提供商关联的主要模型配置。
来源: backend/onyx/db/llm.py:25-26, backend/onyx/llm/factory.py:197-205
技术实现
LLM 工厂与多 LLM 包装器
后端使用 LitellmLLM(一个围绕 LiteLLM 的包装器)来与各种提供商交互。选择层级最终会生成一个由 llm_from_provider 产生的 LLM 接口实例。
代码实体映射
来源: backend/onyx/llm/factory.py:131-194, backend/onyx/llm/multi_llm.py:95-106, backend/onyx/llm/models.py:112-116
能力与推理努力度
选择模型时,Onyx 还会解析特定能力,例如支持"思考"的模型(如 OpenAI o1、Claude 3.7)的推理努力度。
- 推理级别:
AUTO、OFF、LOW、MEDIUM、HIGH。 - 提供商映射:
- OpenAI:通过
OPENAI_REASONING_EFFORT直接映射到reasoning_effort。 - Anthropic:通过
ANTHROPIC_REASONING_EFFORT_BUDGET映射到budget_tokens。 - 自适应推理:较新的模型(如 Claude 4.7)使用
ANTHROPIC_ADAPTIVE_REASONING_EFFORT映射到output_config.effort。
来源: backend/onyx/llm/models.py:13-56, backend/onyx/llm/multi_llm.py:77-92
在 LiteLLM 包装器中的实现
LitellmLLM 类处理消息和工具配置的最终转换。它使用 _strip_tool_content_from_messages 来确保在工具调用被禁用或当前请求不支持时,与 Bedrock 等提供商兼容。
来源: backend/onyx/llm/multi_llm.py:136-182, backend/onyx/llm/multi_llm.py:22-26