普通视图

发现新文章,点击刷新页面。
今天 — 2025年7月2日首页

OpenAI 内部信曝光!奥特曼怒斥小扎 7 亿挖人:唯利是图的雇佣兵,将被使命打败

作者 莫崇宇
2025年7月2日 11:13

还有人没看过关于 Meta 挖人的段子吗?

▲ 建议以后顶级 AI 人才的流动,参考俱乐部的转会制度。

在昨日 Meta 高调官宣超级智能团队实验室之后,大批挖走OpenAI核心研究员之后,一向沉得住气的 Sam Altman 现在也坐不住了,向全体员工发出内部信:

有使命感的人将胜过唯利是图的雇佣兵。

据连线杂志报道,Altman 还在信中强调,留在 OpenAI 才是那些希望构建通用人工智能(AGI)研究者的正确选择,并暗示公司正在重新评估整个研究团队的薪酬结构。

对 Meta 的挖人行为,Altman 显得相当不屑,认为这种「开价挖人」的模式未来将带来严重的文化副作用。

我们已经从角落里的极客,成长为科技行业里最受关注的人(至少是这样)……AI 圈现在乌烟瘴气;Meta 的做法让人感觉不太体面;我觉得事情将来只会更加疯狂。我被解雇又回归时曾说,那不会是 OpenAI 历史上最疯狂的事;显然现在这事也还不是

在评价那些被 Meta 挖走的前同事时,Altman 的态度也没太客气:

「Meta 确实招到了一些优秀的人,但整体来看,他们并没有挖到那些顶尖人才,还得一路向下寻找;他们已经尝试招募很久了,我都记不清他们试图从我们这里挖走多少人去当他们的首席科学家。」Altman 写道,「我为整个行业的使命感感到骄傲,当然总会有一些唯利是图的人。」

他还放话称,OpenAI 股票的潜力远远超过 Meta。但巨大的回报应该建立在巨大成功之后,OpenAI将很快公布更多薪酬方面的举措,但会「确保公平性」,而不是只针对那些「被 Meta 盯上」的个别员工。

Altman还呼吁大家继续留在 OpenAI:

我对我们的研究路线从未如此有信心,我们在计算资源上做了前所未有的投入,我喜欢我们敢于下注,并相信我们会好好利用它。最重要的是,我认为我们拥有全世界最特别的团队和文化。我们确实还需要努力改进我们的文化;过去经历了疯狂的爆炸式增长。但我们的核心是正确的,我认为没有任何其他组织能做到这一点,我有信心我们能解决现有问题。

更重要的是,我们真的在乎如何以正确的方式构建AGI,其他公司更把它当作实现其他目标的手段。而这对我们来说始终是最重要的事,也将永远如此。等到 Meta 转向下一个流行项目,或忙于守护他们的社交护城河时,我们仍会在这里,一天又一天、一年又一年,努力比任何人都更好地完成我们的使命。其他许多项目将起起落落。

话虽如此,其实也真不怪研究人员转投 Meta。

无他,实在是扎克伯格给的太多的了。小扎不语,只是一味群发高薪合同。顶级 AI 研究员横在中间,像极了拿 offer 的你我他,嘴上说着不在乎钱,但手已经开始敲键盘回复小扎发来的邮件。

根据连线杂志获取的信息,扎克伯格为顶尖研究人员开出的薪酬高达 4 年 3 亿美元,首年总薪酬超过 1 亿美元,而目前,财大气粗的 Meta 已向 OpenAI 的员工至少发出了 10 份如此高额的报价,并承诺最先进的 GPU 资源「随便用」。

并且报道还提到,Meta 曾试图招募一位 OpenAI 的高级研究员担任首席科学家一职,但对方最终拒绝了邀请。据称,这些薪资方案虽然以股票为主,但第一年股票直接兑现,诱惑力拉满。

做个横向对比,微软 CEO Satya Nadella 在 2024 年获得的总薪酬为 7910 万美元,主要是股票形式;Uber CEO Dara Khosrowshahi 同期则大约为 3940 万美元,同样以股票为主。一个顶级 AI 研究员的年薪,现在轻松干掉硅谷大厂 CEO。

