前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[译] 优化 React APP 的 10 种方法

[译] 优化 React APP 的 10 种方法

作者头像
腾讯IVWEB团队
发布于 2020-08-10 02:46:52
发布于 2020-08-10 02:46:52
34.8K00
代码可运行
举报
运行总次数:0
代码可运行

如何优化性能以提供出色的用户体验。

在开发任何软件(尤其是Web应用程序)时,优化是每个开发人员考虑的第一件事。像Angular,React等其他JS框架都包含了一些很棒的配置和功能。在这里,我将回顾有助于您优化应用性能的功能和技巧。

无论您使用哪种特定的模式和方法来优化代码。保持 DRY 原则是非常重要的。始终努力重用组件-保证可以帮助编写优化的代码。如果您花费更多的时间来编写出色的代码,而花费更少的时间来编写平庸的代码(出错的机会更大),那么奇妙的事情将会发生。

话虽如此,在处理大型代码库或使用不同的存储库时,重用代码可能会成为真正的挑战,这主要有两个原因:1.您通常不知道有用的代码段。2.跨存储库共享代码的传统方式是通过软件包,这需要一些繁重的配置。要解决这两个问题,请使用 BitGitHub )之类的工具。Bit可帮助您将组件与代码库隔离,并在 bit.dev 上共享它们。令人印象深刻的搜索引擎,过滤器和实时游乐场可轻松找到 bit.dev 上的组件。—好的代码始于良好的工作习惯。

示例:搜索在bit.dev上共享的React组件

1. useMemo()

这是一个React钩子,用于在React中消耗大量CPU资源的函数中进行缓存。

让我们来看一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function App() {
    const [count, setCount] = useState(0)
    
    const expFunc = (count)=> {
        waitSync(3000);
        return count * 90;
    }
    const resCount = expFunc(count)
    return (
        <>
            Count: {resCount}
            <input type="text" onChange={(e)=> setCount(e.target.value)} placeholder="Set Count" />
        </>
    )
}

我们有一个昂贵的函数expFunc,需要3分钟才能执行,它需要输入count等待3分钟才能返回的倍数90。我们有一个变量resCount,expFunc该count变量从useState挂钩中调用。我们有一个输入,可以count在键入任何内容时设置状态。

每当我们键入任何内容时,我们的应用程序组件都会重新渲染,从而导致该expFunc函数被调用。我们将看到,如果连续输入,该函数将被调用,从而导致巨大的性能瓶颈。对于每个输入,渲染将花费3分钟。如果键入3,则expFunc将运行3分钟,如果3再次键入,将再次花费3分钟。它不应在第二个输入中再次运行,因为它与前一个输入相同,它应将结果存储在某个位置,然后在不运行函数(expFunc)的情况下将其返回。

在这里,我们将使用useMemo挂钩为我们优化expFunc。useMemo具有以下结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
useMemo(()=> func, [input_dependency])

Func是我们要缓存/记忆的函数,input_dependency是useMemo将针对其缓存的func的输入数组,也就是说,如果它们更改了func,则将被调用。

现在,在我们的功能组件App上使用useMemo:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function App() {
    const [count, setCount] = useState(0)
    
    const expFunc = (count)=> {
        waitSync(3000);
        return count * 90;
    }
    const resCount = useMemo(()=> {
        return expFunc(count)
    }, [count])
    return (
        <>
            Count: {resCount}
            <input type="text" onChange={(e)=> setCount(e.target.value)} placeholder="Set Count" />
        </>
    )
}

现在,当再次发生相同的输入时,这里将针对输入缓存expFunc结果useMemo将跳过调用expFunc并返回针对输入缓存的输出。

这将使App组件高度优化。

请参阅,该useMemo缓存技术可提高性能。同样,它可以用于根据其属性缓存功能组件。

2.虚拟化长列表

如果呈现大型数据列表,建议一次在浏览器的可见视口内仅呈现一小部分数据集,然后在列表滚动时呈现下一个数据,这称为“窗口” 。为此已经构建了很棒的React库, 反应窗口反应虚拟化 由Brian Vaughn撰写。

