大模型开发(六):OpenAI Completions模型详解并实现多轮对话机器人

news2024/10/6 8:36:35

全文共8500余字,预计阅读时间约17~30分钟 | 满满干货(附代码),建议收藏!

在这里插入图片描述
代码下载点这里

一、 Completions与Chat Completions基本概念

经过海量文本数据训练的大模型会在全量语义空间内学习语法关系和表达风格,并通过某些微调过程使得其能够更好的向人类意图对齐,模型在进行预测时,本质上是根据输入(也就是提示)来预测对应的文字输出,GPT模型作为以transformer为框架的生成式预训练大语言模型,这是它最基本的功能。

在大语言模型领域,这种根据提示来预测对应的文字输出的过程,被称为Completion,中文译为“补全”。能够完成Completion过程的模型,则被成为Completion模型,这也是OpenAI对于能够实现Completion功能的模型的命名。

比如text-davinci-003模型(在text-davinci-002模型基础上通过RLHF微调的模型),就是一个Completion模型。

对于大语言模型的应用而言,有一个非常重要的应用方向——对话机器人。尽管Completion模型也能很好的对文字进行补全,但这种补全有时很难准确理解人类意图,从而出现一些“幻觉”。例如下图为早期与text-davinci-002模型打招呼的对话,只输入了“你好”作为提示词,text-davinci-002自动补全了“您找谁”,并且返回了对应的英文翻译结果:

202306241244044

很明显,模型并没有很好的理解“意图”,当输入“你好”的时候,其实是想和模型打招呼,但模型只是根据已有知识,对“你好”之后可能出现的文字进行了补全。

基于此,为了更好的理解人类的对话意图,OpenAI在Completion模型模型基础上,进一步微调训练得到了对话类模型,也就是Chat Completion模型。相比Completion模型,Chat Completion模型在大量对话预料上进行了微调训练,并且在模型内部新增了system、user和assistant等参数,用于设置聊天语境及不同的聊天角色,从而使得模型能够更好的理解人类意图,从而更好的完成对话类任务。

例如gpt-3.5-turbo就是Chat Completion模型,同时也是ChatGPT普通版背后的大模型。这里我在gpt-3.5-turbo中输入你好,则返回结果如下:

02d4c18c14fa9a8b9befbe3c81bf1186_202306241504280

能够看出,模型返回的结果符合人类预期,说明模型能够较好的理解人类对话意图,并返回更加合适的结果。由此也能看得出Completions模型与Chat Completions模型之间性能区别。

总的来说:Completions 和 Chat Completions 都是 OpenAI 提供的 API,它们都可以用来生成文本。Completions API 主要用于补全问题,用户输入一段提示文字,模型按照文字的提示给出对应的输出。而 Chat Completions API 则专门用于处理聊天任务,它在接口上显示定义了 system、user 和 assistant 三个角色。system 可以理解为聊天的语境,可有可无;user 和 assistant 可以理解为聊天的两个角色

二、 Completions与Chat Completions模型类

点击进入官网

截至目前,OpenAI发布的Completions模型与Chat Completions模型如下:

image-20230717224140771

OpenAI发布的带有text标识的A、B、C、D四大类模型都是Completions模型(也就是gpt-3系列模型),而gpt-3.5和gpt4,则是Chat Completions模型。

从实际功能定位上来说,Completions模型是一类功能更加基础、同时配套功能更加齐全的模型(例如OpenAI只为Completions模型提供了微调的接口),而Chat Completions模型则是一类功能更加特异化、并且更加先进的一类模型。两类模型都有各自适用的场景

三、 Completion.create API

3.1 参数详解

在OpenAI提供的在线大模型中,所有的Completions模型都需要通过Completion.create进行调用,并在实际调用的过程中通过超参数设置对应的调用模型及模型相关参数。

看下官网的参数:

image-20230717224644862

各参数解释如下:

1

3.2 代码测试

先引入依赖包和OPENAI_API_KEY

import os
import openai

openai.api_key = os.getenv("OPENAI_API_KEY")

所有的Completions模型都需要通过Completion.create进行调用,在实际调用的过程中通过超参数设置对应的调用模型及模型相关参数。

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="Say this is a test"
           )

输出结果如下:

image-20230718082318770