当然,在上周 Meta 全员大会上,CTO Andrew Bosworth 也回应了 OpenAI CEO Sam Altman 所称的「Meta 用 1 亿美元签约金挖角」一事,直指其夸大其词。

所谓高额待遇仅适用于极少数高级岗位。「我非常清楚他为什么这么说:因为我们确实成功吸引了一些 OpenAI 的人才,而他对此显然并不高兴。」他强调,所谓的「1 亿美元报价」不是一次性奖金,而是包含股票激励、签约奖励等多个组成部分。

这也应了那句话,算力可以堆,数据可以靠爬虫,但对想赢下 AGI 终局的公司来说,人才始终是最贵的资源。

#欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。

爱范儿 | 原文链接 · 查看评论 · 新浪微博


昨天以前首页

智能前端之图片识别:用React和Moonshot AI打造图片识别应用

作者 FogLetter
2025年6月29日 07:54

前言:当图片遇见AI

大家好!今天我们要探索一个非常酷炫的前端技术——图片识别。想象一下,用户上传一张图片,我们的前端应用不仅能显示预览,还能通过AI识别图片内容并生成详细描述。这听起来像是未来科技,但其实用React和一些现代API就能轻松实现!

作为前端开发者,我们正处在一个令人兴奋的时代。计算机视觉和自然语言处理的进步让我们可以在浏览器中实现以前只能在科幻电影中看到的功能。本文将带你一步步构建这样一个应用,同时分享一些我在开发过程中的心得和最佳实践。

项目概述

我们要构建的应用具有以下功能:

  1. 用户可以选择并上传本地图片
  2. 实时显示图片预览
  3. 将图片发送到AI API进行分析
  4. 显示AI生成的图片描述

听起来很简单?让我们深入细节,看看如何优雅地实现这些功能。

技术栈选择

  • React:我们的前端框架,提供组件化和状态管理
  • FileReader API:处理本地文件读取
  • Moonshot AI:提供图片识别能力
  • Vite:项目构建工具,支持环境变量管理

严格模式:React的安全网

// StrictModel react 默认启动的严格模式
// 执行一次,测试一次 两次

在React 18+中,严格模式(Strict Mode)默认启用。这是一个非常有用的开发工具,它会:

  • 故意双重调用组件函数(仅在开发环境)
  • 检查过时的API使用
  • 检测意外的副作用

这解释了为什么你可能会在控制台看到某些日志出现两次。这不是bug,而是React在帮助我们提前发现潜在问题。

开发建议:始终保留严格模式,它能帮你捕获许多难以追踪的问题,特别是在使用useEffect时。

环境变量:安全地管理API密钥

console.log(import.meta.env.VITE_API_KEY)

在现代前端开发中,我们经常需要使用API密钥等敏感信息。Vite提供了优雅的环境变量解决方案:

  1. 创建.env文件在项目根目录
  2. 变量必须以VITE_前缀开头
  3. 通过import.meta.env访问

安全提示:永远不要将.env文件提交到版本控制!将其添加到.gitignore中。

状态管理:React的核心

const [content, setContent] = useState('')
const [imgBase64Data, setImgBase64Data] = useState('')
const [isValid, setIsValid] = useState(false)

React的useState hook是我们管理组件状态的主要工具。在这个应用中,我们维护三个状态:

  1. content:存储AI返回的图片描述
  2. imgBase64Data:存储图片的Base64编码
  3. isValid:控制提交按钮的禁用状态

设计原则:保持状态最小化,只存储必要的数据。派生数据应该在渲染时计算。

图片预览:即时反馈的重要性

const updateBase64Data = (e) => {
  const file = e.target.files[0];
  if(!file) return;
  
  const reader = new FileReader();
  reader.readAsDataURL(file);
  
  reader.onload = () => {
    setImgBase64Data(reader.result)
    setIsValid(true)
  }
}

图片上传和处理可能很慢,良好的用户体验要求我们提供即时反馈。这里我们使用FileReader API来实现:

  1. 用户选择文件后,触发onChange事件
  2. 通过e.target.files[0]获取文件对象
  3. 创建FileReader实例
  4. 使用readAsDataURL方法将文件转换为Base64字符串
  5. 转换完成后,更新状态