3. React.PureComponent

就像shouldComponentUpdate对组件进行分类一样,React.PureComponent也是如此。

React.PureComponent是基础组件类,用于检查状态字段和属性以了解是否应更新组件。

让我们在shouldComponentUpdate部分中转换我们的示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ReactComponent extends Component {
    constructor(props, context) {
        super(props, context)
        this.state = {
            data: null
        }
        this.inputValue = null
    }
    handleClick = () => {
        this.setState({data: this.inputValue})
    }
    onChange = (evt) => {
        this.inputValue = evt.target.value
    }
    shouldComponentUpdate( nextProps,nextState) {
        if(nextState.data === this.state.data)
            return false
        return true
    }
    render() {
        l("rendering App")
        return (
            <div>
                {this.state.data}
                <input onChange={this.onChange} />
                <button onClick={this.handleClick}>Click Me </button>
            </div>
        )
    }
}

使用React.PureComponent:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ReactComponent extends React.PureComponent {
    constructor(props, context) {
        super(props, context)
        this.state = {
            data: null
        }
        this.inputValue = null
    }
    handleClick = () => {
        this.setState({data: this.inputValue})
    }
    onChange = (evt) => {
        this.inputValue = evt.target.value
    }
    render() {
        l("rendering App")
        return (
            <div>
                {this.state.data}
                <input onChange={this.onChange} />
                <button onClick={this.handleClick}>Click Me </button>
            </div>
        )
    }
}

看到,我们删除了shouldComponentUpdate并使ReactComponent扩展了React.PureComponent。

在文本框中输入2并Click Me连续单击按钮,我们将看到ReactComponent将被重新渲染一次,并且永远不会被渲染。

它将上一个道具和状态对象的字段与下一个道具和状态对象的字段进行浅层比较。它不只是对它们进行对象引用比较。

React.PureComponent通过减少浪费的渲染次数来优化我们的组件。

4.缓存功能

可以在render方法的React组件JSX中调用函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function expensiveFunc(input) {
    ...
    return output
}
class ReactCompo extends Component {
    render() {
        return (
            <div>
                {expensiveFunc}
            </div>
        )
    }
}

如果这些功能变得昂贵,即执行时间很长,它将挂起其余的重新渲染代码以完成操作,从而妨碍了用户的体验。

参见,在ReactCompo中。cheapableFunc在JSX中呈现,对于每次重新呈现,都会调用该函数,并将返回值呈现在DOM上。该函数占用大量CPU,我们将看到在每次重新渲染时都会调用该函数,React将不得不等待其完成才能运行其余的重新渲染算法。

最好的办法是针对输出缓存功能的输入,以便当再次发生相同的输入时,函数的连续执行变得更快。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function expensiveFunc(input) {
    ...
    return output
}
const memoizedExpensiveFunc = memoize(expensiveFunc)
class ReactCompo extends Component {
    render() {
        return (
            <div>
                {memoizedExpensiveFunc}
            </div>
        )
    }
}

5.使用重新选择选择器

使用 reselect 仓库优化我们的Redux状态管理。由于Redux实行不变性,这意味着每次操作分派时都会创建新的对象引用。这将影响性能,因为即使对象引用发生更改但字段未更改,也会在组件上触发重新渲染。

重新选择库封装了Redux状态并检查该状态的字段,并告诉React什么时候渲染或不渲染字段。

因此,重新选择可通过浅遍遍遍prev和当前Redux状态字段来检查宝贵的时间,尽管它们具有不同的内存引用,但它们是否已更改。如果字段已更改,它将告诉React重新渲染;如果没有字段已更改,则尽管创建了新的状态对象,它也会取消重新渲染。

6. 使用 Web worker

JS代码在单个线程上运行。在同一线程上运行一个长进程将严重影响UI呈现代码,因此最好的选择是将进程移至另一个线程。这是由Web工作人员完成的。它们是我们可以在其中创建线程并与主线程并行运行而不妨碍UI流程的网关。

