模型接入全指南:OpenAI / Claude / 本地模型配置与成本对比
第4章:模型接入全指南——OpenAI / Claude / 本地模型配置与成本对比
选错模型可能让你的应用成本是最优方案的 10 倍,但选对模型需要理解每种模型的能力边界、API 特性和定价机制。
本章导读
2024 年的 AI 模型市场百花齐放:GPT-4o、Claude 3.5 Sonnet、Gemini 1.5 Pro、Qwen2.5、DeepSeek-V3……每个月都有新模型发布,性能更强、价格更低。Dify 的一大核心优势就是模型无关性:你今天在 GPT-4 上调好的工作流,明天可以切换到 Claude 或本地模型,只需改一个配置。
但这个"切换"不是无损的。不同模型在上下文长度、工具调用能力、多语言水平、价格结构上有显著差异,错误的模型选择会导致功能缺失或成本飞涨。
本章会带你系统了解 Dify 中模型接入的全貌,帮你在不同场景下做出最优选择。
读完本章,你将能够:
- 在 Dify 中配置 OpenAI、Anthropic、本地模型(Ollama)
- 理解不同模型在能力、价格、使用限制上的核心差异
- 构建多模型策略(主模型 + 备用模型 + 专用模型)
- 计算和控制实际生产环境的模型成本
- 理解 Dify 模型网关的工作原理和限速处理机制
Level 1:基础认知(1-3 年经验)
Dify 支持哪些模型
Dify 将模型分为四类,每类有不同的用途:
| 模型类型 | 用途 | 代表模型 |
|---|---|---|
| LLM(大语言模型) | 对话、推理、生成文本 | GPT-4o, Claude 3.5, Qwen2.5 |
| Embedding(向量化) | 知识库文档向量化、语义检索 | text-embedding-3-small, bge-m3 |
| Rerank(重排序) | 知识库检索结果重排序 | bge-reranker-v2-m3, cohere-rerank |
| 语音(Speech to Text) | 语音输入转文字 | Whisper-1 |
关键认知:在 Dify 里,LLM 不是唯一需要配置的模型。如果你启用了知识库,还需要配置 Embedding 模型;如果想要更好的检索效果,还需要配置 Rerank 模型。
主流模型的能力对比(2024年)
以下是主要模型的横向对比,帮你快速定位:
| 模型 | 上下文长度 | 中文能力 | 工具调用 | 视觉能力 | 每 1M tokens 价格(输入/输出) |
|---|---|---|---|---|---|
| GPT-4o | 128K | ★★★★☆ | ★★★★★ | ★★★★★ | $5 / $15 |
| GPT-4o-mini | 128K | ★★★★☆ | ★★★★☆ | ★★★★☆ | $0.15 / $0.6 |
| Claude 3.5 Sonnet | 200K | ★★★★☆ | ★★★★★ | ★★★★★ | $3 / $15 |
| Claude 3 Haiku | 200K | ★★★☆☆ | ★★★★☆ | ★★★☆☆ | $0.25 / $1.25 |
| Gemini 1.5 Pro | 1M | ★★★★☆ | ★★★★☆ | ★★★★★ | $3.5 / $10.5 |
| Qwen2.5-72B | 128K | ★★★★★ | ★★★★☆ | ★★★☆☆ | $0.56 / $2.24 |
| DeepSeek-V3 | 64K | ★★★★★ | ★★★★☆ | ✗ | $0.27 / $1.1 |
| Llama 3.1 70B (本地) | 128K | ★★★☆☆ | ★★★☆☆ | ✗ | 仅服务器成本 |
注:价格和能力会随版本更新变化,以官方最新数据为准
在 Dify 中配置 OpenAI 模型
前提条件:你有一个 OpenAI API Key(platform.openai.com)
配置步骤:
- 进入 Dify 工作台 → 右上角头像 → 「设置」
- 点击「模型供应商」→ 找到 OpenAI → 点击「配置」
- 填入你的 API Key:
API Key: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Organization ID: org-xxxxxxxx (可选,企业账号填写)
API Base: https://api.openai.com/v1 (默认,如果用 Azure OpenAI 需要修改)
- 点击「保存」,系统自动验证
使用 Azure OpenAI(企业常用,数据不出美国微软机房):
Provider: Azure OpenAI
Azure Endpoint: https://your-resource.openai.azure.com/
API Key: your-azure-key
API Version: 2024-02-01
注意:Azure OpenAI 需要在模型配置中指定「部署名称」(Deployment Name),而不是模型名称。
在 Dify 中配置 Anthropic Claude
Claude 是在长上下文处理和代码生成上经常优于 GPT-4 的选择。
获取 API Key:访问 console.anthropic.com 注册
Dify 配置:
- 模型供应商 → Anthropic → 配置
- 填入 API Key(格式:
sk-ant-xxxxxxxx) - 可用模型:
claude-3-5-sonnet-20241022:综合最强,适合复杂任务claude-3-5-haiku-20241022:速度快、成本低,适合高频调用claude-3-opus-20240229:最强版本,但已被 3.5 Sonnet 超越
Claude 与 GPT-4o 的关键差异:
优势(Claude 3.5 Sonnet 相对 GPT-4o):
✓ 上下文窗口更大(200K vs 128K)
✓ 代码生成质量更高(多个 benchmark 上领先)
✓ 输入价格更低($3 vs $5 per 1M tokens)
✓ 长文档分析更准确(因为长上下文能力更强)
劣势:
✗ 工具调用有时不如 GPT-4o 稳定
✗ 某些特定中文任务上略逊(取决于任务类型)
✗ 图像生成不支持(只有理解能力)
在 Dify 中配置本地模型(Ollama)
本地部署意味着数据完全不离开你的服务器,适合对数据合规有严格要求的场景。
第一步:安装 Ollama(ollama.ai)
# macOS / Linux
curl -fsSL https://ollama.ai/install.sh | sh
# 下载模型(以 Llama 3.1 为例)
ollama pull llama3.1:8b # 8B 参数,适合 8GB 内存机器
ollama pull llama3.1:70b # 70B 参数,需要 40GB 以上内存
# 验证运行
ollama serve
curl http://localhost:11434/api/tags # 查看已下载的模型
第二步:在 Dify 中配置 Ollama
- 模型供应商 → Ollama → 配置
- 填写配置:
Base URL: http://localhost:11434 (如果 Ollama 和 Dify 同机)
或
Base URL: http://your-ollama-server:11434 (不同机器)
- 在模型列表中,会自动显示 Ollama 中已有的模型
本地模型的性能期望(8B vs 70B):
Llama 3.1 8B(消费级 GPU,如 RTX 4090):
- 推理速度:~50 tokens/秒
- 代码生成能力:中等(相当于 GPT-3.5 水平)
- 中文支持:一般
- 内存需求:8GB VRAM
Llama 3.1 70B(专业 GPU,如 A100 40GB × 2):
- 推理速度:~15 tokens/秒
- 代码生成能力:接近 GPT-4 水平
- 中文支持:较好
- 内存需求:40GB VRAM
Level 2:机制深解(3-5 年经验)
理解模型的定价机制
模型定价基于 Token 计算,而不是字数或字符数。理解 Token 是控制成本的关键。
什么是 Token?
Token 是模型处理文本的基本单位。对于英文,大约 1 Token = 0.75 个单词(4 个字符)。对于中文,大约 1 Token = 1.5-2 个汉字。
示例:
"Hello, world!" ≈ 4 tokens
"你好,世界!" ≈ 5 tokens(中文效率更低,同样信息消耗更多 token)
GPT-4o 的实际成本计算:
场景:一个月有 10,000 次知识库问答对话
每次对话的 Token 构成:
- 系统提示词:300 tokens
- 知识库检索结果(5个片段,每段100tokens):500 tokens
- 用户问题:50 tokens
- 历史对话(5轮):500 tokens
- AI 回答:200 tokens
输入 tokens:300 + 500 + 50 + 500 = 1,350 tokens
输出 tokens:200 tokens
GPT-4o 费用:
输入:1,350 × 10,000 / 1,000,000 × $5 = $67.5
输出:200 × 10,000 / 1,000,000 × $15 = $30
月度总费用:$97.5
使用 gpt-3.5-turbo-0125 替代(输入 $0.5/1M,输出 $1.5/1M):
输入:1,350 × 10,000 / 1,000,000 × $0.5 = $6.75
输出:200 × 10,000 / 1,000,000 × $1.5 = $3
月度总费用:$9.75
成本差异:10 倍!
多模型策略:不同任务用不同模型
生产环境的最佳实践是多模型策略:根据任务复杂度选择合适的模型,而不是所有任务都用最贵的模型。
三层模型架构:
Layer 1:轻量模型(高频、简单任务)
- 模型:gpt-4o-mini 或 Claude 3 Haiku
- 适用:意图分类、简单问答、内容过滤
- 成本:~$0.001 / 次
Layer 2:主力模型(中等复杂度任务)
- 模型:gpt-4o 或 Claude 3.5 Sonnet
- 适用:知识问答、代码生成、文档分析
- 成本:~$0.01 / 次
Layer 3:专家模型(复杂推理任务)
- 模型:o1 或 Claude 3.5 Sonnet(复杂 prompt)
- 适用:复杂分析、多步推理、需要高准确度的决策
- 成本:~$0.1 / 次
在 Dify 工作流中实现分层路由:
工作流节点设计:
[开始节点] → 接收用户问题
↓
[LLM 节点:意图分类](使用 gpt-4o-mini)
提示词:将以下问题分类为 simple/medium/complex
输出:{"complexity": "simple/medium/complex"}
↓
[条件分支]
├── complexity == "simple" → [LLM 节点](gpt-4o-mini)→ [结束]
├── complexity == "medium" → [LLM 节点](gpt-4o)→ [结束]
└── complexity == "complex" → [LLM 节点](claude-3-5-sonnet)→ [结束]
配置模型的备用策略(Fallback)
在 Dify 中为主模型配置备用模型,实现自动降级:
Dify 的模型配置支持 Fallback(通过 API 调用时):
# Dify API 调用时可以指定备用模型
payload = {
"inputs": {},
"query": user_question,
"response_mode": "streaming",
"model_config": {
"provider": "openai",
"name": "gpt-4o",
"fallback": {
"provider": "anthropic",
"name": "claude-3-5-sonnet-20241022"
}
}
}
实际的多提供商备份策略:
# 构建一个带故障转移的调用包装器
class ResilientDifyClient:
def __init__(self):
self.endpoints = [
{"url": "https://api.dify.ai/v1", "key": PRIMARY_KEY},
{"url": "https://your-self-hosted-dify.com/v1", "key": BACKUP_KEY},
]
def chat(self, message: str, conversation_id: str = None):
last_error = None
for endpoint in self.endpoints:
try:
response = self._call(endpoint, message, conversation_id)
return response
except Exception as e:
last_error = e
print(f"Endpoint {endpoint['url']} failed: {e}, trying next...")
continue
raise last_error
Rate Limit 处理:生产必须知道的限速机制
每个模型提供商都有调用频率限制(Rate Limit),理解这些限制对于生产稳定性至关重要。
OpenAI Rate Limit(2024年,因账户等级不同而异):
Tier 1($5 消费以上):
- GPT-4o: 500 RPM(请求/分钟),30,000 TPM(tokens/分钟)
- gpt-4o-mini: 500 RPM,200,000 TPM
Tier 3($100 消费以上):
- GPT-4o: 5,000 RPM,300,000 TPM
- gpt-4o-mini: 5,000 RPM,4,000,000 TPM
Tier 5($10,000 消费以上):
- 联系 OpenAI 商务谈定制限额
Dify 的限速处理机制:
Dify 的模型网关内置了指数退避重试:
# api/core/model_runtime/utils/encoder.py 中的重试逻辑(简化)
@retry(
reraise=True,
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=10),
retry=retry_if_exception_type(RateLimitError)
)
def invoke_with_retry(provider, messages, params):
return provider.invoke(messages, params)
这意味着:
- 第 1 次失败后等待 4 秒重试
- 第 2 次失败后等待 8 秒重试
- 第 3 次仍然失败则抛出异常
生产环境的请求队列设计:
如果你的应用有高并发需求,需要在 Dify 前面加一层队列:
# 使用 Redis 实现令牌桶限流
import redis
import time
class TokenBucketRateLimiter:
def __init__(self, redis_client, key: str, rate: float, capacity: int):
"""
rate: 每秒补充的令牌数(如 8.0 表示 500 RPM ÷ 60 秒)
capacity: 令牌桶容量(防止突发流量)
"""
self.redis = redis_client
self.key = key
self.rate = rate
self.capacity = capacity
def acquire(self, tokens: int = 1) -> bool:
"""尝试获取 tokens 个令牌,返回是否成功"""
now = time.time()
pipe = self.redis.pipeline()
# 使用 Lua 脚本保证原子性
lua_script = """
local key = KEYS[1]
local rate = tonumber(ARGV[1])
local capacity = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local requested = tonumber(ARGV[4])
local tokens = redis.call('hget', key, 'tokens')
local last_time = redis.call('hget', key, 'last_time')
if tokens == false then
tokens = capacity
last_time = now
else
tokens = tonumber(tokens)
last_time = tonumber(last_time)
local elapsed = now - last_time
tokens = math.min(capacity, tokens + elapsed * rate)
end
if tokens >= requested then
tokens = tokens - requested
redis.call('hmset', key, 'tokens', tokens, 'last_time', now)
return 1
else
return 0
end
"""
result = self.redis.eval(lua_script, 1, self.key,
self.rate, self.capacity, now, tokens)
return bool(result)
Embedding 模型的选型
知识库的检索质量很大程度上取决于 Embedding 模型的质量。
主流 Embedding 模型对比:
| 模型 | 维度 | 中文支持 | 多语言 | 价格(1M tokens) | 备注 |
|---|---|---|---|---|---|
| text-embedding-3-small | 1536 | 较好 | ✓ | $0.02 | OpenAI 平衡选择 |
| text-embedding-3-large | 3072 | 好 | ✓ | $0.13 | OpenAI 最高质量 |
| text-embedding-ada-002 | 1536 | 较好 | ✓ | $0.10 | 旧版,不推荐 |
| bge-m3 (本地) | 1024 | 优秀 | ✓ | 仅算力成本 | 开源最佳选择 |
| bge-large-zh (本地) | 1024 | 最好 | ✗ | 仅算力成本 | 纯中文场景首选 |
实际测试数据(同一批中文问答数据集):
Recall@5 指标(Top 5 检索结果中包含正确答案的比例):
bge-m3: 92.3%
text-embedding-3-large: 89.7%
text-embedding-3-small: 85.1%
text-embedding-ada-002: 78.4%
结论:
- 纯中文场景:bge-m3 > text-embedding-3-large > text-embedding-3-small
- 多语言场景:text-embedding-3-large ≈ bge-m3
- 成本优先:text-embedding-3-small(性价比最高的商业模型)
Level 3:源码与原理(5 年以上)
Dify 模型网关的完整实现
Dify 的模型网关(api/core/model_runtime/)是一个插件化架构,每个模型提供商是一个独立的插件包。
目录结构:
api/core/model_runtime/
├── model_providers/ # 各提供商实现
│ ├── openai/
│ │ ├── _assets/ # 提供商图标等资源
│ │ ├── openai.py # 提供商主类
│ │ ├── openai.yaml # 提供商配置(可用模型列表、凭据定义)
│ │ ├── llm/
│ │ │ ├── openai_llm.py # LLM 适配器实现
│ │ │ └── gpt-4o.yaml # 特定模型的参数定义
│ │ └── text_embedding/
│ │ └── openai_text_embedding.py
│ ├── anthropic/
│ │ ├── anthropic.yaml
│ │ └── llm/
│ │ └── anthropic_llm.py
│ └── ollama/
│ └── llm/
│ └── ollama_llm.py
├── entities/ # 数据实体定义
│ ├── message_entities.py # 消息格式(PromptMessage 等)
│ └── model_entities.py # 模型元数据
└── errors/ # 错误类型定义
├── invoke_error.py
└── credentials_validate_error.py
提供商 YAML 配置示例(openai.yaml 简化版):
provider: openai
label:
en_US: OpenAI
zh_Hans: OpenAI
icon_small:
en_US: icon_s_en.svg
icon_large:
en_US: icon_l_en.svg
supported_model_types:
- llm
- text-embedding
- speech2text
- tts
configurate_methods:
- predefined-model
- customizable-model
provider_credential_schema:
credential_form_schemas:
- variable: openai_api_key
label:
en_US: API Key
type: secret-input
required: true
placeholder:
en_US: Enter your OpenAI API key
- variable: openai_organization
label:
en_US: Organization
type: text-input
required: false
LLM 适配器的核心实现(openai_llm.py 关键部分):
class OpenAILargeLanguageModel(LargeLanguageModel):
def _invoke(
self,
model: str,
credentials: dict,
prompt_messages: list[PromptMessage],
model_parameters: dict,
tools: list[PromptMessageTool] | None = None,
stop: list[str] | None = None,
stream: bool = True,
user: str | None = None,
) -> LLMResult | Generator:
# 初始化 OpenAI 客户端
client = OpenAI(
api_key=credentials["openai_api_key"],
organization=credentials.get("openai_organization"),
base_url=credentials.get("openai_api_base", "https://api.openai.com/v1")
)
# 将 Dify 内部消息格式转换为 OpenAI 格式
openai_messages = self._convert_messages(prompt_messages)
# 将 Dify 工具定义转换为 OpenAI function 格式
openai_tools = self._convert_tools(tools) if tools else None
# 构建请求参数
params = {
"model": model,
"messages": openai_messages,
"stream": stream,
"temperature": model_parameters.get("temperature", 0.7),
"max_tokens": model_parameters.get("max_tokens", 4096),
}
if openai_tools:
params["tools"] = openai_tools
params["tool_choice"] = "auto"
if stop:
params["stop"] = stop
# 调用 API
if stream:
return self._handle_stream_response(client.chat.completions.create(**params))
else:
response = client.chat.completions.create(**params)
return self._handle_chat_response(response)
def _handle_stream_response(self, stream) -> Generator:
"""处理流式响应,将 OpenAI 格式转换为 Dify 内部格式"""
for chunk in stream:
if not chunk.choices:
continue
delta = chunk.choices[0].delta
if delta.content:
yield LLMResultChunk(
model=chunk.model,
prompt_messages=[],
delta=LLMResultChunkDelta(
index=0,
message=AssistantPromptMessage(content=delta.content),
finish_reason=chunk.choices[0].finish_reason
)
)
# 处理工具调用
if delta.tool_calls:
for tool_call in delta.tool_calls:
yield LLMResultChunk(
model=chunk.model,
prompt_messages=[],
delta=LLMResultChunkDelta(
index=tool_call.index,
message=AssistantPromptMessage(
tool_calls=[ToolCall(
id=tool_call.id,
type="function",
function=ToolCallFunction(
name=tool_call.function.name,
arguments=tool_call.function.arguments
)
)]
)
)
)
添加自定义模型提供商
如果你需要接入 Dify 尚未支持的模型提供商(如某个私有模型 API),可以实现一个自定义提供商:
最小可行的自定义提供商(兼容 OpenAI API 格式的模型):
# 使用 Dify 的 OpenAI-compatible 配置
# 在 Dify 界面:模型供应商 → OpenAI API compatible → 添加
# 配置参数:
# - Model Name: your-custom-model
# - API Endpoint URL: https://your-model-api.com/v1
# - API Key: your-api-key
# - Model Type: LLM
# 如果你的 API 不完全兼容 OpenAI 格式,需要实现完整的提供商:
# 1. 创建目录:api/core/model_runtime/model_providers/your_provider/
# 2. 实现 your_provider.yaml(提供商配置)
# 3. 实现 llm/your_provider_llm.py(继承 LargeLanguageModel)
# 4. 在 your_provider_llm.py 中实现 _invoke 方法
Token 计数的精确实现
Dify 在每次调用后记录 Token 使用量,用于统计和计费:
# Token 计数的实现(简化)
class TokenCounter:
def __init__(self, model: str):
self.model = model
# 对于 OpenAI 模型,使用 tiktoken 库计算 token
import tiktoken
try:
self.encoder = tiktoken.encoding_for_model(model)
except KeyError:
self.encoder = tiktoken.get_encoding("cl100k_base") # 默认编码
def count_message_tokens(self, messages: list[dict]) -> int:
"""计算消息列表的 token 数"""
num_tokens = 0
for message in messages:
num_tokens += 4 # 每条消息的固定开销
for key, value in message.items():
if isinstance(value, str):
num_tokens += len(self.encoder.encode(value))
num_tokens += 2 # 对话结束标记
return num_tokens
关键细节:对于不同提供商,Token 计数方式不同:
- OpenAI:使用
tiktoken精确计算(BPE 算法) - Claude:使用 Anthropic 的 tokenizer(与 OpenAI 略有差异)
- 本地模型:取决于具体模型使用的 tokenizer
Level 4:生产陷阱与决策(专家视角)
陷阱 1:上下文长度的隐性限制
很多人以为 GPT-4o 有 128K 上下文就可以放心传很长的文档,但实际上有两个隐性限制:
限制 1:价格与上下文长度成正比
128K tokens 的输入价格:
128,000 × $5 / 1,000,000 = $0.64 / 次
如果每天处理 1000 个这样的请求:$640/天 = $19,200/月
限制 2:模型在超长上下文下的注意力衰减
研究表明(Lost in the Middle, Liu et al. 2023),当关键信息位于长上下文的中间部分时,LLM 的检索准确率显著下降。这就是为什么 RAG(将文档切成小块检索)比直接放整个文档效果更好的核心原因之一。
实际建议:
- 不要因为模型支持 128K 就把整个文档塞进去
- 知识库 + RAG 是处理长文档的正确方式
- 如果必须处理超长文档,考虑"分段处理 + 结果合并"的工作流
陷阱 2:中文 Token 效率问题
中文的 Token 效率低于英文,这在高并发场景下会显著影响成本。
同等含义的文本,中文 Token 数 ≈ 英文 Token 数 × 1.3-1.8
原因:
- GPT 的 tokenizer(BPE)是基于英文训练的
- 中文字符无法被分割为子词,每个字通常占 1 个 token
- 而英文常用单词如 "the" "is" 只占 1 个 token,但包含更多信息
实际影响:
- 同样的产品文档,中文版比英文版消耗约 1.5 倍的 token
- 对于纯中文应用,使用中文优化的 Embedding 模型(如 bge-m3)更高效
解决方案:对于数据量大的场景,考虑使用本地 Embedding 模型(bge-m3)+ 商业 LLM 的组合,既保证检索质量,又避免 Embedding 费用。
陷阱 3:API Key 安全管理
在生产环境中,API Key 的管理是安全的关键。常见错误:
错误做法:
# 危险!API Key 硬编码在代码中
API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# 危险!API Key 存在 .env 文件但被提交到 Git
# .gitignore 忘记添加 .env
正确做法:
# 1. 使用环境变量
import os
API_KEY = os.environ.get("DIFY_API_KEY")
if not API_KEY:
raise ValueError("DIFY_API_KEY environment variable not set")
# 2. 在 Dify 自托管版本中,通过 .env 文件注入(不提交到 Git)
# .gitignore 必须包含 .env
# 3. 生产环境使用 Secret 管理服务
# AWS Secrets Manager, HashiCorp Vault, Kubernetes Secrets 等
# 4. 定期轮换 API Key
# 建议每 90 天轮换一次,发现泄露立即撤销
监控 API Key 使用异常:
# OpenAI 的使用监控 API
curl -H "Authorization: Bearer $OPENAI_KEY" \
"https://api.openai.com/dashboard/billing/usage?start_date=2024-01-01&end_date=2024-01-31"
# 配置告警:当单日消费超过阈值时发邮件通知
模型选型决策树
面对新项目,用这个决策树快速确定模型配置:
问题 1:数据能否离开本地?
├── 不能(合规要求)→ 本地模型(Ollama + Llama/Qwen)
└── 可以 → 问题 2
问题 2:主要任务是什么?
├── 中文知识问答 → Qwen2.5-72B(中文最强)或 GPT-4o
├── 代码生成 → Claude 3.5 Sonnet(代码任务领先)
├── 长文档分析 → Claude 3.5 Sonnet(200K 上下文)
├── 图像理解 → GPT-4o 或 Gemini 1.5 Pro
└── 通用任务 → GPT-4o 或 Claude 3.5 Sonnet
问题 3:日调用量多少?
├── < 1000 次 → 随便选,成本差异不显著
├── 1000-10000 次 → 考虑 gpt-4o-mini 或 Claude 3 Haiku
└── > 10000 次 → 必须做成本优化,考虑分层路由
问题 4:预算是多少?
├── < $100/月 → gpt-4o-mini 或本地模型
├── $100-500/月 → GPT-4o 或 Claude 3.5 Sonnet,控制好用量
└── 不限 → 按质量选,不同任务用最适合的模型
本章小结
模型接入不只是"填一个 API Key"这么简单。生产级的模型管理需要考虑能力匹配、成本控制、限速处理、安全管理等多个维度。
核心要点:
- 模型分层:不同复杂度的任务用不同的模型,10 倍的成本差异意味着 10 倍的利润空间
- 中文场景优先考虑 bge-m3:作为 Embedding 模型,bge-m3 在中文检索上比 OpenAI 的 Embedding 效果更好
- 本地模型的价值:数据合规不是唯一理由,大规模部署时本地模型的总成本可能远低于云模型
- Rate Limit 是生产的必修课:提前了解各提供商的限制,在应用层做好队列和退避处理
- API Key 安全:生产环境必须使用 Secret 管理服务,绝不硬编码
下一章将深入 RAG 的核心原理:向量检索、全文检索、混合检索的机制对比,以及如何在 Dify 中配置出最优的检索效果。