Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你用受控模式写组件?图啥呢?

你用受控模式写组件?图啥呢?

作者头像
神说要有光zxg
发布于 2024-04-30 07:56:17
发布于 2024-04-30 07:56:17
19900
代码可运行
举报
运行总次数:0
代码可运行

前端开发经常会涉及表单的处理,或者其他一些用于输入的组件,比如日历组件。

涉及到输入,就绕不开受控模式和非受控模式的概念。

什么是受控,什么是非受控呢?

想一下,改变表单值只有两种情况:

用户去改变 value 或者代码去改变 value。

如果不能通过代码改表单值 value,那就是非受控,也就是不受我们控制。

但是代码可以给表单设置初始值 defaultValue。

代码设置表单的初始 value,但是能改变 value 的只有用户,代码通过监听 onChange 来拿到最新的值,或者通过 ref 拿到 dom 之后读取 value。

这种就是非受控模式。

反过来,代码可以改变表单的 value,就是受控模式。

注意,value 和 defaultValue 不一样:

defaultValue 会作为 value 的初始值,后面用户改变的是 value。

而一旦你给 input 设置了 value,那用户就不能修改它了,可以输入触发 onChange 事件,但是表单的值不会变。

用户输入之后在 onChange 事件里拿到输入,然后通过代码去设置 value。

这就是受控模式。

其实绝大多数情况下,非受控就可以了,因为我们只是要拿到用户的输入,不需要手动去修改表单值。

但有的时候,你需要根据用户的输入做一些处理,然后设置为表单的值,这种就需要受控模式。

我们写代码试一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npx create-vite

创建 vite + react 的项目。

去掉 main.tsx 的 index.css 和 StrictMode:

改下 App.tsx

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ChangeEvent } from "react"

function App() {

  function onChange(event: ChangeEvent<HTMLInputElement>) {
    console.log(event.target.value);
  }

  return <input defaultValue={'guang'} onChange={onChange}/>
}

export default App

跑一下开发服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install
npm run dev

看下效果:

defaultValue 作为 value 的初始值,然后用户输入触发 onChange 事件,通过 event.target 拿到了 value。

当然,非受控模式也不一定通过 onChange 拿到最新 value,通过 ref 也可以。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useEffect, useRef } from "react"

function App() {

  const inputRef = useRef<HTMLInputElement>(null);

  useEffect(() => {
    setTimeout(() => {
      console.log(inputRef.current?.value);
    }, 2000);
  }, []);

  return <input defaultValue={'guang'} ref={inputRef}/>
}

export default App

接下来看下受控模式的写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ChangeEvent, useState } from "react"

function App() {

  const [value, setValue] = useState('guang');

  function onChange(event: ChangeEvent<HTMLInputElement>) {
    console.log(event.target.value);
    // setValue(event.target.value);
  }

  return <input value={value} onChange={onChange}/>
}

export default App

我们先把 setValue 注释掉,看下用户可不可以改:

可以看到,用户可以输入,onChange 也可以拿到输入后的表单值,但是 value 并没有变。

把 setValue 那一行注释去掉就可以了。

虽然功能上差不多,但这种写法并不推荐:

你不让用户自己控制,而是通过代码控制,绕了一圈结果也没改 value 的值,还是原封不动的,图啥呢?

而且受控模式每次 setValue 都会导致组件重新渲染。

试一下:

每次输入都会 setValue,然后触发组件重新渲染:

而非受控模式下只会渲染一次:

绕了一圈啥也没改,还导致很多组件的重新渲染,那你用受控模式图啥呢?

那什么情况用受控模式呢?

当然是你需要对输入的值做处理之后设置到表单的时候。

比如把用户输入改为大写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ChangeEvent, useState } from "react"

function App() {

  const [value, setValue] = useState('guang');

  function onChange(event: ChangeEvent<HTMLInputElement>) {
    console.log(event.target.value)
    setValue(event.target.value.toUpperCase());
  }

  return <input value={value} onChange={onChange}/>
}

export default App

这种,需要把用户的输入修改一下再设置 value 的。

但这种场景其实很少。

有的同学可能会说 Form 组件,确实,用 Form.Item 包裹的表单项都是受控组件:

确实,那是因为 Form 组件内有一个 Store,会把表单值同步过去,然后集中管理和设置值:

但也因为都是受控组件,随着用户的输入,表单重新渲染很多次,性能会不好。

如果是单独用的组件,比如 Calendar,那就没必要用受控模式了,用非受控模式,设置 defaultValue 就可以了。