我们可以在React中使用Web worker,尽管没有官方支持,但是有一些方法可以将Web worker添加到React应用中。让我们来看一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// webWorker.js
const worker = (self) => {
    function generateBigArray() {
        let arr = []
        arr.length = 1000000
        for (let i = 0; i < arr.length; i++)
            arr[i] = i
        return arr
    }
    function sum(arr) {
        return arr.reduce((e, prev) => e + prev, 0)
    }
    function factorial(num) {
        if (num == 1)
            return 1
        return num * factorial(num - 1)
    }
    self.addEventListener("message", (evt) => {
        const num = evt.data
        const arr = generateBigArray()
        postMessage(sum(arr))
    })
}
export default worker

// App.js
import worker from "./webWorker"
import React, { Component } from 'react';
import './index.css';
class App extends Component {
    constructor() {
        super()
        this.state = {
            result: null
        }
    }
    calc = () => {
        this.webWorker.postMessage(null)
    }
    componentDidMount() {
        let code = worker.toString()
        code = code.substring(code.indexOf("{") + 1, code.lastIndexOf("}"))
        const bb = new Blob([code], { type: "application/javascript" });
        this.webWorker = new Worker(URL.createObjectURL(bb))
        this.webWorker.addEventListener("message", (evt) => {
            const data = evt.data
            this.setState({ result: data })
        })
    }
    render() {
        return ( 
            <div>
                <button onClick = { this.calc }> Sum </button>   
                <h3> Result: { this.state.result }</h3>  
            </div>
        )
    }
}

此应用程序将计算包含1M个元素的数组的总和,现在,如果我们在主线程中执行了此操作,则主线程将一直挂起,直到遍历1M个元素并计算了它们的总和。

现在,在这里我们将其移至Web worker,我们的主线程将与web worker线程并行运行,同时将计算1M元素数组的总和。完成后将传达结果,并且主线程将仅呈现结果。快速,简单和高性能。

7.延迟加载

延迟加载已成为现在广泛用于加快加载时间的优化技术之一。延迟加载的前景有助于将某些Web应用程序性能问题的风险降至最低。

为了在React中延迟加载路由组件,使用了React.lazy()API

延迟加载已成为现在广泛用于加快加载时间的优化技术之一。延迟加载的前景有助于将某些Web应用程序性能问题的风险降至最低。

为了在React中延迟加载路由组件,使用了React.lazy()API。

这里引用我之前博客的内容:

React.lazy是Reactv16.6发布时添加到React的新功能,它为延迟加载和代码拆分React组件提供了一种简单明了的方法。

React.lazy函数使您可以将动态导入呈现为常规组件。— React博客

React.lazy使创建组件和使用动态导入呈现组件变得容易。React.lazy将一个函数作为参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
React.lazy(()=>{})
// or
function cb () {}
React.lazy(cb)

此回调函数必须使用动态import()语法加载组件的文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// MyComponent.js
class MyComponent extends Component{
    render() {
        return <div>MyComponent</div>
    }
}
const MyComponent = React.lazy(()=>{import('./MyComponent.js')})
function AppComponent() {
    return <div><MyComponent /></div>
}
// or
function cb () {
    return import('./MyComponent.js')
}
const MyComponent = React.lazy(cb)
function AppComponent() {
    return <div><MyComponent /></div>
}

React.lazy的回调函数通过import()调用返回一个Promise 。Promise会解决模块是否成功加载的问题,并拒绝由于网络故障,错误的路径解析,找不到文件等原因导致模块加载错误。

当webpack遍历我们的代码进行编译和捆绑时,当它到达React.lazy()和时会创建一个单独的捆绑import()。我们的应用程序将变成这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
react-app
 dist/
  - index.html
  - main.b1234.js (contains Appcomponent and bootstrap code)
  - mycomponent.bc4567.js (contains MyComponent)
/** index.html **/
<head>
    <div id="root"></div>
    <script src="main.b1234.js"></script>
