你不要乱写sleep(6)——简评华为昇腾演示代码翻车

59 篇文章 0 订阅

庄晓立/LIIGO,20240520。

官方回应

先看一段新闻报道(来源https://kxstock.hexun.com/2024-05-16/212868824.html):

【华为昇腾社区正式回应大模型演示"翻车"事件】 华为昇腾社区近日就有关大模型演示"翻车"的争议进行了正面回应。在5月10日举行的鲲鹏昇腾开发者大会上,华为昇腾展示了mxRAGSDK功能,通过短短的十几行代码,实现了RAG应用开发的实时生成。华为昇腾强调,此次展示的代码均为真实有效,并且是基于开源大模型的实时生成,而非预置内容。据悉,华为昇腾计算业务总裁张迪煊在同一场合发表了主题演讲。 昇腾是华为旗下专注于人工智能计算芯片的品牌,其构建的昇腾计算产业涵盖了从处理器到行业应用等全产业链。

演示代码分析

sleep6_main

q = input(">> ")  // 读取用户输入的指令
ret = rag.query(q, ...)  // 将用户指令输入给RAG服务并获取结果
ret.write("...")  // 将RAG服务返回的图片数据存储到本地磁盘

主要流程:创建RAG服务对象rag(代码位于main函数上方,此图未体现),读取用户指令,请求服务,存储服务返回数据。input是Python系统函数,query和write均为RAG服务接口API。

失误过程分析

sleep6_traceback
根据上图分析演示过程。程序启动后,演示者输入指令时输入"帮我"二字后不小心按了回车键,他担心指令不完整导致输出结果不正确,便立刻按 Ctrl+C 强制终止了程序运行。然后他重新运行程序,输入完整指令后完成了程序演示。

由于Ctrl+C强制终止程序运行触发了Python程序内置的TRACEBACK功能,即输出函数调用栈。下文进一步分析调用栈将会解读出更多信息。

调用栈分析

调用栈显示,main.py调用了ret.write(),ret.write()调用了time.sleep(6)。

也就是说,time.sleep(6)代码是写在ret.write()函数内部的。这一点我感觉很反常。

正常来说,流程应该是这样的:query, sleep, write。不知道处于何种考虑,演示者似乎不想让我们看到sleep,故意把sleep隐藏到write内部。事实上如果演示过程一切正常,我们根本不知道有sleep(6)的存在;只不过因为一个意外回车才导致sleep暴露在我们眼前。

说一下为什么我感觉不正常。

这里涉及两个角色,一个是模块的实现者(生产者),一个是模块的使用者(消费者)。也就是说一个提供API、一个调用API,双方各行其责。

rag.query()是API,使用者负责调用API,实现者负责实现API内部代码,也就是说query()函数里面的代码是实现者写的。

ret是query()的返回值,因而ret.write()也是API,write()函数里面的代码是实现者写的。

可是sleep()应该是调用者的工作呀,应该写在API函数外面,不应该写在API函数里面。

而且看ret.write()的命名,其功能很简单很明确,就是写出文件,按常理不应该有sleep功能。

以上讨论的是API未提供等待机制的情况。按说成熟的API设计应该提供等待机制,可行方案是:或1,把rag.query()设计为异步函数(调用方异步等待),或2,新增ret.waitForComplete()类似接口(在ret.write()之前调用)。

考虑到他们演示的模块还不是正式版,还没有发布,API不成熟没有等待机制也可以理解。

让使用者等待调用完成是很尴尬的,因为使用者不能预知要等多久。作为演示代码也无所谓,根据经验就暂定等6秒吧,可以的。

但是使用者等待的时机,应该是在query之后write之前呀。write函数里面,那不是你的领地;把sleep(6)写在write里面,是很反常的。因为你API尚未完善需要调用方等待呀,DEMO代码应该明确体现出sleep调用呀。

写在最后

此演示主要面向开发者,我认为其目的大抵有二:1、展示模块功能,体现自身技术实力,2、展示调用接口,体现API友好易用。

前述两个演示目的都未达成,毫无疑问是“翻车”了。原本想展示技术实力,结果让人怀疑演示造假。原本想展示API友好易用,结果竟然需要sleep(6)等待。

虽然华为昇腾社区官方及时出面,否认了演示造假,但是该回应缺乏细节和逻辑,可信度不够。

我建议华为昇腾社区还要尽快多做一些工作,才能及时消除大面积负面影响:

  • 尽快将当前版本模块原样发布体验板,让网友在线试用,证实该功能可用
  • 尽快解释API设计逻辑,为何没有异步等待机制
  • 尽快解释为何将原本属于调用方的sleep(6)写在模块实现代码内部
  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
抢购代码是一种用于在华为商城网站上自动抢购商品的程序编写代码。下面是一个用Python编写的简单抢购代码示例: ```python import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 设置浏览器驱动,这里使用的是Chrome浏览器驱动,请提前下载对应版本的Chrome浏览器驱动 driver = webdriver.Chrome('path/to/chromedriver') # 打开华为商城抢购页面 driver.get('https://www.vmall.com/product/10086335223127.html') # 设置等待时间,等待页面加载完成 wait = WebDriverWait(driver, 10) # 等待抢购按钮出现并点击 buy_now_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="pro-operation"]/div/a[1]'))) buy_now_btn.click() # 等待选择颜色的弹窗出现并选择颜色 color_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="spec-item-1-1"]'))) color_btn.click() # 等待选择版本的弹窗出现并选择版本 version_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="spec-item-1767142-20853680"]'))) version_btn.click() # 等待选择套餐的弹窗出现并选择套餐 package_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="spec-item-13009-100003364"]'))) package_btn.click() # 等待立即下单按钮出现并点击 submit_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="pro-operation"]/div[1]/a[1]'))) submit_btn.click() # 等待确认订单按钮出现并点击 confirm_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="confirmOrder_1"]/div[2]/div[2]/div/div[3]/a'))) confirm_btn.click() # 填写收货地址等信息,并提交订单 # ... # 等待支付页面加载完成并跳转到支付页面 time.sleep(10) pay_url = driver.current_url driver.quit() # 打印支付页面的URL,可以手动在浏览器中打开该URL进行支付 print(pay_url) ``` 这段代码使用了Selenium库来实现自动化操作,在运行代码之前,需要下载对应版本的Chrome浏览器驱动,并将驱动路径设置为`webdriver.Chrome()`函数中的参数。运行代码后,它会自动打开华为商城的商品页面,依次点击选择颜色、版本、套餐,并点击立即下单和确认订单按钮,最后打印出支付页面的URL。可以手动在浏览器中打开该URL进行支付。注意,这只是一个简单的示例,实际抢购可能需要根据网站的具体页面结构和行为进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值