Base64小知识:Base64是一种用64个字符表示二进制数据的编码方案。它可以将图片数据转换为字符串,方便在JSON中传输。

无障碍访问:为所有人构建

<label htmlFor="fileInput">文件:</label>
<input 
  type="file"
  id='fileInput'
  className='input'
  accept='.jpeg,.jpg,.png,.gif'
  onChange={updateBase64Data}
/>

无障碍访问(A11Y)经常被忽视,但它对用户体验至关重要。这里我们:

  1. 使用labelinput通过htmlForid关联
  2. 为输入添加明确的标签
  3. 限制可接受的图片格式

无障碍提示:屏幕阅读器依赖正确的标签关联来向视障用户描述表单控件。不要忽视这些细节!

与AI API交互:异步编程的艺术

const update = async () => {
  if(!imgBase64Data) return;
  
  const endpoint = 'https://api.moonshot.cn/v1/chat/completions';
  const headers = {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${import.meta.env.VITE_API_KEY}`
  }
  
  setContent('正在生成...')
  
  const response = await fetch(endpoint, {
    method: 'POST',
    headers,
    body: JSON.stringify({
      model: 'moonshot-v1-8k-vision-preview',
      messages: [
        {
          role: 'user',
          content: [
            {
              type: 'image_url',
              image_url: {
                url: imgBase64Data
              }
            },
            {
              type: 'text',
              text: '请详细描述这张图片的内容'
            }
          ]
        }
      ]
    })
  })
  
  const data = await response.json()
  setContent(data.choices[0].message.content)
}

这是与Moonshot AI API交互的核心代码。让我们分解这个异步过程:

  1. 首先检查是否有图片数据
  2. 设置API端点和请求头(包含认证)
  3. 立即更新状态显示"正在生成..."(即时反馈)
  4. 使用fetch发起POST请求
  5. 请求体包含图片数据和提示文本
  6. 解析响应并更新状态

异步编程选择:我们使用async/await而不是.then链,因为它提供了更线性的代码结构,更易于理解和维护。

错误处理:被忽视的重要部分

虽然示例代码中没有展示,但在生产环境中,我们必须添加错误处理:

try {
  const response = await fetch(endpoint, { /* ... */ });
  if (!response.ok) throw new Error('网络响应不正常');
  const data = await response.json();
  setContent(data.choices[0].message.content);
} catch (error) {
  setContent('识别失败: ' + error.message);
  console.error('API调用失败:', error);
}

最佳实践:总是处理网络请求可能失败的情况,并向用户提供友好的错误信息。

性能优化:减少不必要的渲染

React组件在状态变化时会重新渲染。对于我们的应用,可以做一些优化:

  1. 使用useCallback记忆事件处理函数
  2. 对于大型图片,考虑压缩后再上传
  3. 添加防抖或节流(如果适用)
const updateBase64Data = useCallback((e) => {
  // ...原有逻辑
}, []);

性能提示:React DevTools的Profiler工具可以帮助你识别性能瓶颈。

样式与布局:不只是功能

虽然本文主要关注功能实现,但良好的UI同样重要。我们的CSS可能包含:

.container {
  max-width: 800px;
  margin: 0 auto;
  padding: 20px;
}

.preview img {
  max-width: 100%;
  height: auto;
  border-radius: 8px;
}

.input {
  margin: 10px 0;
}

button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

UI原则:确保应用在不同设备上都能良好显示(响应式设计),并为交互元素提供视觉反馈。

扩展思路:让应用更强大

这个基础应用可以扩展许多有趣的功能:

  1. 多图片分析:允许用户上传多张图片并比较结果
  2. 自定义提示:让用户输入自己的问题而不仅是描述图片
  3. 历史记录:保存之前的识别结果
  4. 图片编辑:添加简单的裁剪或滤镜功能

总结:前端开发的未来

通过这个项目,我们看到了现代前端开发的强大能力。借助React和现代浏览器API,我们能够:

  1. 处理本地文件
  2. 提供实时预览
  3. 与AI服务交互
  4. 创建响应式和无障碍的界面

图片识别只是计算机视觉在前端的冰山一角。随着WebAssembly和WebGPU等技术的发展,前端将能够处理更复杂的AI任务。

最后的思考:作为开发者,我们不仅要关注功能的实现,还要考虑用户体验、性能和可访问性。每一个细节都可能影响用户对我们产品的感受。

希望这篇文章能激发你对智能前端的兴趣!如果你有任何问题或想法,欢迎在评论区讨论。Happy coding! 🚀


附录:完整代码

import { useState, useCallback } from 'react'
import './App.css'

function App() {
  const [content, setContent] = useState('')
  const [imgBase64Data, setImgBase64Data] = useState('')
  const [isValid, setIsValid] = useState(false)

  const updateBase64Data = useCallback((e) => {
    const file = e.target.files[0];
    if(!file) return;
    
    const reader = new FileReader();
    reader.readAsDataURL(file);
    
    reader.onload = () => {
      setImgBase64Data(reader.result)
      setIsValid(true)
    }
  }, [])

  const update = async () => {
    if(!imgBase64Data) return;
    
    try {
      const endpoint = 'https://api.moonshot.cn/v1/chat/completions';
      const headers = {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${import.meta.env.VITE_API_KEY}`
      }
      
      setContent('正在生成...')
      
      const response = await fetch(endpoint, {
        method: 'POST',
        headers,
        body: JSON.stringify({
          model: 'moonshot-v1-8k-vision-preview',
          messages: [
            {
              role: 'user',
              content: [
                {
                  type: 'image_url',
                  image_url: {
                    url: imgBase64Data
                  }
                },
                {
                  type: 'text',
                  text: '请详细描述这张图片的内容'
                }
              ]
            }
          ]
        })
      })
      
      if (!response.ok) throw new Error('网络响应不正常');
      const data = await response.json()
      setContent(data.choices[0].message.content)
    } catch (error) {
      setContent('识别失败: ' + error.message)
      console.error('API调用失败:', error)
    }
  }

  return (
    <div className='container'>
      <div>
        <label htmlFor="fileInput">文件:</label>
        <input 
          type="file"
          id='fileInput'
          className='input'
          accept='.jpeg,.jpg,.png,.gif'
          onChange={updateBase64Data}
        />
        <button onClick={update} disabled={!isValid}>提交</button>
      </div>
      <div className="output">
        <div className="preview">
          {imgBase64Data && <img src={imgBase64Data} alt="预览" />}
        </div>
        <div>
          {content}
        </div>
      </div>
    </div>
  )
}