最简单的调用是:在函数中设置model和prompt参数,这两个是必填的参数。其中model表示调用的模型,而prompt则表示提示词。

返回结果response包含了text_completion id(completion任务编码),以及返回结果和模型参数。

response是一个OpenAIObject类型对象

image-20230718082627570

获取元素就是常规的Python操作了,如:

  • 提取response中具体返回的文本

image-20230718082759411

  • 提取text对象

image-20230718082851549

生成式大模型的结果往往是无法复现的。尽管从理论上来说,当temperature取值为0的时候,模型在每个步骤中总是选择最可能的下一个token,这会导致生成的文本变得确定和可预测,但在实践过程中,由于模型内部的计算精度和舍入误差等因素,也可能无法完全保证结果的完全一致性。

除了temperature外,目前OpenAI并没有提供任何额外的可以用于控制结果随机性的参数。top_p尽管可以影响输出结果,但并不能完全控制模型随机性。此外,目前OpenAI的在线大模型也并没有类似机器学习领域的随机数种子的参数设置。因此,就目前的情况而言,控制大语言输出结果使其能够复现,几乎是不可能做到的。

3.3 参数调参实践

大语言模型是非常复杂的黑箱模型,导致很多时候参数设置导致的结果并不能完全按照理论情况来进行推演。

因此需要通过大量的实践,来积累不同参数的使用经验——即掌握不同参数在实际Completion过程中对输出结果的影响。

先来试一下 尝试调整Completion.create的核心参数来观察模型输出结果变化情况

3.3.1 参数n

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="请问什么是机器学习",
           max_tokens=1000,
           n=3
           )

response

此时的返回就有3个completion,如下:

image-20230718085111023

单独看某一个的话:

response["choices"][0]["text"].strip('?\n\n')

输出如下:

image-20230718085203488

封装成函数:

import openai

def generate_response(n):
    response = openai.Completion.create(
               model="text-davinci-003",
               prompt="请问什么是机器学习",
               max_tokens=1000,
               n=n
               )
    for i in range(n):
        print(response["choices"][i]["text"].strip('?\n\n'))

# 测试函数
generate_response(3)

3.3.2 参数temperature

temperature参数是非常核心的用于控制模型输出结果随机性的参数。其取值范围在0-2之间,默认值为1,数值越大模型随机性越大。

先尝试设置temperature=1.5并观察返回结果:

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="请问什么是机器学习",
           max_tokens=1000,
           n=3,
           temperature=1.5
           )

看下结果:

image-20230718085705866

对于“请问什么是机器学习”这一较为简单的提示(预训练文本中存在大量相关语料),返回的结果已经出现了非常严重的随机性,很多文本甚至不可读。这也说明temperature对文本输出结果的随机性影响非常大。

设置一个更小的temperature取值,并观察输出结果:

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="请问什么是机器学习",
           max_tokens=1000,
           n=3,
           temperature=0.8
           )

看下结果:

image-20230718085925440

从结果上就能看出,当temperature参数数值下降时,模型返回的多个结果会更加“趋同”,整体来看答案严谨但缺乏创造力,更像是教科书式的定义。

关于temperature参数的设置技巧:

  • 首先是关于参数推荐的取值范围,尽管temperature可以在[0,2]范围内进行调节,但temperature的数值对模型结果影响极大,往往小幅的数值调整就会导致非常大的影响,因此建议的调整范围在**[0.8,1.2]**之间;
  • 其次是参数不同取值的实际影响,伴随着temperature取值逐渐增加,返回的文本也将从严谨表述逐渐变为“胡言乱语”,但temperature在某些取值时,返回的结果会呈现出具备一定“启发性”的特性。具体temperature参数取值如何设置,还需要根据实际情况来判断

更新一下函数:

import openai

def generate_response(n, temperature):
    response = openai.Completion.create(
               model="text-davinci-003",
               prompt="请问什么是机器学习",
               max_tokens=1000,
               n=n,
               temperature=temperature
               )
    for i in range(n):
        print(response["choices"][i]["text"].strip('?\n\n'))

# 测试函数
generate_response(3, 0.8)

3.3.3 参数presence_penalty

对文本输出质量有重要影响的另一个参数,是presence_penalty。