</head>

现在,我们的应用程序现在分为多个捆绑包。呈现AppComponent时,将加载mycomponent.bc4567.js文件,并且包含的 MyComponent将显示在DOM上。

8. React.memo()

就像useMemo和React.PureComponent一样,React.memo() 用于记忆/缓存功能组件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function My(props) {
    return (
        <div>
            {props.data}
        </div>
    )
}
function App() {
    const [state, setState] = useState(0)
    return (
        <>
            <button onClick={()=> setState(0)}>Click</button>
            <My data={state} />
        </>
    )
}

应用程序渲染My组件,通过dataprop 将状态传递给My 。现在,看到按下按钮时,该按钮会将状态设置为0。如果连续按下按钮,则状态始终保持不变,但是尽管传递给其道具的状态相同,但My组件仍将重新渲染。如果App和My下有成千上万个组件,这将是一个巨大的性能瓶颈。

为了减少这种情况,我们将用React.memo包装My组件,该组件将返回My的备注版本,该版本将在App中使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function My(props) {
    return (
        <div>
            {props.data}
        </div>
    )
}
const MemoedMy = React.memo(My)
function App() {
    const [state, setState] = useState(0)
    return (
        <>
            <button onClick={()=> setState(0)}>Click</button>
            <MemeodMy data={state} />
        </>
    )
}

这样,连续按下“单击”按钮将仅触发一次“永不”的重新渲染。这是因为React.memo会记住其道具,并会在不执行My组件的情况下返回缓存的输出,只要相同的输入一遍又一遍。

React.PureComponent对组件进行分类是Reat.memo对功能组件进行分类。

9. useCallback()

在上一篇文章中: 使用useMemo,提高功能组件的性能useCallback

它可以用作useMemo,但区别在于它用于记忆函数声明。

假设我们有这个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function TestComp(props) {
    l('rendering TestComp')
    return (
        <>
            TestComp
            <button onClick={props.func}>Set Count in 'TestComp'</button>
        </>
    )
}
TestComp = React.memo(TestComp)
function App() {
    const [count, setCount] = useState(0)
    return (
        <>
            <button onClick={()=> setCount(count + 1)}>Set Count</button>
            <TestComp func={()=> setCount(count + 1)} />
        </>
    )
}

我们有一个App组件,它使用useState维护计数状态,每当调用setCount函数时,App组件都会重新呈现。它呈现一个按钮和TestComp组件,如果我们单击Set Count按钮,则App组件将连同其子树一起重新呈现。现在,使用备忘录对TestComp进行备忘录化,以避免不必要的重新渲染。React.memo通过将其当前/下一个道具与上一个道具进行比较来记住一个组件,如果它们相同,则不会重新渲染该组件。TestComp会在func props属性中实际上接收到一个props函数,每当重新渲染App时,都会检查TestComp的props函数是否相同,如果发现相同,则不会重新渲染。

这里的问题是TestComp接收到函数prop的新实例。怎么样?看一下JSX:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
    return (
        <>
            ...
            <TestComp func={()=> setCount(count + 1)} />
        </>
    )
...

传递了箭头函数声明,因此,每当呈现App时,总是使用新的引用(内存地址指针)创建新的函数声明。因此,React.memo的浅表比较将记录差异,并为重新渲染提供批准。

现在,我们如何解决这个问题?如果我们将函数移到函数范围之外,那会很好,但是不会引用setCount函数。这是useCallback出现的地方,我们将把功能道具传递给useCallback并指定依赖项,useCallback钩子返回函数式道具的记忆版本,这就是我们将传递给TestComp的东西。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function App() {
    const check = 90
    const [count, setCount] = useState(0)
    const clickHndlr = useCallback(()=> { setCount(check) }, [check]);
    return (
        <>
            <button onClick={()=> setCount(count + 1)}>Set Count</button>
            <TestComp func={clickHndlr} />
        </>
    )
}