很多人上来就设置 value,然后监听 onChange,但是绕了一圈又原封不动的把用户输入转为 value。

没啥意义,还平白导致组件的很多次重新渲染。

除了原生表单元素外,组件也需要考虑受控和非受控的情况。

比如日历组件:

它的参数就要考虑是支持非受控模式的 defaultValue,还是用受控模式的 value + onChange。

如果这是一个业务组件,那基本就是用非受控模式的 defaultValue 了,调用方只要拿到用户的输入就行。

用受控模式的 value 还要 setValue 触发额外的渲染。

但是基础组件不能这样,你得都支持,让调用者自己去选择。

ant design 的 Calendar 组件就是这样的:

ColorPicker 组件也是:

它同时支持了受控组件和非受控组件。

咋做到的呢?

我们来试试:

首先写下非受控组件的写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ChangeEvent, useState } from "react"

interface CalendarProps{
  defaultValue?: Date;
  onChange?: (date: Date) => void;
}
function Calendar(props: CalendarProps) {
  
  const {
    defaultValue = new Date(),
    onChange
  } = props;

  const [value, setValue] = useState(defaultValue);

  function changeValue(date: Date) {
    setValue(date);
    onChange?.(date);
  } 


  return <div>
    {value.toLocaleDateString()}
    <div onClick={()=> {changeValue(new Date('2024-5-1'))}}>2023-5-1</div>
    <div onClick={()=> {changeValue(new Date('2024-5-2'))}}>2023-5-2</div>
    <div onClick={()=> {changeValue(new Date('2024-5-3'))}}>2023-5-3</div>
  </div>
}

function App() {
  return <Calendar defaultValue={new Date('2024-5-1')} onChange={(date) => {
    console.log(date.toLocaleDateString());
  }}/>
}

export default App

这里 Calendar 组件传入 defaultValue 和 onChange 参数。

defaultValue 会作为 value 的初始值,然后用户点击不同日期会修改 value,然后回调 onChange 函数。

这种情况,调用者只能设置 defaultValue 初始值,不能直接修改 value,所以是非受控模式。

试一下;

然后再来写下受控模式的版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ChangeEvent, useEffect, useState } from "react"

interface CalendarProps{
  value: Date;
  onChange?: (date: Date) => void;
}
function Calendar(props: CalendarProps) {
  
  const {
    value,
    onChange
  } = props;

  function changeValue(date: Date) {
    onChange?.(date);
  } 

  return <div>
    {value.toLocaleDateString()}
    <div onClick={()=> {changeValue(new Date('2024-5-1'))}}>2023-5-1</div>
    <div onClick={()=> {changeValue(new Date('2024-5-2'))}}>2023-5-2</div>
    <div onClick={()=> {changeValue(new Date('2024-5-3'))}}>2023-5-3</div>
  </div>
}

function App() {
  const [value, setValue] = useState(new Date('2024-5-1'));

  return <Calendar value={value} onChange={(date) => {
    console.log(date.toLocaleDateString());
    setValue(date);
  }}/>
}

export default App

直接用 props 传入的 value,然后切换日期的时候回调 onChange 函数:

value 的值的维护在调用方。

这就是受控组件的写法:

那能不能同时支持受控和非受控模式呢?

可以的,组件库基本都是这么做的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useEffect, useRef, useState } from "react"

interface CalendarProps{
  value?: Date;
  defaultValue?: Date;
  onChange?: (date: Date) => void;
}

function Calendar(props: CalendarProps) {
  
  const {
    value: propsValue,
    defaultValue,
    onChange
  } = props;

  const [value, setValue] = useState(() => {
    if (propsValue !== undefined) {
      return propsValue;
    } else {
      return defaultValue;
    }
  });

  const isFirstRender = useRef(true);

  useEffect(() => {
    if(propsValue === undefined && !isFirstRender.current) {
      setValue(propsValue);
    }
    isFirstRender.current = false;
  }, [propsValue]);

  const mergedValue = propsValue === undefined ? value : propsValue;

  function changeValue(date: Date) {
    if (propsValue === undefined) {
      setValue(date);
    }
    onChange?.(date);
  } 

  return <div>
    {mergedValue?.toLocaleDateString()}
    <div onClick={()=> {changeValue(new Date('2024-5-1'))}}>2023-5-1</div>
    <div onClick={()=> {changeValue(new Date('2024-5-2'))}}>2023-5-2</div>
    <div onClick={()=> {changeValue(new Date('2024-5-3'))}}>2023-5-3</div>
  </div>
}