export default App

搭建自动化 Web 页面性能检测系统 —— AI 篇

2025年6月27日 10:55

我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。

本文作者:琉易

这一篇是系列文章:

搭建自动化 Web 页面性能检测系统 —— 设计篇

搭建自动化 Web 页面性能检测系统 —— 实现篇

搭建自动化 Web 页面性能检测系统 —— 部署篇

页面性能对于用户体验、用户留存有着重要影响,当页面加载时间过长时,往往会伴随着一部分用户的流失,也会带来一些用户差评。性能的优劣往往是同类产品中胜出的影响因素,也是一个网站口碑的重要评判标准。

系统架构图(简略)

本篇重点讲解 AI 分析模块的设计与实践。

画板

AI 分析模块的设计与实现

输入与输出

  • 输入:Lighthouse 检查产生的 JSON 数据
    • 由于每次检测产生的 JSON 数据较大,一般有 350KB ~ 500KB,而大模型往往是根据输入 Tokens 进行计费,且并不是单纯的按量计费,类似于生活中常见的阶梯计费;另外模型支持的输入也有限,一般为 32k Tokens 或 64k Tokens。所以我们将 JSON 数据传输给大模型前需要进行精简。
    • 保留检测结果中的关键数据,如:环境数据(environment)、每一项检测指标的详细结果(audits)、检测时的配置参数(configSettings)、汇总各类指标的最终得分(categories)。
  • 输出:自然语言优化建议列表
    • 如:建议将图片资源启用 lazy-load
    • 如:减小某个图片文件的大小以减少传输时间

