资讯详情

使用 Semantic Kernel Python 在 Azure AI Studio 上跑通 MMLU 多模型基准评测

📅 2026/9/12 17:09:13 | 华诺云谱 👁 阅读
使用 Semantic Kernel Python 在 Azure AI Studio 上跑通 MMLU 多模型基准评测
使用 Semantic Kernel Python 在 Azure AI Studio 上跑通 MMLU 多模型基准评测【免费下载链接】semantic-kernelIntegrate cutting-edge LLM technology quickly and easily into your apps项目地址: https://gitcode.com/GitHub_Trending/se/semantic-kernel本文以 python/samples/concepts/model_as_a_service 目录下的官方示例为主线讲解如何用 Semantic Kernel Python 对 Llama3-8b、Phi3-mini、Phi3-small 等多个 Azure AI Studio 无服务器Serverless/Model-as-a-Service模型批量评测经典的MMLUMassive Multitask Language Understanding数据集并输出每个模型的准确率。读完本文你将掌握MMLU 数据集的加载与学科裁剪、多 AI 服务注册与统一评测框架、零样本 prompt 的调优思路以及把该脚本改造为自定义数据集基准测试的完整方法。示例背景与设计意图MMLU 是一个被广泛用于衡量大语言模型多任务理解能力的基准数据集包含数十个学科的多选题。官方示例 mmlu_model_eval.py 用它来做两件有意义的事评估在 Azure AI Studio 上部署的 Model-as-a-ServiceMaaS模型比如 Phi 系列、Llama 系列、Mistral large 等通过无服务器 API 提供的模型给开发者提供一个可扩展的基准测试脚手架——无论你是想新增一个数据集、扩展现有数据集来评测新模型还是想复现学术论文中的评测结果都可以以此脚本为起点。仓库只读本文只讲解查看、安装、运行与配置方法不会改动仓库内容。脚本默认挑选了三个模型作为对比基线Llama3-8b、Phi3-mini、Phi3-small。选择依据来自论文Phi-3 Technical Report: A Highly Capable Language Model Locally on Your Phonearxiv 2404.14219第 6 页报告的评测结果理论上 Phi3-small 优于 Phi3-miniPhi3-mini 优于 Llama3-8b。跑完本示例你应能看到相同的相对排名——但绝对数值不会一致因为论文报告使用的是 5-shot 评测而本示例刻意采用zero-shot零样本评测其目的正是留出空间让你通过调整 prompt 去逼近论文中的准确率。前置准备模型部署与依赖安装运行该示例需要满足以下条件部署所需模型在 Azure AI Studio 中把想评测的模型如 Llama3-8b、Phi3-mini、Phi3-small以无服务器 API 的形式部署并拿到对应的 API key 与 endpoint。模型可用性以 Azure AI Studio 的模型目录为准。准备 HuggingFace 访问令牌MMLU 数据集托管在 HuggingFace 上cais/mmlu访问需要 token。脚本运行时load_mmlu_dataset会调用login()提示你登录你可以提前用huggingface-cli login配置好凭证。安装依赖在 Semantic Kernel Python 项目的虚拟环境中安装 HuggingFacedatasets模块pip install datasets填写密钥与端点把 API key 和 endpoint 填入脚本中setup_kernel()对应的服务构造参数里。完成上述步骤后在激活了虚拟环境的终端中直接运行python mmlu_model_eval.py如果你使用 VS Code也可以直接在虚拟环境解释器下选中脚本文件、点击文件面板右上角的运行图标来执行。数据集加载按学科裁剪 MMLUMMLU 数据集包含众多按学科划分的子集示例默认加载 5 个学科你也可以在 mmlu_model_eval.py 的main()中按需增删datasets load_mmlu_dataset([ college_computer_science, astronomy, college_biology, college_chemistry, elementary_mathematics, # Add more subjects here. # See here for a full list of subjects: https://huggingface.co/datasets/cais/mmlu/viewer ])底层加载逻辑位于load_mmlu_dataset函数mmlu_model_eval.pydef load_mmlu_dataset(subjects: list[str]) - dict[str, Dataset]: login() datasets {} number_of_samples 0 for subject in subjects: ds: DatasetDict load_dataset(cais/mmlu, namesubject) validation_ds: Dataset ds[validation] datasets[subject] validation_ds print(fLoaded MMLU validation dataset for {subject}. This dataset has {validation_ds.num_rows} examples.) number_of_samples validation_ds.num_rows print(fLoaded {len(subjects)} datasets with a total of {number_of_samples} examples.) return datasets几个值得注意的实现细节它加载的是每个学科的validation验证分割而非训练或测试分割返回结构是dict[str, Dataset]以学科名为 key、对应验证集为 value便于后续按学科逐条评测与统计login()保证 HuggingFace 凭证可用数据集通过datasets库的load_dataset按需拉取。多模型注册一个 Kernel 承载多个 AI 服务评测的核心思想是让同一个评测框架自动遍历 Kernel 中注册的所有服务。setup_kernel()mmlu_model_eval.py为每个模型调用一次kernel.add_service注册AzureAIInferenceChatCompletiondef setup_kernel(): Set up the kernel with AI services. kernel Kernel() # Add multiple AI services to the kernel kernel.add_service( AzureAIInferenceChatCompletion( ai_model_idLlama3-8b, api_key, endpoint, ) ) kernel.add_service( AzureAIInferenceChatCompletion( ai_model_idPhi3-mini, api_key, endpoint, ) ) kernel.add_service( AzureAIInferenceChatCompletion( ai_model_idPhi3-small, api_key, endpoint, ) ) # Add the plugin to the kernel kernel.add_plugin(MMLUPlugin(), MMLUPlugin) return kernel新增模型的扩展方式非常直接复制一个add_service块、填入新的ai_model_id/api_key/endpoint即可新服务会被自动纳入评测范围——因为main()通过kernel.get_services_by_type(ChatCompletionClientBase)动态枚举所有聊天补全服务见 kernel_services_extension.pyai_services kernel.get_services_by_type(ChatCompletionClientBase).keys()从源码看azure_ai_inference_chat_completion.pyAzureAIInferenceChatCompletion的构造参数与默认行为如下参数是否必填说明ai_model_id必填用于标识模型的字符串如模型名也是评测结果输出中显示的名称api_key可选Azure AI Inference 服务部署的 API key缺省时从环境变量AZURE_AI_INFERENCE_API_KEY读取endpoint可选Azure AI Inference 服务部署的 endpoint缺省时从环境变量AZURE_AI_INFERENCE_ENDPOINT读取api_version可选API 版本缺省时读AZURE_AI_INFERENCE_API_VERSIONservice_id可选服务的唯一 ID不传时默认取ai_model_id的值client可选直接传入现成的ChatCompletionsClient实例instruction_role可选将 system 消息改写为developer角色用于 summarization 等场景关于 service_id 有一点值得注意脚本中并未显式传service_id这意味着服务 ID 默认等于ai_model_id。因此评测输出中的Llama3-8b、Phi3-mini等名称既是模型标识也是注册到 Kernel 的服务 ID二者在此处保持一致。同时 add_service 在service_id重复时会抛出异常除非设置overwriteTrue这也提醒我们服务 ID 需要全局唯一。评测插件单样本问答与判分逻辑MMLUPlugin是一个典型的 Semantic Kernel 原生插件mmlu_model_eval.py它通过kernel_function装饰器暴露evaluate函数接收一条样本与学科名让指定服务作答并返回是否答对。kernel_function(nameevaluate, descriptionRun a sample and return if the answer was correct.) async def evaluate( self, sample: Annotated[dict, The sample], subject: Annotated[str, The subject of the sample], kernel: Annotated[Kernel, The kernel], service_id: Annotated[str, The service id], ) - Annotated[bool, Whether the answer was correct]: # Initialize chat history with a system message chat_history ChatHistory(system_messageformatted_system_message(subject)) # Add the user message to the chat history chat_history.add_user_message( formatted_question( sample[question], sample[choices][0], sample[choices][1], sample[choices][2], sample[choices][3], ), ) # Determine the correct answer correct_answer expected_answer_to_letter(sample[answer]) # Get the chat response from the AI service response await kernel.get_service(service_id).get_chat_message_content( chat_history, settingskernel.get_prompt_execution_settings_from_service_id(service_id), ) if not response: return False # Compare the AI response with the correct answer return response.content.strip() correct_answer这段代码揭示了完整的单样本评测链路也是理解整个示例的关键构造对话用ChatHistory放入系统消息与用户消息消息内容由 helpers.py 中的模板生成取服务kernel.get_service(service_id)按服务 ID 取出对应 AI 服务kernel.get_prompt_execution_settings_from_service_id(service_id)则实例化该服务专属的PromptExecutionSettings见 kernel_services_extension.py推理与判分调用get_chat_message_content拿到回复将回复文本去除首尾空白后与标准答案字母做精确匹配请求失败response为空时直接判False。值得注意与常规的kernel.invoke函数调用链不同这里把kernel和service_id直接作为参数传入函数体在函数内部手动完成“取服务 → 构建设置 → 发起对话”这种写法非常适合评测场景中对服务选择的显式控制。Prompt 模板与零样本设计helpers.py 集中定义了 prompt 模板与答案转换逻辑是调优准确率的主要入口def formatted_system_message(subject: str): Return a formatted system message. return f You are an expert in {subject}. You answer multiple choice questions on this topic. def formatted_question(question: str, answer_a: str, answer_b: str, answer_c: str, answer_d: str): Return a formatted question. return f Question: {question} Which of the following answers is correct? A. {answer_a} B. {answer_b} C. {answer_c} D. {answer_d} State ONLY the letter corresponding to the correct answer without any additional text. def expected_answer_to_letter(answer: str): Return the letter corresponding to the expected answer. The dataset contains numbers as answers, this function converts them to letters. return [A, B, C, D][int(answer)]三个函数各司其职formatted_system_message(subject)把学科名注入系统消息让模型扮演对应学科专家formatted_question(...)把问题与四个选项组织成多选题格式并强制要求只输出答案字母——这是保证判分稳定性的关键设计expected_answer_to_letter(answer)MMLU 原始答案用数字 0~3 表示这里映射为[A, B, C, D]对应下标从而与模型输出的字母比较。示例刻意采用 zero-shot不提供任何示例便于你在此基础上观察 prompt 工程对准确率的影响想要逼近论文的 5-shot 结果可以在这个文件中扩展 few-shot 的示例拼接逻辑。主循环逐学科、逐样本、逐模型批量评测main()mmlu_model_eval.py将前面所有部件串成完整的评测流水线async def main(): datasets load_mmlu_dataset([...]) kernel setup_kernel() ai_services kernel.get_services_by_type(ChatCompletionClientBase).keys() totals sum([datasets[subject].num_rows for subject in datasets]) total_corrects {ai_service: 0.0 for ai_service in ai_services} for subject in datasets: corrects {ai_service: 0.0 for ai_service in ai_services} print(fEvaluating {subject}...) for sample in tqdm(datasets[subject]): for ai_service in ai_services: kernel_arguments KernelArguments( samplesample, subjectsubject, kernelkernel, service_idai_service, ) result await kernel.invoke( plugin_nameMMLUPlugin, function_nameevaluate, argumentskernel_arguments ) if result.value is True: corrects[ai_service] 1 print(fFinished evaluating {subject}.) for ai_service in ai_services: total_corrects[ai_service] corrects[ai_service] print(fAccuracy of {ai_service}: {corrects[ai_service] / datasets[subject].num_rows * 100:.2f}%.) print(Overall results:) for ai_service in ai_services: print(fOverall Accuracy of {ai_service}: {total_corrects[ai_service] / totals * 100:.2f}%.)流程可以归纳为三层循环外层按学科遍历对每个学科先统计该学科内各服务的答对数量输出单学科准确率中层按样本遍历借助tqdm显示进度条逐条样本调用kernel.invokeplugin_nameMMLUPlugin, function_nameevaluate内层按服务遍历同一份样本依次喂给所有注册的聊天补全服务KernelArguments中的service_id让evaluate知道该用哪个模型作答。最终各学科准确率汇总后得到每个模型的总体准确率。这套“一个 Kernel、多个服务、统一插件”的模式可以平滑迁移到你自己的数据集只需替换load_mmlu_dataset的加载来源并让样本 dict 提供question、choices、answer三个字段即可。运行结果解读示例运行结束后会依次输出每个学科、每个模型的准确率最后汇总总体结果输出形如Finished evaluating college_biology. Accuracy of Llama3-8b: 75.00%. Accuracy of Phi3-mini: 81.25%. Accuracy of Phi3-small: 93.75%. ... Overall results: Overall Accuracy of Llama3-8b: 51.09%. Overall Accuracy of Phi3-mini: 55.43%. Overall Accuracy of Phi3-small: 66.30%.解读时注意三点相对排名比绝对值更可靠由于是 zero-shot 且 prompt 模板不同绝对数值不会与论文完全一致但模型间的相对强弱应保持一致数值差异的根源论文采用 5-shot、本示例采用 zero-shot这是两者数值不同的主因也是你调 prompt 的切入点可验证性准确率的计算完全由corrects[ai_service] / datasets[subject].num_rows与total_corrects[ai_service] / totals得出见 mmlu_model_eval.py结构透明便于核对与二次开发。扩展指南如何评测自己的数据集把该示例改造成自定义数据集基准测试时只需关注三处数据源把load_mmlu_dataset中的load_dataset(cais/mmlu, namesubject)替换为你自己的数据集来源并确保每条样本包含question、choices长度为 4 的列表、answer0~3 的整数下标字段若字段名不同同步修改MMLUPlugin.evaluate与formatted_question的取值逻辑模型集合在setup_kernel()中按需增删AzureAIInferenceChatCompletion服务只要是模型目录中可用的 MaaS 模型即可新服务会被get_services_by_type(ChatCompletionClientBase)自动发现Prompt 策略在 helpers.py 中调整系统消息与问题格式甚至可以加入 few-shot 示例来复现学术论文中的评测设置。整个示例充分体现了 Semantic Kernel Python 的“插件 函数 服务注册”组合能力评测逻辑被封装为MMLUPlugin插件多模型通过服务注册机制统一驱动评测维度通过数据集裁剪灵活扩展——这套结构本身就是一份可直接复用的多模型基准评测模板。【免费下载链接】semantic-kernelIntegrate cutting-edge LLM technology quickly and easily into your apps项目地址: https://gitcode.com/GitHub_Trending/se/semantic-kernel创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。