在这里,除非clickHndlr重新定义App依赖关系check,否则不会在每次重新渲染组件时都重新创建它,因此当我们反复单击Set Count按钮TestComp时不会重新渲染。useCallback将检查check变量,如果不相同,其上一个值,它将返回函数传递所以TestComp和React.memo会看到一个新的参考和重新渲染TestComp,如果不一样useCallback就什么都不返回所以React.memo会看到一个函数引用相同的分组值并取消重新呈现TestComp。

10. shouldComponentUpdate()

React应用程序由组件组成,从根组件(通常是App.js中的App)到扩展分支。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ReactComponent extends Component {
    render() {
        return (
            <div></div>
        )
    }
}

基本的React组件。

这些组件树使其具有父子关系,即在组件中更新绑定数据时,将重新呈现该组件及其子组件,以使更改传播到整个子组件树中。当要重新渲染组件时,React会将其先前的数据(属性和上下文)与当前数据(属性和上下文)进行比较,如果它们相同,则不会进行重新渲染,但是如果存在差异,则该组件并重新渲染其子级。

由于props和context是对象,因此React使用严格相等运算符===通过对象引用比较差异。因此,React使用该引用来知道先前的道具和状态何时与当前的道具和状态发生了变化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ReactComponent extends Component {
    constructor(props, context) {
        super(props, context)
        this.state = {
            data: null
        }
        this.inputValue = null
    }
handleClick = () => {
        this.setState({data: this.inputValue})
    }
onChange = (evt) => {
        this.inputValue = evt.target.value
    }
render() {
        l("rendering App")
        return (
            <div>
                {this.state.data}
                <input onChange={onChange} />
                <button onClick={handleCick}>Click Me </button>
            </div>
        )
    }
}

请参阅上面的组件。它在状态对象中具有数据。如果我们在输入文本框中输入一个值并按下Click Me按钮,则将呈现输入中的值。我特意在render方法中添加了l(“ rendering App”),以便我们知道ReactComponent何时渲染。

现在,如果我们输入2并单击按钮,则将渲染组件,应该渲染该组件,因为先前的状态是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
state = { data: null }

下一个状态对象是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
state = { data: 2 }

因为setState每次调用都会创建新的状态对象,所以严格相等运算符将看到不同的内存引用并触发组件上的重新呈现。

如果再次单击该按钮,我们将有另一个重新渲染,不是这样,因为前一个状态对象和下一个状态对象将具有相同的data值,但是由于setState新状态对象的创建,React将看到差异状态对象引用和触发器重新呈现,尽管它们具有相同的内部值。

现在,如果组件树增长到数千个组件,则此重新渲染可能会很昂贵。

这样,React为我们提供了一种方法来控制组件的重新渲染,而不是通过React来控制内部逻辑,这是shouldComponentUpdate方法。只要重新渲染组件,就会调用shouldComponentUpdate,如果返回true,则重新渲染组件;如果为false,则取消重新渲染。

我们将shouldComponentUpdate添加到ReactComponent。此方法接受下一个状态对象和下一个props对象作为参数,因此使用此方法,我们将实现检查以告知React什么时候重新渲染。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ReactComponent extends Component {
    constructor(props, context) {
        super(props, context)
        this.state = {
            data: null
        }
        this.inputValue = null
    }
handleClick = () => {
        this.setState({data: this.inputValue})
    }
onChange = (evt) => {
        this.inputValue = evt.target.value
    }
shouldComponentUpdate( nextProps,nextState) {
        if(nextState.data === this.state.data)
            return false
        return true
    }
render() {
        l("rendering App")
        return (
            <div>
                {this.state.data}
                <input onChange={this.onChange} />
                <button onClick={this.handleClick}>Click Me </button>
            </div>
        )
    }
}

看到,在shouldCmponentUpdate中,我检查了下一个状态对象nextState对象和当前状态对象中的数据值。如果不相等,则返回true,将触发重新渲染;如果不相等,则返回false,以取消重新渲染。

再次运行该应用程序,输入2并连续单击该Click Me按钮,您将看到渲染一次,不再进行:)

