用同一组带单元测试的编程题对比 deepseek-v3.2、qwen-3-32b、llama-3.3-70b、kimi-k2.6 的通过率。
我写了一个小型的 Python 测试套件,向四个不同的 Oxlo.ai 模型发送同一个编程任务,然后自动检查哪些模型能通过一组单元测试。这样在选择内部代码生成工具的模型时就不用靠猜了。
依赖:
pip install openai
需要一个 Oxlo.ai API key,从 https://portal.oxlo.ai 获取。
首先实例化一个指向 Oxlo.ai 的 OpenAI 兼容客户端。由于 Oxlo.ai 采用按请求计费的扁平定价方式,用同样的长 prompt 调用四个模型的单次成本相同,不受输入大小影响。然后列出要对比的模型 slug。
from openai import OpenAI
client = OpenAI(base_url="https://api.oxlo.ai/v1", api_key="YOUR_OXLO_API_KEY")
MODELS = [
"deepseek-v3.2",
"qwen-3-32b",
"llama-3.3-70b",
"kimi-k2.6",
]
我用严格的 system prompt,让模型以可预期的格式返回代码。user prompt 是一个带边界情况的美帝电话号码规范化函数,适合自动测试。
SYSTEM_PROMPT = """You are an expert Python engineer.
Write clean, production-ready code with type hints and docstrings.
Include error handling for edge cases.
Output only the Python code inside a markdown code block, followed by a brief explanation."""
USER_PROMPT = """Write a Python function normalize_phone_number(phone: str) -> str that converts
various US phone formats into E.164 (+1XXXXXXXXXX).
Raise ValueError for empty strings, non-digits (except an optional leading +1), or invalid lengths.
Do not write a main block or unit tests."""
这个辅助函数发起请求并记录往返耗时。我把 temperature 设得很低,因为我想要确定性的代码,而不是有创意的变体。
import time
def run_coding_task(model_id: str, system: str, user: str):
start = time.time()
response = client.chat.completions.create(
model=model_id,
messages=[
{"role": "system", "content": system},
{"role": "user", "content": user},
],
temperature=0.2,
)
latency = time.time() - start
content = response.choices[0].message.content
return content, latency
模型通常会把代码包裹在 markdown 围栏里。这个辅助函数把原始 Python 抽出来,以便在干净的名字空间中安全地 exec。
import re
def extract_python_code(text: str) -> str:
pattern = r"
```python\s*(.*?)```
"
match = re.search(pattern, text, re.DOTALL)
if match:
return match.group(1).strip()
return text.strip()
我定义了六个测试用例,覆盖正常流程和预期的异常情况。评测器自身不 import 任何东西,只是运行生成的函数并统计通过或失败的结果。
TEST_CASES = [
("(555) 123-4567", "+15551234567"),
("555.123.4567", "+15551234567"),
("+1 555 123 4567", "+15551234567"),
("5551234567", "+15551234567"),
("", None),
("123", None),
]
def evaluate_model(model_id: str, code: str):
namespace = {}
try:
exec(code, namespace)
func = namespace.get("normalize_phone_number")
if not func:
return "FAIL: function not found in output"
except Exception as e:
return f"FAIL: exec error - {e}"
passed = 0
failed = 0
for inp, expected in TEST_CASES:
try:
result = func(inp)
if expected is None:
failed += 1
elif result == expected:
passed += 1
else:
failed += 1
except ValueError:
if expected is None:
passed += 1
else:
failed += 1
except Exception:
failed += 1
return f"PASS={passed} FAIL={failed}"
把全部内容保存到 compare_models.py,替换 YOUR_OXLO_API_KEY,然后运行。应该能看到每个模型生成一个解法,测试运行器报告通过和失败的数量。以下是我机器上的输出。
$ python compare_models.py
Running deepseek-v3.2 ...
PASS=6 FAIL=0
Running qwen-3-32b ...
PASS=6 FAIL=0
Running llama-3.3-70b ...
PASS=6 FAIL=0
Running kimi-k2.6 ...
PASS=6 FAIL=0
结果会因模型更新和 temperature 设置而异。如果某个模型失败了,检查原始输出,看它是忽略了 system prompt 的格式要求还是没有处理某个边界情况。
两个具体的下一步方向。第一,把这个测试套件接入 GitHub Action,在 Oxlo.ai 向目录添加新模型时对自身代码库做回归测试。第二,换入专门的模型如 Qwen 3 Coder 或 DeepSeek R1,看看以推理为重点的权重在同样的任务上表现如何。可以在 https://oxlo.ai/pricing 了解长 prompt 的扁平按请求计费方案。