核心组成

  • JSON 清洗与摘要
  • Prompt 定义
  • openai 接口集成
  • 流式处理

Prompt 设计要点

构建一个高质量的 Prompt 是成功的关键,以下是一个例子:

你是一个网页性能优化专家。我将提供一个通过 Google Lighthouse 生成的 JSON 报告,请你根据报告中的内容:
1. 每个关键指标给出两三条优化建议,需要结合 json 中的实际数据进行举例。
2. 回答的内容使用 markdown 格式。
3. 专业名词需要使用中文。

实际测试中 Kimi 的 moonshot-v1-auto 模型回答更快,百炼平台的模型输入输出 Tokens 限制更宽泛,但是输出速度略慢;百炼平台的免费额度更多,OpenAI 费用较高且部署后会有访问的问题。

关键技术点

Lighthouse 报告数据结构解析

JSON 数据清洗与摘要是大模型调用能否成功的关键,清洗后的结果是 Prompt 的数据来源,如果内容较多可能会超出模型输入 Tokens 的限制从而导致调用失败。

  • audits 中会包含各种指标近百种,我们可以删除一些内容较多但对分析用处不大的数据,如:offscreen-images、screenshot-thumbnails 等。
  • Lighthouse 生成的 JSON 数据会直接保存瀑布图等图片的 Base64 格式数据,这些图片数据占用 Tokens 明显。

经过清洗,尽量将输入的 Tokens 控制在 100k 以内。

流式输出

openai 是一个 npm 包,通过这个 npm 包可以快速的对接各种大模型的 API 调用服务。

// 流式输出
const stream = await client.chat.completions.create({
    model: 'moonshot-v1-auto',
    messages: [
        {
            role: 'system',
            content: `你是一个网页性能优化专家。我将提供一个通过 Google Lighthouse 生成的 JSON 报告,请你根据报告中的内容:
1. 每个关键指标给出两三条优化建议,需要结合 json 中的实际数据进行举例。
2. 回答的内容使用 markdown 格式。
3. 专业名词需要使用中文。`,
        },
        { role: 'user', content: jsonData },
    ],
    temperature: 0.3,
    stream: true,
});

// 当启用流式输出模式(stream=True),SDK 返回的内容也发生了变化,我们不再直接访问返回值中的 choice
// 而是通过 for 循环逐个访问返回值中每个单独的块(chunk)
for await (const chunk of stream) {
    if (abortSignal?.aborted) {
        console.log(`${taskIdLogStr}任务中止, kimi chat`);
        break;
    }

    // 在这里,每个 chunk 的结构都与之前的 completion 相似,但 message 字段被替换成了 delta 字段
    const delta = chunk.choices[0].delta;
    if (delta.content) {
        onData(delta.content);
    }
}
@ApiOperation({ summary: '分析检测结果' })
    @HttpCode(HttpStatus.OK)
    @Post('reportChat')
    @RawResponse()
    async reportChat(@Body() query: ReportChatReqDto, @Res() res: Response) {
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');
    res.flushHeaders();

    const abortController = new AbortController();

    // 👇 监听客户端断开连接(如 Abort)
    res.on('close', () => {
        abortController.abort();
    });

    try {
        await this.AIService.reportChat(
            query,
            (content: string) => {
                res.write(`data: ${JSON.stringify({ content })}\n\n`);
            },
            abortController.signal
        );
        res.write(`data: [DONE]\n\n`);
    } catch (error) {
        res.write(`data: [ERROR] ${error.message || 'stream error'}\n\n`);
        abortController.abort();
    } finally {
        res.end();
    }
}

非流式输出

// 非流式输出
const completion = await client.chat.completions.create({
    model: 'moonshot-v1-auto',
    messages: [
        {
            role: 'system',
            content: `你是一个网页性能评分分析专家。我将提供一个产品的性能评分数据,帮我分析得分趋势和较大的得分变化。回答的内容不要带格式符号,尤其是 **。`,
        },
        { role: 'user', content: jsonData },
    ],
    temperature: 0.3,
});