function App() {
  return <Calendar defaultValue={new Date('2024-5-1')} onChange={(date) => {
    console.log(date.toLocaleDateString());
  }}/>
}

export default App

参数同时支持 value 和 defaultValue,通过判断 value 是不是 undefined 来区分受控模式和非受控模式。

如果是受控模式,useState 的初始值设置 props.value,然后渲染用 props.value。

如果是非受控模式,那渲染用内部 state 的 value,然后 onChange 里 setValue。

当不是首次渲染,但 value 变为 undefined 的情况,也就是从受控模式切换到了非受控模式,要同步设置 state 为 propsValue。

这样,组件就同时支持了受控和非受控模式。

测试下:

非受控模式:

受控模式:

其实组件库也都是这么做的。

比如 arco design 的 useMergeValue 的 hook:

代码差不多,它也是 useState 根据 value 是不是 undefined 来设置 value 或者 defaultValue。

不过它这里又加了一个默认值,没有 defaultValue 的时候用它哪个 defaultStateValue。

然后渲染用的 state 根据 value 是不是 undefind 来判断受控非受控从而决定用 props 的 value 还是 state 的 value。

它也处理了 value 从别的值变为 undefined 的情况:

保存了之前的 value,判断是从 props.value 别的值变为 undefined 的情况再修改内部 state 为这个 value。

这里保存之前的值是用的 useRef:

ref 的特点是修改了 current 属性不会导致渲染。

我们是判断非首次渲染,但是 props.value 变为了 undefined,效果一样。

再比如 ant design 的工具包 rc-util 里的 useMergedValue 的 hook:

它也是 useState 根据 value 是不是 undefined 来设置 value 或者 defaultValue

然后又加了一个默认值,没有 defaultValue 的时候用它那个 defaultStateValue。

渲染的时候也是判断 value 是不是 undefind 来决定用 props.value 还是 state 的 value:

并且也做了别的值变为 undefined 的处理。

大家都这么搞,我们也来封装个 hook:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function useMergeState<T>(
  defaultStateValue: T,
  props?: {
    defaultValue?: T,
    value?: T
  }
): [T, React.Dispatch<React.SetStateAction<T>>,] {
  const { defaultValue, value: propsValue } = props || {};

  const isFirstRender = useRef(true);

  const [stateValue, setStateValue] = useState<T>(() => {
    if (propsValue !== undefined) {
      return propsValue!;
    } else if(defaultValue !== undefined){
      return defaultValue!;
    } else {
      return defaultStateValue;
    }
  });

  useEffect(() => {
    if(propsValue === undefined && !isFirstRender.current) {
      setStateValue(propsValue!);
    }

    isFirstRender.current = false;
  }, [propsValue]);

  const mergedValue = propsValue === undefined ? stateValue : propsValue;

  return [mergedValue, setStateValue]
}

用一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface CalendarProps{
  value?: Date;
  defaultValue?: Date;
  onChange?: (date: Date) => void;
}

function Calendar(props: CalendarProps) {
  const {
    value: propsValue,
    defaultValue,
    onChange
  } = props;

  const [mergedValue, setValue] = useMergeState(new Date(), {
    value: propsValue,
    defaultValue
  });

  function changeValue(date: Date) {
    if (propsValue === undefined) {
      setValue(date);
    }
    onChange?.(date);
  } 

  return <div>
    {mergedValue?.toLocaleDateString()}
    <div onClick={()=> {changeValue(new Date('2024-5-1'))}}>2023-5-1</div>
    <div onClick={()=> {changeValue(new Date('2024-5-2'))}}>2023-5-2</div>
    <div onClick={()=> {changeValue(new Date('2024-5-3'))}}>2023-5-3</div>
  </div>
}

试试效果:

非受控模式:

受控模式:

完美!

这样,我们的组件就同时支持了受控模式和非受控模式。

案例代码上传了react 小册仓库:https://github.com/QuarkGluonPlasma/react-course-code/tree/main/controlled-and-uncontrolled。

总结

涉及到用户输入的组件都要考虑用受控模式还是非受控模式。

非受控模式就是完全用户自己修改 value,我们只是设置个 defaultValue,可以通过 onChange 或者 ref 拿到表单值。

受控模式是代码来控制 value,用户输入之后通过 onChange 拿到值然后 setValue,触发重新渲染。