不同于temperature是用于控制输出结果是“严谨表述”还是“胡言乱语”,presence_penalty更多的是控制返回语句的精炼程度。presence_penalty参数在[-2,2]中取值,数值越大,返回结果越精炼,数值越小,返回结果越啰嗦。

仍然还是以“请问什么是机器学习”作为提示,观察presence_penalty取值不同时的输出结果:

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="请问什么是机器学习",
           max_tokens=1000,
           n=3,
           presence_penalty=2
           )

看下结果:

image-20230718090453425

此时的输出结果是非常精炼的。而如果设置presence_penalty为-2:

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="请问什么是机器学习",
           max_tokens=1000,
           n=3,
           presence_penalty=-2
           )

结果如下:

image-20230718090606378

此时结果则显得“啰嗦”了不少。

看起来presence_penalty参数对模型结果的影响并不如temperature那么显著,但在实际调用大模型进行Completion时,presence_penalty参数和temperature参数搭配进行使用,往往能达到非常好的效果。一般来说,如果希望模型更加具有创造力,则会增加temperature取值,并且适当降低presence_penalty取值

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="请问什么是机器学习",
           max_tokens=1000,
           n=3,
           presence_penalty=-1,
           temperature=1.2
           )

结果如下:

image-20230718091043514

反之,如果希望结果更加精准,则会适当降低temperature,同时增加presence_penalty取值:

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="请问什么是机器学习",
           max_tokens=1000,
           n=3,
           presence_penalty=2,
           temperature=0.8
           )

结果如下:

image-20230718091204523

这也就是经常会看到一些大语言模型具备三种不同的模式,分别为精确模式、平衡模式和创造力模式(例如早期的Bing AI聊天),其功能的实现都是通过大模型的参数调整来完成的,而支持这些不同模式功能实现的最基础的两个参数就是presence_penalty参数和temperature参数。

更新一下函数:

import openai

def generate_response(n, temperature, presence_penalty):
    """
    根据输入的n、temperature和presence_penalty生成相应的响应。

    n: 输出结果的数量。
    temperature: 控制输出的随机性。值越高,输出结果越随机;值越低,输出结果越确定。
    presence_penalty: 控制模型输出时对于当前已存在的内容的依赖程度。值越高,模型在生成文本时就越不会重复使用当前已有的内容;值越低,模型生成的文本就可能会有更多的重复。

    注意:如果希望模型更具有创造力,可以增加temperature的值,同时适当降低presence_penalty的值;
         如果希望结果更加精确,可以适当降低temperature的值,同时增加presence_penalty的值。
    """
    response = openai.Completion.create(
               model="text-davinci-003",
               prompt="请问什么是机器学习",
               max_tokens=1000,
               n=n,
               temperature=temperature,
               presence_penalty=presence_penalty
               )
    for i in range(n):
        print(response["choices"][i]["text"].strip('?\n\n'))

# 测试函数
generate_response(3, 0.8, 2)

3.3 4 参数best_of

best_of能够让一个模型预测多组结果,并择优进行输出。

比如:如果设置best_of=5,则代表总共创建5个备选文本,再从中选取概率最大(得分最高)的一组进行输出:

response = openai.Completion.create(
           model="text-davinci-003",
           prompt="请问什么是机器学习",
           max_tokens=1000,
           presence_penalty=-1,
           temperature=1.2,
           best_of=5
           )

结果如下:

image-20230718091754746

  • 在大多数情况下,随着best_of值增加,最终的输出结果质量也会随之提升;

  • best_of参数会消耗大量Token配额以及每分钟调用次数配额,同时也会消耗更多的资金;

best_of是自动筛选最优结果,参数n可以支持手动筛选最佳结果,有的时候可以同时使用这两个参数,以期获得更好的结果。如best_of=2、n=2时,总共发出四次请求,最终返回两个结果。

更新代码:

import openai