return completion.choices[0].message.content;

实现的功能点

检测报告的智能分析与建议

由于保存的是 html 文件,我们可以通过正则将 html 文件中的 JSON 数据提取出来,用于后续的清洗与分析。

image.png

结合清洗后的 JSON 数据给出优化建议。

数据周报的趋势分析

将过去一周的分数给到大模型,由大模型分析解读得分的变化趋势。

image.png

后续规划

  • JSON 数据清洗更精确,确定好哪些是关键性能指标
  • 将 Lighthouse 的具体评分规则同步给大模型
  • 优化 Prompt,更换更合适的大模型
  • 结合埋点数据
    • 分析页面性能与用户停留时长的关系
    • 分析用户跳出率与页面性能的关系
    • 结合采集到的埋点数据分析页面性能对业务指标的影响

打造极致聊天体验:uz-chat——全端AI聊天组件来了!

作者 伊泽瑞尔
2025年6月24日 21:47

🚀 打造极致聊天体验:uz-chat——全端AI聊天组件来了!

🌟 插件介绍

uz-chat是一款基于uni-app开发的全端AI聊天组件,可无缝对接DeepSeek、OpenAI等主流AI服务。它不仅支持基础的消息展示,还内置了打字机效果、Markdown渲染和平滑滚动等高级特性,让你的应用瞬间拥有专业级聊天体验!

插件效果

✨ 核心功能亮点

1️⃣ 全端兼容,一次开发多端运行

  • 完美支持H5、小程序、App等多平台
  • 基于uni-app生态,无缝集成现有项目

2️⃣ 流畅的消息交互体验

  • 🎉 实时滚动:新消息自动平滑滚动到底部
  • ⌨️ 打字机效果:模拟AI思考和输入过程
  • 📋 消息操作:支持复制、编辑消息内容

3️⃣ 强大的内容渲染

  • ✍️ Markdown支持:代码高亮、表格、列表等格式化展示
  • 💻 代码块展示:支持多种编程语言语法高亮
  • 📝 富文本内容:满足复杂消息展示需求

4️⃣ 灵活的自定义能力

  • 支持自定义头像、昵称
  • 可扩展的消息类型插槽
  • 丰富的样式定制选项

🚀 快速上手

安装方式

在DCloud插件市场导入聊天消息组件uni_modules版本,无需额外import即可使用。

基础用法

<template>
  <uz-chat 
    @sendMessage="sendMessage"
    :isSending="isSending"
    :messages="messages"
    v-model:modelValue="inputMessage"
    :offset-height="topHeight + 'rpx'"
  ></uz-chat>
</template>

<script setup lang="ts">
import { ref } from 'vue'
const isSending = ref(false)
const messages = ref([])
const inputMessage = ref('')

// 发送消息处理
const sendMessage = async (msg: string) => {
  // 实现消息发送逻辑
}
</script>

对接AI服务

// 对接DeepSeek等AI服务示例
async function createChatCompletion(messages) {
  const openai = new OpenAI({
    baseURL: 'https://api.deepseek.com',
    apiKey: process.env.DEEPSEEK_API_KEY
  })
  
  return openai.chat.completions.create({
    messages: messages,
    model: 'deepseek-chat',
    stream: true
  })
}

🛠️ 技术特性

  • 高效渲染:采用虚拟列表技术,支持大量消息展示
  • 性能优化:消息滚动节流处理,避免卡顿
  • 类型安全:完整的TypeScript类型定义
  • 轻量化设计:核心功能打包体积小

📈 未来规划

  • 支持上拉加载更多历史消息
  • 支持语音消息
  • 自定义表情包功能
  • 暗黑模式

🤝 如何获取

💡 写在最后

uz-chat致力于为开发者提供开箱即用的高质量聊天组件,无论是构建AI助手、在线客服还是社交聊天应用,它都能满足你的需求。现在就集成uz-chat,为你的应用增添专业的聊天体验吧!

如果觉得这个组件对你有帮助,欢迎在掘金、CSDN等平台分享你的使用体验,也欢迎提交issue和PR参与项目贡献!

❌
❌