资讯动态

基于大模型API的自动化评测系统:DeepSeek出题考豆包实践

发布时间:2026/8/4 12:19:13 来源:尧图企业网站定制
这次我们来看一个很有意思的技术实践如何让 DeepSeek 出题去考豆包。这不是一个现成的开源项目而是一个基于两个主流 AI 大模型 API 的自动化评测思路。核心是利用 DeepSeek 强大的逻辑和生成能力来设计测试题目然后调用豆包的 API 来回答问题最后再由 DeepSeek 进行评分和反馈形成一个自动化的“出题-答题-判卷”闭环。对于开发者、AI 应用测试者或者对模型能力对比感兴趣的人来说这个方案的价值在于它提供了一种低成本、可编程、可批量执行的模型能力评估方法。你不需要手动设计成千上万的问题也不需要人工去评判答案的好坏。整个过程完全自动化可以快速验证不同模型在特定领域如编程、逻辑、常识、创作上的表现差异。本文将带你从零构建这个自动化评测系统。我们会重点讲清楚几个关键点如何申请和配置 DeepSeek 与豆包的 API 密钥如何设计一个稳定的、支持批量任务的 Python 脚本架构如何定义合理的出题、答题、评分流程以及如何观察和分析评测结果。整个过程对硬件几乎没有门槛主要依赖网络和 API 调用适合在普通开发机上运行。1. 核心能力速览能力项说明项目类型基于 API 的自动化模型评测脚本核心功能利用 DeepSeek 生成题目 - 调用豆包回答 - 利用 DeepSeek 评分硬件门槛极低。主要依赖网络和 API 调用普通 CPU、内存的电脑即可无需 GPU。启动方式命令行运行 Python 脚本支持配置文件和参数化。是否支持 API是核心即基于 DeepSeek API 和豆包 API。是否支持批量任务是可配置题目数量、领域实现无人值守批量评测。输出结果结构化的评测报告JSON/CSV包含题目、答案、评分及评语。适合场景模型能力对比、特定任务效果测试、自动化题库生成与验证、技术调研。2. 适用场景与使用边界这个自动化评测方案主要适合以下几类人AI 开发者与研究者需要定量比较不同大模型如 DeepSeek vs 豆包在特定任务上的性能为技术选型提供依据。产品经理与测试人员希望自动化测试自家产品集成的 AI 能力如智能客服、内容生成的稳定性和效果。教育或内容创作者需要批量生成特定领域如编程题、知识问答的题目和参考答案并验证其合理性。技术爱好者对 AI 模型的工作原理和能力边界感到好奇希望通过实践来直观感受。使用边界与注意事项合规使用 API务必遵守 DeepSeek 和豆包开放平台的 API 使用条款注意调用频率限制和费用。内容安全自动生成的题目和答案需符合法律法规脚本应避免生成涉及敏感、违法、侵权的内容。在实际部署中可考虑增加内容过滤环节。结果仅供参考AI 评分本质是另一个 AI 的判断可能存在主观偏差。对于关键决策建议结合人工复核。非官方评测此方案得出的结论仅为技术探索不代表模型的官方能力排名。3. 环境准备与前置条件运行此评测脚本你需要准备好以下环境操作系统Windows 10/11, macOS, 或 Linux (如 Ubuntu) 均可。Python 环境推荐 Python 3.8 及以上版本。确保pip包管理工具可用。网络环境需要能够稳定访问 DeepSeek 和豆包 API 服务器的网络。API 密钥这是最重要的前置条件。DeepSeek API Key访问 DeepSeek 开放平台官网注册账号并创建应用以获取 API Key。豆包 API Key访问豆包开放平台官网完成开发者注册并创建应用以获取 API Key。文本编辑器或 IDE如 VSCode、PyCharm 等用于编写和修改代码。磁盘空间仅需少量空间存放脚本和生成的评测报告。4. 安装部署与启动方式本项目本质上是一个 Python 脚本部署非常简单。第一步创建项目目录并安装依赖创建一个新的文件夹例如model_evaluator。在该目录下创建requirements.txt文件并写入以下依赖requests2.28.0 openai1.0.0 # 用于兼容DeepSeek等OpenAI格式的API pandas1.5.0 # 用于处理CSV报告 tqdm4.64.0 # 用于显示进度条 python-dotenv0.19.0 # 用于管理环境变量然后打开终端进入该目录执行安装命令pip install -r requirements.txt第二步配置 API 密钥推荐使用环境变量在项目根目录创建.env文件用于安全地存储密钥注意不要将此文件提交到版本控制系统# .env 文件内容 DEEPSEEK_API_KEYyour_deepseek_actual_api_key_here DOUBAO_API_KEYyour_doubao_actual_api_key_here请将your_deepseek_actual_api_key_here和your_doubao_actual_api_key_here替换为你实际申请的密钥。第三步编写核心评测脚本创建主脚本文件例如evaluate.py。下面是一个高度可配置的核心框架# evaluate.py import os import json import time import pandas as pd from typing import Dict, List, Any, Optional from tqdm import tqdm from dotenv import load_dotenv from openai import OpenAI # 用于DeepSeek import requests # 用于豆包API # 加载环境变量 load_dotenv() class ModelEvaluator: def __init__(self): self.deepseek_client OpenAI( api_keyos.getenv(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com # DeepSeek API地址 ) self.doubao_api_key os.getenv(DOUBAO_API_KEY) self.doubao_api_url https://ark.cn-beijing.volces.com/api/v3/chat/completions # 示例地址请以豆包官方文档为准 self.results [] def _call_deepseek(self, prompt: str, system_prompt: str 你是一个严谨的AI助手。) - str: 调用DeepSeek API生成内容 try: response self.deepseek_client.chat.completions.create( modeldeepseek-chat, # 或根据需求选择其他模型如 deepseek-coder messages[ {role: system, content: system_prompt}, {role: user, content: prompt} ], temperature0.7, max_tokens2000 ) return response.choices[0].message.content.strip() except Exception as e: print(fDeepSeek API调用失败: {e}) return def _call_doubao(self, prompt: str) - str: 调用豆包API生成内容 headers { Authorization: fBearer {self.doubao_api_key}, Content-Type: application/json } payload { model: ep-20250225142114-abcdefg, # 示例模型ID需替换为豆包实际可用模型 messages: [{role: user, content: prompt}], temperature: 0.7, max_tokens: 2000 } try: resp requests.post(self.doubao_api_url, headersheaders, jsonpayload, timeout60) resp.raise_for_status() data resp.json() # 解析豆包API返回结构此处为示例需根据实际响应调整 return data.get(choices, [{}])[0].get(message, {}).get(content, ).strip() except Exception as e: print(f豆包API调用失败: {e}) return def generate_question(self, domain: str 通用知识) - Dict[str, str]: 使用DeepSeek生成一道题目及其参考答案 sys_prompt f你是一个专业的出题官擅长出{domain}领域的题目。请生成一道高质量的题目并同时提供该题目的标准答案或参考答案。要求题目清晰答案准确。 user_prompt f请生成一道关于{domain}的题目并附上答案。请以严格的JSON格式输出包含两个键question题目内容和 reference_answer参考答案。 response_text self._call_deepseek(user_prompt, sys_prompt) # 尝试从响应中解析JSON try: # 处理可能存在的markdown代码块 if json in response_text: json_str response_text.split(json)[1].split()[0].strip() elif in response_text: json_str response_text.split()[1].split()[0].strip() else: json_str response_text.strip() question_data json.loads(json_str) return question_data except json.JSONDecodeError: # 如果解析失败手动构造一个简单结构 print(f解析题目JSON失败使用原始文本。响应{response_text[:100]}...) return {question: response_text, reference_answer: N/A} def evaluate_one_round(self, domain: str 通用知识, round_id: int 1): 执行一轮完整的出题-答题-评分流程 print(f\n--- 开始第 {round_id} 轮评测 [{domain}] ---) # 1. 出题 (DeepSeek) print(步骤1: DeepSeek 正在出题...) question_data self.generate_question(domain) question question_data.get(question, ) reference_answer question_data.get(reference_answer, ) if not question: print( 警告题目生成失败跳过本轮。) return # 2. 答题 (豆包) print(步骤2: 豆包 正在答题...) doubao_answer self._call_doubao(question) if not doubao_answer: print( 警告豆包回答失败跳过本轮。) return # 3. 评分 (DeepSeek) print(步骤3: DeepSeek 正在评分...) evaluation_prompt f 请你扮演一位公正的评委。 题目{question} 参考答案{reference_answer} 考生答案{doubao_answer} 请根据考生答案与参考答案的契合度、准确性、完整性和逻辑性进行评分。 评分范围0-10分整数。 同时请提供一段简短的评语指出优点和不足。 请以JSON格式输出包含两个键score分数和 comment评语。 evaluation_result_text self._call_deepseek(evaluation_prompt, 你是一位公正严谨的评分官。) try: if json in evaluation_result_text: eval_json_str evaluation_result_text.split(json)[1].split()[0].strip() elif in evaluation_result_text: eval_json_str evaluation_result_text.split()[1].split()[0].strip() else: eval_json_str evaluation_result_text.strip() eval_data json.loads(eval_json_str) score eval_data.get(score, 0) comment eval_data.get(comment, 无评语) except: score 0 comment 评分解析失败 # 4. 保存结果 result { round_id: round_id, domain: domain, question: question, reference_answer: reference_answer, doubao_answer: doubao_answer, score: score, comment: comment, timestamp: time.strftime(%Y-%m-%d %H:%M:%S) } self.results.append(result) print(f 评分结果{score} 分 | 评语{comment[:50]}...) time.sleep(1) # 简单限速避免触发API频率限制 def run_batch_evaluation(self, domains: List[str], rounds_per_domain: int 3): 批量执行多轮评测 for domain in domains: print(f\n 开始评测领域: {domain}) for i in tqdm(range(1, rounds_per_domain 1), descf{domain} 进度): self.evaluate_one_round(domain, i) def save_results(self, format: str both): 保存评测结果 df pd.DataFrame(self.results) timestamp time.strftime(%Y%m%d_%H%M%S) if format in [json, both]: json_path fevaluation_results_{timestamp}.json df.to_json(json_path, orientrecords, indent2, force_asciiFalse) print(f结果已保存至 JSON 文件: {json_path}) if format in [csv, both]: csv_path fevaluation_results_{timestamp}.csv df.to_csv(csv_path, indexFalse, encodingutf-8-sig) print(f结果已保存至 CSV 文件: {csv_path}) if __name__ __main__: evaluator ModelEvaluator() # 配置要评测的领域和每领域轮数 test_domains [Python编程, 中国历史, 基础物理学] evaluator.run_batch_evaluation(domainstest_domains, rounds_per_domain2) evaluator.save_results(formatboth)第四步启动评测在终端中确保位于脚本所在目录并已配置好.env文件然后运行python evaluate.py脚本将开始自动执行多轮评测并在控制台显示进度最终生成带有时间戳的 JSON 和 CSV 结果文件。5. 功能测试与效果验证运行脚本后我们需要验证整个流程是否按设计工作并评估其输出质量。测试目的确保“出题-答题-评分”三个环节 API 调用成功数据流转正常输出结果结构完整、合理。操作步骤与验证点环境与依赖验证操作运行python evaluate.py。预期脚本正常启动不报ModuleNotFoundError。失败排查检查requirements.txt是否安装虚拟环境是否激活。API 连通性验证操作观察控制台输出应看到类似“开始第 1 轮评测 [Python编程]”、“DeepSeek 正在出题...”的日志。预期日志顺利推进没有出现“API调用失败”、“认证错误”等信息。失败排查检查.env文件中的 API Key 是否正确无误。检查网络连接尝试用curl或浏览器测试 API 端点可达性。核对 DeepSeek/豆包 API 的 Base URL 和请求格式是否与官方最新文档一致上述代码中的 URL 和模型 ID 为示例需替换。数据流验证操作等待一轮评测完成查看控制台输出的“评分结果”行。预期输出包含分数和简短的评语例如“评分结果7 分 | 评语答案基本正确但未能详细解释递归的终止条件...”。失败排查如果出题或评分环节返回空检查_call_deepseek方法中的模型名称、参数是否正确。如果答题环节返回空检查_call_doubao方法中的请求头、载荷结构是否符合豆包 API 规范。查看各 API 调用的返回原始数据可在代码中临时添加print语句确认响应结构。输出结果验证操作脚本运行结束后检查生成的evaluation_results_*.json/csv文件。预期文件应包含round_id,domain,question,reference_answer,doubao_answer,score,comment,timestamp等字段并且数据已正确填充。判断成功文件可正常打开数据条数与配置的评测轮数一致字段无大量缺失值如“N/A”或空字符串比例不高。效果评估 成功运行后你可以打开 CSV 文件按score排序快速查看豆包在不同领域题目的表现。同时通过阅读question、doubao_answer和comment可以定性评估 DeepSeek 出题的质量、豆包回答的准确性以及 DeepSeek 评分的合理性。这是验证整个系统价值的关键。6. 接口 API 与批量任务本项目的核心就是 API 调用并且天然支持批量任务。接口调用详解DeepSeek API 调用我们使用了openai库的兼容模式因为 DeepSeek 的 API 与 OpenAI 格式兼容。这简化了代码。关键参数base_url: 指定为 DeepSeek 的端点。model: 根据任务选择如通用对话用deepseek-chat代码相关用deepseek-coder。messages: 对话历史我们通过system和user角色来传递指令和内容。temperature: 控制生成随机性0-1评测时建议使用较低值如0.7以保证稳定性。max_tokens: 限制生成答案的最大长度。豆包 API 调用使用了标准的requests库发送 HTTP POST 请求。关键参数url: 豆包 API 的服务地址。headers: 必须包含Authorization: Bearer {api_key}。json(payload): 包含model、messages、temperature等参数。特别注意豆包 API 的模型 ID (model) 和消息格式可能与 DeepSeek 略有不同务必查阅其最新官方文档。批量任务优化 上面的run_batch_evaluation方法已经实现了简单的批量任务。对于更严肃的评测可以考虑以下优化并发控制使用asyncio或concurrent.futures进行有限的并发请求大幅提升效率但需注意 API 的频率限制。错误重试与熔断为 API 调用添加重试逻辑如使用tenacity库和简单的熔断机制避免因单次失败或服务不稳定导致整个任务中断。任务队列对于海量评测可以将待评测的题目列表放入队列如 Redis由多个 worker 进程消费实现分布式评测。配置化将评测领域、题目类型、评分标准等抽象为配置文件如 YAML使评测方案更灵活。一个简单的带重试和并发控制的调用示例概念import asyncio from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) async def call_api_with_retry(session, url, payload): async with session.post(url, jsonpayload, headersheaders) as response: response.raise_for_status() return await response.json() # 在主函数中创建会话和任务列表进行并发调用7. 资源占用与性能观察由于本项目完全基于云端 API本地资源占用极低。CPU/内存占用主要消耗在运行 Python 脚本、处理 JSON 数据和生成报告上。对于几千轮的评测普通笔记本电脑的 CPU 和内存占用也几乎可以忽略不计。网络流量主要的性能瓶颈和资源消耗在网络 I/O。每次评测涉及 3 次 API 调用出题、答题、评分每次调用都会发送和接收一定量的文本数据。批量运行大量任务时需要关注网络延迟和稳定性。时间成本单轮评测耗时 ≈ DeepSeek出题时间 豆包答题时间 DeepSeek评分时间 网络延迟。通常一轮在几秒到十几秒。开启并发可以成倍减少总耗时但需谨慎避免触发 API 的速率限制。费用成本这是需要重点观察的“资源”。DeepSeek 和豆包 API 通常按 Token 数量计费。批量运行前建议估算 Token 消耗。可以在脚本中添加简单的 Token 计数功能或使用 API 返回的usage字段来统计以便控制成本。监控建议在脚本中添加日志记录记录每轮的开始结束时间、API 调用状态和 Token 使用量如果 API 返回。使用tqdm进度条直观了解整体进度。关注 API 返回的错误码如429代表请求过多5xx代表服务器错误并实现相应的退避或暂停逻辑。8. 常见问题与排查方法问题现象可能原因排查方式解决方案启动时报ModuleNotFoundErrorPython 依赖未安装或不在当前环境。在终端执行pip list检查requests,openai,pandas等包是否存在。在项目目录下执行pip install -r requirements.txt。确保使用正确的 Python 环境。控制台输出API调用失败或认证错误1. API Key 错误或过期。2. 环境变量未加载。3. API 服务地址或模型 ID 错误。1. 检查.env文件内容是否正确确保没有多余空格。2. 在代码开头打印os.getenv(“DEEPSEEK_API_KEY”)的前几位确认是否成功加载。3. 核对代码中的base_url和model参数是否与官方文档一致。1. 重新申请或复制正确的 API Key。2. 确保.env文件在主脚本同级目录。3. 根据官方文档更新 API 端点和模型名称。出题或评分结果为空1. API 返回格式不符合 JSON 解析预期。2. 生成的内容被安全策略过滤。1. 在_call_deepseek函数内打印response_text原始内容检查其格式。2. 查看 API 返回中是否有error字段。1. 增强 JSON 解析的鲁棒性如代码中尝试从 markdown 代码块提取。2. 调整system_prompt和user_prompt使其指令更明确要求 AI 必须返回 JSON。豆包回答内容为空1. 豆包 API 请求格式错误。2. 豆包模型 ID 无效或已下线。1. 打印豆包 API 请求的headers和payload与官方示例对比。2. 查看豆包 API 响应状态码和完整 Body。1. 严格按照豆包开放平台最新的 API 文档调整请求结构。2. 确认使用的模型 ID 是否有调用权限且服务正常。评分全部为0或极低1. 评分提示词 (evaluation_prompt) 设计不合理。2. 参考答案 (reference_answer) 质量差或为空。1. 手动检查几轮生成的question和reference_answer质量。2. 将evaluation_prompt和对应的输入输出打印出来人工判断评分逻辑是否合理。1. 优化generate_question中的系统提示词要求生成更高质量的题目和答案。2. 细化评分提示词给出更具体的评分维度和示例。运行速度很慢1. 网络延迟高。2. 代码中是顺序同步调用且没有并发。1. 使用ping或curl测试 API 端点的网络延迟。2. 观察脚本运行时是否在等待一个 API 响应完成后才发起下一个请求。1. 考虑使用代理或选择延迟更低的服务区域如果支持。2. 引入异步编程 (asyncio/aiohttp) 或线程池实现并发 API 调用并合理设置并发数。达到API调用频率限制单位时间内请求次数过多。查看 API 返回的错误信息通常包含429状态码和rate limit相关描述。1. 在代码中增加请求间隔 (time.sleep)。2. 实现更完善的退避策略如指数退避。3. 申请提升 API 调用配额。9. 最佳实践与使用建议为了让这个自动化评测系统更可靠、有用建议遵循以下实践从小规模开始首次运行先将rounds_per_domain设置为 1 或 2快速验证整个流程和配置是否正确避免因配置错误浪费大量 API 调用额度。分领域精细化评测不要只测试“通用知识”。针对你的目标场景设计领域如“Java异常处理”、“明清历史选择题”、“产品文案撰写”这样得出的结论更有指导意义。优化提示词工程这是影响评测质量的关键。出题提示词要明确要求题目类型选择题、问答题、编程题、难度、考察点并强制要求以指定格式如 JSON输出。评分提示词要给出清晰、可操作的评分标准如准确性 40%、完整性 30%、逻辑性 30%并要求评委忽略格式差异关注实质内容。引入人工质检样本定期从自动生成的题目和评分结果中抽样进行人工检查。这有助于发现提示词设计或模型理解上的系统性偏差并据此迭代优化。结果分析与可视化使用pandas和matplotlib等库对生成的 CSV 结果进行深入分析。计算平均分、分领域统计、题目难度分布等并绘制图表让结果一目了然。成本控制在脚本中集成简单的 Token 计数和费用估算功能。对于长期、大规模的评测建立预算监控机制。合规与伦理确保生成的题目内容不涉及侵权、歧视、违法信息。明确本评测结果的局限性避免将其作为对模型的绝对定性评价。如果计划公开评测结果应注明评测方法、局限性并遵守相关平台的规则。10. 总结与下一步通过本文的步骤你已经可以搭建一个让 DeepSeek 出题考豆包的自动化评测系统。这个方案的核心优势在于其灵活性和可编程性——你不仅可以比较 DeepSeek 和豆包只需稍加修改就可以接入 Kimi、通义千问、文心一言等其他模型的 API实现多方混战。最值得尝试的下一步是“让豆包出题考 DeepSeek”只需交换两个 API 在流程中的角色就能从另一个维度对比模型能力。你也可以尝试更复杂的评测链比如让多个模型互为出题官和评分官或者引入第三个模型作为“终极裁判”。最容易踩的坑主要集中在API 配置和提示词设计。务必仔细核对两大平台的官方文档确保请求格式、模型名称、认证方式完全正确。提示词则需要多次迭代通过少量样本测试来调整直到能稳定输出结构规整、质量合格的内容。这个脚本是一个强大的起点你可以在此基础上增加数据库存储、Web 控制面板、自动报告生成等功能将其发展成一个完整的模型能力评估工具。建议收藏本文在需要快速验证模型效果或进行技术调研时随时可以拿出来跑一遍。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价