看到,我们使用了shouldComponentUpdate方法来设置何时重新渲染组件,从而有效地提高了组件的性能。

结论

React很棒!

我们在这里提到的技巧绝不能全部实现。请记住,不要及早进行优化,首先对项目进行编码,然后在必要时进行优化。

谢谢!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
崖山数据库智能问答系统:DeepSeek + RAG
近年来,人工智能领域发展迅猛,尤其是大型语言模型(LLM)的突破性进展,正在深刻改变各行各业。DeepSeek AI 作为新兴的人工智能技术代表,凭借其卓越性能和成本优势迅速崭露头角,为数据库管理等领域带来了新的可能性。
用户10349277
2025/05/27
2100
智能客服的演变:从传统到向量数据库的新时代
国产数据库的发展在21世纪初取得了显著的进展。根据不完全统计,目前在国内已有超过300种不同的数据库在案。这一现象在40年前几乎是不可想象的,标志着中国在数据库领域取得了巨大的突破和多样化选择。对于对老一辈的故事或数据库发展史充满兴趣的朋友们,我强烈推荐观看纪录片《中国数据库的前世今生》。虽然是纪录片形式,但内容生动有趣,非常值得一看。
努力的小雨
2024/08/20
4720
同事吹只需简单调用腾讯云DeepSeek API,就能实现智能AI客服?我表示...
在这个信息化时代,企业和开发者对智能化、自动化的需求日益增加,尤其是在人工智能(AI)应用领域。越来越多的公司希望能够利用现有的AI技术,为自己的业务场景提供创新的解决方案,结合AI实现智能化转型。而腾讯云智能体开发平台的 API开发模式(代码态) 正是为解决这一问题提供了强有力的支持。
bug菌
2025/02/18
7894
同事吹只需简单调用腾讯云DeepSeek API,就能实现智能AI客服?我表示...
RAG智能问答系统为什么要使用混合检索?(完整版)
检索增强生成简称RAG(Retrieval-augmented Generation),RAG为大语言模型安装了知识外挂,基础大语言模型不用训练,通过RAG技术与大语言模型结合在回答问题的时候,可以通过企业内部的知识库检索相关和最新的信息来生成内容,从而提高了回答问题的准确性、实时性和关联性。
产品言语
2024/03/25
2.4K0
RAG智能问答系统为什么要使用混合检索?(完整版)
DeepSeek大模型的基础知识解析!
随着人工智能技术的发展,大模型的出现为我们带来了全新的计算体验和应用场景。作为一款国产大模型,DeepSeek不仅在技术上做出了突破,还承载着国产AI的雄心壮志。很多人对大模型可能还抱有一丝困惑,尤其是像 DeepSeek 这样的模型。那么,DeepSeek究竟是什么?它的架构和原理是什么?在实际应用中又能做些什么呢?今天,我将带你一起走进 DeepSeek 的世界,了解它的基础知识、工作原理、实际应用以及未来前景。让我们一起从最基础的概念开始,层层剖析!🚀
bug菌
2025/02/08
3950
DeepSeek大模型的基础知识解析!
DeepSeek、Grok 和 ChatGPT 对比分析:从技术与应用场景的角度深入探讨
在人工智能领域,随着技术的快速发展,不同的工具和框架不断涌现,为开发者提供了更多选择。DeepSeek、Grok 和 ChatGPT 作为三款备受关注的工具,每一款都有其独特的优势和适用场景。本文将从技术特点、应用场景以及实际案例分析的角度,对这三款工具进行对比,帮助读者更好地理解它们的区别和适用场景
DARLING Zero two
2025/03/01
7710
DeepSeek、Grok 和 ChatGPT 对比分析:从技术与应用场景的角度深入探讨
腾讯云智能体开发平台与DeepSeek-R1:企业智能问答平台的构建实践
随着人工智能技术的迅猛发展,大型语言模型已成为企业数字化转型的重要工具。腾讯云智能体开发平台(LLM Knowledge Engine,简称LKE)作为面向企业客户及合作伙伴的知识应用构建平台,结合企业专属数据,能够高效构建知识问答等应用。而DeepSeek作为国内领先的大语言模型,以其卓越的表现在众多场景展现出巨大的应用潜力。本文将深入探讨如何利用腾讯云智能体开发平台与DeepSeek-R1模型,为企业构建高效、精准的智能问答平台。
用户10266550
2025/03/09
3710
联系上下文,自行划重点!这只“高情商”AI能读懂对话语境,让客服问答丝般顺滑
作为顾客,此时你大概要叹一句“人工智能真不智能”。这些所谓“智能”客服们往往只能做到一问一答,一旦对话涉及稍微复杂的情境,它们就开始答非所问。
大数据文摘
2019/12/25
1.5K0
联系上下文,自行划重点!这只“高情商”AI能读懂对话语境,让客服问答丝般顺滑
基于知识图谱的智能问答方案
2012年谷歌首次提出“知识图谱”这个词,由此知识图谱在工业界也出现得越来越多,对于知识图谱以及相关概念的理解确实也是比较绕。自己在研究大数据独角兽Palantir之后开始接触知识图谱,也算对其有了一定了解,这里从三个角度总结一下怎么去理解知识图谱。
机器学习AI算法工程
2020/07/14
4.7K0
大规模语言训练模型应用,如何让文档问答系统快速拥有“高智商”?
信息爆炸的时代,更需要我们拥有高效获得文档信息的能力。随着人工智能技术的快速发展,智能问答系统已逐渐成为提升这一能力的重要手段之一。2022 年以来,以 GPT-3 模型为代表的大规模语言模型能力的不断提升,为智能文档问答带来了新的机遇,前不久 GPT-4 模型的震撼发布更是再次颠覆人们的认知。 GPT 爆火后,人们往往聚焦于其巨大的模型和令人惊叹的自然语言生成能力,而少有人谈到如此具体的技术解析。 近日,亚马逊云科技联合 Jina AI 举办 Tech Talk 主题活动。Jina AI 联合创始人兼 C
深度学习与Python
2023/04/10
8330
大规模语言训练模型应用,如何让文档问答系统快速拥有“高智商”?
商业实战归巢网智能问答系统建设方案对比分析报告03-优雅草卓伊凡
成本效益(3年TCO对比): | 项目 | 自建方案 | 云方案 | |——————|——————-|——————-| | 硬件购置 | ¥180,000 | ¥0 | | 云服务费 | ¥0 | ¥540,000 | | 运维人力 | ¥360,000 | ¥72,000 | | 总计 | ¥540,000 | ¥612,000 |
卓伊凡
2025/05/07
860
大模型落地实践:同花顺大模型技术应用及优化
作者介绍:谌明,浙江核新同花顺网络信息股份有限公司首席技术官,浙江省金融信息工程技术中心副主任,之江实验室金融大数据智能计算实验平台专家;曾主持多个国家重点项目,总投入资金数亿元;发表 SCI/EI 高水平学术论文 20 余篇,申请或授权发明专利 31 项;荣获中国 IT 年度人物杰出 CTO 和杰出工程师等奖项。
澜舟科技
2022/08/11
2.5K0
大模型落地实践:同花顺大模型技术应用及优化
Prompt提示工程上手指南(七)Prompt编写实战-基于智能客服问答系统下的Prompt编写
本系列文章从最初的基础原理与入门实践切入,一直延伸到主流策略、引导策略、RAG(检索增强生成)、思维树(ToT)与避免幻觉(Hallucination)的策略这种渐进的结构方便了对初学者和进阶者的双向照顾。初学者可以先理解基本概念,然后慢慢深入;有一定经验的读者则可以快速跳到策略章节,获取更高阶的经验和方法。在熟练掌握以上技能和熟悉概念理论之后,我们需付出实践,结合场景来实际操作检验一遍,达到融会贯通。
fanstuck
2024/12/13
1.7K0
Prompt提示工程上手指南(七)Prompt编写实战-基于智能客服问答系统下的Prompt编写
智能化升级:AI在客服知识库中的应用
在数字化时代,客户服务已成为企业竞争的关键一环。随着人工智能(AI)技术的飞速发展,传统客服模式正经历着前所未有的变革。AI与客服知识库的深度融合,不仅极大地提升了客服处理的效率与准确性,还为用户带来了更加个性化、高效的服务体验。
企业运营学堂
2024/09/03
4530
智能化升级:AI在客服知识库中的应用
RAG 技术真的“烂大街”了吗?
大语言模型技术迅猛发展的脚步,正引领着信息检索技术进入一个新的纪元。在这一领域中, RAG 技术将传统信息检索技术与大语言模型技术相结合,为知识理解、知识获取提供了全新的解决方案。然而,尽管 RAG 在很多任务上表现出色,其在深度应用上仍面临诸多挑战。
深度学习与Python
2024/07/24
3600
RAG 技术真的“烂大街”了吗?
基于深度学习的FAQ问答系统
| 导语 问答系统是信息检索的一种高级形式,能够更加准确地理解用户用自然语言提出的问题,并通过检索语料库、知识图谱或问答知识库返回简洁、准确的匹配答案。相较于搜索引擎,问答系统能更好地理解用户提问的真实意图, 进一步能更有效地满足用户的信息需求。问答系统是目前人工智能和自然语言处理领域中一个倍受关注并具有广泛发展前景的研究方向。 一、引言        问答系统处理的对象主要包括用户的问题以及答案。根据问题所属的知识领域,问答系统可分为面向限定域的问答系统、面向开放域的问答系统、以及面向常用问题集(Fre
腾讯知文实验室
2018/08/28
18.1K7
基于深度学习的FAQ问答系统
技术干货 | 达观数据智能问答技术研究
在AlphaGo大胜李世石、柯洁之后,人工智能越来越火,智能问答也是其中必不可少的一环。智能问答一般用于解决企业客服、智能资讯等应用场景,实现的方式多种多样,包括简单的规则实现,也可以基于检索实现,还可以通过encoder-decoder框架生成,本文通过几种常见的问答技术,概要介绍了达观数据智能问答相关原理研究。 1 基于规则的智能问答 基于规则的智能问答通常是预先设置了一系列的问答规则,在用户输入一个问题时,去规则库里匹配,看是否满足某项规则,如果满足了就返回该规则对应的结果。如规则库里设置“*你好
达观数据
2018/03/30
1.3K0
端到端的智能问答系统
使用 OpenAI 的审核函数接口(Moderation API )可以帮助开发者识别和过滤用户输入,对用户输入的内容进行审核。
h3110_w0r1d
2025/02/06
2120
腾讯云智能体开发平台 × DeepSeek:打造企业智能化转型新引擎
在人工智能技术飞速发展的今天,大语言模型(LLM)已经成为推动企业数字化转型的重要工具。2月8日,腾讯云宣布上线 DeepSeek-R1 和 V3 原版模型的 API 接口,并将其深度集成到旗下的 腾讯云智能体开发平台 平台中。这一举措不仅为企业和开发者提供了强大的技术支持,还通过低代码和代码态两种开发模式,大幅降低了大模型应用的门槛。
是山河呀
2025/02/22
3080
用 AIGC 重构后的智能客服,能否淘到大模型时代的第一桶金?
ChatGPT 的诞生打响了现代 AI 军备竞赛的第一枪。以 GPT-4、ChatGTP、Bard 等为代表的大语言模型在全球各界引起了广泛关注。结合 ChatGPT 的底层技术逻辑,未来中短期内 ChatGPT 产业化的方向大致有四类:即智能客服、文字模态的 AIGC 应用、代码开发相关工作以及图像生成。其中,最适合直接落地的项目就是智能客服类的工作。
唯一Chat
2023/07/10
3480
推荐阅读
相关推荐
崖山数据库智能问答系统:DeepSeek + RAG
更多 >
LV.6
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档