def generate_response(n, temperature, presence_penalty, best_of):
    """
    根据输入的n、temperature、presence_penalty和best_of生成相应的响应。

    n: 输出结果的数量。
    temperature: 控制输出的随机性。值越高,输出结果越随机;值越低,输出结果越确定。
    presence_penalty: 控制模型输出时对于当前已存在的内容的依赖程度。值越高,模型在生成文本时就越不会重复使用当前已有的内容;值越低,模型生成的文本就可能会有更多的重复。
    best_of: 让模型预测多组结果,并择优进行输出。

    注意:如果希望模型更具有创造力,可以增加temperature的值,同时适当降低presence_penalty的值;
         如果希望结果更加精确,可以适当降低temperature的值,同时增加presence_penalty的值。
    """
    response = openai.Completion.create(
               model="text-davinci-003",
               prompt="请问什么是机器学习",
               max_tokens=1000,
               n=n,
               temperature=temperature,
               presence_penalty=presence_penalty,
               best_of=best_of
               )
    for i in range(n):
        print(response["choices"][i]["text"].strip('?\n\n'))

# 测试函数
generate_response(3, 1.2, -1, 5)

四、基于Completion.create函数的可调节对话风格的多轮对话机器人

在了解Completion.create函数功能之后,尝试编写一个基于Completion.create函数的可以在Jupyter内部实现多轮对话的聊天机器人,同时通过预设不同的参数,在函数内部预设精确模式、平衡模式和创造力模式,以满足不同使用场景。函数定义如下:

def chat_now(model='text-davinci-003',mode='balance'):
    """
    基于Completion.create函数的多轮对话机器人
    
    :param model: 调用的大语言模型,默认为text-davinci-003
    :param mode: 聊天机器人预设模式,默认为平衡模式balance,可选precision(精确模式)和creativity(创造力模式)

    """
    # 提示想终止聊天时输入"quit"
    print("if you want to stop the conversation, please input 'quit'") 
    # 三种不同的模式及其对应的参数
    if mode == 'balance':
        temperature = 1
        presence_penalty = 0
    elif mode == 'precision':
        temperature = 0.8
        presence_penalty = 2
    elif mode == 'creativity':
        temperature = 1.2
        presence_penalty = -1     
    
    # 定义执行对话函数,方便后续反复调用
    def chat(prompt):
        try:
            # 不报错的情况下,返回Completion.create函数输出结果
            response = openai.Completion.create(
                       model = model,
                       prompt = prompt,
                       max_tokens = 1000,
                       temperature=temperature, 
                       presence_penalty=presence_penalty,
                       stop = [" Human:", " AI:"]
                       )

            answer = response["choices"][0]["text"].strip()
            return answer
        except Exception as exc:
            # 报错时返回"broken"
            return "broken"

    # 对话执行函数,首先准备空容器
    text = "" 
    turns = [] 
    # 执行多轮对话,即多次调用chat函数
    while True: 
        # 启动对话框
        question = input()
        # 首次开启对话框时提示请输入问题
        if len(question.strip()) == 0: 
            print("please input your question")
        # 当输入为'quit'时,停止多轮对话,即停止while循环
        elif question == "quit":  
            print("\nAI: See You Next Time!")
            break
        else:
            # 多轮对话时,将问题和此前对话结果都作为prompt输入
            prompt = text + "\nHuman: " + question
            result = chat(prompt)
            # 当一次请求失败时,再次发起请求
            while result == "broken": 
                print("please wait...")
                result = chat(prompt) 
            else:
                # 保留本次对话结果
                turns += [question] + [result]
                print(result)
            # 最多保留十次对话结果,超出次数则最开始的对话会被删除
            if len(turns)<=10:  
                text = " ".join(turns)
            else:
                text = " ".join(turns[-10:])

测试一下,运行函数进行对话:

chat_now()

image-20230718092743153

五、总结

文章详细阐述了OpenAI的Completions与Chat Completions模型的基本概念与模型类。接着,对Completion.create API进行了深度解析,包括参数详解、代码测试以及参数调参实践,特别是对n、temperature、presence_penalty、best_of等参数的详细讲解。最后,以Completion.create函数为基础,实现了具有可调节对话风格的多轮对话机器人,展现了AI对话系统的灵活性。掌握这些知识,对优化AI对话系统具有重要的指导意义。

感谢您阅读这篇文章!如果您觉得有所收获,别忘了点赞、收藏并关注我,这是我持续创作的动力。您有任何问题或建议,都可以在评论区留言,我会尽力回答并接受您的反馈。如果您希望了解某个特定主题,也欢迎告诉我,我会乐于创作与之相关的文章。谢谢您的支持,期待与您共同成长!

