提供方实现
提供方实现
相关源文件
本章引用的主要源码文件:
api/apps/llm_app.pyconf/llm_factories.jsonconf/models/aliyun.jsonconf/models/baidu.jsonconf/models/cohere.jsonconf/models/deepseek.jsonconf/models/fishaudio.jsonconf/models/google.jsonconf/models/minimax.jsonconf/models/mistral.jsonconf/models/moonshot.jsonconf/models/nvidia.jsonconf/models/openai.jsonconf/models/openrouter.jsonconf/models/paddleocr.jsonconf/models/siliconflow.jsonconf/models/stepfun.jsonconf/models/volcengine.jsonconf/models/xai.jsonconf/models/zhipu-ai.jsoninternal/development.mdinternal/entity/model.gointernal/entity/models/aliyun.gointernal/entity/models/baichuan.gointernal/entity/models/baidu.gointernal/entity/models/cohere.gointernal/entity/models/deepseek.gointernal/entity/models/dummy.gointernal/entity/models/factory.gointernal/entity/models/fishaudio.gointernal/entity/models/gitee.gointernal/entity/models/google.gointernal/entity/models/jina.gointernal/entity/models/lmstudio.gointernal/entity/models/localai.gointernal/entity/models/minimax.gointernal/entity/models/mistral.gointernal/entity/models/mistral_test.gointernal/entity/models/moonshot.gointernal/entity/models/nvidia.gointernal/entity/models/nvidia_rerank_test.gointernal/entity/models/ollama.gointernal/entity/models/openai.gointernal/entity/models/openrouter.gointernal/entity/models/siliconflow.gointernal/entity/models/stepfun.gointernal/entity/models/types.gointernal/entity/models/vllm.gointernal/entity/models/volcengine.gointernal/entity/models/voyage.gointernal/entity/models/zhipu-ai.gointernal/handler/providers.gointernal/service/model_service.gorag/llm/__init__.pyrag/llm/chat_model.pyrag/llm/cv_model.pyrag/llm/embedding_model.pyrag/llm/rerank_model.pyrag/llm/sequence2txt_model.pyrag/llm/tts_model.pytest/testcases/test_web_api/test_llm_app/test_llm_list_unit.pyweb/src/components/svg-icon.tsxweb/src/constants/llm.tsweb/src/pages/user-setting/setting-model/constant.tsweb/src/utils/common-util.ts
本文档详细介绍了 RAGFlow 大语言模型(LLM)集成系统中的具体 AI 提供方实现,涵盖了 OpenAI、Anthropic、DeepSeek 等主要提供方以及多个本地/自托管模型。同时解释了这些实现如何向工厂注册自身,以实现运行时的发现和实例化。本页面是一个叶子页面,专注于提供方层面的架构和代码实体映射。
1. 工厂模式与动态注册
RAGFlow 采用动态工厂模式,在导入时自动发现和注册大语言模型(LLM)提供方。这种机制意味着每个提供方实现只需声明一个 _FACTORY_NAME 类属性,即可自动注册到相应的全局工厂字典中。
提供方注册流程
工厂发现过程将知名提供方名称的自然语言领域映射到实现这些提供方的 Python 代码实体。rag/llm/__init__.py 中的代码动态导入所有与 LLM 相关的模块,检查这些模块,并将类注册到每种模型类型的工厂字典中。
图:提供方注册与发现流程
该过程主要发生在 rag/llm/__init__.py:162-184,其中:
MODULE_MAPPING枚举了模型类别模块。- 每个模块被导入,并检查其中的所有类。
- 继承自抽象
Base或LiteLLMBase且具有_FACTORY_NAME属性的类会被注册。 - 该映射支持每个类有多个工厂名称。
2. 按模型类型的工厂字典
RAGFlow 维护以下全局字典,将提供方工厂名称映射到其实现类:
| 字典名称 | 模块 | 描述 |
|---|---|---|
ChatModel | rag/llm/chat_model.py | 对话聊天模型 |
EmbeddingModel | rag/llm/embedding_model.py | 向量嵌入模型 |
RerankModel | rag/llm/rerank_model.py | 重排序模型 |
CvModel | rag/llm/cv_model.py | 计算机视觉和图像到文本模型 |
TTSModel | rag/llm/tts_model.py | 文本到语音模型 |
Seq2txtModel | rag/llm/sequence2txt_model.py | 语音到文本模型 |
OcrModel | rag/llm/ocr_model.py(未显示) | OCR 模型 |
每个字典都允许通过工厂名称在运行时实例化相应的提供方,从而将系统组件与实现细节解耦。
3. 大语言模型(LLM)工厂注册表与 API 密钥关联
RAGFlow 定义了一个 JSON 注册表(conf/llm_factories.json),声明了提供方的元数据及其支持的模型及其属性:
- 工厂级元数据:名称、标签、状态、显示排序。
- 模型级元数据:模型名称、标签、最大 Token 限制、类型(聊天、嵌入等)以及是否支持工具调用。
该注册表与 api/apps/llm_app.py 中的 API 路由紧密集成,这些路由:
- 列出所有允许的工厂(
/factories端点)。 - 通过实例化相关模型并尝试测试请求来验证 API 密钥。
- 将每个租户的已验证 API 密钥和配置保存到
TenantLLM表中。
4. 关键提供方实现概览
4.1 OpenAI 提供方
- 聊天模型:
rag/llm/chat_model.py中的GPTSeq2txt使用openai.OpenAI客户端,并支持流式聊天补全。它通过_apply_model_family_policies应用模型系列特定的请求调整。rag/llm/chat_model.py:113-126
- 嵌入模型:
OpenAIEmbed提供对 OpenAI 嵌入 API 的批量调用,包含输入截断和 Token 计数。rag/llm/embedding_model.py:159-183
- 自动语音识别(ASR)与文本到语音(TTS):
- 语音到文本由
GPTSeq2txt封装 Whisper 处理。rag/llm/sequence2txt_model.py:53-61 - 文本到语音通过基于 HTTP 的 TTS 基类以及特定的 FishAudio、QwenTTS 实现。
rag/llm/tts_model.py:83-188
- 语音到文本由
- API 基础 URL 默认为
https://api.openai.com/v1,通过FACTORY_DEFAULT_BASE_URL设置。rag/llm/__init__.py:87-90
4.2 Anthropic 提供方
- 实现与 Anthropic API 高度一致的聊天补全功能。
- 以
"Anthropic"工厂名称注册。 - 属于
ChatModel字典的一部分。
4.3 DeepSeek 提供方
- 支持文本嵌入和聊天,以
"DeepSeek"注册。 - 可通过 LiteLLM 提供方前缀
"deepseek/"访问。 - 实现提供方特定的请求处理。
- 集成在统一的 LLM 类中。
4.4 本地/自托管模型
包括 Ollama、Xinference、LocalAI、GPUStack 等:
- 这些模型通常被封装在提供一致 API 的类中。
- 它们允许自定义基础 URL,并支持私有/自托管部署。
- 例如,
rag/llm/rerank_model.py中的LocalAIRerank展示了在本地服务器上的重排序模型。rag/llm/rerank_model.py:111-146
4.5 提供方基类
每个模型模块都定义了一个 Base 抽象类,具体提供方继承自该类。基类处理通用关注点(例如重试配置、Token 工具、客户端初始化),而提供方类实现具体细节。
5. 提供方工厂映射逻辑
在 Go 后端层面,internal/entity/models/factory.go 中的 ModelFactory 使用对规范化提供方名称字符串的 switch case 来实例化正确的 ModelDriver 实现。
这个 Go 工厂抽象地封装了内部服务的提供方实例化,支持包括 DeepSeek、OpenAI 和本地实现在内的提供方特定模型。
来源:internal/entity/models/factory.go:23-99
6. 提供方实例化和使用的数据流
- 租户配置:租户在系统中配置提供方(例如 OpenAI)及其 API 密钥。
- API 密钥验证:后端 API(
api/apps/llm_app.py)通过从工厂字典创建模型实例并对嵌入、聊天或重排序模型调用测试请求来验证密钥。api/apps/llm_app.py:79-157
- 请求路由:当用户触发 LLM 请求时:
- 系统将请求的
llm_factory映射到相应工厂字典中已注册的类(例如ChatModel["OpenAI"]→GPTSeq2txt)。
- 使用 API 密钥和选项创建实例。
- 实例执行底层 API 调用,应用模型系列策略和配置。
- 流式处理和响应处理:聊天和视觉模型支持流式结果、错误处理和 Token 记账。
7. 关键提供方类及文件汇总表
| 提供方 | 模型类型 | 工厂名称 (_FACTORY_NAME) | 主要文件路径 |
|---|---|---|---|
| OpenAI | 聊天 | "OpenAI" | rag/llm/chat_model.py |
| OpenAI | 嵌入 | "OpenAI" | rag/llm/embedding_model.py |
| Anthropic | 聊天 | "Anthropic" | rag/llm/chat_model.py |
| DeepSeek | 聊天/嵌入 | "DeepSeek" | rag/llm/chat_model.py (LiteLLM) |
| LocalAI | 重排序 | "LocalAI" | rag/llm/rerank_model.py |
| FishAudio | 文本到语音(TTS) | "Fish Audio" | rag/llm/tts_model.py |
| Qwen-TTS | 文本到语音(TTS) | "Tongyi-Qianwen" | rag/llm/tts_model.py |
8. 提供方实现技术总结
8.1 ChatModel 基类与 OpenAI 聊天
Base类定义了重试逻辑、错误分类以及通过openai.OpenAI类进行的客户端设置。_apply_model_family_policies根据模型系列修改请求(例如 Qwen3 在非流式模式下禁用thinking)。- 实现了同步和异步聊天补全,支持流式。
- 通过
self.is_tools和相关状态支持工具和函数调用会话。
8.2 EmbeddingModel 实现
OpenAIEmbed封装了 OpenAI 嵌入 API,支持批处理和 Token 限制执行。BuiltinEmbed通过 HuggingFace 或其他本地库支持本地嵌入,采用线程安全的单例构造。- 嵌入方法返回 NumPy 数组和总 Token 使用量。
8.3 RerankModel 实现
JinaRerank、XInferenceRerank和LocalAIRerank类通过 HTTP 请求远程或本地重排序端点实现相似度排序。- 排序结果被归一化并以 NumPy 数组形式返回。
8.4 CVModel(视觉)处理
- 将图像从各种输入类型编码为 base64 数据 URL,供 API 使用。
- 使用
vision_llm_describe_prompt为视觉模型构建提示。 - 支持图像相关任务的异步聊天流式执行。
8.5 文本到语音(TTS)和序列到文本模型
- 文本到语音(TTS)使用 HTTP 流式传输、打包以及针对 Fish Audio 和 Tongyi 等提供方的专用 SDK。
- 像
QWenSeq2txt这样的自动语音识别(ASR)模型使用 DashScope API 进行转录。 - 这些模型为音频/文本处理提供了一致的接口。
完整桥接图:自然语言提供方名称到代码实体
总结
- RAGFlow 通过集中式工厂模式支持超过 60 个大语言模型(LLM)提供方。
- 提供方在导入时通过
_FACTORY_NAME自动注册。 - 基于 JSON 的
llm_factories.json作为综合注册表,列出了每个提供方的模型。 - OpenAI、Anthropic、DeepSeek 以及本地/自托管选项都是一等公民。
- Go 后端同样使用工厂方法实例化正确的提供方驱动类。
- API 密钥验证和租户模型管理已集成到 REST API 层。
- 按模型类型的模块化代码组织便于轻松扩展新的提供方。
来源: rag/llm/__init__.py:141-184 rag/llm/chat_model.py:113-126 rag/llm/embedding_model.py:159-183 rag/llm/rerank_model.py:53-146 rag/llm/tts_model.py:83-188 rag/llm/sequence2txt_model.py:53-166 internal/entity/models/factory.go:23-99 api/apps/llm_app.py:32-156 conf/llm_factories.json:1-144