ChatGPT 出现后,对于低代码产品的影响、冲击一直是一个悬而未决的问题。事实上 ChatGPT 不仅不会干掉低代码产品,还可以帮助低代码产品做得更好。
腾讯云前端技术专家姜天意从 ChatGPT 的提示工程原理出发,讲解了如何通过设计 AI 友好的应用,使用 ChatGPT 赋能低代码开发。本文为演讲内容概要。
今天的分享内容包括三个主要部分。首先,我将深入介绍大模型的 Prompt Engineering 和低代码技术。其次,我将详细展示低代码平台的各个功能模块,并分享如何运用 AIGC 技术在各种低代码场景中取得成功。最后,我还会简单探讨一些低代码的高级技术。
首先,Prompt Engineering 能够让你更准确地从大模型拿到你想要的知识,与此同时,它能够让大模型给你返回的内容更好地接入你的系统。这里涉及到多个要素,包括指令、上下文、输入数据和输出。
在 Prompt 过程中,需要特别注意 Temperature 和 Top_p 这两个参数,它们对于控制模型的回答风格十分关键。对于创作性工作,例如诗歌或文案创作,我们会适当增大这两个参数的值,以便模型能够更加自由地发挥创意。相反,如果我们的目标是生成代码或 DSL,我们会倾向于将这两个值设定较小,以确保模型的回答更为精准。
同时需要注意虽然 ChatGPT 3.5 和 Text-davinci-003 都属于 OpenAI ChatGPT3 家族,但 ChatGPT 3.5 -Turbo 不仅更经济实惠,效果也更为出色。在同等情况下,我强烈建议优先选择 GB 3.5 Turbo。另外,如果条件允许,我们还可以考虑使用 ChatGPT 4。此外,我们还注意到”Role”在与大模型的对话中扮演着重要角色。
由于大模型的无记忆特性,我们需要通过某种方式保存所有聊天记录和上下文,以便模型能够理解我们的需求。System Role 是指对模型的输入进行指定,以便模型在生成回复时具有特定的角色或身份。通过为模型设定系统角色,你可以引导模型以特定角色的视角来产生回复,从而限定回答的范围和内容,使其更加符合特定的上下文或需求。User Role 用户消息一般是用户自己的输入以及开发者给 GPT 的一些指令。助手消息 Assistant Role 可以帮助存 GPT 自己的响应。
当对话场景需要引用之前的消息时,就需要维护好这个 message 数组,这就是所谓 GPT 对话的上下文 or 历史记录。大模型对过去的请求没有记忆,所以你如果想保持这个上下文,必须维护好这个 message,然后在每次对话过程中,把完整的 message 传过去。因此,如果这些记录超过了模型的 token 限制,就需要以某种方式缩短它。
这里的 token 是什么意思呢?GPT 家族的大语言模型会使用 Token 作为处理文本的标识,用来标识一段文本中的“词”。大语言模型会理解这些 Token 之间的关系,并能够预测一系列 token 中的下一个。文本占据多少 Token 我们可以通过 https://platform.openai.com/tokenizer or tiktoken 来计算。在计算过程中发现,中文占据了大量 Token,同时换行、标点符号等也会占据 Token。根据 openai 的建议,一个 token 能写 4 个字母,或者 0.5 个汉字。因此 4000 个 token 可以写 2000 字的中文。
输入和输出都会计算 Token 。比如 API 调用在消息输入中使用了 10 个 Token,而在消息输出中收到了 20 个 Token,则需要支付 30 个 Token 的费用。如果在调用时候超了,会调用失败。输出的时候超了,会被截断。因此你自己的 GPT 应用, 一定要实现“试算 Token” 的功能。不同模型支持的 Token 最大值参考 https://platform.openai.com/docs/models/moderation
由于 Token 价格昂贵,因此在一段时间之内,“省 Token ”都是 AI 应用需要关注的重要问题。
01
Prompt 高级技巧 – Zero Shot 与 Few Shot
目前的大语言模型(LLMs)通过大量的数据训练和指令调整,能够在零样本情况下完成任务。
以上例子中我们直接向大模型提问,并没有添加任何需要示范的例子,就可以得到很好的回复,这便是零样本 (Zero Shot) 能力。但事实上很多场景零样本是无法得到我们想要的结果的。
有些复杂的任务,比如成语接龙,仅靠 Zero – Shot 可能不够,这时就需要用到 Few-Shot 技术。比如,我们想生成数据可视化图表的 JSON,可以通过 Few-Shot 技术,给出一些具体的例子让模型学习。同样,对于自己的可视化图表库,也可以用 Few-Shot 技术教会模型生成。这种方法尤其适用于一些可以列举场景的问答和学习。
02
Prompt 高级技巧 – COT
思维链提示(Chain-of-Thought,CoT)是一种用于提高大语言模型推理能力的技术,通过提示模型生成一系列推理步骤来解决多步骤的问题。研究表明,这种技术可以显著提高模型在数学、常识、推理等方面的准确性。该技术的应用使得模型能够将多步骤的问题分解成中间步骤,从而更好地理解和解决问题。
比如一个简单的例子
我们发现 GPT 已经完全懵逼了。但如果我们加入一句 “请进一步思考下”,引导 GPT 按照步骤思考呢
效果非常惊人。同样我们在之前的例子中使用魔法咒语:
效果也非常好。事实上思维链的“触发”方式,就是在原始提示中添加“逐步思考””请一步步思考问题”,但它能够起到非常惊人的效果。
事实上,思维链远远不止“让我们逐步思考” 这一魔法咒语,他可以仅仅通过 Prompt 就可以让 GPT 完成非常复杂的任务。下面我们来举个例子:男生送礼物给女生,应该怎么选?
如果考虑下人类的思考过程,可能会这么想:
1. 我这个朋友是男生。
2. 男生可能会喜欢一些高达、手办、相机等等。
3. 那我就在其中选择一个。
可以看出,人们在得到一个问题的最终答案前,通常是会有若干个「中间步骤(intermediate steps)」的。因此我们可以把这些“中间步骤”明确出来,引导 GPT 进行思考,prompt 设计如下:
这个 Prompt 中,首先我提供了两个工具,告诉这两个工具可以帮助 GPT 获得答案。之后特别指出,GPT 每次思考都要返回 Thought、Action、Action Input,他要先去我的工具库中寻找工具,调用适合的工具,并返回答案,同时要一直不停的做,直到得到答案。那我们看下实际使用时,GPT 是如何思考的:
可以看到 GPT 像人一样,一步步的思考问题,他首先理解了这个问题,并从工具库中取出了性别判断工具,进行判断后,他又在工具库中取出了礼物推荐工具,并进一步得到结论。其实这个思路就是非常流行的 Reasoning + Acting :ReAct 技术,每次让 LLM 输出一个当前的【思考】和【要做的动作】,这个动作并不只限于检索信息,可以是调用任何工具,类似 ChatGPT plugin。LLM 通过 few shot 的例子和工具自带的描述、还有它自己学到的常识来决定何时调用工具以及如何调用工具。目前 ChatGPT plugin 也可以调用各种工具,让大模型与外界数据互动,变得更智能。
03
Prompt 高级技巧 – 生成知识
大模型不是万能的。我们可以通过生成知识把外部知识给灌入大模型,这个时候大模型就具有了领知识的这个识别和学习能力。比如,当我提问高尔夫规则的,大模型答错了,我们可以用生成知识的技术纠正它,然后再问一次,这样就能得到正确的回答。将生成式知识技术与 Few-Shot 方法结合,是许多低代码技术的基础之一。同时,这种结合也是构建各类问答系统、知识库等产品时不可或缺的重要技术支持。
再举个例子,比如我可以通过逻辑编排的 DSL 描述从 A 流转到 B 再到 C 的过程。刚开始,ChatGPT 可能返回一个 A-B-C 的 DSL,但我想让它理解平台的逻辑编排 DSL。我采用一段 JSON 数据来表示逻辑编排,其中 Node 表示节点,link 表示节点关系。通过示例教给 ChatGPT 后,它就掌握了这种 DSL。
接下来,我提出一个问题,让它用某种语法表达 A 到 B 到 C 的过程,结果 ChatGPT 成功返回了自有流程编排的 DSL。因此,自定义 DSL 不再是难题。
在处理 Prompt 的过程中,有几个关键点需要注意。首先,我们需要确保将任务分解得足够细致,以确保 ChatGPT 能够更轻松且更准确地理解。
其次,Prompt 工程应该以一种包含指令、上下文输入和输出格式的方式来构建,这有助于提供明确的指导。第三,我们应当明确地提升模型,确保我们的指导可以让 ChatGPT 生成更加明确的回复内容。
最后,我们需要避免不必要的废话。在此之后,我们还介绍了一些高级技巧,如之前提到的 “Few Shot”、”思维链” 以及 “生成知识”。
04
AI 应用的开发利器 – LangChain
LangChain 它将大模型可能需要的各种能力封装在一起。例如,调用大模型、文本加载和处理、云存储以及数据库接口等等。这些能力可以根据你的需求自动执行,同时还提供了对 Few Shot 的管理以及 Prompt 词的支持。其中,”chain”是 “LangChain” 中最关键的概念。但简单来说,它就是一个封装了明确输入和输出的独立任务。不同的链式任务具有不同的输入输出要求,例如,有的链式任务专门用于对话,有的用于文档检索,有的用于数据操作等。
当然,一旦你深入了解了链式任务,你就能够构建自己的链式任务。因此,在大模型开发中,你可以借助 LangChain 来加速开发。举个例子,进行一个爬虫任务,通常情况下,我们会使用解析 HTML 和正则表达式来处理网页内容。然而,ChatGPT 提供了一个 Request Chain,它可以从网页中获取文章内容,然后我们可以构建一个 Prompt,将请求结果传递给大模型,最后通过 JSON 格式化数据。一旦我们初始化了 Request Chain,只需要提供一个 URL 和大模型,它就能够完成解析。
05
ChatGPT 与低代码
低代码技术在过去几年取得了显著发展,涵盖了数据分析师使用的 BI 工具、运营人员使用的广告工具、卖家的店铺搭建工具,还有产品经理和开发人员使用的 UI 可视化工具等。低代码技术在 Web 应用架构中也有广泛应用。
传统情况下,前端会调用后端接口进行数据处理和逻辑编排。但是,我们可以使用 UI 编排来实现低代码界面搭建,逻辑编排可以用于构建页面间的交互行为,业务逻辑的构建也可以通过逻辑编排来实现,而接口服务的构建则可以通过服务编排来实现。总之,所有这些功能都可以利用 ChatGPT 来实现。
在分享中,我的思路是先分解任务,构建 Prompt,然后获取并解析 OpenAI 的输出。
在上面的案例中,我们的目标是根据需求生成 DSL,特别是让 ChatGPT 能够生成 SQL 语句。
首先,我们要确保 ChatGPT 理解 SQL。其次,我们需要传达上下文,告诉模型关于库表的信息以及具体要执行的操作,例如查询人员或物品。我们可以通过一个简单的示例来展示,为一个表字段进行按性别分组,按排名排序。
这样的 Prompt 非常简单,然后我们将其集成到真实应用中,用户只要选择数据源并输入需求,ChatGPT 就可以生成相应的 SQL 语句。实际上,如果你熟悉数据分析和数据开发领域,你会发现 SQL 编写会耗费很多时间和精力,这个工具的出现可以大大减轻 SQL 工程师的负担。设计优秀的 Prompt 对于实现有效目标非常重要。
如果我们想要将这项技术应用到我们的低码平台中,通常,首先用户会输入一个 SQL 查询。在浏览器端,我们会调用 Meta service,它在低码平台中通常用于存储元数据或领域模型。这样,我们可以获取字段表结构或领域模型的信息。然后,通过一个网关,无论是用 NODE 还是 Python,我们都可以调用 ChatGPT 来将表结构和 SQL 整合,然后将生成的 SQL 返回给用户。
这里我们将 OpenAI 或 ChatGPT 作为一个服务集成到我们的系统中,完成了 AI 转 SQL 功能的开发。在这个过程中,还有一些简单的技巧。比如,DDL 可能会非常庞大,特别是表有很多字段的情况下,可能会导致 Token 超限。为此,我们可以采取一些策略来缩减 DDL。另外,我们还可以引入一些路由,让用户先选择领域模型,以减少 Token 的浪费。类似的产品在开源社区中已经有了,例如 SQL chart,它已经实现了整个流程,我们可以直接借鉴。
另一方面,采用 Lang Chain 方案开发更为简单。我们可以引入 SQL DataBase Chain,连接数据库并获取结果。该 Chain 接收大模型和数据库参数,可连接 MySQL 数据库。通过这种方式,开发 AIGC 应用变得非常简单,只需构建数据依赖,选择合适的 Chain,运行即可。
在低代码开发中,我们面临一个复杂的问题:如何对接多样的数据源和查询网关。通过 AIGC,我们有了一种解决方法。
我们可以将任务分解,以获取数据为目标,通过构建 Prompt 引导 ChatGPT 理解可用接口、所需字段和期望输出。架构设计如下:用户请求通过代理服务发送给机器,将 Swagger API 和请求合并为 Prompt,AI 返回接口描述。代理服务再实际请求服务,将数据通过 AI 翻译,最终得到结果。然而,接口数量庞大,需要不断开发新接口。与此同时,Swagger API 可能冗余,接口能力限制多样需求。
鉴此,我们提出了”AI 友好的接口设计”概念,考虑使用 GraphQL 解决这些问题。
当开发 RBAC 权限模型时,我们常涉及多对多的用户角色权限关系,传统接口可能会面临大量 Get 和 Post 接口。为了解决这个问题,我考虑将表结构转化为 GraphQL 结构。即使你不熟悉 GraphQL,我可以通过 ChatGPT 模型提供表结构信息,让 ChatGPT 将 DDL 转换为 GraphQL 查询语言(GQL)结构,生成多个类型,处理关联关系并构建查询语句。
通过这种方式,我们无需手动开发接口,只需定义好 GraphQL 查询模型,ChatGPT 会自动生成相关数据模型的查询语句,这比开发大量接口要方便得多。
AI 友好的概念是让 AI 发挥其擅长的能力,而不是强迫它学习我们的系统技术。ChatGPT 可以更好地理解 SQL 和 GraphQL,但可能不理解 Swagger。
大模型 X 低代码搭建
接下来,我们可以考虑低代码搭建。我们常常在界面上拖拽组件并编辑属性,设计结构包含配置和组件的 Schema,定义类型、属性和子元素。通过应用知识生成和 Few Shot,我们可以构建低代码搭建系统。
首先,我们能通过自然语言和用户名进行查询过滤,生成所需的 DSL,直接呈现动态界面。这个界面是可操作的,并且可以随时修改。不同于一次性生成,我们的编排工具着重在实现可编辑的 DSL。我们设计了生成机制技术的 Prompt,使 ChatGPT 返回适用于我们低代码平台的 DSL。这里有两个问题:低代码平台有许多组件,而许多 AIGC 平台不支持二次编辑。我们目标是生成可编辑的 DSL。构建 Prompt,将整个 DSL 知识以 JSON Schema 告诉 ChatGPT,再传递组件知识。
总体而言,我们构建了一个 DSL 模板,上半部分是 DSL 结构,下半部分是组件结构。引入当前业务模型信息后,我们获得 ChatGPT 生成的 DSL,与之前的 DSL 基本相同,验证了 Prompt 模板思路的正确性。这使我们能够实现可编辑的 DSL。
接下来,让我们解决第一个问题,即组件过多的情况。我们可以将 ChatGPT 视为智能平台,告诉它我们需要构建一个页面,其中包括查询列表和搜索列表,然后询问它需要哪些组件。这时,ChatGPT 将首先提供组件列表。假设我们的低代码平台有 100 个组件,我们只返回其中四五个组件的 Schema。
接着,我们将当前的 Schema 与 ChatGPT 和数据模型结合,再次生成一个 prompt。通过这种方式,我们能够在生成 DSL 时节省所需的 Token。
第二点是关于二次编辑的方法,我们采用一项名为”JSON Path”的技术。它指导我们如何操作 JSON 数据,包括替换、增加和删除。这相当于一种针对 JSON 操作的专用语言(DSL)。
将 JSON Path 应用于原始 JSON 数据后,它返回经过操作的结果,实现了低代码平台的二次编辑功能。我们可以直接告诉 ChatGPT,需要在 JSON 数据中删除某功能,并采用”JSON Path”格式返回。
ChatGPT 将呈现原始 DSL 结构和” Path”格式,这使我们能仅通过操作”Path”部分,而不影响原始 DSL 结构。此外,我们还能将”Path”集成到自己的平台,提供”Path”,具体操作由我们完成。ChatGPT 将直接返回”OP”为”remove”的结果。
总之,通过”JSON Path”,我们实现了 AIGC 应用的二次编辑功能,能进一步操作和修改原始 JSON 数据。
大模型 X 逻辑编排
接下来,让我们思考逻辑编排的内容。首先,我们需要明确逻辑编排的领域特点,即逻辑编排的领域特定语言(DSL)具体是什么样的。在如何让 ChatGPT 学习逻辑编排方面,我认为基于流程式编程的思想是关键。
流程式编程,即 flow based programming,包含三个主要要素:进程、组件和网络。
-
进程:作为流程式编程的核心部分,进程可以被视为流程中的节点。每个进程代表特定的操作或任务。 -
组件:进程中的节点被称为组件,它们是具体的功能单元,用于执行特定的计算或操作。 -
网络:组件通过连接形成网络,这个网络描述了不同组件之间的数据流和控制流。
– END –
报告下载
大佬观点