最后,给大家送上干货!建议大家点赞&收藏,Mark住别丢了。有高质量资料免费送!

1. 关于魔法,你需要知道的

2. 超全流程!OpenAI账户注册看这里!

3. ChatGPT Plus 升级指南

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

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

相关文章

13.postgresql--函数

文章目录 标量示例复合示例有返回值函数返回voidRETURN NEXT ,RETURN QUERYRETURN EXECUTEIF THEN END IFFOREACH,LOOPSLICE &#xff08;1&#xff09;如果函数返回一个标量类型&#xff0c;表达式结果将自动转行成函数的返回类型。但要返回一个复合&#xff08;行&#xff09…

python如何打包整个项目成exe文件?

首先需要进入项目打包文件所在的目录 运行以下命令打包 build_medicalgraph.py文件 pyinstaller -D build_medicalgraph.py 打包完成后一定要记得下面这个步骤&#xff0c;否则运行会发现报错 把数据文件给放到exe文件同级别目录下 除了以下文件保留&#xff0c;其他文件可以…

EXISTS和IN的区别

一.EXISTS和IN的介绍 1. exists exists返回的是true(空)和flase(非空) 对user表的每行数据逐条取出,每取一行,就判断exists后面的子语句的结果是否为空,是空,这行数据就不要,不是空,这行数据就留下. 如下&#xff1a; select * from user where exists (select 1); 对user表…

js计算数组中每个元素出现的次数

tip&#xff1a;空值合并运算符&#xff08;??&#xff09;是一个逻辑运算符&#xff0c;当左侧的操作数为 null 或者 undefined 时&#xff0c;返回其右侧操作数&#xff0c;否则返回左侧操作数。reduce() 方法对数组中的每个元素按序执行一个提供的 reducer 函数&#xff0…

VUE之基本组成和使用

参考资料&#xff1a; 参考视频 视频资料及个人demo vue官网 vue官网-vue.js组成说明 VUE之基本部署及VScode常用插件 关闭驼峰命名法的使用异常 VUE项目结构介绍&#xff1a; 通过上文步骤&#xff08;VUE之基本部署及VScode常用插件&#xff09;,我们创建了一个基本的…

【业务功能篇48】后端接口开发的统一规范

业务背景&#xff1a;日常工作中&#xff0c;我们开发接口时&#xff0c;一般都会涉及到参数校验、异常处理、封装结果返回等处理。而我们项目有时为了快速迭代&#xff0c;在这方面上有所疏忽&#xff0c;后续导致代码维护比较难&#xff0c;不同的开发人员的不同习惯&#xf…

5、Java入门教程【数组】

数组是用于存储同种类型的多个数据的容器。 一、声明 //语法 dataType[] arrayRefVar; // 首选的方法 或 dataType arrayRefVar[]; // 效果相同&#xff0c;但不是首选方法//示例 double[] myList; // 首选的方法 或 double myList[]; // 效果相同&…

服务机器人应用

随着时代的发展&#xff0c;机器人技术在各个领域越来越普及。在服务领域&#xff0c;服务机器人的应用也越来越受到人们的欢迎。服务机器人将会在商业、医疗、教育、酒店等领域得到应用&#xff0c;并成为未来发展的趋势。 在商业领域中&#xff0c;服务机器人可以承担很多工作…

分类预测 | MATLAB实现LSTM(长短期记忆神经网络)分类预测

分类效果 基本介绍 长短期记忆网络Q通常被称为LSTM,是一种特殊的RNN,能够学习长期依赖性。由Hochreiter和Schmidhuber(1997)提出的,并且在接下来的工作中被许多人改进和推广。 LSTM在各种各样的问题上表现非常出色,现在被广泛使用。LSTM被明确设计用来避免长期依赖性问…

vue3基础+进阶(一、Vue3项目创建并相比vue2熟悉项目结构)

目录 第一章、认识create-vue 1.1 简介 1.2 使用create-vue创建项目 1.2.1 创建步骤以及注意事项 1.2.2 注意事项 1.2.3 熟悉项目&#xff0c;与vue2区分 第一章、认识create-vue 1.1 简介 create-vue是Vue官网新的脚手架工具&#xff0c;底层切换到了vite(下一代前端工…

