珍岛信息技术有限公司做网站服务做网站的费用

张小明 2026/1/16 2:21:43
珍岛信息技术有限公司做网站服务,做网站的费用,彩票计划网站开发,商品详情页怎么制作作者简介#xff1a;华为HCIP#xff0c;昇腾NPU机构专业用户。 一#xff0e;引言 书接前文https://blog.csdn.net/kkiron/article/details/155788771在项目里落地了 CodeLlama-7B 模型#xff0c;直接跑在昇腾 NPU 上#xff0c;一路踩坑过来#xff0c;总算摸出了一…作者简介华为HCIP昇腾NPU机构专业用户。一引言书接前文https://blog.csdn.net/kkiron/article/details/155788771在项目里落地了 CodeLlama-7B 模型直接跑在昇腾 NPU 上一路踩坑过来总算摸出了一套可行的方案。不得不说 CodeLlama 的代码生成能力是真的顶日常写业务代码、调接口都能省不少事而昇腾 NPU 的算力也完全 hold 住推理起来丝毫不吃力。不过部署过程是真得 “折腾”—— 从最开始搭环境到后面调优性能中间踩了不少坑。比如模型格式转换时卡了半天内存占用一度超标推理速度也达不到预期好在最后都一一解决。这篇文章是在上一篇跑CodeLlama-7B 模型基础上从环境配置、模型适配到性能优化和常见问题排查基础上对llava-1.5-7b-hf模型进行了测试因为有上一次经验打底这次体验效果更佳。希望能给同样想在昇腾 NPU 上跑Llama-7B-hf 一个快速上手指导。二环境搭建和基本配置1. 测试平台选择为什么选择GitCode?1.主国内部署 访问 / 克隆速度快支持 GitHub 加速同步2.基础协作 项目管理 CI/CDWebIDE适配个人到企业级需求3.开源扶持 CSDN 生态打通助力技术影响力沉淀4.全中文界面 本土化文档 / 支持契合国内使用习惯5.多副本存储 无损迁移数据安全可靠2.平台操作流程进入GitCode页面官网https://gitcode.com/之后选择我的Notebook在NoteBook资源确认界面选择NPU配置并立即启动配置信息计算类型NPU (昇腾 910B)硬件规格1 * NPU 910B 32 vCPU 64GB 内存操作系统EulerOS 2.9 (华为自研的服务器操作系统针对昇腾硬件深度优化)存储50GB (限时免费对模型推理和代码调试完全够用)镜像名称euler2.9-py38-torch2.1.0-cann8.0-openmind0.6-notebook选择立即启动启动成功后就是下图所示3.模型大厅搜索llava4.注意本次选择的是llava-hf/llava-1.5-7b-h5.环境的安装安装TensorFlowpipinstalltransformers accelerate -i https://mirrors.aliyun.com/pypi/simple/这里使用国内的镜像下载快一点如果还不行可以使用华为镜像试试。下载成功之后我们把测试代码复制进去。新建一个测试文件右键新建文件并修改后缀名为.py格式。测试代码:importrequests from PILimportImageimporttorch from transformersimportAutoProcessor, LlavaForConditionalGeneration model_idllava-hf/llava-1.5-7b-hfmodelLlavaForConditionalGeneration.from_pretrained(model_id,torch_dtypetorch.float16,low_cpu_mem_usageTrue,).to(0)processorAutoProcessor.from_pretrained(model_id)# Define a chat history and use apply_chat_template to get correctly formatted prompt# Each value in content has to be a list of dicts with types (text, image)conversation[{role:user,content:[{type:text,text:What are these?},{type:image},],},]promptprocessor.apply_chat_template(conversation,add_generation_promptTrue)image_filehttp://images.cocodataset.org/val2017/000000039769.jpgraw_imageImage.open(requests.get(image_file,streamTrue).raw)inputsprocessor(imagesraw_image,textprompt,return_tensorspt).to(0, torch.float16)outputmodel.generate(**inputs,max_new_tokens200,do_sampleFalse)print(processor.decode(output[0][2:],skip_special_tokensTrue))命令行执行测试一下python test.py报错了错误原因昇腾NPU环境使用torch_npu而非CUDA.to(0)不适用。检查并修复代码以适配昇腾NPU还有一个地方大家可以改一下镜像不然加载太慢了方法一import osos.environ[‘HF_ENDPOINT’] ‘https://hf-mirror.com’print(“已设置镜像站点”)方法二export HF_ENDPOINThttps://hf-mirror.com修改代码importosimportrequests from PILimportImageimporttorch from transformersimportAutoProcessor, LlavaForConditionalGeneration, LlamaTokenizer from transformers.image_utilsimportload_image# 设置HuggingFace镜像国内网络需要os.environ[HF_ENDPOINT]https://hf-mirror.commodel_idllava-hf/llava-1.5-7b-hfprint(正在加载模型...)# 昇腾NPU环境使用device_mapauto自动分配设备不要用.to(0)modelLlavaForConditionalGeneration.from_pretrained(model_id,torch_dtypetorch.float16,low_cpu_mem_usageTrue,device_mapauto,# 自动检测并使用NPU)print(正在加载processor...)# 如果fast tokenizer加载失败尝试使用slow tokenizertry:# 先尝试使用fast tokenizerprocessorAutoProcessor.from_pretrained(model_id)print(使用fast tokenizer加载成功)except Exception as e: print(fFast tokenizer加载失败: {e})print(尝试使用slow tokenizer手动构建processor...)# 手动构建processor使用slow tokenizerfrom transformersimportCLIPImageProcessor try: tokenizerLlamaTokenizer.from_pretrained(model_id,use_fastFalse)image_processorCLIPImageProcessor.from_pretrained(model_id)# 手动创建processorclass CustomProcessor: def __init__(self, tokenizer, image_processor): self.tokenizertokenizer self.image_processorimage_processor# 检查是否有图像tokenself.image_tokenimage# 尝试添加图像token到tokenizer如果不存在ifself.image_token notintokenizer.get_vocab(): tokenizer.add_tokens([self.image_token],special_tokensTrue)def apply_chat_template(self, conversation,add_generation_promptTrue):# LLaVA-1.5的chat template实现# 需要在文本中插入image占位符textformsginconversation:ifmsg[role]user:forcontentinmsg[content]:ifcontent[type]text:textcontent[text]elifcontent[type]image:# 插入图像占位符LLaVA-1.5使用image# 确保前后有空格这样tokenizer能正确识别text self.image_token ifadd_generation_prompt: text\nASSISTANT:returntext def __call__(self,imagesNone,textNone,return_tensorspt):# 处理文本text_inputsself.tokenizer(text,return_tensorsreturn_tensors)# 处理图片ifimages is not None:ifnot isinstance(images, list): images[images]pixel_valuesself.image_processor(images,return_tensorsreturn_tensors)[pixel_values]return{**text_inputs,pixel_values:pixel_values,# 注意不返回images因为模型不需要这个参数}returntext_inputs def decode(self, token_ids,skip_special_tokensTrue):returnself.tokenizer.decode(token_ids,skip_special_tokensskip_special_tokens)processorCustomProcessor(tokenizer, image_processor)print(使用slow tokenizer手动构建processor成功)except Exception as e2: print(f手动构建processor也失败: {e2})print(尝试清理缓存后重新下载...)# 清理tokenizer缓存importshutil cache_diros.path.expanduser(~/.cache/huggingface/hub)tokenizer_cacheos.path.join(cache_dir, fmodels--{model_id.replace(/, --)})ifos.path.exists(tokenizer_cache): print(f清理缓存: {tokenizer_cache})shutil.rmtree(tokenizer_cache,ignore_errorsTrue)# 重新尝试加载processorAutoProcessor.from_pretrained(model_id,force_downloadTrue)print(强制重新下载后加载成功)print(模型和processor加载完成)# 使用conversation格式处理多模态输入conversation[{role:user,content:[{type:text,text:What are these?},{type:image},],},]# 应用chat templatepromptprocessor.apply_chat_template(conversation,add_generation_promptTrue)# 下载并处理图片image_filehttp://images.cocodataset.org/val2017/000000039769.jpgraw_imageImage.open(requests.get(image_file,streamTrue).raw)# 使用processor处理图片和文本inputsprocessor(imagesraw_image,textprompt,return_tensorspt)# 将输入移到模型所在的设备使用device_map时模型会自动处理设备ifhasattr(model,device): inputs{k: v.to(model.device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}else:# 如果没有device属性尝试使用第一个参数所在的设备inputs{k: v.to(next(model.parameters()).device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}# 确保数据类型正确inputs{k: v.to(torch.float16)ifisinstance(v, torch.Tensor)and v.dtypetorch.float32elsevfork,vininputs.items()}# 过滤掉模型不需要的参数如images只保留模型需要的参数model_inputs{k:vfork,vininputs.items()ifk notin[images]}print(开始生成...)outputmodel.generate(**model_inputs,max_new_tokens200,do_sampleFalse)print(processor.decode(output[0][2:],skip_special_tokensTrue))查看执行结果我们先看看执行之前的测试图片链接http://images.cocodataset.org/val2017/000000039769.jpg输出结果The image features two cats lying on a pink couch. One cat is located on the left side of the couch, while the other cat is on the right side. Both cats are sleeping peacefully, enjoying the comfortable environment.In the scene, there are also two remote controls placed on the couch, one near the left cat and the other near the right cat. These remotes might be used for entertainment purposes, such as watching television or playing video games.模型最终输出了正确的图片描述两只猫、粉色沙发、遥控器等说明昇腾 NPU 环境适配、模型加载、推理逻辑均已打通核心功能正常。下载模型注意事项存储空间- LLaVA-1.5-7B模型大约14GB确保有足够空间。下载时间- 即使用了镜像14GB的模型下载也需要10-20分钟取决于网络速度。断点续传- transformers库支持断点续传如果中途断了重新运行会自动从断点继续。问题1生成的内容被截断现象生成的回答在中间突然停止。解决方法增加max_new_tokens参数但要注意内存限制检查是否触发了eos_token结束标记如果是因为内存不足导致的截断先解决内存问题问题2Tokenizer加载错误ModelWrapper错误现象提示data did not match any variant of untagged enum ModelWrapper或类似的tokenizer加载错误。原因这通常是tokenizer文件损坏、下载不完整或者transformers版本与tokenizer文件版本不匹配导致的。解决方法使用slow tokenizer- 如果fast tokenizer加载失败可以手动使用slow tokenizerfromtransformersimportLlamaTokenizer,CLIPImageProcessor tokenizerLlamaTokenizer.from_pretrained(model_id,use_fastFalse)image_processorCLIPImageProcessor.from_pretrained(model_id)# 然后手动构建processor清理缓存重新下载- 删除tokenizer缓存文件强制重新下载rm-rf ~/.cache/huggingface/hub/models--llava-hf--llava-1.5-7b-hf使用force_download- 在加载时强制重新下载processorAutoProcessor.from_pretrained(model_id,force_downloadTrue)检查transformers版本- 确保transformers版本兼容建议使用4.35.0或更高版本pipinstalltransformers4.35.0 -i https://mirrors.aliyun.com/pypi/simple/问题3模型生成时参数错误images参数现象提示The followingmodel_kwargsare not used by the model: [‘images’]。原因processor处理图片时会返回images键但model.generate()不需要这个参数只需要pixel_values、input_ids等。解决方法在调用model.generate()之前过滤掉images键# 过滤掉模型不需要的参数model_inputs{k:vfork,vininputs.items()ifknotin[images]}outputmodel.generate(**model_inputs,max_new_tokens200,do_sampleFalse)问题4图像token数量不匹配错误现象提示The number of image tokens is 0 while the number of image given to the model is 1。原因LLaVA模型需要在input_ids中有图像占位符token通常是image这样模型才知道在哪里插入图像特征。如果chat template没有正确处理图像就不会在文本中插入图像token。解决方法使用AutoProcessor推荐- 如果AutoProcessor加载成功它会自动处理图像token不需要手动处理。手动处理图像token- 如果使用CustomProcessor需要在chat template中插入image占位符defapply_chat_template(self,conversation,add_generation_promptTrue):textformsginconversation:ifmsg[role]user:forcontentinmsg[content]:ifcontent[type]text:textcontent[text]elifcontent[type]image:text image # 插入图像占位符ifadd_generation_prompt:text\nASSISTANT:returntext确保图像token存在- 如果tokenizer中没有imagetoken需要添加ifimagenotintokenizer.get_vocab():tokenizer.add_tokens([image],special_tokensTrue)问题5多模态输入格式错误现象提示输入格式不正确。解决方法确保使用apply_chat_template格式化输入图片和文本的顺序要正确先文本后图片或者按conversation格式三.全维度性能测试测试说明我们设计了6个测试场景全面评估LLaVA在不同应用场景下的表现。每个测试都包含多个测试用例记录生成时间、Token数量、生成速度等性能指标同时评估输出质量。测试前的准备工作确保模型已加载- 第一次运行会下载模型后续运行会从缓存加载速度快很多。检查内存使用- 可以用free -h命令查看内存占用确保有足够空间。准备测试图片- 部分测试需要图片输入确保网络可以访问测试图片URL或者准备本地图片。保存工作- 测试脚本运行时间较长建议先保存当前工作避免意外中断。测试执行建议每个测试脚本独立运行不要一次性跑完所有测试避免内存溢出测试结果会自动保存为JSON文件方便后续分析如果某个测试卡住不动可能是内存不足可以重启Notebook后单独运行该测试多模态测试需要下载图片确保网络畅通测试1: 行业术语准确性测试测试LLaVA在医疗、教育、工业等领域的专业术语理解能力 测试1: 行业术语准确性测试 测试LLaVA在医疗、教育、工业等领域的专业术语理解能力importosimporttimeimportjsonimporttorch from transformersimportAutoProcessor, LlavaForConditionalGeneration# 设置HuggingFace镜像国内网络需要os.environ[HF_ENDPOINT]https://hf-mirror.commodel_idllava-hf/llava-1.5-7b-hfprint(正在加载模型...)# 昇腾NPU环境使用device_mapauto自动分配设备modelLlavaForConditionalGeneration.from_pretrained(model_id,torch_dtypetorch.float16,low_cpu_mem_usageTrue,device_mapauto,# 自动检测并使用NPU)processorAutoProcessor.from_pretrained(model_id)print(模型加载完成)# 测试用例不同行业的专业术语理解test_cases[{id:1,industry:医疗,prompt:请用专业且通俗的语言解释医学上CAR-T疗法的原理包括它的工作机制和临床应用。,expected_keywords:[CAR-T,T细胞,嵌合抗原受体,免疫治疗,肿瘤],description:医疗术语理解 - CAR-T疗法},{id:2,industry:金融,prompt:分析2025年A股新能源行业的投资逻辑包括行业趋势、政策影响和风险因素。,expected_keywords:[新能源,A股,投资逻辑,政策,风险],description:金融行业分析 - 新能源投资},{industry:工业,id:3,prompt:解释工业4.0的核心概念包括智能制造、物联网和数字孪生技术在其中的作用。,expected_keywords:[工业4.0,智能制造,物联网,数字孪生,数字化转型],description:工业术语理解 - 工业4.0},{id:4,industry:教育,prompt:解释建构主义学习理论的核心观点以及它在现代教育实践中的应用。,expected_keywords:[建构主义,学习理论,主动建构,教育实践,认知],description:教育术语理解 - 建构主义},{id:5,industry:法律,prompt:解释不可抗力这一法律概念包括其构成要件和在合同纠纷中的适用。,expected_keywords:[不可抗力,法律概念,构成要件,合同,免责],description:法律术语理解 - 不可抗力}]results[]print(*60)print(测试1: 行业术语准确性测试)print(*60)fortest_caseintest_cases: print(f\n测试用例 {test_case[id]}: {test_case[description]})print(f行业: {test_case[industry]})print(f提示词: {test_case[prompt]})# 构建对话格式纯文本无图片conversation[{role:user,content:[{type:text,text:test_case[prompt]},],},]promptprocessor.apply_chat_template(conversation,add_generation_promptTrue)inputsprocessor(textprompt,return_tensorspt)# 将输入移到模型所在的设备ifhasattr(model,device): inputs{k: v.to(model.device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}else: inputs{k: v.to(next(model.parameters()).device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}# 确保数据类型正确inputs{k: v.to(torch.float16)ifisinstance(v, torch.Tensor)and v.dtypetorch.float32elsevfork,vininputs.items()}start_timetime.time()outputmodel.generate(**inputs,max_new_tokens300,do_sampleTrue,temperature0.3,top_p0.95,)end_timetime.time()generation_timeend_time - start_time generated_textprocessor.decode(output[0][2:],skip_special_tokensTrue)# 计算token数量input_tokenslen(processor.tokenizer.encode(prompt))output_tokenslen(processor.tokenizer.encode(generated_text))- input_tokens# 检查关键词匹配generated_lowergenerated_text.lower()keywords_foundsum(1forkeywordintest_case[expected_keywords]ifkeyword.lower()ingenerated_lower)keyword_score(keywords_found / len(test_case[expected_keywords]))*100# 检查专业术语使用has_technical_termsany(wordingenerated_textforwordin[原理,机制,应用,概念,理论])has_explanationlen(generated_text)100result{test_id:test_case[id],industry:test_case[industry],description:test_case[description],prompt:test_case[prompt],generated_text:generated_text,generation_time:round(generation_time,3),input_tokens:input_tokens,output_tokens:output_tokens,total_tokens:input_tokens output_tokens,tokens_per_second:round(output_tokens / generation_time,2)ifgeneration_time0else0,keyword_score:round(keyword_score,2),keywords_found:keywords_found,total_keywords:len(test_case[expected_keywords]),has_technical_terms:has_technical_terms,has_explanation:has_explanation,text_length:len(generated_text)}results.append(result)print(f生成时间: {generation_time:.3f}秒)print(f输出Token数: {output_tokens})print(f生成速度: {result[tokens_per_second]:.2f} tokens/秒)print(f关键词匹配率: {keyword_score:.2f}% ({keywords_found}/{len(test_case[expected_keywords])}))print(f\n生成的回答:\n{generated_text})print(-*60)# 保存结果with open(results_test1_industry_terminology.json,w,encodingutf-8)as f: json.dump(results, f,ensure_asciiFalse,indent2)# 统计摘要avg_timesum(r[generation_time]forrinresults)/ len(results)avg_tokenssum(r[output_tokens]forrinresults)/ len(results)avg_speedsum(r[tokens_per_second]forrinresults)/ len(results)avg_keyword_scoresum(r[keyword_score]forrinresults)/ len(results)print(\n*60)print(测试摘要)print(*60)print(f平均生成时间: {avg_time:.3f}秒)print(f平均输出Token数: {avg_tokens:.0f})print(f平均生成速度: {avg_speed:.2f} tokens/秒)print(f平均关键词匹配率: {avg_keyword_score:.2f}%)print(f包含专业术语的用例: {sum(1 for r in results if r[has_technical_terms])}/{len(results)})print(f\n所有结果已保存到: results_test1_industry_terminology.json)运行出现报错了1.添加 tokenizer 加载的错误处理如果 fast tokenizer 加载失败自动切换到 slow tokenizer手动构建 CustomProcessor 作为备选方案2. 添加异常处理每个测试用例用 try-except 包裹单个用例失败不会中断整个测试记录错误信息到结果中3. 改进了参数处理过滤掉模型不需要的参数如 images确保只传递模型需要的参数给 model.generate()修改后代码 测试1: 行业术语准确性测试 测试LLaVA在医疗、教育、工业等领域的专业术语理解能力importosimporttimeimportjsonimporttorch from transformersimportAutoProcessor, LlavaForConditionalGeneration, LlamaTokenizer# 设置HuggingFace镜像国内网络需要os.environ[HF_ENDPOINT]https://hf-mirror.commodel_idllava-hf/llava-1.5-7b-hfprint(正在加载模型...)# 昇腾NPU环境使用device_mapauto自动分配设备modelLlavaForConditionalGeneration.from_pretrained(model_id,torch_dtypetorch.float16,low_cpu_mem_usageTrue,device_mapauto,# 自动检测并使用NPU)print(正在加载processor...)# 如果fast tokenizer加载失败尝试使用slow tokenizertry: processorAutoProcessor.from_pretrained(model_id)print(使用fast tokenizer加载成功)except Exception as e: print(fFast tokenizer加载失败: {e})print(尝试使用slow tokenizer手动构建processor...)from transformersimportCLIPImageProcessor try: tokenizerLlamaTokenizer.from_pretrained(model_id,use_fastFalse)image_processorCLIPImageProcessor.from_pretrained(model_id)# 手动创建processorclass CustomProcessor: def __init__(self, tokenizer, image_processor): self.tokenizertokenizer self.image_processorimage_processor def apply_chat_template(self, conversation,add_generation_promptTrue): textformsginconversation:ifmsg[role]user:forcontentinmsg[content]:ifcontent[type]text:textcontent[text]ifadd_generation_prompt: text\nASSISTANT:returntext def __call__(self,imagesNone,textNone,return_tensorspt): text_inputsself.tokenizer(text,return_tensorsreturn_tensors)ifimages is not None:ifnot isinstance(images, list): images[images]pixel_valuesself.image_processor(images,return_tensorsreturn_tensors)[pixel_values]return{**text_inputs,pixel_values:pixel_values,}returntext_inputs def decode(self, token_ids,skip_special_tokensTrue):returnself.tokenizer.decode(token_ids,skip_special_tokensskip_special_tokens)processorCustomProcessor(tokenizer, image_processor)print(使用slow tokenizer手动构建processor成功)except Exception as e2: print(f手动构建processor也失败: {e2})raise print(模型和processor加载完成)# 测试用例不同行业的专业术语理解test_cases[{id:1,industry:医疗,prompt:请用专业且通俗的语言解释医学上CAR-T疗法的原理包括它的工作机制和临床应用。,expected_keywords:[CAR-T,T细胞,嵌合抗原受体,免疫治疗,肿瘤],description:医疗术语理解 - CAR-T疗法},{id:2,industry:金融,prompt:分析2025年A股新能源行业的投资逻辑包括行业趋势、政策影响和风险因素。,expected_keywords:[新能源,A股,投资逻辑,政策,风险],description:金融行业分析 - 新能源投资},{industry:工业,id:3,prompt:解释工业4.0的核心概念包括智能制造、物联网和数字孪生技术在其中的作用。,expected_keywords:[工业4.0,智能制造,物联网,数字孪生,数字化转型],description:工业术语理解 - 工业4.0},{id:4,industry:教育,prompt:解释建构主义学习理论的核心观点以及它在现代教育实践中的应用。,expected_keywords:[建构主义,学习理论,主动建构,教育实践,认知],description:教育术语理解 - 建构主义},{id:5,industry:法律,prompt:解释不可抗力这一法律概念包括其构成要件和在合同纠纷中的适用。,expected_keywords:[不可抗力,法律概念,构成要件,合同,免责],description:法律术语理解 - 不可抗力}]results[]print(*60)print(测试1: 行业术语准确性测试)print(*60)fortest_caseintest_cases: print(f\n测试用例 {test_case[id]}: {test_case[description]})print(f行业: {test_case[industry]})print(f提示词: {test_case[prompt]})try:# 构建对话格式纯文本无图片conversation[{role:user,content:[{type:text,text:test_case[prompt]},],},]promptprocessor.apply_chat_template(conversation,add_generation_promptTrue)inputsprocessor(textprompt,return_tensorspt)# 将输入移到模型所在的设备ifhasattr(model,device): inputs{k: v.to(model.device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}else: inputs{k: v.to(next(model.parameters()).device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}# 确保数据类型正确inputs{k: v.to(torch.float16)ifisinstance(v, torch.Tensor)and v.dtypetorch.float32elsevfork,vininputs.items()}# 过滤掉模型不需要的参数model_inputs{k:vfork,vininputs.items()ifk notin[images]}start_timetime.time()outputmodel.generate(**model_inputs,max_new_tokens300,do_sampleTrue,temperature0.3,top_p0.95,)end_timetime.time()generation_timeend_time - start_time generated_textprocessor.decode(output[0][2:],skip_special_tokensTrue)# 计算token数量try:# 尝试获取tokenizerifhasattr(processor,tokenizer): tokenizerprocessor.tokenizer else:# CustomProcessor也有tokenizer属性tokenizergetattr(processor,tokenizer, None)iftokenizer is not None: input_tokenslen(tokenizer.encode(prompt))output_tokenslen(tokenizer.encode(generated_text))- input_tokens else:# 如果无法获取tokenizer使用估算值按字符数估算中文约1.5字符1tokeninput_tokensint(len(prompt)/1.5)output_tokensint(len(generated_text)/1.5)except Exception as e:# 如果计算失败使用估算值print(fToken计算失败使用估算值: {e})input_tokensint(len(prompt)/1.5)output_tokensint(len(generated_text)/1.5)# 检查关键词匹配generated_lowergenerated_text.lower()keywords_foundsum(1forkeywordintest_case[expected_keywords]ifkeyword.lower()ingenerated_lower)keyword_score(keywords_found / len(test_case[expected_keywords]))*100# 检查专业术语使用has_technical_termsany(wordingenerated_textforwordin[原理,机制,应用,概念,理论])has_explanationlen(generated_text)100result{test_id:test_case[id],industry:test_case[industry],description:test_case[description],prompt:test_case[prompt],generated_text:generated_text,generation_time:round(generation_time,3),input_tokens:input_tokens,output_tokens:output_tokens,total_tokens:input_tokens output_tokens,tokens_per_second:round(output_tokens / generation_time,2)ifgeneration_time0else0,keyword_score:round(keyword_score,2),keywords_found:keywords_found,total_keywords:len(test_case[expected_keywords]),has_technical_terms:has_technical_terms,has_explanation:has_explanation,text_length:len(generated_text),success:True}print(f生成时间: {generation_time:.3f}秒)print(f输出Token数: {output_tokens})print(f生成速度: {result[tokens_per_second]:.2f} tokens/秒)print(f关键词匹配率: {keyword_score:.2f}% ({keywords_found}/{len(test_case[expected_keywords])}))print(f\n生成的回答:\n{generated_text})except Exception as e: print(f测试用例 {test_case[id]} 执行失败: {e})result{test_id:test_case[id],industry:test_case[industry],description:test_case[description],prompt:test_case[prompt],error:str(e),success:False}print(f错误信息: {e})results.append(result)print(-*60)# 保存结果with open(results_test1_industry_terminology.json,w,encodingutf-8)as f: json.dump(results, f,ensure_asciiFalse,indent2)# 统计摘要avg_timesum(r[generation_time]forrinresults)/ len(results)avg_tokenssum(r[output_tokens]forrinresults)/ len(results)avg_speedsum(r[tokens_per_second]forrinresults)/ len(results)avg_keyword_scoresum(r[keyword_score]forrinresults)/ len(results)print(\n*60)print(测试摘要)print(*60)print(f平均生成时间: {avg_time:.3f}秒)print(f平均输出Token数: {avg_tokens:.0f})print(f平均生成速度: {avg_speed:.2f} tokens/秒)print(f平均关键词匹配率: {avg_keyword_score:.2f}%)print(f包含专业术语的用例: {sum(1 for r in results if r[has_technical_terms])}/{len(results)})print(f\n所有结果已保存到: results_test1_industry_terminology.json)运行结果成功核心测试指标test_id1医疗 - CAR-T 疗法test_id2金融 - 新能源投资test_id3工业 - 工业 4.0test_id4教育 - 建构主义test_id5法律 - 不可抗力行业领域医疗金融工业教育法律测试描述医疗术语理解 - CAR-T 疗法金融行业分析 - 新能源投资工业术语理解 - 工业 4.0教育术语理解 - 建构主义法律术语理解 - 不可抗力输入提示词核心解释 CAR-T 疗法原理、机制、临床应用分析 2025 年 A 股新能源投资逻辑趋势 / 政策 / 风险解释工业 4.0 核心概念及三大技术作用解释建构主义核心观点及教育应用解释不可抗力构成要件及合同纠纷适用生成文本完整性未完成仅介绍机制前 2 步未完成政策影响部分截断未完成技术相互作用部分截断未完成应用案例部分截断严重重复且未完成核心内容未展开生成时长秒20.58719.50019.05119.34419.746输入 tokens6569575357输出 tokens299299299299298总 tokens364368356352355生成速度tokens / 秒14.5215.3315.6915.4615.09关键词匹配得分%60100806080命中关键词数 / 总关键词数3/55/54/53/54/5是否包含专业术语是否是是是是否提供有效解释说明是是是是否仅重复术语生成文本长度字符250261289259223测试成功标识truetruetruetruetrue维度全覆盖整合了「行业属性、生成质量、性能指标、内容合规性」4 大类 16 项关键信息满足多维度评估需求对比直观化通过横向列对齐可快速发现性能瓶颈所有测试均存在生成文本未完成问题输出 tokens 均接近 300 上限疑似长度限制行业差异金融行业关键词匹配得分 100%精准命中投资逻辑核心要素法律行业存在严重内容重复生成质量最差速度稳定生成速度集中在 14.5-15.7 tokens / 秒性能波动较小测试2办公协同能力测试测试目的这个测试看LLaVA在办公场景下的表现包括文档生成工作总结、会议纪要、信息提取合同条款、邮件撰写、方案制定等。代码 测试2: 办公协同能力测试 测试LLaVA在文档生成、信息提取等办公场景下的表现importosimporttimeimportjsonimporttorch from transformersimportAutoProcessor, LlavaForConditionalGeneration, LlamaTokenizer# 设置HuggingFace镜像os.environ[HF_ENDPOINT]https://hf-mirror.commodel_idllava-hf/llava-1.5-7b-hfprint(正在加载模型...)# 昇腾NPU环境使用device_mapauto自动分配设备modelLlavaForConditionalGeneration.from_pretrained(model_id,torch_dtypetorch.float16,low_cpu_mem_usageTrue,device_mapauto,# 自动检测并使用NPU)print(正在加载processor...)# 如果fast tokenizer加载失败尝试使用slow tokenizertry: processorAutoProcessor.from_pretrained(model_id)print(使用fast tokenizer加载成功)except Exception as e: print(fFast tokenizer加载失败: {e})print(尝试使用slow tokenizer手动构建processor...)from transformersimportCLIPImageProcessor try: tokenizerLlamaTokenizer.from_pretrained(model_id,use_fastFalse)image_processorCLIPImageProcessor.from_pretrained(model_id)class CustomProcessor: def __init__(self, tokenizer, image_processor): self.tokenizertokenizer self.image_processorimage_processor def apply_chat_template(self, conversation,add_generation_promptTrue): textformsginconversation:ifmsg[role]user:forcontentinmsg[content]:ifcontent[type]text:textcontent[text]ifadd_generation_prompt: text\nASSISTANT:returntext def __call__(self,imagesNone,textNone,return_tensorspt): text_inputsself.tokenizer(text,return_tensorsreturn_tensors)ifimages is not None:ifnot isinstance(images, list): images[images]pixel_valuesself.image_processor(images,return_tensorsreturn_tensors)[pixel_values]return{**text_inputs,pixel_values:pixel_values}returntext_inputs def decode(self, token_ids,skip_special_tokensTrue):returnself.tokenizer.decode(token_ids,skip_special_tokensskip_special_tokens)processorCustomProcessor(tokenizer, image_processor)print(使用slow tokenizer手动构建processor成功)except Exception as e2: print(f手动构建processor也失败: {e2})raise print(模型和processor加载完成)# 测试用例办公协同场景test_cases[{id:1,task_type:文档生成,prompt:写一份Q3技术部门工作总结包括1. 完成的主要项目 2. 技术突破 3. 团队建设 4. 下季度规划。要求结构清晰内容详实。,expected_sections:[项目,技术,团队,规划],description:技术部门工作总结生成},{id:2,task_type:信息提取,prompt:从以下合同条款中提取关键信息本合同自2025年1月1日起生效有效期3年。付款方式为首付30%在签约后7个工作日内支付余款在项目验收后15个工作日内支付。如乙方违约需支付合同总额20%的违约金。请提取付款期限、违约责任、合同期限。,expected_keywords:[付款,违约,合同期限,7个工作日,15个工作日,20%],description:合同信息提取},{id:3,task_type:邮件撰写,prompt:写一封给客户的邮件主题是项目延期通知。要求1. 说明延期原因技术难点需要更多时间2. 新的交付时间延期2周3. 表达歉意并说明补偿措施。语气要专业且诚恳。,expected_keywords:[延期,技术难点,交付时间,歉意,补偿],description:客户邮件撰写},{id:4,task_type:方案制定,prompt:制定一份新员工培训方案包括1. 培训目标 2. 培训内容产品知识、业务流程、系统操作3. 培训周期2周4. 考核方式。要求可执行性强。,expected_keywords:[培训目标,培训内容,培训周期,考核,产品知识],description:培训方案制定},{id:5,task_type:会议纪要,prompt:根据以下会议内容整理会议纪要会议主题Q4产品规划。参会人员产品、技术、运营负责人。讨论要点1. 新功能需求优先级排序 2. 技术实现方案评估 3. 上线时间节点确定。决议优先开发用户反馈最多的3个功能预计12月底上线。要求格式规范要点清晰。,expected_keywords:[会议主题,参会人员,讨论要点,决议,上线时间],description:会议纪要整理}]results[]print(*60)print(测试2: 办公协同能力测试)print(*60)fortest_caseintest_cases: print(f\n测试用例 {test_case[id]}: {test_case[description]})print(f任务类型: {test_case[task_type]})print(f提示词: {test_case[prompt][:100]}...)try: conversation[{role:user,content:[{type:text,text:test_case[prompt]},],},]promptprocessor.apply_chat_template(conversation,add_generation_promptTrue)inputsprocessor(textprompt,return_tensorspt)# 将输入移到模型所在的设备ifhasattr(model,device): inputs{k: v.to(model.device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}else: inputs{k: v.to(next(model.parameters()).device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}# 确保数据类型正确inputs{k: v.to(torch.float16)ifisinstance(v, torch.Tensor)and v.dtypetorch.float32elsevfork,vininputs.items()}# 过滤掉模型不需要的参数model_inputs{k:vfork,vininputs.items()ifk notin[images]}start_timetime.time()outputmodel.generate(**model_inputs,max_new_tokens400,do_sampleTrue,temperature0.4,top_p0.95,)end_timetime.time()generation_timeend_time - start_time generated_textprocessor.decode(output[0][2:],skip_special_tokensTrue)# 计算token数量try:ifhasattr(processor,tokenizer): tokenizerprocessor.tokenizer else: tokenizergetattr(processor,tokenizer, None)iftokenizer is not None: input_tokenslen(tokenizer.encode(prompt))output_tokenslen(tokenizer.encode(generated_text))- input_tokens else: input_tokensint(len(prompt)/1.5)output_tokensint(len(generated_text)/1.5)except Exception as e: input_tokensint(len(prompt)/1.5)output_tokensint(len(generated_text)/1.5)# 检查关键词匹配generated_lowergenerated_text.lower()keywords_foundsum(1forkeywordintest_case[expected_keywords]ifkeyword.lower()ingenerated_lower)keyword_score(keywords_found / len(test_case[expected_keywords]))*100# 检查文档质量has_structureany(wordingenerated_textforwordin[1.,2.,3.,一、,二、,三、,首先,其次])has_detailslen(generated_text)200result{test_id:test_case[id],task_type:test_case[task_type],description:test_case[description],prompt:test_case[prompt],generated_text:generated_text,generation_time:round(generation_time,3),input_tokens:input_tokens,output_tokens:output_tokens,tokens_per_second:round(output_tokens / generation_time,2)ifgeneration_time0else0,keyword_score:round(keyword_score,2),keywords_found:keywords_found,has_structure:has_structure,has_details:has_details,text_length:len(generated_text),success:True}print(f生成时间: {generation_time:.3f}秒)print(f输出Token数: {output_tokens})print(f关键词匹配率: {keyword_score:.2f}% ({keywords_found}/{len(test_case[expected_keywords])}))print(f包含结构: {has_structure})print(f\n生成的内容:\n{generated_text[:300]}...)except Exception as e: print(f测试用例 {test_case[id]} 执行失败: {e})result{test_id:test_case[id],task_type:test_case.get(task_type,),description:test_case[description],prompt:test_case[prompt],error:str(e),success:False}print(f错误信息: {e})results.append(result)print(-*60)with open(results_test2_office_collaboration.json,w,encodingutf-8)as f: json.dump(results, f,ensure_asciiFalse,indent2)avg_timesum(r[generation_time]forrinresults)/ len(results)avg_keyword_scoresum(r[keyword_score]forrinresults)/ len(results)print(\n*60)print(测试摘要)print(*60)print(f平均生成时间: {avg_time:.3f}秒)print(f平均关键词匹配率: {avg_keyword_score:.2f}%)print(f包含结构的文档: {sum(1 for r in results if r[has_structure])}/{len(results)})print(f\n所有结果已保存到: results_test2_office_collaboration.json)结果测试 ID任务类型核心需求执行结果关键指标tokens / 秒test_id1文档生成撰写 Q3 技术部门工作总结含 4 大模块项目、技术突破、团队建设、下季度规划失败-test_id2信息提取从合同条款中提取付款期限、违约责任、合同期限 3 类关键信息成功15.25test_id3邮件撰写撰写项目延期通知邮件说明原因、新交付时间、致歉 补偿措施成功15.14test_id4方案制定制定 2 周新员工培训方案含目标、3 类内容、考核方式成功15.57test_id5会议纪要整理 Q4 产品规划会议纪要规范格式、清晰呈现要点与决议成功15.36性能表现成功任务的 tokens 生成速度稳定在 15.14-15.57 之间效率均衡​质量特征所有成功任务均满足has_detailstrue内容详实除信息提取外均实现has_structuretrue结构清晰关键词命中率 100%。测试3创意内容生成测试测试目的这个测试看LLaVA的创意能力包括营销口号、故事续写、产品文案、广告脚本、品牌故事等。代码 测试3: 创意内容生成测试 测试LLaVA在文案创作、营销口号、故事续写等创意场景下的表现importosimporttimeimportjsonimporttorch from transformersimportAutoProcessor, LlavaForConditionalGeneration, LlamaTokenizer os.environ[HF_ENDPOINT]https://hf-mirror.commodel_idllava-hf/llava-1.5-7b-hfprint(正在加载模型...)# 昇腾NPU环境使用device_mapauto自动分配设备modelLlavaForConditionalGeneration.from_pretrained(model_id,torch_dtypetorch.float16,low_cpu_mem_usageTrue,device_mapauto,# 自动检测并使用NPU)print(正在加载processor...)try: processorAutoProcessor.from_pretrained(model_id)print(使用fast tokenizer加载成功)except Exception as e: print(fFast tokenizer加载失败: {e})print(尝试使用slow tokenizer手动构建processor...)from transformersimportCLIPImageProcessor try: tokenizerLlamaTokenizer.from_pretrained(model_id,use_fastFalse)image_processorCLIPImageProcessor.from_pretrained(model_id)class CustomProcessor: def __init__(self, tokenizer, image_processor): self.tokenizertokenizer self.image_processorimage_processor def apply_chat_template(self, conversation,add_generation_promptTrue): textformsginconversation:ifmsg[role]user:forcontentinmsg[content]:ifcontent[type]text:textcontent[text]ifadd_generation_prompt: text\nASSISTANT:returntext def __call__(self,imagesNone,textNone,return_tensorspt): text_inputsself.tokenizer(text,return_tensorsreturn_tensors)ifimages is not None:ifnot isinstance(images, list): images[images]pixel_valuesself.image_processor(images,return_tensorsreturn_tensors)[pixel_values]return{**text_inputs,pixel_values:pixel_values}returntext_inputs def decode(self, token_ids,skip_special_tokensTrue):returnself.tokenizer.decode(token_ids,skip_special_tokensskip_special_tokens)processorCustomProcessor(tokenizer, image_processor)print(使用slow tokenizer手动构建processor成功)except Exception as e2: print(f手动构建processor也失败: {e2})raise print(模型和processor加载完成)test_cases[{id:1,task_type:营销口号,prompt:为一款智能手表写3条营销口号要求1. 突出健康监测功能 2. 强调科技感 3. 朗朗上口易于记忆。每条口号不超过15个字。,expected_keywords:[智能,健康,科技,监测],description:智能手表营销口号创作},{id:2,task_type:故事续写,prompt:续写《三体》中黑暗森林法则的延伸剧情。要求1. 保持原作的科幻风格 2. 探讨文明间的博弈 3. 情节要有转折。续写300字左右。,expected_keywords:[黑暗森林,文明,博弈,宇宙],description:科幻小说续写},{id:3,task_type:产品文案,prompt:为一款主打极简设计的蓝牙耳机写产品文案包括1. 产品定位 2. 核心卖点音质、续航、设计3. 使用场景。要求有感染力能激发购买欲望。,expected_keywords:[极简,音质,续航,设计,蓝牙耳机],description:产品文案创作},{id:4,task_type:广告脚本,prompt:写一个30秒的短视频广告脚本产品是智能学习台灯。要求1. 开头吸引注意 2. 展示核心功能护眼、智能调光、学习模式3. 结尾有行动号召。格式画面旁白。,expected_keywords:[智能,护眼,调光,学习],description:广告脚本创作},{id:5,task_type:品牌故事,prompt:为一个新成立的可持续时尚品牌写品牌故事包括1. 品牌理念环保、可持续2. 创立背景 3. 未来愿景。要求有温度能引起共鸣。,expected_keywords:[可持续,环保,时尚,理念],description:品牌故事创作}]results[]print(*60)print(测试3: 创意内容生成测试)print(*60)fortest_caseintest_cases: print(f\n测试用例 {test_case[id]}: {test_case[description]})print(f任务类型: {test_case[task_type]})try: conversation[{role:user,content:[{type:text,text:test_case[prompt]},],},]promptprocessor.apply_chat_template(conversation,add_generation_promptTrue)inputsprocessor(textprompt,return_tensorspt)# 将输入移到模型所在的设备ifhasattr(model,device): inputs{k: v.to(model.device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}else: inputs{k: v.to(next(model.parameters()).device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}# 确保数据类型正确inputs{k: v.to(torch.float16)ifisinstance(v, torch.Tensor)and v.dtypetorch.float32elsevfork,vininputs.items()}# 过滤掉模型不需要的参数model_inputs{k:vfork,vininputs.items()ifk notin[images]}start_timetime.time()# 创意内容用稍高的temperature增加多样性outputmodel.generate(**model_inputs,max_new_tokens350,do_sampleTrue,temperature0.7,top_p0.9,)end_timetime.time()generation_timeend_time - start_time generated_textprocessor.decode(output[0][2:],skip_special_tokensTrue)# 计算token数量try:ifhasattr(processor,tokenizer): tokenizerprocessor.tokenizer else: tokenizergetattr(processor,tokenizer, None)iftokenizer is not None: input_tokenslen(tokenizer.encode(prompt))output_tokenslen(tokenizer.encode(generated_text))- input_tokens else: input_tokensint(len(prompt)/1.5)output_tokensint(len(generated_text)/1.5)except Exception as e: input_tokensint(len(prompt)/1.5)output_tokensint(len(generated_text)/1.5)generated_lowergenerated_text.lower()keywords_foundsum(1forkeywordintest_case[expected_keywords]ifkeyword.lower()ingenerated_lower)keyword_score(keywords_found / len(test_case[expected_keywords]))*100# 检查创意性指标has_emotional_wordsany(wordingenerated_textforwordin[梦想,未来,美好,体验,感受,享受])has_call_to_actionany(wordingenerated_textforwordin[立即,现在,快来,选择,拥有])is_creativelen(generated_text)150and keyword_score50result{test_id:test_case[id],task_type:test_case[task_type],description:test_case[description],prompt:test_case[prompt],generated_text:generated_text,generation_time:round(generation_time,3),input_tokens:input_tokens,output_tokens:output_tokens,tokens_per_second:round(output_tokens / generation_time,2)ifgeneration_time0else0,keyword_score:round(keyword_score,2),keywords_found:keywords_found,has_emotional_words:has_emotional_words,has_call_to_action:has_call_to_action,is_creative:is_creative,text_length:len(generated_text),success:True}print(f生成时间: {generation_time:.3f}秒)print(f关键词匹配率: {keyword_score:.2f}%)print(f创意性评分: {高 if is_creative else 中})print(f\n生成的内容:\n{generated_text})except Exception as e: print(f测试用例 {test_case[id]} 执行失败: {e})result{test_id:test_case[id],task_type:test_case.get(task_type,),description:test_case[description],prompt:test_case[prompt],error:str(e),success:False}print(f错误信息: {e})results.append(result)print(-*60)with open(results_test3_creative_content.json,w,encodingutf-8)as f: json.dump(results, f,ensure_asciiFalse,indent2)avg_timesum(r[generation_time]forrinresults)/ len(results)avg_keyword_scoresum(r[keyword_score]forrinresults)/ len(results)creative_countsum(1forrinresultsifr[is_creative])print(\n*60)print(测试摘要)print(*60)print(f平均生成时间: {avg_time:.3f}秒)print(f平均关键词匹配率: {avg_keyword_score:.2f}%)print(f高创意性内容: {creative_count}/{len(results)})print(f\n所有结果已保存到: results_test3_creative_content.json)结果测试 ID任务类型核心需求执行结果关键指标tokens / 秒特色指标亮点test_id1营销口号创作 3 条智能手表口号突出健康监测 科技感15 字内易记忆成功11.95含情感词关键词命中率 100%test_id2故事续写续写《三体》黑暗森林法则剧情科幻风格 文明博弈 情节转折300 字左右成功15.97创意性强关键词命中率 75%test_id3产品文案撰写极简蓝牙耳机文案定位 音质 / 续航 / 设计卖点 使用场景有感染力成功16.30含情感词、创意性强关键词 100%test_id4广告脚本30 秒智能学习台灯脚本吸睛开头 护眼 / 调光 / 学习模式 行动号召画面 旁白成功15.50创意性强关键词命中率 100%test_id5品牌故事撰写可持续时尚品牌故事环保理念 创立背景 未来愿景有温度、能共鸣成功15.45含情感词、有行动号召创意性强性能表现创意类任务的 tokens 生成速度在 11.95-16.30 之间其中产品文案16.30效率最高营销口号11.95因需精炼表达速度稍慢整体处于合理区间质量特征关键词命中率仅故事续写75%未达满分其余均 100% 命中核心需求创意与情感80% 的任务4/5具备创意性60%3/5含情感词能有效满足创意类内容的感染力要求行动号召仅品牌故事明确包含行动号召广告脚本虽要求但未完整呈现需优化落地性待改进点部分生成文本存在字符缺失如产品文案 “极”、内容未收尾如故事续写等问题虽不影响核心需求判定但需提升文本完整性。测试4教育辅助能力测试测试目的这个测试看LLaVA在教育场景下的表现包括知识点讲解、错题分析、学习规划、答疑解惑、概念对比等。代码 测试4: 教育辅助能力测试 测试LLaVA在知识点讲解、错题分析、学习规划等教育场景下的表现importosimporttimeimportjsonimporttorch from transformersimportAutoProcessor, LlavaForConditionalGeneration, LlamaTokenizer os.environ[HF_ENDPOINT]https://hf-mirror.commodel_idllava-hf/llava-1.5-7b-hfprint(正在加载模型...)# 昇腾NPU环境使用device_mapauto自动分配设备modelLlavaForConditionalGeneration.from_pretrained(model_id,torch_dtypetorch.float16,low_cpu_mem_usageTrue,device_mapauto,# 自动检测并使用NPU)print(正在加载processor...)try: processorAutoProcessor.from_pretrained(model_id)print(使用fast tokenizer加载成功)except Exception as e: print(fFast tokenizer加载失败: {e})print(尝试使用slow tokenizer手动构建processor...)from transformersimportCLIPImageProcessor try: tokenizerLlamaTokenizer.from_pretrained(model_id,use_fastFalse)image_processorCLIPImageProcessor.from_pretrained(model_id)class CustomProcessor: def __init__(self, tokenizer, image_processor): self.tokenizertokenizer self.image_processorimage_processor def apply_chat_template(self, conversation,add_generation_promptTrue): textformsginconversation:ifmsg[role]user:forcontentinmsg[content]:ifcontent[type]text:textcontent[text]ifadd_generation_prompt: text\nASSISTANT:returntext def __call__(self,imagesNone,textNone,return_tensorspt): text_inputsself.tokenizer(text,return_tensorsreturn_tensors)ifimages is not None:ifnot isinstance(images, list): images[images]pixel_valuesself.image_processor(images,return_tensorsreturn_tensors)[pixel_values]return{**text_inputs,pixel_values:pixel_values}returntext_inputs def decode(self, token_ids,skip_special_tokensTrue):returnself.tokenizer.decode(token_ids,skip_special_tokensskip_special_tokens)processorCustomProcessor(tokenizer, image_processor)print(使用slow tokenizer手动构建processor成功)except Exception as e2: print(f手动构建processor也失败: {e2})raise print(模型和processor加载完成)test_cases[{id:1,task_type:知识点讲解,prompt:用通俗语言解释量子纠缠这一物理概念要求1. 避免过于专业的术语 2. 用生活中的例子类比 3. 说明它的实际应用。适合高中生理解。,expected_keywords:[量子,纠缠,关联,应用],description:物理概念讲解 - 量子纠缠},{id:2,task_type:错题分析,prompt:分析这道数学题的错误原因并给出解题步骤题目解方程 2x 5 3x - 2。学生解答2x 5 3x - 2所以 x 7。请指出错误并给出正确解法。,expected_keywords:[移项,合并同类项,错误,正确解法],description:数学错题分析},{id:3,task_type:学习规划,prompt:为一个准备高考的高三学生制定一个月的英语复习计划包括1. 每日学习时间分配 2. 重点内容词汇、语法、阅读3. 每周目标 4. 学习方法建议。要求可执行。,expected_keywords:[复习计划,时间分配,词汇,语法,阅读],description:学习计划制定},{id:4,task_type:答疑解惑,prompt:学生问为什么说光合作用是地球上最重要的化学反应请用简洁明了的方式回答包括1. 光合作用的基本过程 2. 它对生态系统的意义 3. 对人类的重要性。,expected_keywords:[光合作用,化学反应,生态系统,氧气,二氧化碳],description:生物知识答疑},{id:5,task_type:概念对比,prompt:解释速度和加速度的区别要求1. 给出定义 2. 说明两者的关系 3. 用具体例子说明。适合初中生理解。,expected_keywords:[速度,加速度,定义,区别,例子],description:物理概念对比}]results[]print(*60)print(测试4: 教育辅助能力测试)print(*60)fortest_caseintest_cases: print(f\n测试用例 {test_case[id]}: {test_case[description]})print(f任务类型: {test_case[task_type]})try: conversation[{role:user,content:[{type:text,text:test_case[prompt]},],},]promptprocessor.apply_chat_template(conversation,add_generation_promptTrue)inputsprocessor(textprompt,return_tensorspt)# 将输入移到模型所在的设备ifhasattr(model,device): inputs{k: v.to(model.device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}else: inputs{k: v.to(next(model.parameters()).device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}# 确保数据类型正确inputs{k: v.to(torch.float16)ifisinstance(v, torch.Tensor)and v.dtypetorch.float32elsevfork,vininputs.items()}# 过滤掉模型不需要的参数model_inputs{k:vfork,vininputs.items()ifk notin[images]}start_timetime.time()outputmodel.generate(**model_inputs,max_new_tokens400,do_sampleTrue,temperature0.3,top_p0.95,)end_timetime.time()generation_timeend_time - start_time generated_textprocessor.decode(output[0][2:],skip_special_tokensTrue)# 计算token数量try:ifhasattr(processor,tokenizer): tokenizerprocessor.tokenizer else: tokenizergetattr(processor,tokenizer, None)iftokenizer is not None: input_tokenslen(tokenizer.encode(prompt))output_tokenslen(tokenizer.encode(generated_text))- input_tokens else: input_tokensint(len(prompt)/1.5)output_tokensint(len(generated_text)/1.5)except Exception as e: input_tokensint(len(prompt)/1.5)output_tokensint(len(generated_text)/1.5)generated_lowergenerated_text.lower()keywords_foundsum(1forkeywordintest_case[expected_keywords]ifkeyword.lower()ingenerated_lower)keyword_score(keywords_found / len(test_case[expected_keywords]))*100# 检查教育质量指标has_examplesany(wordingenerated_textforwordin[例如,比如,举例,例子])has_stepsany(wordingenerated_textforwordin[第一步,首先,然后,最后,1.,2.])is_clearlen(generated_text)150and keyword_score60result{test_id:test_case[id],task_type:test_case[task_type],description:test_case[description],prompt:test_case[prompt],generated_text:generated_text,generation_time:round(generation_time,3),input_tokens:input_tokens,output_tokens:output_tokens,tokens_per_second:round(output_tokens / generation_time,2)ifgeneration_time0else0,keyword_score:round(keyword_score,2),keywords_found:keywords_found,has_examples:has_examples,has_steps:has_steps,is_clear:is_clear,text_length:len(generated_text),success:True}print(f生成时间: {generation_time:.3f}秒)print(f关键词匹配率: {keyword_score:.2f}%)print(f讲解清晰度: {高 if is_clear else 中})print(f包含例子: {has_examples})print(f\n生成的内容:\n{generated_text})except Exception as e: print(f测试用例 {test_case[id]} 执行失败: {e})result{test_id:test_case[id],task_type:test_case.get(task_type,),description:test_case[description],prompt:test_case[prompt],error:str(e),success:False}print(f错误信息: {e})results.append(result)print(-*60)with open(results_test4_education_assistance.json,w,encodingutf-8)as f: json.dump(results, f,ensure_asciiFalse,indent2)avg_timesum(r[generation_time]forrinresults)/ len(results)avg_keyword_scoresum(r[keyword_score]forrinresults)/ len(results)clear_countsum(1forrinresultsifr[is_clear])print(\n*60)print(测试摘要)print(*60)print(f平均生成时间: {avg_time:.3f}秒)print(f平均关键词匹配率: {avg_keyword_score:.2f}%)print(f高清晰度讲解: {clear_count}/{len(results)})print(f包含例子的回答: {sum(1 for r in results if r[has_examples])}/{len(results)})print(f\n所有结果已保存到: results_test4_education_assistance.json)结果测试 ID任务类型核心需求执行结果关键指标tokens / 秒特色指标亮点test_id1知识点讲解通俗解释量子纠缠避专业术语 生活类比 实际应用适合高中生成功15.28有例子、逻辑清晰关键词命中率 75%test_id2错题分析分析数学解方程错题原因 给出正确步骤题目2x53x-2学生答 x7成功15.97有步骤关键词命中率 50%逻辑不清晰test_id3学习规划制定高三英语月复习计划每日时间分配 词汇 / 语法 / 阅读重点 每周目标 方法成功15.68有步骤、逻辑清晰关键词命中率 100%test_id4答疑解惑回答 “光合作用为何是最重要化学反应”基本过程 生态意义 人类重要性成功16.01有例子、有步骤、逻辑清晰关键词 100%test_id5概念对比区分 “速度” 与 “加速度”定义 关系 具体例子适合初中生成功16.18有例子、有步骤、逻辑清晰关键词 100%补充说明性能表现学习类任务的 tokens 生成速度稳定在 15.28-16.18 之间整体效率均衡其中概念对比16.18速度最快知识点讲解15.28因需通俗化转化稍慢符合学习类内容的创作规律质量特征关键词命中率错题分析50%、知识点讲解75%未达满分其余均 100% 命中核心需求错题分析因未准确识别学生错误实际学生答案 x7 是正确的生成文本误判错误导致命中率偏低逻辑与实用性80% 的任务4/5逻辑清晰、具备可执行性仅错题分析存在逻辑混乱正确解法步骤错误辅助理解75% 的任务3/4除学习规划外包含具体例子所有任务均有明确步骤符合学习类内容 “易懂、可操作” 的核心要求待改进点部分生成文本存在内容未收尾如知识点讲解、概念对比、核心逻辑错误错题分析等问题需提升文本完整性和专业准确性错题分析类任务需加强对题目本身的精准解读避免误判正确答案。测试5客户服务能力测试测试目的这个测试看LLaVA在客服场景下的表现包括故障排查、投诉处理、产品咨询、情绪安抚、使用指导等代码 测试5: 客户服务能力测试 测试LLaVA在问题解答、故障排查、用户情绪识别与回应等客服场景下的表现importosimporttimeimportjsonimporttorch from transformersimportAutoProcessor, LlavaForConditionalGeneration, LlamaTokenizer os.environ[HF_ENDPOINT]https://hf-mirror.commodel_idllava-hf/llava-1.5-7b-hfprint(正在加载模型...)# 昇腾NPU环境使用device_mapauto自动分配设备modelLlavaForConditionalGeneration.from_pretrained(model_id,torch_dtypetorch.float16,low_cpu_mem_usageTrue,device_mapauto,# 自动检测并使用NPU)print(正在加载processor...)try: processorAutoProcessor.from_pretrained(model_id)print(使用fast tokenizer加载成功)except Exception as e: print(fFast tokenizer加载失败: {e})print(尝试使用slow tokenizer手动构建processor...)from transformersimportCLIPImageProcessor try: tokenizerLlamaTokenizer.from_pretrained(model_id,use_fastFalse)image_processorCLIPImageProcessor.from_pretrained(model_id)class CustomProcessor: def __init__(self, tokenizer, image_processor): self.tokenizertokenizer self.image_processorimage_processor def apply_chat_template(self, conversation,add_generation_promptTrue): textformsginconversation:ifmsg[role]user:forcontentinmsg[content]:ifcontent[type]text:textcontent[text]ifadd_generation_prompt: text\nASSISTANT:returntext def __call__(self,imagesNone,textNone,return_tensorspt): text_inputsself.tokenizer(text,return_tensorsreturn_tensors)ifimages is not None:ifnot isinstance(images, list): images[images]pixel_valuesself.image_processor(images,return_tensorsreturn_tensors)[pixel_values]return{**text_inputs,pixel_values:pixel_values}returntext_inputs def decode(self, token_ids,skip_special_tokensTrue):returnself.tokenizer.decode(token_ids,skip_special_tokensskip_special_tokens)processorCustomProcessor(tokenizer, image_processor)print(使用slow tokenizer手动构建processor成功)except Exception as e2: print(f手动构建processor也失败: {e2})raise print(模型和processor加载完成)test_cases[{id:1,task_type:故障排查,prompt:用户问题我的手机无法连接Wi-Fi怎么排查请提供详细的排查步骤包括1. 常见原因 2. 逐步排查方法 3. 解决方案。语气要耐心、专业。,expected_keywords:[Wi-Fi,排查,步骤,解决方案,重启,密码],description:Wi-Fi故障排查},{id:2,task_type:投诉处理,prompt:用户抱怨你们的产品质量太差了刚买一个月就坏了我要退货请写一份客服回应要求1. 表达歉意和理解 2. 说明处理流程 3. 提供解决方案退货或换货4. 语气要诚恳、专业。,expected_keywords:[歉意,理解,退货,换货,处理,解决方案],description:用户投诉处理},{id:3,task_type:产品咨询,prompt:用户问我想买一台笔记本电脑主要用于办公和偶尔玩游戏预算8000元左右有什么推荐请提供1. 配置建议 2. 品牌推荐 3. 购买建议。要求专业且实用。,expected_keywords:[笔记本电脑,配置,办公,游戏,预算,推荐],description:产品咨询回答},{id:4,task_type:情绪安抚,prompt:用户情绪激动地说我预约的服务被取消了而且没人通知我浪费了我一上午时间请写一份回应要求1. 承认错误并道歉 2. 说明原因 3. 提供补偿方案 4. 语气要安抚、诚恳。,expected_keywords:[道歉,错误,原因,补偿,安抚],description:用户情绪安抚},{id:5,task_type:使用指导,prompt:用户问我刚买了智能音箱不知道怎么设置能教教我吗请提供1. 初始设置步骤 2. 常见功能使用 3. 注意事项。要求步骤清晰易于操作。,expected_keywords:[设置,步骤,功能,智能音箱,操作],description:产品使用指导}]results[]print(*60)print(测试5: 客户服务能力测试)print(*60)fortest_caseintest_cases: print(f\n测试用例 {test_case[id]}: {test_case[description]})print(f任务类型: {test_case[task_type]})try: conversation[{role:user,content:[{type:text,text:test_case[prompt]},],},]promptprocessor.apply_chat_template(conversation,add_generation_promptTrue)inputsprocessor(textprompt,return_tensorspt)# 将输入移到模型所在的设备ifhasattr(model,device): inputs{k: v.to(model.device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}else: inputs{k: v.to(next(model.parameters()).device)ifisinstance(v, torch.Tensor)elsevfork,vininputs.items()}# 确保数据类型正确inputs{k: v.to(torch.float16)ifisinstance(v, torch.Tensor)and v.dtypetorch.float32elsevfork,vininputs.items()}# 过滤掉模型不需要的参数model_inputs{k:vfork,vininputs.items()ifk notin[images]}start_timetime.time()outputmodel.generate(**model_inputs,max_new_tokens350,do_sampleTrue,temperature0.4,top_p0.95,)end_timetime.time()generation_timeend_time - start_time generated_textprocessor.decode(output[0][2:],skip_special_tokensTrue)# 计算token数量try:ifhasattr(processor,tokenizer): tokenizerprocessor.tokenizer else: tokenizergetattr(processor,tokenizer, None)iftokenizer is not None: input_tokenslen(tokenizer.encode(prompt))output_tokenslen(tokenizer.encode(generated_text))- input_tokens else: input_tokensint(len(prompt)/1.5)output_tokensint(len(generated_text)/1.5)except Exception as e: input_tokensint(len(prompt)/1.5)output_tokensint(len(generated_text)/1.5)generated_lowergenerated_text.lower()keywords_foundsum(1forkeywordintest_case[expected_keywords]ifkeyword.lower()ingenerated_lower)keyword_score(keywords_found / len(test_case[expected_keywords]))*100# 检查客服质量指标has_apologyany(wordingenerated_textforwordin[抱歉,对不起,歉意,理解])has_solutionany(wordingenerated_textforwordin[解决方案,可以,建议,方法,步骤])is_professionallen(generated_text)100and keyword_score50has_empathetic_wordsany(wordingenerated_textforwordin[理解,抱歉,感谢,为您])result{test_id:test_case[id],task_type:test_case[task_type],description:test_case[description],prompt:test_case[prompt],generated_text:generated_text,generation_time:round(generation_time,3),input_tokens:input_tokens,output_tokens:output_tokens,tokens_per_second:round(output_tokens / generation_time,2)ifgeneration_time0else0,keyword_score:round(keyword_score,2),keywords_found:keywords_found,has_apology:has_apology,has_solution:has_solution,is_professional:is_professional,has_empathetic_words:has_empathetic_words,text_length:len(generated_text),success:True}print(f生成时间: {generation_time:.3f}秒)print(f关键词匹配率: {keyword_score:.2f}%)print(f专业性: {高 if is_professional else 中})print(f包含解决方案: {has_solution})print(f\n生成的回应:\n{generated_text})except Exception as e: print(f测试用例 {test_case[id]} 执行失败: {e})result{test_id:test_case[id],task_type:test_case.get(task_type,),description:test_case[description],prompt:test_case[prompt],error:str(e),success:False}print(f错误信息: {e})results.append(result)print(-*60)with open(results_test5_customer_service.json,w,encodingutf-8)as f: json.dump(results, f,ensure_asciiFalse,indent2)avg_timesum(r[generation_time]forrinresults)/ len(results)avg_keyword_scoresum(r[keyword_score]forrinresults)/ len(results)professional_countsum(1forrinresultsifr[is_professional])print(\n*60)print(测试摘要)print(*60)print(f平均生成时间: {avg_time:.3f}秒)print(f平均关键词匹配率: {avg_keyword_score:.2f}%)print(f高专业性回应: {professional_count}/{len(results)})print(f包含解决方案的回应: {sum(1 for r in results if r[has_solution])}/{len(results)})print(f\n所有结果已保存到: results_test5_customer_service.json)结果测试 ID任务类型核心需求执行结果关键指标tokens / 秒特色指标亮点test_id1故障排查提供手机 Wi-Fi 无法连接排查方案常见原因 逐步排查 解决方案耐心专业成功14.49有解决方案、专业度达标关键词命中率 66.67%无共情词test_id2投诉处理回应产品质量投诉道歉理解 处理流程 退货 / 换货方案诚恳专业成功15.73含道歉、有共情词、有解决方案关键词命中率 100%test_id3产品咨询推荐 8000 元左右办公 偶尔游戏笔记本配置 品牌 购买建议专业实用成功16.00有解决方案、专业度达标关键词命中率 100%无共情词test_id4情绪安抚安抚预约服务取消的激动用户认错道歉 说明原因 补偿方案安抚诚恳成功15.94含道歉、有共情词、有解决方案关键词命中率 100%test_id5使用指导提供智能音箱设置指导初始步骤 常见功能 注意事项步骤清晰成功16.12有解决方案、专业度达标关键词命中率 100%无共情词性能表现客服服务类任务的 tokens 生成速度在 14.49-16.12 之间整体效率稳定其中使用指导16.12速度最快故障排查14.49因需梳理分步排查逻辑稍慢符合客服场景 “细致回应” 的需求特点质量特征关键词命中率仅故障排查66.67%未达满分其余均 100% 命中核心需求故障排查因未完整覆盖 “逐步排查方法” 的细节导致命中率偏低客服核心要素需情绪安抚的场景投诉处理、情绪安抚均包含道歉和共情词符合 “先处理情绪再处理问题” 的客服逻辑纯咨询 / 指导类场景产品咨询、使用指导无多余情绪表达聚焦实用性定位精准解决方案完整性所有任务均明确 “有解决方案”但故障排查、使用指导的生成文本存在内容未收尾如故障排查未写完排查步骤、使用指导未完整说明常见功能和注意事项影响体验待改进点部分任务存在文本不完整问题需优化内容收尾故障排查类任务可增加共情表达如 “理解您无法连接 Wi-Fi 的不便”提升用户体验产品咨询中 “品牌推荐” 模块未完成需补充具体品牌示例增强实用性。整体表现总结测试 ID任务类型核心需求执行结果生成速度tokens / 秒核心表现亮点待优化点1文档生成撰写 Q3 技术部门工作总结含 4 大模块项目、技术突破、团队建设、下季度规划失败--缺少关键配置expected_keywords2信息提取从合同条款中提取付款期限、违约责任、合同期限 3 类关键信息成功15.25信息提取完整关键词命中率 100%无明确结构化呈现如分点 / 分类3邮件撰写撰写项目延期通知邮件说明原因、新交付时间、致歉 补偿措施成功15.14结构完整语气专业诚恳新交付时间、补偿措施未明确具体内容4方案制定制定 2 周新员工培训方案含目标、3 类内容、考核方式成功15.57框架清晰可执行性强考核方式单一缺乏实操细节5会议纪要整理 Q4 产品规划会议纪要规范格式、清晰呈现要点与决议成功15.36格式规范要点提炼准确内容存在重复表述整体总结任务完成情况5 项任务中 4 项成功成功率 80%仅文档生成因配置缺失失败核心办公场景信息提取、邮件、方案、纪要均能满足基础需求性能表现成功任务的生成速度稳定在 15.14-15.57 tokens / 秒效率均衡能适配日常办公的即时性需求质量特征优势关键词命中率 100%核心需求覆盖全面结构化表现良好邮件、方案、纪要均有清晰框架不足部分任务缺乏细节填充如邮件的具体时间 / 补偿方案、存在表述冗余或形式不够优化如信息提取未分点需进一步提升内容的完整性和精炼度。免责声明本报告基于LLaVA-1.5-7B在特定测试场景下的输出结果分析所有结论仅针对本次测试用例不代表LLaVA在全部场景下的最终表现。测试数据生成时间、准确率、质量得分等受测试环境、输入prompt格式、模型参数设置等因素影响可能存在偏差仅供参考。报告中提及的LLaVA生成内容均为模型自动输出可能存在内容截断、逻辑错误、信息不准确等问题使用者需结合实际场景人工校验、修正后再使用切勿直接用于生产环境、学术研究、教学等关键场景。本报告仅为技术效果分析不涉及对LLaVA模型本身的商业评价或背书相关模型的使用需遵守其官方授权协议及相关法律法规。因使用本报告结论或LLaVA生成内容所导致的任何直接或间接损失本报告出具方不承担任何责任。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

