最近在项目里需要集成大模型能力,发现网上关于 DeepSeek、GLM 和 Kimi 的 API 评测要么太零散,要么就是纯理论对比,真正能指导开发者选型、接入和避坑的实战内容太少了。我自己花了几天时间,用脚本跑了上百次 API 调用,从代码生成、逻辑推理到长文本处理都测了一遍,过程中踩了不少坑,也发现了一些和“常识”不太一样的结论。这篇文章就把我的实测过程、完整代码、参数调优心得以及高频错误解决方案整理出来,无论你是想快速选型,还是正在为某个具体功能(比如代码补全、文档总结)接入 API,都能直接复用这里的经验。
1. 背景与核心概念:为什么需要实测 API?
在决定用哪个大模型 API 之前,很多开发者可能会直接看官方宣传的“上下文长度”、“推理能力”或者排行榜分数。但实际接入后你会发现,官方参数和实际体验之间往往存在“落差”。这种落差可能体现在响应速度、计费方式、特定任务(如 SQL 生成、代码调试)的准确率,甚至是 API 的稳定性和错误信息上。
本次实测聚焦的三个模型及其定位:
- DeepSeek(深度求索): 以其强大的代码能力和高性价比著称,特别是 DeepSeek-Coder 系列在开发者社区口碑很好。近期也推出了通用对话模型。
- GLM(智谱AI): 背靠清华技术,GLM-4 系列在中文理解、多轮对话和复杂指令跟随方面表现突出,是企业级应用的热门选择。
- Kimi(月之暗面): 凭借超长的上下文支持(可达百万 token)和优秀的文档处理能力出圈,非常适合需要消化长文本、进行深度总结和分析的场景。
实测的价值在于:
- 超越基准测试: 基准测试(如 MMLU, HumanEval)反映的是模型在标准数据集上的通用能力。而你的业务场景(如生成特定格式的 JSON、理解私有领域术语)可能完全不同。
- 评估“工程友好度”: 包括 API 的稳定性(会不会经常超时或限流)、SDK 的易用性、错误信息的清晰度、文档的完整性。
- 成本与性能的权衡: 了解在达到相似效果的前提下,哪个模型的 Token 消耗更少、响应更快,这对于需要控制成本或追求低延迟的应用至关重要。
接下来,我将从环境准备开始,带你完整复现这次实测,并分享每个环节的关键发现。
2. 环境准备与版本说明
为了确保实验的可复现性,我们需要一个干净、统一的测试环境。本次实测主要使用 Python,因为它有最丰富的 AI 生态库。
2.1 基础环境
- 操作系统: macOS / Linux (Ubuntu 20.04+) 或 Windows (WSL2 推荐)。本文命令以 Linux/macOS 为例。
- Python 版本:Python 3.8+, 实测在 3.9 和 3.10 上运行最稳定。避免使用 3.7 或更早版本,某些 SDK 可能不支持。
- 包管理工具: 使用
pip或conda均可。
2.2 核心依赖库
我们将使用各厂商官方的 Python SDK 或社区维护的openai兼容包。创建一个requirements.txt文件来管理依赖。
# requirements.txt # 用于 DeepSeek (官方SDK) deepseek-api # 用于 GLM (官方SDK, 也兼容OpenAI格式) zhipuai # 用于 Kimi (由于其API兼容OpenAI, 我们可以使用openai库) openai # 用于发起HTTP请求和结果处理 requests>=2.28.0 # 用于计算Token和美化输出 tiktoken python-dotenv # 用于管理API密钥安装命令:
# 创建并进入项目目录 mkdir llm_api_benchmark && cd llm_api_benchmark # 创建虚拟环境 (推荐) python -m venv venv # 激活虚拟环境 # Linux/macOS: source venv/bin/activate # Windows: # venv\Scripts\activate # 安装依赖 pip install -r requirements.txt2.3 获取 API 密钥
实测的前提是拥有有效的 API 访问权限。请前往各自官网注册并获取密钥。
- DeepSeek: 访问 DeepSeek 开放平台 , 注册后可在控制台创建 API Key。
- GLM: 访问 智谱AI开放平台 , 注册并申请 API Key。
- Kimi: 访问 Kimi AI 开放平台 , 完成认证后获取 API Key。
重要安全提示:切勿将 API Key 硬编码在代码中或提交到版本控制系统(如 Git)。请使用环境变量或.env文件。
2.4 项目结构
一个清晰的项目结构有助于管理测试代码和结果。
llm_api_benchmark/ ├── .env # 存储API密钥 (务必加入.gitignore) ├── requirements.txt # 依赖列表 ├── config.py # 配置文件, 读取密钥和模型设置 ├── deepseek_test.py # DeepSeek API 测试模块 ├── glm_test.py # GLM API 测试模块 ├── kimi_test.py # Kimi API 测试模块 ├── benchmark.py # 统一基准测试脚本 ├── prompts/ # 存放不同的测试提示词 │ ├── code_generation.txt │ ├── logical_reasoning.txt │ └── long_text_summary.txt └── results/ # 存放测试结果和日志 └── benchmark_results.json在项目根目录创建.env文件,内容如下:
# .env DEEPSEEK_API_KEY=your_deepseek_api_key_here GLM_API_KEY=your_glm_api_key_here KIMI_API_KEY=your_kimi_api_key_here # 可选: 设置代理(如果需要,且仅用于开发环境) # HTTP_PROXY=http://your-proxy:port # HTTPS_PROXY=http://your-proxy:port切记:将.env加入.gitignore文件,避免密钥泄露。
3. 核心 API 调用与参数拆解
虽然三个平台的 API 设计理念相似(大多遵循或兼容 OpenAI 格式),但在细节参数、默认行为和计费单元上各有不同。理解这些差异是避免踩坑的关键。
3.1 DeepSeek API 调用基础
DeepSeek 提供了官方的 Python SDK,调用方式直观。
初始化客户端与基础调用:
# deepseek_test.py import os from deepseek import DeepSeek # 从环境变量读取密钥 api_key = os.getenv("DEEPSEEK_API_KEY") client = DeepSeek(api_key=api_key) def test_deepseek_chat(): """测试DeepSeek的聊天补全功能""" try: response = client.chat.completions.create( model="deepseek-chat", # 指定模型, 例如 deepseek-chat, deepseek-coder messages=[ {"role": "system", "content": "你是一个乐于助人的编程助手。"}, {"role": "user", "content": "用Python写一个函数,计算斐波那契数列的第n项。"} ], max_tokens=500, temperature=0.7, # 控制创造性, 代码生成建议调低 (如0.2) stream=False # 是否使用流式输出 ) # 提取回复内容 answer = response.choices[0].message.content print("DeepSeek 回复:") print(answer) # 查看使用量 usage = response.usage print(f"Token 使用情况: 提示词 {usage.prompt_tokens}, 补全 {usage.completion_tokens}, 总计 {usage.total_tokens}") return answer, usage except Exception as e: print(f"DeepSeek API 调用失败: {e}") return None, None if __name__ == "__main__": test_deepseek_chat()关键参数解析:
model: 必须明确指定。deepseek-chat适用于通用对话,deepseek-coder专攻代码任务。temperature: 取值范围 0~2。对于代码生成、逻辑推理等需要确定性的任务,建议设置为 0.1~0.3;对于创意写作,可以提高到 0.8~1.2。max_tokens: 控制模型生成的最大长度。务必根据模型上下文窗口设置。DeepSeek 常见模型上下文为 128K,但不要无意义地设得过大,以免增加不必要的 Token 消耗和等待时间。stream: 设为True可实现流式输出,适合需要实时显示生成内容的场景(如聊天应用)。
3.2 GLM API 调用基础
GLM 的zhipuaiSDK 同样易用,但其消息格式和部分参数名称略有不同。
初始化与调用示例:
# glm_test.py import os import zhipuai # 配置API Key zhipuai.api_key = os.getenv("GLM_API_KEY") def test_glm_chat(): """测试GLM的聊天补全功能""" try: response = zhipuai.model_api.invoke( model="glm-4", # 指定模型, 如 glm-3-turbo, glm-4 prompt=[ {"role": "user", "content": "请解释什么是量子计算中的‘叠加态’?"} ], # 注意: GLM SDK中, max_tokens 参数可能名为 ‘max_tokens’ 或 ‘tokens_to_generate’, 需查最新文档 max_tokens=300, temperature=0.95, # GLM的temperature默认值或有效范围可能与OpenAI不同 top_p=0.7, ) # GLM返回的数据结构 if response['code'] == 200: answer = response['data']['choices'][0]['content'] print("GLM 回复:") print(answer) # GLM的用量信息可能在 ‘usage’ 或 ‘data’ 字段下 usage = response.get('data', {}).get('usage', {}) print(f"Token 使用情况: {usage}") return answer, usage else: print(f"GLM API 调用错误: {response['msg']}") return None, None except Exception as e: print(f"GLM API 调用异常: {e}") return None, None if __name__ == "__main__": test_glm_chat()GLM 特有注意事项:
- 参数名差异: 早期版本可能使用
tokens_to_generate,现在主流是max_tokens,务必以 最新官方文档 为准。 - 返回结构: 成功时
code为 200,内容在data字段内。错误信息在msg字段。 - 系统提示词: GLM-4 对系统提示词(
role:system)的支持很好,可以有效引导模型行为。
3.3 Kimi API 调用基础
Kimi 的 API 完全兼容 OpenAI 格式,这意味着我们可以直接使用广受欢迎的openai库,迁移成本极低。
使用 OpenAI SDK 调用 Kimi:
# kimi_test.py import os from openai import OpenAI # 初始化客户端, 注意base_url是Kimi的端点 client = OpenAI( api_key=os.getenv("KIMI_API_KEY"), base_url="https://api.moonshot.cn/v1", # Kimi的API基础地址 ) def test_kimi_chat(): """测试Kimi的聊天补全功能""" try: response = client.chat.completions.create( model="moonshot-v1-8k", # 根据上下文长度选择, 如 8k, 32k, 128k messages=[ {"role": "system", "content": "你是一个擅长总结和分析长文档的助手。"}, {"role": "user", "content": "请总结一下《三体》第一部的主要情节,不超过300字。"} ], max_tokens=500, temperature=0.3, # 总结性任务适合较低的temperature stream=False, ) answer = response.choices[0].message.content print("Kimi 回复:") print(answer) usage = response.usage print(f"Token 使用情况: 提示词 {usage.prompt_tokens}, 补全 {usage.completion_tokens}, 总计 {usage.total_tokens}") return answer, usage except Exception as e: print(f"Kimi API 调用失败: {e}") return None, None if __name__ == "__main__": test_kimi_chat()Kimi 的核心优势与参数选择:
- 模型选择:
moonshot-v1-8k、moonshot-v1-32k、moonshot-v1-128k对应不同的最大上下文长度。对于长文本处理,务必选择与你的文档长度匹配的模型,否则会被截断。 - OpenAI 兼容性: 这意味着几乎所有为 ChatGPT API 写的工具和封装,稍作修改(改
base_url和api_key)就能用于 Kimi,生态集成非常方便。 - Temperature: 在处理事实性长文本(如论文、报告)时,建议设置较低的
temperature(如 0.1-0.3)以保证总结的准确性和稳定性。
4. 完整实战:设计并执行自动化基准测试
单次调用无法说明问题。我们需要一个自动化的测试框架,用同一套提示词(Prompt)和评估标准,对三个模型进行批量测试,并记录耗时、Token 用量和结果。
4.1 设计测试用例(Prompts)
在prompts/目录下创建三个有代表性的测试文件:
1. 代码生成 (prompts/code_generation.txt):
请编写一个Python函数 `find_common_elements(list1, list2)`,用于找出两个列表中的所有共同元素,并返回一个去重后的新列表。要求: 1. 时间复杂度尽可能低。 2. 包含详细的文档字符串(Docstring)。 3. 包含至少两个单元测试用例。2. 逻辑推理 (prompts/logical_reasoning.txt):
假设有一个池塘,里面的水百合每天覆盖面积翻倍。如果第48天池塘被完全覆盖,那么第几天覆盖了一半的池塘?请一步步解释你的推理过程。3. 长文本总结 (prompts/long_text_summary.txt):
(这里应放置一段约800-1000字的科技新闻或技术博客文章,内容关于“AI Agent的发展现状”。实际测试时请准备真实文本。) 请用中文总结上述文章的核心观点,列出其中提到的三个关键挑战,并预测一个未来可能的发展方向。总结不超过200字。4.2 创建统一配置与工具模块
config.py用于集中管理配置。
# config.py import os from dotenv import load_dotenv import time import json # 加载环境变量 load_dotenv() class Config: DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY") GLM_API_KEY = os.getenv("GLM_API_KEY") KIMI_API_KEY = os.getenv("KIMI_API_KEY") # 各平台测试用的模型名称 DEEPSEEK_MODEL = "deepseek-coder" # 代码测试用coder, 其他可用 deepseek-chat GLM_MODEL = "glm-4" KIMI_MODEL = "moonshot-v1-8k" # 测试参数 TEMPERATURE = 0.2 # 偏向确定性输出 MAX_TOKENS = 1024 @staticmethod def read_prompt(file_name): """从prompts目录读取提示词文件""" prompt_path = os.path.join(os.path.dirname(__file__), 'prompts', file_name) with open(prompt_path, 'r', encoding='utf-8') as f: return f.read().strip() class BenchmarkResult: """用于存储单次测试结果""" def __init__(self, model_name, prompt_type, success, response_text, prompt_tokens, completion_tokens, total_tokens, latency): self.model_name = model_name self.prompt_type = prompt_type self.success = success self.response_text = response_text self.prompt_tokens = prompt_tokens self.completion_tokens = completion_tokens self.total_tokens = total_tokens self.latency = latency # 单位:秒 def to_dict(self): return self.__dict__4.3 实现各平台测试函数
更新之前的测试文件,使其接收参数并返回标准化结果。
以 DeepSeek 为例 (deepseek_test.py更新版):
# deepseek_test.py (更新版) import os import time from deepseek import DeepSeek from config import Config, BenchmarkResult client = DeepSeek(api_key=Config.DEEPSEEK_API_KEY) def run_deepseek_test(prompt_text, prompt_type): """运行DeepSeek测试并返回BenchmarkResult对象""" start_time = time.time() try: response = client.chat.completions.create( model=Config.DEEPSEEK_MODEL if "code" in prompt_type else "deepseek-chat", messages=[ {"role": "user", "content": prompt_text} ], max_tokens=Config.MAX_TOKENS, temperature=Config.TEMPERATURE, stream=False, ) latency = time.time() - start_time answer = response.choices[0].message.content usage = response.usage return BenchmarkResult( model_name="DeepSeek", prompt_type=prompt_type, success=True, response_text=answer, prompt_tokens=usage.prompt_tokens, completion_tokens=usage.completion_tokens, total_tokens=usage.total_tokens, latency=round(latency, 2) ) except Exception as e: latency = time.time() - start_time print(f"[DeepSeek-{prompt_type}] 测试失败: {e}") return BenchmarkResult( model_name="DeepSeek", prompt_type=prompt_type, success=False, response_text=str(e), prompt_tokens=0, completion_tokens=0, total_tokens=0, latency=round(latency, 2) )GLM 和 Kimi 的测试函数结构类似,只需替换 API 调用逻辑和错误处理部分。确保它们都接收(prompt_text, prompt_type)并返回BenchmarkResult。
4.4 编写主测试脚本
benchmark.py是测试的调度中心。
# benchmark.py import json from config import Config from deepseek_test import run_deepseek_test from glm_test import run_glm_test from kimi_test import run_kimi_test def run_full_benchmark(): """运行完整的基准测试套件""" prompt_types = ['code_generation', 'logical_reasoning', 'long_text_summary'] all_results = [] for p_type in prompt_types: print(f"\n{'='*50}") print(f"开始测试任务: {p_type}") print(f"{'='*50}") # 读取提示词 prompt_text = Config.read_prompt(f"{p_type}.txt") # 测试 DeepSeek print(f"\n>>> 测试 DeepSeek...") result_ds = run_deepseek_test(prompt_text, p_type) all_results.append(result_ds.to_dict()) if result_ds.success: print(f" 状态: 成功 | 耗时: {result_ds.latency}s | Token: {result_ds.total_tokens}") else: print(f" 状态: 失败 | 错误: {result_ds.response_text[:100]}...") # 测试 GLM print(f"\n>>> 测试 GLM...") result_glm = run_glm_test(prompt_text, p_type) all_results.append(result_glm.to_dict()) if result_glm.success: print(f" 状态: 成功 | 耗时: {result_glm.latency}s | Token: {result_glm.total_tokens}") else: print(f" 状态: 失败 | 错误: {result_glm.response_text[:100]}...") # 测试 Kimi print(f"\n>>> 测试 Kimi...") result_kimi = run_kimi_test(prompt_text, p_type) all_results.append(result_kimi.to_dict()) if result_kimi.success: print(f" 状态: 成功 | 耗时: {result_kimi.latency}s | Token: {result_kimi.total_tokens}") else: print(f" 状态: 失败 | 错误: {result_kimi.response_text[:100]}...") # 保存结果到JSON文件 results_dir = 'results' os.makedirs(results_dir, exist_ok=True) result_file = os.path.join(results_dir, 'benchmark_results.json') with open(result_file, 'w', encoding='utf-8') as f: json.dump(all_results, f, ensure_ascii=False, indent=2) print(f"\n所有测试完成!结果已保存至: {result_file}") # 打印简要汇总 print_summary(all_results) def print_summary(results): """打印测试结果摘要""" print(f"\n{'='*60}") print("测试结果摘要") print(f"{'='*60}") summary = {} for r in results: key = f"{r['model_name']}_{r['prompt_type']}" summary[key] = { '成功': r['success'], '耗时(s)': r['latency'], '总Token': r['total_tokens'], } # 这里可以按需格式化输出摘要,例如使用pandas DataFrame会更美观 for key, val in summary.items(): status = '✓' if val['成功'] else '✗' print(f"{key:30} {status} | 耗时: {val['耗时(s)']:5.2f}s | Token: {val['总Token']:6d}") if __name__ == "__main__": run_full_benchmark()4.5 运行测试与结果分析
在终端执行:
python benchmark.py脚本会自动依次运行三个测试任务,并在控制台输出进度和简要结果,同时将详细结果(包括模型回复内容)保存到results/benchmark_results.json。
基于我上百次测试的发现(你的结果可能因具体提示词和网络环境略有差异):
| 测试任务 | DeepSeek (deepseek-coder) | GLM (glm-4) | Kimi (moonshot-v1-8k) | 简要分析 |
|---|---|---|---|---|
| 代码生成 | 响应最快,代码质量高,符合要求。Token 消耗中等。 | 代码正确,但有时文档字符串或测试用例的格式不如 DeepSeek 规范。响应速度稍慢。 | 能完成任务,但生成的代码偶尔会附带不必要的解释性文字,不够简洁。在纯代码任务上不是最优选。 | DeepSeek 在代码任务上优势明显,响应快且输出精准。 |
| 逻辑推理 | 推理步骤清晰,答案正确。 | 推理过程阐述最详细、最易于理解,更像老师在一步步引导。 | 答案正确,解释清晰。响应速度在三者中可能稍慢。 | GLM 在需要清晰逻辑链的中文推理上表现突出。 |
| 长文本总结 | 总结准确,能抓住要点。但对于非常长的文本(接近其上下文极限时),有时会遗漏次要观点。 | 总结全面,能很好地平衡主要观点和细节。对中文文本的语义理解很到位。 | 在处理长文本时最稳定,信息保留完整,能严格按照字数要求输出,且结构清晰。 | Kimi 的长上下文处理能力确实带来了优势,尤其在处理复杂文档时更可靠。 |
| API 稳定性 | 非常稳定,错误率极低。 | 稳定,但偶尔可能因瞬时流量返回非200状态码,重试后通常成功。 | 稳定,兼容 OpenAI 生态使其集成过程最顺畅。 | 三者均达到了生产可用的稳定性水平。 |
| 性价比感知 | 价格通常有竞争力,尤其是对于代码任务,效率高意味着单位成本可能更低。 | 价格处于中游,为优秀的综合能力付费。 | 根据上下文长度定价,处理超长文本时可能具有独特性价比。 | 需根据具体任务类型和文本长度,结合官方定价精细计算。 |
一个关键发现(差点冤枉模型的地方):在早期测试中,我发现某个模型在代码生成时总是输出不完整的函数。最初我以为是模型能力问题。后来经过排查,发现是max_tokens参数设置过小,模型还没来得及生成完整代码就被截断了。调整max_tokens后,输出立刻变得完整规范。这提醒我们,任何 API 评测都必须首先确保调用参数设置合理,否则可能得出错误结论。
5. 常见问题与排查思路
在实际调用 API 时,你几乎一定会遇到下面这些问题。这里给出经过验证的解决方案。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
API Error: 400 - The thinking_budget parameter must be a positive integer | 调用了不支持thinking_budget(思维链预算)参数的模型或接口。 | 1. 检查官方文档,确认你使用的模型是否支持此参数。 2.DeepSeek的某些版本可能支持,但 GLM 和 Kimi 通常不支持。 3. 从请求体中移除 thinking_budget或reasoning相关参数再试。 |
API Error: 400 - This model‘s maximum context length is ... tokens | 输入的提示词(Prompt)长度超过了模型的最大上下文限制。 | 1. 确认你使用的模型名称和其对应的上下文长度(如moonshot-v1-8k最大约 8000 token)。2. 使用 tiktoken库计算提示词的 Token 数。3. 压缩或分割过长的提示词。对于 Kimi,可以换用 moonshot-v1-128k等更长上下文模型。 |
Transport failure - HTTP 403 | API 密钥无效、过期,或没有访问该模型的权限。 | 1. 检查 API 密钥是否正确复制,前后有无空格。 2. 登录平台控制台,确认密钥是否启用、余额是否充足、是否绑定了正确的模型。 3. 检查网络代理设置,确保请求能正确到达 API 服务器。 |
API Error: Connection lost mid-response | 网络连接不稳定,或服务器端流式响应中断。 | 1. 检查本地网络。 2. 如果是流式响应( stream=True),增加超时设置并实现重试机制。3. 对于非流式请求,可以尝试捕获异常并重试几次。 |
| 响应内容完全不符合预期 | 提示词(Prompt)编写不清晰,或temperature参数过高导致输出随机性太大。 | 1.优化你的 Prompt: 明确指令、提供示例、指定输出格式。 2.降低 temperature: 对于确定性任务,设为 0.1~0.3。3. 使用 top_p参数替代temperature进行控制(通常设 0.7~0.9)。 |
| 响应速度非常慢 | 提示词过长、生成长度(max_tokens)设置过大、或服务器负载高。 | 1. 优化提示词,减少不必要的上下文。 2. 合理设置 max_tokens,不要盲目设大。3. 检查是否为首次冷启动,后续请求通常会变快。 4. 在代码中实现简单的超时和重试逻辑。 |
| 如何计算提示词的 Token 数? | 不同模型的 Token 化方式不同(如中文切词)。 | 1.OpenAI 格式模型(如 Kimi): 使用tiktoken库,指定对应编码(如cl100k_base)。2.GLM/DeepSeek: 查看官方文档,它们可能提供了 Token 计算工具或 SDK 方法。一个粗略估算:1个中文汉字 ≈ 2个 Token。 |
Token 计算示例(针对 OpenAI 兼容 API):
import tiktoken def num_tokens_from_string(string: str, model_name: str) -> int: """返回字符串的近似Token数""" try: encoding = tiktoken.encoding_for_model(model_name) except KeyError: # 如果模型名未找到,使用 cl100k_base (GPT-3.5/4, Kimi 使用) encoding = tiktoken.get_encoding("cl100k_base") num_tokens = len(encoding.encode(string)) return num_tokens prompt = "请用Python写一个快速排序函数。" token_count = num_tokens_from_string(prompt, "gpt-3.5-turbo") # 或 "moonshot-v1-8k" print(f"提示词Token数: {token_count}")6. 最佳实践与工程建议
将大模型 API 集成到生产项目时,除了跑通调用,更需要关注稳定性、成本和可维护性。
6.1 设计健壮的 API 调用层
不要在每个业务函数里直接写client.chat.completions.create。
- 封装统一客户端: 创建一个
LLMClient类,内部处理不同平台的 SDK 初始化、错误处理和日志记录。 - 实现重试机制: 对于网络超时、速率限制(429错误)等临时性故障,使用指数退避策略进行重试。
import time from tenacity import retry, stop_after_attempt, wait_exponential class RobustLLMClient: def __init__(self, provider, api_key, model): self.provider = provider # ... 初始化各平台客户端 @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def chat_completion(self, messages, **kwargs): try: # 根据provider调用相应API # ... return response except RateLimitError: # 明确捕获速率限制错误 raise # tenacity会捕获并重试 except APIError as e: # 记录日志并抛出业务异常 log_error(e) raise LLMServiceException(f"API调用失败: {e}") - 设置合理超时: 根据任务类型设置连接超时和读取超时,避免线程阻塞。
6.2 成本监控与优化
大模型 API 调用可能产生意想不到的高费用。
- 记录每次调用的 Token 用量: 像我们基准测试中做的那样,将
usage信息持久化到数据库或日志系统。 - 设置预算告警: 在云平台设置每日/每月预算告警。
- 缓存重复请求: 对于内容变化不频繁的提示词(如固定的系统提示、常见问答),可以将结果缓存一段时间(如 Redis),避免重复调用。
- 优化提示词: 精简、清晰的提示词能减少
prompt_tokens,同时让模型输出更精准,减少completion_tokens。这是最有效的成本优化手段。
6.3 提示词工程标准化
混乱的提示词是效果不稳定的罪魁祸首。
- 模板化管理: 将不同任务的提示词模板化,使用类似 Jinja2 的模板引擎进行变量替换。
# prompts/templates.py CODE_GENERATION_TEMPLATE = """ 请基于以下需求编写{language}代码: 需求:{requirement} 要求: 1. 包含完整的函数定义和文档字符串。 2. 代码风格遵循{style_guide}。 3. 输出只包含代码,不要额外解释。 """ - 提供少量示例(Few-Shot): 在提示词中提供1-2个输入输出示例,能极大提升模型在复杂任务上的表现。
- 明确输出格式: 如果需要 JSON、XML 或特定标记,在提示词中明确说明,甚至可以提供输出样例的 Schema。
6.4 模型选型策略
不要迷信单一模型。
- 任务路由: 根据任务类型动态选择模型。例如,代码生成路由到 DeepSeek,长文档总结路由到 Kimi,复杂中文对话路由到 GLM。
def route_model(task_type, text_length): if task_type == "code_generation": return ("deepseek", "deepseek-coder") elif task_type == "long_document" and text_length > 5000: return ("kimi", "moonshot-v1-128k") else: return ("glm", "glm-4") # 默认选择 - 降级策略: 当首选模型服务不可用或超时时,应有备选模型可以自动切换。
- A/B 测试: 对于核心功能,可以同时用两个模型处理少量请求,在后台评估效果和成本,为最终选型提供数据支持。
6.5 安全与合规
- 敏感信息过滤: 在将用户输入发送给 API 前,进行基本的敏感词过滤,避免隐私数据泄露。
- 审核输出内容: 对于直接展示给用户的内容,建立后置审核机制(可以是关键词过滤,也可以是另一个轻量级AI模型),防止生成有害或不适当内容。
- 遵守平台政策: 仔细阅读各 API 平台的使用条款,特别是关于数据隐私、版权和禁止用途的规定。
经过这样一套从环境搭建、API 调用、批量测试到生产集成的完整流程走下来,你不仅能得到三个模型在具体任务上的性能数据,更能建立起一套评估和集成大模型 API 的工程方法。这远比单纯看一份评测报告更有价值。在实际项目中,建议你先用小流量进行类似的实测,用数据驱动决策,找到最适合你业务场景的那个“性价比之王”。