通过LLM多轮对话生成单元测试用例

通过LLM多轮对话生成单元测试用例

  • 代码

在采用 随机生成pytorch算子测试序列且保证算子参数合法 这种方法之前,曾通过本文的方法生成算子组合测试用例。目前所测LLM生成的代码均会出现BUG,且多次交互后仍不能解决.也许随着LLM的更新,这个问题会得到解决.记录备用。

代码

import re
import os
import logging
import random
import numpy as np
import os
import re
import traceback
import subprocess
import tempfile
import copy
import requests
import jsonimport os
os.environ['MKL_THREADING_LAYER'] = 'GNU'
os.environ['MKL_SERVICE_FORCE_INTEL'] = '1'os.environ["QIANFAN_AK"] = ""
os.environ["QIANFAN_SK"] = ""
os.environ['DASHSCOPE_API_KEY'] = 'sk-'
os.environ['MOONSHOT_API_KEY']="sk-"
os.environ['SPARKAI_APP_ID'] = ''
os.environ['SPARKAI_API_SECRET'] = ''
os.environ['SPARKAI_API_KEY'] = ''
os.environ['SPARKAI_DOMAIN'] = 'generalv3.5'
os.environ['ZhipuAI_API_KEY'] = ''
os.environ['YI_API_KEY']=""logger = logging.getLogger('llm_logger')
logger.setLevel(logging.DEBUG)  # 设置日志级别# 创建一个handler,用于写入日志文件
log_file = 'llm_opt.log'
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(logging.DEBUG)# 创建一个handler,用于将日志输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)# 设置日志格式
formatter = logging.Formatter('%(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)# 将handlers添加到logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)system_prompt="你是一位pytorch专家,现在需要编写各种测试程序,挖掘算子的潜在BUG"question =f'''
背景描述:
1.为了测试pytorch不同算子组合时的精度是否正常,需要构建module级别的测试用例
2.尤其需要关注unsqueeze,repeat,permute,transpose,reshape,expand,view等维度变换算子的各种组合
3.以及在这些组合之后添加其它io或计算类的算子如(contiguous,matmul,mul,concat等)需求:
1.你一次生成一个测试用例(pytorch module及测例),只包含cpu计算
2.之后,我会从的回复中提取出python代码,执行并将结果反馈给你
3.你根据我的反馈,预测性地生成下一个测试用例
4.我们通过多次交互,最大程度地挖掘出潜在的BUG约束:
1.所有测试用例的代码放在一个```python ```中,方便提取
2.为了防止shape不匹配,建议在forward中计算shape,并根据当前的shape合理地设置下一个算子的参数
3.你每次提供的代码都必须是完整的,不要添加任何注释
4.测试代码只输出成功、失败或抛异常,不需要输出任何多余信息
5.特别需要注意矩阵乘维度是否匹配如果你明白我的意思,请直接输出第一个测试用例
'''def extract_and_run_python_code(markdown_text):pattern = re.compile(r'```python\n([^```].*?)\n```', re.DOTALL)code_blocks = pattern.findall(markdown_text)if len(code_blocks)==0:return "没有找到Python代码块。"results = []for code in code_blocks:try:with tempfile.NamedTemporaryFile(delete=False, suffix=".py") as temp_file:temp_file.write(code.encode())temp_filename = temp_file.nameresult = subprocess.run(['python3', temp_filename], capture_output=True, text=True)    output=f"{result.stderr}{result.stdout}"results.append(output)except Exception as e:error_message = f"error:{traceback.format_exc()}"results.append(error_message)        finally:os.remove(temp_filename)return "".join(results)class LLMInfer(object):def __init__(self, system_prompt,question,history_len=5):self.system_prompt=system_promptself.question=question    self.history_len=history_len   def infer(self,user_input=None):pass    def reset(self):passclass dashscope_llm(LLMInfer):def __init__(self, system_prompt, question):super().__init__(system_prompt, question)import dashscopedashscope.api_key=os.environ['DASHSCOPE_API_KEY'] self.history=[]self.history.append({'role': 'system', 'content': self.system_prompt})self.history.append({'role': 'user', 'content': self.question})		def reset(self):if len(self.history)>self.history_len:self.history=self.history[:2] + self.history[-3:]def infer(self,user_input=None):from dashscope import Generationfrom http import HTTPStatus          if user_input:self.history.append({'role': 'user', 'content': user_input})response = Generation.call(model="qwen-plus", messages=self.history,result_format='message')if response.status_code == HTTPStatus.OK:role=response.output.choices[0]['message']['role']content=response.output.choices[0]['message']['content']self.history.append({'role': role,'content': content})return contentelse:return Noneclass moonshot_llm(LLMInfer):def __init__(self, system_prompt, question):super().__init__(system_prompt, question)'''pip install --upgrade 'openai>=1.0''''from openai import OpenAIself.client = OpenAI(api_key = os.environ['MOONSHOT_API_KEY'],base_url = "https://api.moonshot.cn/v1",)self.history=[]self.history.append({'role': 'system', 'content': self.system_prompt})self.history.append({'role': 'user', 'content': self.question})		def reset(self):if len(self.history)>self.history_len:self.history=self.history[:2] + self.history[-3:]def infer(self,user_input=None):      if user_input:self.history.append({'role': 'user', 'content': user_input})completion = self.client.chat.completions.create(model="moonshot-v1-128k",messages=self.history,temperature=0.3,top_p=0.1)role="assistant"content=completion.choices[0].message.contentself.history.append({'role': role,'content': content})return contentclass qianfan_llm(LLMInfer):def __init__(self, system_prompt, question):super().__init__(system_prompt, question)'''pip3 install qianfan'''self.history=[]#self.history.append({'role': 'system', 'content': self.system_prompt})self.history.append({'role': 'user', 'content': self.question})		def reset(self):if len(self.history)>self.history_len:self.history=self.history[:1] + self.history[-2:]def infer(self,user_input=None):    import qianfan  if user_input:self.history.append({'role': 'user', 'content': user_input})response = qianfan.ChatCompletion().do(endpoint="completions_pro", messages=self.history,temperature=0.7, top_p=0.8, penalty_score=1,                                             disable_search=False, enable_citation=False)role="assistant"content=response.body["result"]self.history.append({'role': role,'content': content})return contentclass sparkai_llm(LLMInfer):def __init__(self, system_prompt, question):super().__init__(system_prompt, question)'''pip3 install --upgrade spark_ai_python'''from sparkai.llm.llm import ChatSparkLLMfrom sparkai.core.messages import ChatMessageself.spark = ChatSparkLLM(spark_api_url='wss://spark-api.xf-yun.com/v3.5/chat',spark_app_id=os.environ['SPARKAI_APP_ID'],spark_api_key=os.environ['SPARKAI_API_KEY'],spark_api_secret=os.environ['SPARKAI_API_SECRET'],spark_llm_domain=os.environ['SPARKAI_DOMAIN'],streaming=False,        temperature=0.1)self.history=[]self.history.append(ChatMessage(role="system",content=self.system_prompt))self.history.append(ChatMessage(role="user",content=self.question))def reset(self):if len(self.history)>self.history_len:self.history=self.history[:2] + self.history[-3:]def infer(self,user_input=None):    from sparkai.core.messages import ChatMessagefrom sparkai.llm.llm import ChunkPrintHandlerif user_input:self.history.append(ChatMessage(role="user",content=user_input))        handler = ChunkPrintHandler()response = self.spark.generate([self.history], callbacks=[handler])self.history.append(response.generations[0][0].message)return response.generations[0][0].textclass zhipuai_llm(LLMInfer):def __init__(self, system_prompt, question):super().__init__(system_prompt, question)'''pip install zhipuai'''from zhipuai import ZhipuAIself.client = ZhipuAI(api_key=os.environ['ZhipuAI_API_KEY'])self.history=[]self.history.append({'role': 'system', 'content': self.system_prompt})self.history.append({'role': 'user', 'content': self.question})		def reset(self):if len(self.history)>self.history_len:self.history=self.history[:2] + self.history[-3:]def infer(self,user_input=None):      if user_input:self.history.append({'role': 'user', 'content': user_input})completion = self.client.chat.completions.create(model="glm-4",messages=self.history,temperature=0.3,top_p=0.1)role="assistant"content=completion.choices[0].message.contentself.history.append({'role': role,'content': content})return contentclass yi_llm(LLMInfer):def __init__(self, system_prompt, question):super().__init__(system_prompt, question)'''pip install --upgrade 'openai>=1.0''''from openai import OpenAIself.client = OpenAI(api_key = os.environ['YI_API_KEY'],base_url = "https://api.lingyiwanwu.com/v1",)self.history=[]self.history.append({'role': 'system', 'content': self.system_prompt})self.history.append({'role': 'user', 'content': self.question})		def reset(self):if len(self.history)>self.history_len:self.history=self.history[:2] + self.history[-3:]def infer(self,user_input=None):      if user_input:self.history.append({'role': 'user', 'content': user_input})completion = self.client.chat.completions.create(model="yi-large",messages=self.history,temperature=0.3,top_p=0.1)role="assistant"content=completion.choices[0].message.contentself.history.append({'role': role,'content': content})return contentllms=[dashscope_llm,moonshot_llm,qianfan_llm,sparkai_llm,zhipuai_llm,yi_llm]
for llm in llms:logger.info(f" ---------------------------------- {llm.__name__} ---------------------------------- ")llm=llm(system_prompt,question)response = llm.infer()for i in range(15):llm.reset()logger.info(f" ---------------------------------- 第{i}轮 ---------------------------------- ")result=Nonelogger.info("####### bot #######")logger.info(f"{response}")if response:result=f"{extract_and_run_python_code(response)}"     logger.info("####### user #######")logger.info(f"{result}")response=llm.infer(result)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/844588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Inno Setup 深入浅出-文件的显示

【1】在需要打包的文件中,新建一个文本文件,如License.txt 注意:中文的编码格式需要GB2312,否则显示乱码 【2】读取、显示文本 [Code] procedure Init_ShowLicense(); var tmpFont:TFont; begin editLicense : TMemo.C…

OpenFHE 源码解析:BinFHE 部分

参考文献: [ABB22] Al Badawi A, Bates J, Bergamaschi F, et al. Openfhe: Open-source fully homomorphic encryption library[C]//Proceedings of the 10th Workshop on Encrypted Computing & Applied Homomorphic Cryptography. 2022: 53-63.openfheorg/o…

算法训练营day43

题目1&#xff1a;343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int integerBreak(int n) {vector<int> dp(n 1, 0);dp[2] 1;for(int i 3;i < n;i) {for(int j 1;j < i;j ) {// j * (i - j)相当于拆分成两个数// j * dp[i …

搭建YOLOv10环境 训练+推理+模型评估

文章目录 前言一、环境搭建必要环境1. 创建yolov10虚拟环境2. 下载pytorch (pytorch版本>1.8)3. 下载YOLOv10源码4. 安装所需要的依赖包 二、推理测试1. 将如下代码复制到ultralytics文件夹同级目录下并运行 即可得到推理结果2. 关键参数 三、训练及评估1. 数据结构介绍2. 配…

kotlin基础之泛型和委托

Kotlin泛型的概念及使用 泛型概念 在Kotlin中&#xff0c;泛型&#xff08;Generics&#xff09;是一种允许在类、接口和方法中使用类型参数的技术。这些类型参数在实例化类、实现接口或调用方法时会被具体的类型所替代。泛型的主要目的是提高代码的复用性、类型安全性和可读…

oracle翻页查询的小坑记录

oracle的查询&#xff0c;因为能获取到查询结果的rownum&#xff0c;就想着直接在查询条件后面做翻页&#xff0c;而且首页确实是正常查询到了。后面才发现翻页是空的。。。 这是因为rownum排序是在查询结果才分配的。所以应该把查询结果作为子查询&#xff0c;在外查询应用排序…

【深度好文】AI企业融合联盟营销,做的好就是最大赢家!

AI工具市场正在迅速发展&#xff0c;现仍有不少企业陆续涌出&#xff0c;那么如何让你的工具受到目标群体的关注呢&#xff1f;这相比是AI工具营销人员一直在思考的问题。 即使这个市场正蓬勃发展&#xff0c;也无法保证营销就能轻易成功。AI工具虽然被越来越多人认可和接受&a…

Windows配置java环境JDK

配置jdk环境非常简单&#xff0c;大概有以下几步&#xff1a; 下载jdk安装&#xff0c;然后双击进行安装配置环境变量(也不是一定非要配置环境变量&#xff0c;配置环境变量的好处就是&#xff0c;在任何位置&#xff0c;系统都可以找到安装路径&#xff0c;非常实用且方便) …

短信平台-平台群发短信

时代的进步带来了我们生活的便利&#xff0c;而其中最受欢迎和广泛应用的方式之一就是通过短信传递信息。在这个飞速发展的数字时代&#xff0c;我们需要一个高效、可靠的短信平台来满足不断增长的通讯需求。而今天&#xff0c;我要向大家推荐的正是这样一款卓越的短信平台——…

连接远程的kafka【linux】

# 连接远程的kafka【linux】 前言版权推荐连接远程的kafka【linux】一、开放防火墙端口二、本地测试是否能访问端口三、远程kafka配置四、开启远程kakfa五、本地测试能否连接远程六、SpringBoot测试连接 遇到的问题最后 前言 2024-5-14 18:45:48 以下内容源自《【linux】》 仅…

封装和解构是 Python 中常用的技术

目录 前言 一、封装&#xff08;Packing&#xff09;&#xff1a; 二、解构&#xff08;Unpacking&#xff09;&#xff1a; 2.1 解构元组或列表&#xff1a; 2.2 解构字典&#xff1a; 2.3 使用*进行解构&#xff1a; 2.4 解构函数返回值 总结 前言 提示&#xff1a;这…

Oracle体系结构初探:RMAN基本配置参数

目录 查看RMAN基本配置 修改RMAN配置参数 基本配置参数说明 查看RMAN基本配置 进入RMAN命令行 rman target / -- “/” 就代表了sysdba权限 查看参数命令 show all; RMAN> show all; RMAN configuration parameters for database with db_unique_name ORCL are:…

leetcode-189. 旋转数组 原地递归算法(非官方的三种方法)

Problem: 189. 轮转数组 思路 首先&#xff0c;很明显&#xff0c;题目要求的操作等同于将数组的后k%n个元素移动到前面来。 然后我们思考原地操作的方法&#xff1a; &#xff08;为了方便讲解&#xff0c;我们先假设k<n/2&#xff09; 1.我们将数组划分为 [A&#xff0c;B…

7. CSS 网格布局

CSS3引入了强大的网格布局&#xff08;Grid Layout&#xff09;&#xff0c;它提供了一种二维的布局方式&#xff0c;使得创建复杂的网页布局变得更加简单和直观。通过定义行和列&#xff0c;我们可以精确控制网页元素的排列和对齐。本章将详细介绍网格布局的基本概念和属性&am…

pytorch学习day1

一.pytorch主要模块介绍 1.1 模块介绍 模块描述torch包含激活函数和主要的张量操作torch.Tensor定义了张量的数据类型&#xff0c;方法可返回新张量&#xff0c;方法后缀带下划线可修改张量本身torch.cuda定义了 CUDA 运算相关的函数&#xff0c;如检查 CUDA 是否可用&#x…

橙派探险记:开箱香橙派 AIpro 与 疲劳驾驶检测的奇幻之旅

橙派探险记&#xff1a;开箱香橙派 AIpro 与 疲劳驾驶检测的奇幻之旅 引子&#xff1a;神秘包裹的到来 在很久很久以前......在一个阳光明媚的下午&#xff0c;我终于收到了期待已久的包裹——香橙派 AIpro。这份礼物辗转两次才到我的手上&#xff0c;每一天我都怀着满心的期待…

JetLinks物联网平台在windows 7搭建(前后端)部署教程

近期对接TCP、modbusTCP等自定义解析&#xff0c;做了很多万能解析的方法&#xff0c;却都不遂人意&#xff0c;而一直在用的ThingsBoard不能直接对接TCP透传(企业版除外)&#xff0c;需要在外围做一些自定义解析&#xff0c;然后转json再mqtt上传&#xff0c;感觉来说比较麻烦…

RTKLIB学习--前向滤波

#前言 如果要详细了解RTKLIB或进行二次开发&#xff0c;了解obs指针所存储每个历元的卫星观测数据是必不可少的环节&#xff0c;此文对RTKLIB的&#xff08;由于后处理和实时运行都要用到前向滤波&#xff09;前向滤波&#xff08;从文件头读取观测数据到obs结构体中&#xff0…

Android笔记--应用安装

这一节了解一下普通应用安装app的方式&#xff0c;主要是唤起系统来安装&#xff0c;直接上代码: 申请权限 <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name"android.permission.WRITE_EXT…

【包装类简单认识泛型】

目录 1&#xff0c;包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 2&#xff0c;什么是泛型 3&#xff0c;引出泛型 3.1 语法 4&#xff0c;泛型如何编译的 4.1 擦除机制 4.2 为什么不能实例化泛型类型数组 5&#xff0c;泛型的上界 5.1 语法 5.2 复杂示例…