苍穹外卖-【day03】-【公共字段自动填充】-【新增】-【分页】-【删除】-【修改】

苍穹外卖-day03 课程内容 公共字段自动填充新增菜品菜品分页查询删除菜品修改菜品 **功能实现&#xff1a;**菜品管理 菜品管理效果图&#xff1a; 1. 公共字段自动填充 1.1 问题分析 在上一章节我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c;在…

SeLa:Self Labeling Via Simultaneous Clustering and Representation Learning

方法论 有监督的分类任务实现 给定一个将数据I映射至特征向量 x ∈ R D x ∈ R^D x∈RD 的深度神经网络 Φ Φ Φ &#xff0c;即 x Φ ( I ) x Φ ( I ) xΦ(I)。使用有N个样本 I 1 , … , I N I_1 , … , I_N I1​,…,IN​, 且具有标签 y 1 , … , y N ∈ { 1 , … , K }…

线性DP———最长公共子序列问题(LCS)

LCS问题 求两序列具有相同元素的最长子序列&#xff0c;我们可以用到动态规划的方法来解决问题 我们用 来表示序列 与序列 能组成的LCS的长度&#xff0c;的状态转移方程如下&#xff1a; 使用两层for循环就可以解决此问题&#xff0c;时间复杂度为,可以处理n<7000左右…

pycharm里debug时torch数组显示不全

pycharm里查看torch数组全部值 一、在Pycharm运行torch数组时&#xff0c;通常只能看到数组的一部分二、解决办法1、debug后&#xff0c;鼠标右键想要查看完整的数组&#xff0c;选择Evaluate Expression2、输入np.array(x0.data)&#xff0c;x0为想要查看的数组名&#xff0c;…

C#中的抽象类(abstract)

C#中的抽象类&#xff08;abstract&#xff09;。 1&#xff1a;抽象方法只作声明&#xff0c;而不包含实现&#xff0c;可以看成是没有实现体的虚方法 2&#xff1a;抽象类不能被实例化 3&#xff1a;抽象类可以但不是必须有抽象属性和抽象方法&#xff0c;但是一旦有了抽象方…

HTML5学习简记(更新中~)

HTML定义 HTML是一种超文本标记语言&#xff0c;超文本即我们在网页中看到的链接&#xff0c;标记指的是语言中的标签 标签 标签一般成对出现&#xff0c;结束标签比开始标签多一个/ 此外标签一般分为单标签与双标签 HTML基本骨架 其中,HTML标签代表整个网页&#xff0c;hea…

ubuntu迁移anaconda到另外的目录,完美解决问题

背景&#xff1a;anaconda放在/home/下&#xff0c;但是太大了&#xff0c;需要迁移到/data/&#xff0c;找了很多资料&#xff0c;都没解决问题。 一、你可以先做一下尝试&#xff1a; ①拷贝anaconda到你想要的新目录 cp -r /home/anaconda3 /data/ ②将原来的anaconda备…

我国开设大数据相关专业的大学有哪些?

社会对大数据相关专业的人才有着巨大的需求&#xff0c;据预测&#xff0c;到2030年&#xff0c;大数据及相关产业规模达到上万亿元&#xff0c;大数据产业将成为重要的经济增长点。数据是企业最宝贵的资源&#xff0c;大数据分析技术在提升企业经营管理、提高销售业绩、降低管…

微服务组件Sentinel

什么是Sentinel Sentinel 是一种用于流量控制、熔断降级和系统负载保护的开源框架。它由阿里巴巴集团开发并开源&#xff0c;旨在帮助开发人员构建可靠和稳定的分布式系统。 Sentinel 提供了以下主要功能&#xff1a; 流量控制&#xff1a;Sentinel 可以通过限制请求的速率或…

怎么学习Java I/O相关的知识和技术? - 易智编译EaseEditing

要学习Java I/O&#xff08;输入输出&#xff09;相关的知识和技术&#xff0c;可以按照以下步骤进行&#xff1a; 理解Java I/O基础知识&#xff1a; 首先&#xff0c;了解Java I/O的基本概念和术语&#xff0c;包括输入流和输出流、字节流和字符流、文件读写等。掌握Java中…