飞书深诺 AI 系列 -- 如何写出一个好的 Prompt
前言
随着 chatGPT 的发布,AI 从原来的伪智能正式走向了可落地的强智能,特别是在 AIGC 领域,已经有不少公司有实际落地的例子,且取得了较好的效果,基于此,如何将 AI 与业务更好的结合,赋能业务快速高效发展,是摆在当代每家公司或组织面前必须要回答的一个命题,而对于所有希望利用 AI 能力的公司和个人来说,理解和掌握和 AI 沟通的桥梁:Prompt,便成为一个 must to have 的技能。本文将全面解析 Prompt 的定义、功能、工作机制以及最佳实践,为读者深入浅出的介绍何为 Prompt,它是如何工作的以及如何写出一个好的 Prompt。
什么是 Prompt
纵观整个计算机的发展史,会发现,人类与计算机系统的沟通方式门槛越来越低,方式越来越高级,从最早基于少数人掌握的汇编语言与硬件直接交互,到后来的面向操作系统的 C 语言,再到后续面向应用的跨系统的 Java 等高级语言,其演进方式呈现几个特点:
门槛越来越低,体现在沟通方式越来越接近人类的思维方式,编程语言越来越易理解,模式的抽象越来越接近现实世界(面向过程到面向对象)
杠杆性越来越强,体现在 API 的功能抽象越来越强大,对应的单位代码能够调用的能力也越来越强大
掌握的人越来越多,从只有极少数人掌握的汇编语言,到程序员变成社会的一个大行业
而这次针对大模型的 Prompt 可以理解为是计算机语言发展的又一次飞跃,人类第一次可以用一个如此接近人类自然语言的方式(不完全是自然语言,这个在本文会阐述)去与系统交互,调用系统的能力
在人工智能领域,Prompt 是指一段文本、问题或者任务,用来引导模型生成期望的回答、解决方案或者输出。
它的原理主要是基于自然语言处理的深度学习模型来理解和生成文本。在训练过程中,模型学习了大量的文本数据,从而掌握了词汇、语法、语义和一定程度的常识知识。当用户输入 Prompt 时,模型会根据所学到的知识和规律来理解 Prompt 的含义,进而生成与 Prompt 相关的响应,其工作机制主要涉及以下几个方面:
上下文理解:模型会根据输入的 Prompt 来理解上下文,包括词汇、语法结构和语义关系。这对于生成与提示词紧密相关的答案至关重要。
生成策略:基于 Prompt 中的上下文信息,模型会采用一定的生成策略来产生合适的响应。这些策略通常包括概率分布选择、贪心搜索、束搜索等,用以平衡生成结果的多样性和准确性。
当我们向模型提供一个 Prompt 时,我们实际上是给它一个任务,要求它根据我们的输入进行相应的回应或操作。在这种情况下,Prompt 可以被视为指令,引导模型执行特定任务,例如生成内容、回答问题或进行对话模拟。Prompt 的作用类似于引发反应的导火线,使模型基于其训练和语言理解能力来产生有用、相关且连贯的输出。
Prompt 的作用
Prompt 在 AIGC 链路上主要是指导和控制模型生成响应,它是用户与模型之间沟通的「桥梁」
从大的纬度来说,Prompt 能起作用的地方在于:
激发与利用模型当前具备的能力,包括:
当前的大模型拥有海量的知识,但这些知识的质量可能良莠不齐,而好的 Prompt 可以将模型里高质量的信息引导出来,例如,如果用户希望模型生成一篇关于“气候变化影响”的文章,不仅可以提供“写一篇关于气候变化影响的文章”的提示,还可以通过 Prompt 添加更多的详细指导,例如“讨论气候变化对极地生态的影响”。
当前的大模型拥有一定的推理能力,但是其原生的推理能力不一定能处理一定复杂度的问题,而利用特定的 Prompt 可以激发模型具备更强的推理能力,从而对复杂问题进行拆解
控制模型输出的形式,有些时候需要模型的输出按照一定的格式,比如对机器更友好的结构化输出,或者将输出限定为十四行的诗体形式,那么可以在 Prompt 指定特定的格式。
缓解模型当前固有的缺陷,包括:
当前的大模型对于自己是否确实知道某些信息是没有感知的,体现在可能会「一本正经的胡说八道」,那么 Prompt 就可以通过一些更明确的指令减少幻觉的发生,比如在 Prompt 中加上「当该 xx 不存在或你不了解的时候,回答“不知道”即可,不可胡编乱造」
当前的大模型里大部分信息都是在预训练阶段注入的,所以就存在对于当前实时的信息的缺失,这个时候可以在 Prompt 里带上实时信息,此时大模型在处理对应问题的时候就可以将这段实时信息合并到其知识库里一起处理
与实时信息的缺失类似,当前的大模型缺失很多领域的专业信息,那么也可以在 Prompt 里带上这部分专业信息,那么相当于大模型在回答对应问题的时候就带上了这部分专业信息
而 Prompt 作为一个和大模型沟通的方式,肯定有其局限性,包括:
无法完全掌控模型的输出,尽管 Prompt 可以帮助引导模型生成具有特定特征的内容,但它无法完全控制模型的最终输出结果。模型最后的输出还取决于诸多因素,包括模型训练的数据集,模型的架构,甚至随机的元素
对于大模型本身的缺陷,它只能部分缓解,而无法完全避免,比如上面提到的幻觉,信息的非实时,专业信息的缺失等
无法替代 AI 模型训练,因为 Prompt 提供的信息当前不会改变模型本身的结构和信息,换句话说,当和人对话的时候上次说了一件事情,也许过了一年和他重新对话还是会记得,因为这个信息通过对话的形式进入了这个人的大脑记忆,改变了部分神经元结构,但是大模型不会,至少当前没有开放
无法完全解决道德和伦理问题:Prompt 不能完全阻止模型产生露骨、冒犯的答案,或是违反隐私和安全规定的内容。虽然尽可能设计良好的 Prompt 以避免不良输出,但最终内容的审查和管理是必要的
当前的 Prompt 的大小是受限的,所以对应的 Prompt 可以携带的信息大小也有一定限度的
Prompt 的工作机制
在深入探索 Prompt 工程之前,我们首先需要理解 Prompt 的基本工作机制。该机制包括五个关键步骤:输入表示,序列编码,上下文理解,生成响应和后处理。这些步骤共同构成了 Prompt 的核心,使其能够有效地理解和响应用户的需求。首先,输入表示和序列编码将用户的输入转化为机器可理解的形式,这是整个过程的基石。接着,上下文理解使机器能够洞察输入的含义和背后的意图,这是理解和生成响应的关键环节。然后,生成响应根据理解的结果产生相应的输出,这是满足用户需求的直接体现。最后,后处理对生成的响应进行优化和调整,以提升响应的质量和用户满意度。这些步骤的实现涉及到各种复杂的算法和技术,如自然语言处理、机器学习和深度学习等。在后续的文章中,我们将详细探讨这些步骤,以及它们在 Prompt 工程中的应用和实现。
输入表示
在 NLP 任务中,Prompt 需要被转换为模型可理解的形式,这个步骤称为"输入表示"。它确保了模型能够理解文本中的语义信息,并为后续任务提供统一的输入表示。这一过程通常涉及两个主要步骤:分词和词嵌入。
分词(Tokenization):分词是将原始文本切分为更小的单位,可以是单词、子词或字符等。这些单位被称为“tokens”。分词的目的是将自然语言文本转换为模型可以处理的基本单位。分词方法有很多种,包括基于规则的、基于统计的以及基于深度学习的方法。
常见的分词方法包括:
空格分词:按照空格和标点符号将文本切分为单词,适用于词汇间以空格分隔的语言,如英语。
中文分词:针对中文等没有明确词汇边界的语言,采用基于词典、统计或深度学习的方法进行分词。
字符级分词:将文本切分为单个字符,适用于字符级别的任务,如拼写纠错。
Subword 分词:将文本切分为子词单位,如 BPE(Byte Pair Encoding)和 WordPiece 等方法。这些方法可以有效处理未登录词(OOV,Out Of Vocabulary)问题,即在训练词汇表中不存在的单词。
词嵌入(Word Embedding):词嵌入是将分词后的 tokens 映射到连续的向量空间中的向量。这些向量能够捕捉词汇的语义信息,同时具有较低的维度,有助于模型的训练和计算。
常见的词嵌入方法包括:
One-hot 编码:为每个词汇分配一个唯一的向量,其中只有一个维度的值为 1,其余维度为 0。这种表示方法稀疏且高维,无法表示词汇之间的语义关系。
Word2Vec:通过预测给定词汇的上下文或由上下文预测目标词汇来生成词嵌入。Word2Vec 包括 CBOW(Continuous Bag-of-Words)和 Skip-gram 两种模型。
GloVe(Global Vectors for Word Representation):通过对共现矩阵进行分解,捕捉全局的词汇共现信息。
ELMo(Embeddings from Language Models):利用双向语言模型(Bi-LSTM)计算上下文相关的词嵌入。
BERT(Bidirectional Encoder Representations from Transformers):使用预训练的 Transformer 模型生成上下文相关的词嵌入。
序列编码
随后,Prompt 的词嵌入序列会被输入到模型中。对于循环神经网络(RNN)或长短时记忆网络(LSTM)等序列模型,它们会对输入序列进行逐步处理;而对于 Transformer 等自注意力(Self-Attention)模型,它们可以并行处理输入序列。通过这些编码方法,模型可以捕获词汇之间的顺序关系和依赖关系。
序列编码主要目的是将经过分词并转换为词嵌入的输入转换为具有上下文信息的序列表示。常见的序列编码方法包括:
循环神经网络(RNN):RNN 是一种处理输入序列的神经网络结构,其通过维持一个隐藏状态来捕获前面的输入单元信息。在每个时间步,RNN 会根据当前输入和前一个时间步的隐藏状态来计算新的隐藏状态。最后,每个单元的隐藏状态都包含了从序列开始到目前为止所观察到的信息,从而实现了上下文信息的编码。由于梯度消失或梯度爆炸问题,RNN 在捕捉长距离依赖关系方面存在局限。
长短时记忆网络(LSTM):LSTM 是 RNN 的一种改进,通过引入门控机制和单元状态来解决梯度消失和梯度爆炸问题。LSTM 具有输入门、遗忘门和输出门,这些门可以学习调节信息在不同时间步之间的流动。通过这种结构,LSTM 可以捕获序列中的长距离依赖关系。
门控循环单位(GRU):GRU 是另一种改进的 RNN 结构,其将 LSTM 中的单元状态与隐藏状态合并,同时减少了门的数量。GRU 具有更新门和重置门,可以学习保留或丢弃当前输入信息。尽管 GRU 结构相对简单,但其在捕获序列信息方面的性能与 LSTM 相近。
Transformer:Transformer 是一种基于自注意力机制(Self-Attention)的编码方法,其可以并行处理整个序列。在自注意力机制中,每个单词的表示都会根据与其他单词之间的关系进行加权更新。通过堆叠多层自注意力层和前馈神经网络层,Transformer 可以捕获丰富的上下文信息。由于其并行性和强大的表现能力,Transformer 已经成为当今 NLP 领域的主流编码方法。
通过这些序列编码方法,NLP 模型可以捕获输入序列中的上下文信息和依赖关系,并为后续任务(如文本生成、分类、翻译等)提供更丰富的表示。
上下文理解
基于编码后的表示,模型可以理解 Prompt 中所包含的上下文信息。这样,在给定一个新的 Prompt 时,模型可以根据其内部表示进行推理和分析。上下文理解具体包括以下几个方面:
语义理解:模型需要理解 Prompt 中的词汇和短语所传达的含义。这包括识别实体(如人名、地名等)、属性(如颜色、形状等)、动作(如跑步、学习等)以及它们之间的关系。通过词嵌入和上下文编码,模型可以捕获词汇的语义信息,并根据预训练知识进行推理和分析。
句法理解:模型需要分析 Prompt 中的句子结构,例如识别主语、谓语、宾语等成分,并理解它们在句子中的作用。通过自注意力(Self-Attention)机制或循环神经网络(RNN),模型可以捕获词汇之间的顺序信息和依赖关系,从而辅助句法分析。
指代消解:模型需要识别并解决 Prompt 中的代词或指代词所指向的实体。例如,在句子“Tom 和 Jerry 正在跑步,他们很开心”的情境中,模型应当理解“他们”指的是“Tom 和 Jerry”。通过注意力机制和预训练知识,模型可以关联上下文中的代词和实体,并进行有效的指代消解。
语境消歧:模型需要根据上下文环境理解具有歧义性的词汇。举个例子,在句子“他在银行办理业务”中,“银行”指的是金融机构;而在句子“他在河岸边钓鱼”中,“河岸”也可以称为“银行”。模型需根据上下文信息确定词汇的正确含义。这通常依赖于模型在预训练过程中学到的大量语言知识和经验。
情感和观点识别:模型需要从 Prompt 中获取用户的情感和观点,并据此生成相应的回应。例如,模型应当区分正面评价(如“这部电影很好看”)和负面评价(如“这部电影很无聊”),并给出相应的建议或回答。
长距离依赖关系:有时,上下文信息可能被分布在距离较远的词汇之间。AI 模型需要捕获这些长距离依赖关系,以更好地理解文本。Transformer 等自注意力模型在这方面具有较好的性能,能够捕捉到跨越长距离的语义关系。
生成响应
在理解 Prompt 的上下文信息后,模型需要生成恰当的响应。对于生成任务(如文本生成或摘要生成),模型可以采用自回归(Autoregressive)或者 Teacher Forcing 方法逐步生成输出序列。对于分类任务(如情感分析或实体识别),模型通常会对每个可能的类别计算一个分数,并选择分数最高的类别作为输出结果。生成响应过程中有以下一些重要技术:
输出类型:生成响应的方式取决于任务类型。对于生成任务(如文本生成、摘要生成或翻译),模型需要生成一个连续的文本序列;而对于分类任务(如情感分析或实体识别),模型需要预测一个离散的类别标签。
解码策略:在生成任务中,模型通常会为每个可能的词汇计算一个概率分布。这意味着,模型会根据上下文和内部表示预测每个词在给定位置出现的概率。接下来,可以基于这个概率分布选择输出词汇。模型基于解码策略来决定如何从概率分布中选择输出词汇,常用的解码策略包括贪婪搜索(Greedy Search)、束搜索(Beam Search)和采样(Sampling)。贪婪搜索是每个时间步选择概率最高的单词,然后继续生成后续单词;束搜索是在每个时间步保持 k 个最优候选序列,从中选择最佳路径;而采样则是根据输出概率分布随机选择单词。每种解码策略在生成质量、多样性和效率之间取得不同的平衡。
自回归生成:对于自回归模型(如 GPT),生成响应的过程是逐步进行的。模型首先生成第一个词汇,然后将其添加到输入序列中,再生成下一个词汇。这个过程会持续进行,直到生成一个特定的终止符或达到最大长度限制。
Teacher Forcing:对于循环神经网络(RNN)或长短时记忆网络(LSTM),训练过程中可能会采用 Teacher Forcing 策略。在这种策略中,模型在每个时间步都接收到真实的输出词汇,而不是自己生成的词汇。虽然这种方法可以加速训练过程,但在实际生成时可能会导致不一致的输出。
温度调整:在生成响应时,可以通过调整温度值来控制输出的多样性。温度是一个超参数,用于平滑概率分布。较高的温度会使概率分布更均匀,从而产生更多样的输出;较低的温度则使概率较高的词更有可能被选中。
长度归一化:在生成任务中,可以使用长度归一化来平衡输出序列的长度。这意味着,在计算概率分布时,模型会倾向于生成接近目标长度的序列,从而避免过长或过短的输出。
后处理
生成的响应会经过后处理,将模型的输出转换为可理解的自然语言文本。这可能包括将词嵌入转换回原始单词、合并子词以及纠正语法错误等操作。后处理是自然语言处理模型生成响应后将模型输出转换为可理解的自然语言文本的过程,通过这一过程,我们可以将 NLP 模型的输出转换为具有可读性和可理解性的自然语言文本。这一阶段包括:
词 ID 到词映射:在解码过程中,每个生成的单词都由一个整数 ID 表示。这些 ID 需要被转换为实际的自然语言单词。通常情况下,这个映射关系在分词器(Tokenizer)中可以找到,实现从词 ID 到词的转换。
子词合并:预训练 NLP 模型通常采用子词(Subword)分词方法,这意味着一个实际的单词可能被分割成多个子词。在后处理阶段,根据分词规则(如 BPE 或 WordPiece 算法),需要将这些子词重新组合成完整的单词。
删除特殊标记:在处理模型输出时,特殊标记(如结束符、填充符等)需要被删除。这是因为这些标记在模型训练时具有特定的功能(如表示序列结束或序列填充),但对于生成的可理解性文本来说是多余的。
语法与拼写纠正:为了提高生成文本的质量,可以采用语法和拼写纠正工具对生成的文本进行进一步的修改。这有助于改正模型生成的语法错误和拼写错误,使输出文本更符合自然语言规范。
生成截断:有时候,模型生成的文本可能会过长或者不符合预期。在这种情况下,我们可以根据特定的规则对生成文本进行截断,以满足用户需求。例如,可以根据句子结束符(如句号、问号等)来划分生成文本,提取前 n 个句子作为最终输出。
如何写出一个好的 Prompt
我们了解了 Prompt 的基本工作机制之后,如何应用到我们的 Prompt 工程里,让它能将普通人的输入,变成神奇的“咒语”呢?在接下来的探讨中,我们将深入研究 Prompt 应该包含哪些内容,应该具备什么特点,以及如何去评估 Prompt。我们将从用户的输入开始,探讨如何将这些输入转化为机器可理解的形式,然后深入理解这些输入的含义和背后的意图。我们还将探讨 Prompt 应该具备的特点,以及如何评估 Prompt,以确保其能够满足用户的需求和期望。这些都是我们在构建 Prompt 工程时需要考虑的关键因素,我们希望通过这些探讨,能够帮助读者更好地理解和应用 Prompt。
好的 Prompt 应包含的信息
基于 Prompt 的工作机制,我们看到,最重要的是 Prompt 需要”被理解“。”被理解“意味着一个 Prompt 需要包含足够、无歧义的信息。这通常包括三个关键组成部分:做什么、怎么做、上下文。
每个组件都由各种元素组成,如做什么包括角色、指令和主题。这些元素可以调整、重新排列和量身定制,以创建不同的 prompt“配方”。
不同的使用场景,可能不需要所有的组件或元素。比如:
这个 prompt 只包含了一个元素--指令(把 xxx 翻译成中文)
这个 prompt 包含了指令--解释黑洞概念,禁止项--不超过 200 字,受众--10 岁小孩。
好的 Prompt 应具备的特点
为了”被理解“,prompt 还应该具备以下特点:
简明扼要
简明扼要是指,用尽可能简洁的语言清楚地表达出问题,避免冗长和不必要的描述。简洁的 prompt 使模型更容易理解任务要求,减少了模型对输入的歧义理解的可能性;能够减少模型生成答案所需的处理时间,降低模型处理任务所需的计算资源,提高系统性能。要实现简明扼要,可以通过使用直接问问题的方式、避免过度解释背景信息、移除多余修饰词等方法。
正例:请告诉我人类的血型有哪些?
反例:我一直对人类的血液类型很感兴趣,你能告诉我关于人类血液类型有哪些方面的信息吗?
正例简洁明确地表达了问题,让 AI 模型能够立即理解并给出答案,而反例使用了许多不必要的描述,如“一直对…很感兴趣”,导致问题变得冗长且不够直接。 结果输出会包含较多的冗余信息。
表述清晰
表述清晰是指在提问或给出指令时,使用恰当、明确的词汇和表达,避免使用模糊或歧义的词汇。当提问或指令含糊不清时,模型可能会产生错误的理解,或提供无关或不准确的答案。
正例:谁是美国历史上最年轻的总统?
反例:美国最小的那个总统是谁?
正例表述清晰明确,指明了要询问的信息是关于美国历史上最年轻的总统,模型可以直接给出答案。,而反例则表述不清晰,用户可能想问的是年龄最小的总统,但“最小”一词在此可能会产生歧义,导致模型无法准确理解问题。
信息完整
详细信息是指提供足够的上下文和背景信息,明确表达出预期输出或回答类型。明确的目标和指导可以避免模型产生与需求无关或过于宽泛的回答,确保模型充分了解问题所涉及的范围和目标,从而给出更合适的答案。
正例:请列举 20 世纪最具影响力的 5 位科学家,并简要说明他们的主要贡献。
反例:告诉我一些有名的科学家。
正例明确了需求的具体内容(20 世纪最具影响力的科学家)、数量(5 位)以及额外信息要求(他们的主要贡献),而反例没有明确目标导向,如何选择科学家、要介绍多少科学家以及是否需要提供关于他们贡献的信息都没有给出具体要求,从而可能导致 AI 模型给出过于宽泛或无法满足用户实际需求的答案。
分步骤
分步骤是指将一个问题或任务分解成一系列顺序执行的子任务,以逐步完成整个问题。这种方法特别适合处理复杂且难以一次性完成的任务。通过分步骤处理问题,我们可以更易于管理和理解问题,并获得更精确的结果。
比如:
假设想要了解如何在城市中创建一个可持续的绿色空间。可以将这个问题分解成以下步骤:
背景了解:首先了解城市中绿色空间的重要性及其对环境和社会的影响。
分析现状:评估当前城市的绿色空间,并确定存在的问题和挑战。
提出方案:根据现状,提出几种可行的解决方案,以解决城市中绿色空间匮乏的问题。
评估可行性:对每个解决方案进行可行性分析,考虑成本、实施难度、社会和环境效果等因素。
制定实施计划:根据可行性分析的结果,选择一个或多个最优解决方案,并制定详细的实施计划。
监测和评估:实施解决方案后,持续监测绿色空间的发展情况,并对其效果进行评估,以便进行调整和完善。
在处理这个问题时,可以将每个步骤作为一个独立的子任务,逐个解决。这样可以更好地组织思路,确保问题得到全面而有针对性的解答。通过分步骤处理问题,可以更易于监控进度、识别问题并及时调整策略,从而最终实现目标。
如何衡量一个 Prompt
评价一个 Prompt 的好坏是一件比较微妙的事情,因为 Prompt 更接近一项艺术,而非精密的工程学。在采用一个 Prompt 之前,我们可以对照“优秀的 Prompt 应具备哪些特点”去评估,之后,也可以根据 Prompt 的使用情况来评估。
事前评估时,除了人为去评估,我们甚至可以用魔法打败魔法,让模型来帮助我们评价一个 Prompt 的好坏:
输入:
输出:
事后评估,我们会依赖相关的打点数据,从以下一些维度来评估 Prompt 的好坏:
满意度:是一个非常直观的评价指标,它可以直接反映用户对 Prompt 的满足度。我们通过让用户在使用 Prompt 后给出一个评价(1-5 分)衡量;
使用率:用户可以自己写文案,也可以基于 prompt 让模型生成文案。从这个角度来看,用户对 Prompt 的使用频率就成为了评价 Prompt 好坏的一种方式。例如,如果用户用几次就不再使用,那么就可以说明这个 Prompt 可能存在问题。而如果一个 Prompt 的使用率较高,那么就能说明用户对该 prompt 挺有好感和信任感;
采用率:我们可以通过比较用户最终采用的文案与由 Prompt 生成的文案的相似度来判断是否采用,反映出 Prompt 的实用性以及其在具体业务场景中的适用度;
效果:基于 prompt 产生内容的效果,和用户自己生成内容的的效果相比较,也是衡量 Prompt 好坏的一个标准。例如,在广告、营销等领域,我们可以比较模型生成文案的实际广告效果,与人工生成文案的效果,评判 Prompt 的质量;在问答相关的场景里,我们可以通过追踪问题是否得到解决来衡量。例如,针对某一问题,如果 Prompt 提供的答案被采纳,问题得以解决,则可以认为这是成功的。反过来,如果问题需要转由人工解决,那么便说明 Prompt 在此场景下的表现不够好。
总结
就如特斯拉前首席 AI 科学家Andrej Karpathy所说:未来最火的编程语言将是自然语言
这里编程语言毋庸置疑就是 Prompt,所以是否能够很好的理解 Prompt 的工作机制,书写出高质量的 Prompt,将决定使用者是否能够高效的利用当前 AI 的能力,大家都听说过在软件时代存在着 10X 工程师的说法,那么在 AI 时代,系统的杠杆效用更明显,是否有可能产生 100X 工程师?我觉得是有可能的,而这样的工程师一定也是特别精通如何书写 Prompt 并与 AI 进行交互的人
本文主要从 Prompt 的基础概念与运作机制做了入门级的讲解,希望让初学者能够对 Prompt 有一个基础的理解,同时这也是我们 AI 系列文章的第一篇,后续我们会结合公司在 AI 方面的探索和落地实践,推出一系列 AI 方面的文章,和大家一起共同推动 AI 知识的普及与应用的落地
作者
祝俊 (飞书深诺架构与平台技术,架构师)
评论