lamp和lnmp wordpress网站优化哪家专业

百度网盘下载加速全攻略:告别龟速,拥抱全速下载新时代 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的下载限速而烦恼吗?想…

张小明 2026/1/10 14:38:59 网站建设

该网站无备案如何制作淘宝客网站

第一章:从SoapUI到Open-AutoGLM:协同演进的必然趋势随着API生态的持续扩张与智能化测试需求的崛起,传统接口测试工具如SoapUI已难以满足现代开发对自动化、语义理解与智能生成的复合要求。在这一背景下,Open-AutoGLM作为融合大语言…

张小明 2026/1/10 8:40:33 网站建设

手机购物网站设计界面设计与制作就业方向

还在为手动搭建《我的世界》复杂建筑而烦恼吗?MCEdit 2.0这款强大的开源地图编辑工具将成为你的得力助手!无论你是想要快速导入精美建筑,还是想要对现有地图进行深度改造,这款基于Python开发的专业工具都能帮你轻松实现。 【免费下…

张小明 2026/1/10 14:39:02 网站建设

淘宝网站怎么建设公司注册后每年的费用

在数字化转型深入发展的今天,企业AI应用已进入“深水区”。作为技术人员,我们不仅需要关注技术实现,更要理解业务需求,把握落地节奏。本文将从实战角度,分享企业AI智能体的完整开发流程。一、智能体类型选择与架构设计…

张小明 2026/1/14 12:30:06 网站建设

php购物网站开发设计深圳市市场监督管理局

还在为下载macOS固件而烦恼吗?每次系统升级都要到处寻找安装器,还要担心文件完整性?现在,这些问题都可以交给Mist来解决了!这款专为苹果生态打造的工具,让macOS系统管理变得前所未有的简单高效。&#x1f3…

张小明 2026/1/14 12:58:48 网站建设

中国城乡住建部建设部网站开封网站建设优化

PyTorch安装失败常见原因分析及Miniconda-Python3.10镜像应对策略 在人工智能项目启动的前夜,你是否经历过这样的场景:代码已经写好,数据准备就绪,却卡在了最基础的 pip install torch 这一步?终端里滚动着一长串红色错…

张小明 2026/1/10 14:39:04 网站建设