单独用的组件,绝大多数情况下,用非受控模式就好了,因为你只是想获取到用户的输入。

受控模式只在需要对用户的输入做一些修改然后再设置到 value 的情况用。

再就是如果需要结合 Form 表单用,那是要支持受控模式,因为 Form 会通过 Store 来统一管理所有表单项。

封装业务组件的话,用非受控模式就行。

但是基础组件还是都要支持,也就是支持 defaultValue 和 value + onChange 两种参数,内部通过判断 value 是不是 undefined 来区分。

arco design、ant design 等组件库都是这么做的,并且不约而同封装了 useMergedValue 的 hook,我们也封装了一个。

如果不是基础组件,用非受控模式就好了,很多人写组件不管三七二十一就设置 value 和 onChange,这样功能和非受控一样,但还会导致很多次的额外渲染,图啥呢?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 神光的编程秘籍 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LLM 大模型学习必知必会系列(一):大模型基础知识篇
2023 年,随着 LLM 技术的发展,中国模型研究机构的开源模型迎来了爆发式的增长:
汀丶人工智能
2024/05/11
3.2K0
LLM 大模型学习必知必会系列(一):大模型基础知识篇
微软研究人员推出SpreadsheetLLM!旨在理解和处理电子表格;“神农大模型 2.0”正式发布!|AI日报
代号“Strawberry”,OpenAI新型武器被曝光!4050亿参数版Llama 3近期即将发布?|AI日报
可信AI进展
2024/07/17
3250
深入LLM与RAG 原理、实现与应用
大模型LLM(Large Language Model)是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能,能够处理更加复杂的任务和数据。大模型在各种领域都有广泛的应用,包括自然语言处理、计算机视觉、语音识别和推荐系统等。大模型通过训练海量数据来学习复杂的模式和特征,具有更强大的泛化能力,可以对未见过的数据做出准确的预测。
奔跑企鹅907340320
2024/09/20
1540
对话 APUS 李涛:全面转型做 AI,蒸馏法训练大模型,沉淀中小模型
作者丨何思思 编辑丨林觉民 走进融新科技中心A座23层,映入眼帘的是绿植、野营桌椅帐篷,在如此轻松的环境下,雷峰网见到了APUS创始人李涛,他着一身休闲装,显得尤为放松。 对谈前,他用八个字总结了创办APUS的心路历程——“享受过程、追求快乐”,对谈过程中,也始终强调着“快乐”的重要性。一场对谈下来,他口中有关“创业压力、至暗时刻”的抱怨很少,更多的是应对变局时的从容淡定。 雷峰网从侧面了解到,APUS在选择办公地址时通常首选高层,原因是窄小的格子间只会给程序员带来压迫感,毫无快乐可言,高楼层视野开阔,可以
AI科技评论
2023/04/09
3540
对话 APUS 李涛:全面转型做 AI,蒸馏法训练大模型,沉淀中小模型
GPTs数据泄露大语言模型安全刻不容缓,如何用AI Agent提升LLM应用安全系数?
阻碍广大企业应用大语言模型(LLM,Large Langeuage Models)的诸多因素中,无疑数据安全是最重要的。
王吉伟频道
2023/11/13
9850
GPTs数据泄露大语言模型安全刻不容缓,如何用AI Agent提升LLM应用安全系数?
大模型市场竞争白热化:技术不是门槛,数据才是
在过去的2023年里,互联网圈子最吸引眼球的话题莫过于大模型了。尤其是随着文心一言、讯飞星火、百川、通义千问、混元等国产大模型纷纷上线,“调戏”大模型成了网友们日常热衷的活动。然而,在运行了几个月之后,不少中文语言大模型出现了在训练时“相互借鉴”的现象。
数据猿
2024/01/25
2430
大模型市场竞争白热化:技术不是门槛,数据才是
一文带你解密 Large Language Model(大型语言模型)
Hello folks,我是 Luga,今天我们来聊一下人工智能(AI)生态领域相关的技术 - Large Language Model(大型语言模型) 。
Luga Lee
2023/11/13
7K2
一文带你解密 Large Language Model(大型语言模型)
AI Agent框架(LLM Agent):LLM驱动的智能体如何引领行业变革,应用探索与未来展望
有很多人或许会疑惑,Agent 这个东西看起来跟 LLM 也没差得那么远,那为啥最近突然 Agent 那么火,而不称之为 LLM-Application 或者其他的词呢?这就得从 Agent 的来历上说起了,因为 Agent 是个很古老的术语,甚至可以追溯至亚里士多德和休谟等人的言论。从哲学意义上讲,“代理人”是指具有行动能力的实体,而 “代理” 一词则表示这种能力的行使或体现。而从狭义上讲,“代理”通常是指有意行动的表现; 相应地,“代理人” 一词表示拥有欲望、信念、意图和行动能力的实体。需要注意的是,代理人不仅包括人类个体,还包括物理世界和虚拟世界中的其他实体。重要的是,“代理” 的概念涉及个人的自主性,赋予他们行使意志、做出选择和采取行动的能力,而不是被动地对外部刺激做出反应。
汀丶人工智能
2024/07/05
2.9K0
AI Agent框架(LLM Agent):LLM驱动的智能体如何引领行业变革,应用探索与未来展望
LLM大语言模型原理、发展历程、训练方法、应用场景和未来趋势
LLM,全称Large Language Model,即大型语言模型。LLM是一种强大的人工智能算法,它通过训练大量文本数据,学习语言的语法、语义和上下文信息,从而能够对自然语言文本进行建模。这种模型在自然语言处理(NLP)领域具有广泛的应用,包括文本生成、文本分类、机器翻译、情感分析等。本文将详细介绍LLM大语言模型的原理、发展历程、训练方法、应用场景和未来趋势。
正在走向自律
2024/12/18
1.7K0
LLM大语言模型原理、发展历程、训练方法、应用场景和未来趋势
【黄啊码】一分钟了解LLM
大语言模型(LLM,Large Language Model),也称大型语言模型,是一种旨在理解和生成人类语言的人工智能模型。
黄啊码
2024/08/09
1710
AI人工智能大模型失守!ChatGPT、BARD、BING、Claude 相继被"提示攻击"攻陷!
“ 提示攻击,一种利用巧妙的技巧和迷惑性的指令,让这些顶尖的语言模型产生混乱或错误的回答的方法。”
技术人生黄勇
2024/07/19
2350
AI人工智能大模型失守!ChatGPT、BARD、BING、Claude 相继被"提示攻击"攻陷!
AIGC如何借AI Agent落地?TARS-RPA-Agent破解RPA与LLM融合难题
大语言模型(LLM,Large Language Model)的持续爆发,让AIGC一直处于这股AI风暴最中央,不停席卷各个领域。
王吉伟频道
2023/08/23
1.3K0
AIGC如何借AI Agent落地?TARS-RPA-Agent破解RPA与LLM融合难题
ChatGPT 新应用时代来临!CSDN AIGC 与大模型技术应用峰会全日程公布
我们正处在一个什么样的时代节点? 比尔·盖茨直指人工智能时代已经开启,并这样表示:在我有生之年,见证了两次革命性的技术展示。一次是 1980 年看到图形用户界面;一次就是 OpenAI 带来的 ChatGPT 与 GPT-4。 英伟达的黄教主说:“生成式 AI 将重塑几乎所有行业。”ChatGPT、Stable Diffusion、DALL-E 和 Midjourney 唤醒了世界对生成式 AI 的认知。 OpenAI CEO Sam Altman 则直指 ChatGPT 可能影响 80%工作岗位,会是像蒸
AI科技大本营
2023/04/06
7320
ChatGPT 新应用时代来临!CSDN AIGC 与大模型技术应用峰会全日程公布
LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等
自ChatGPT为代表的大语言模型(Large Language Model, LLM)出现以后,由于其惊人的类通用人工智能(AGI)的能力,掀起了新一轮自然语言处理领域的研究和应用的浪潮。尤其是以ChatGLM、LLaMA等平民玩家都能跑起来的较小规模的LLM开源之后,业界涌现了非常多基于LLM的二次微调或应用的案例。本项目旨在收集和梳理中文LLM相关的开源模型、应用、数据集及教程等资料,目前收录的资源已达100+个!
汀丶人工智能
2024/04/29
3.1K0
LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等
解决通用LLM「偏科」问题,数学大模型MathGPT要来了!
机器之心原创 作者:蛋酱 数学大模型 MathGPT,专治大语言模型的「偏科」问题。 不做通用 LLM,不基于现有 LLM 做微调和接口调用,学而思自研的数学大模型 MathGPT 要来了。 这对于全世界的数学爱好者来说,都是个值得关注的好消息。 MathGPT 是面向全球数学爱好者和科研机构,以数学领域的解题和讲题算法为核心的大模型。据了解,学而思已将 MathGPT 定位为公司核心项目,由 CTO 田密负责,今年春节前,研发正在进行中,该项目已经启动相应的团队建设、数据、算力准备和技术研发。 进度方面
机器之心
2023/05/09
6930
解决通用LLM「偏科」问题,数学大模型MathGPT要来了!
十问农业大模型的当前和未来
11月6日OpenAI开发者大会带来的GPT-4 Turbo多模态能力升级和GPT Store生态策略,再次引起业界关注热潮。我国通过《生成式人工智能服务管理暂行办法》第一、第二批备案的大模型已经达到22个,除了通用大模型之外,行业或领域大模型开始逐渐增多。可以预见,通用大模型持续增强的听、说、看能力,将通过声音、视觉、图像等多模态开放接口,更便捷的输出给行业大模型的开发者和使用者,在带来更丰富场景的同时,进一步降低应用门槛。
晨涵
2023/11/16
4920
十问农业大模型的当前和未来
超越 ChatGPT-4,谷歌结合 AlphaGo 技术的多模态大模型 Gemini 已小范围内测
“ 谷歌的多模态AI系统Gemini正在小范围内测,这标志着它很快会对外开放。Gemini集成了文本、图像等多种模式,运用了AlphaGo中的强化学习等技术,目标是在规划、记忆、多模态方面进行创新。Gemini可能会成为继ChatGPT系列后又一个里程碑式的产品。”
技术人生黄勇
2024/07/19
1390
超越 ChatGPT-4,谷歌结合 AlphaGo 技术的多模态大模型 Gemini 已小范围内测
AIGC持续火爆大模型争相推出,庞大市场造就算力供应模式演变
但火的不只是AIGC应用,还有巨头之间的AI竞赛,以及接连不断上新的AI大模型(LLM,Large Language Model)。
王吉伟频道
2023/05/22
2640
AIGC持续火爆大模型争相推出,庞大市场造就算力供应模式演变
当我想要构建一款 LLM 应用时:关于技术栈、省钱和游戏规则
“虽然在 2012 年到 2015 年间,深度学习在图像识别领域获得了巨大成功,但要达到通用人工智能,还需要时间。”这是读研究生时刘小洋的老教授告诉他的。
深度学习与Python
2023/09/20
5010
当我想要构建一款 LLM 应用时:关于技术栈、省钱和游戏规则
开源大型语言模型(llm)总结
大型语言模型(LLM)是人工智能领域中的一个重要研究方向,在ChatGPT之后,它经历了快速的发展。这些发展主要涉及以下几个方面:
deephub
2023/08/30
4930
开源大型语言模型(llm)总结
推荐阅读
LLM 大模型学习必知必会系列(一):大模型基础知识篇
3.2K0
微软研究人员推出SpreadsheetLLM!旨在理解和处理电子表格;“神农大模型 2.0”正式发布!|AI日报
3250
深入LLM与RAG 原理、实现与应用
1540
对话 APUS 李涛:全面转型做 AI,蒸馏法训练大模型,沉淀中小模型
3540
GPTs数据泄露大语言模型安全刻不容缓,如何用AI Agent提升LLM应用安全系数?
9850
大模型市场竞争白热化:技术不是门槛,数据才是
2430
一文带你解密 Large Language Model(大型语言模型)
7K2
AI Agent框架(LLM Agent):LLM驱动的智能体如何引领行业变革,应用探索与未来展望
2.9K0
LLM大语言模型原理、发展历程、训练方法、应用场景和未来趋势
1.7K0
【黄啊码】一分钟了解LLM
1710
AI人工智能大模型失守!ChatGPT、BARD、BING、Claude 相继被"提示攻击"攻陷!
2350
AIGC如何借AI Agent落地?TARS-RPA-Agent破解RPA与LLM融合难题
1.3K0
ChatGPT 新应用时代来临!CSDN AIGC 与大模型技术应用峰会全日程公布
7320
LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等
3.1K0
解决通用LLM「偏科」问题,数学大模型MathGPT要来了!
6930
十问农业大模型的当前和未来
4920
超越 ChatGPT-4,谷歌结合 AlphaGo 技术的多模态大模型 Gemini 已小范围内测
1390
AIGC持续火爆大模型争相推出,庞大市场造就算力供应模式演变
2640
当我想要构建一款 LLM 应用时:关于技术栈、省钱和游戏规则
5010
开源大型语言模型(llm)总结
4930
相关推荐
LLM 大模型学习必知必会系列(一):大模型基础知识篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验