不写代码也能年薪百万?Prompt+低代码开发实战
👉腾小云导读
近期 AIGC 狂潮席卷,“前端走向穷途”“低代码时代终结”的言论甚嚣尘上。事实上 GPT 不仅不会干掉低代码,反而会大幅度促进低代码相关系统的开发。本文会介绍 GPT Prompt Engineering 的基本原理,以及如何帮助低代码平台相关技术快速开发落地的技术方案。接着往下看吧~
👉看目录点收藏,随时涨技术
1 提示工程 1.1 提示工程基本概念 1.2 如何使用 OpenAI/Chatgpt 做提示工程测试 1.3 role & token 1.4 提示工程技巧-少样本提示(few shot) 1.5 提示工程技巧-思维链提示(Chain-of-Thought,CoT) 1.6 提示工程技巧-生成知识(knowledge generation)1.7 提示工程的总结 1.8 langchain 的介绍2 低代码技术 2.1 低代码技术介绍
2.2 Hello world:AI2SQL 2.3 接口网关:构建 AI 友好的应用 2.4 低代码搭建:生成知识技术的大规模使用 2.5 低代码搭建:逻辑编排技术与 GPT 2.6 低代码搭建:数据可视化技术与 GPT 2.7 文档系统的 GPT 搭建 2.8 总结
3 GPT 高级使用技巧走马观花与总结
01
1.1 提示工程基本概念
提示工程是什么?如图所示。你同大模型的交谈就是所谓的 Prompt, 而如何设计、组织、优化则称为提示工程(Prompt Engineering)。
提示工程是通用技术,适合于几乎所有大语言模型(Large Language Models,简称LLMs)。
1.2 如何使用 OpenAI/Chatgpt 做提示工程测试
· temperature(温度) —— 简言之,温度越低,结果越具有确定性,因为总是选择概率最高的下一个词。提高温度可能导致更多的随机性,鼓励产生更多样化或富有创意的输出对基于事实的问答任务使用较低的温度值,以鼓励更加准确和简洁地回答。对于诗歌生成或其他创意任务,提高温度值可能会更有益。
· top_p —— 类似的,通过 top_p 调节名为 nucleus sampling 的温度抽样技术,可以控制模型在生成回应时的确定性。如果需要准确和事实性的答案,请保持较低的 top_p 值,如果希望获得更多样化的回应,请增加到较高的 top_p 值。
另外是模型 text-davinci-003 和 gpt-3.5-turbo 的区别。
text-davinci-003 和 gpt-3.5-turbo 都是 OpenAI GPT-3 系列中的两个模型,区别在于性能和价格,此处我们着重讲下性能的对比。
性能:gpt-3.5-turbo 相对于 text-davinci-003 在性能方面有所提高。根据 OpenAI 的说法,gpt-3.5-turbo 在许多任务中的性能与 text-davinci-003 相当或更好。这意味着,与 text-davinci-003 相比,gpt-3.5-turbo 可以在保持相同质量输出的同时更有效地完成任务。
1.3 role & token
不同 Role 的含义如下:
系统消息(role = system):一般用于定义 GPT 对话的行为,比如:你是一个 SQL 工程师,擅长写 SQL。gpt-3.5-turbo-0301 并不会把这个系统消息做很高的优先度关注。未来的模型将被训练为更加关注系统消息。
用户消息(rule=user):一般是用户自己的输入以及开发者给 GPT 的一些指令。
助手消息(rule=assistant) :可以帮助存 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 最大值参考 。
1.4 提示工程技巧-少样本提示 (few shot)
1.5 提示工程技巧-思维链提示(Chain-of-Thought,CoT)
思维链提示(Chain-of-Thought,CoT)是一种用于提高大语言模型推理能力的技术,通过提示模型生成一系列推理步骤来解决多步骤的问题。研究表明,这种技术可以显著提高模型在数学、常识、推理等方面的准确性。该技术的应用使得模型能够将多步骤的问题分解成中间步骤,从而更好地理解和解决问题。
比如一个简单的例子 :
事实上,思维链远远不止“让我们逐步思考”这一魔法咒语,它可以仅仅通过 Prompt 就可以让 GPT 完成非常复杂的任务。下面我们来举个例子:
假设今天我需要送给一个朋友礼物,希望有一个机器人能告诉你。如果我们考虑下自己的思考过程,可能会这么想:
· 我这个朋友是男生。 · 男生可能会喜欢一些高达、手办、相机等等。 · 那我就在其中选择一个。 |
可以看到 GPT 像人一样,一步步地思考问题,它首先理解了这个问题,并从工具库中取出了性别判断工具,进行判断后,它又在工具库中取出了礼物推荐工具,并进一步得到结论。其实这个思路就是非常流行的 Reasoning + Acting :ReAct 技术,每次让 LLM 输出一个当前的【思考】和【要做的动作】,这个动作并不只限于检索信息,可以是调用任何工具,类似 ChatGPT plugin。LLM 通过 few shot 的例子和工具自带的描述,还有它自己学到的常识来决定何时调用工具以及如何调用工具。
这样 ReAct 引入了外部工具的概念,让 LLM 能够通过这种步进式的方式逐步思考并调用外部工具,根据结果进一步思考循环。同时也可以仅仅是输出一步思考,并继续下去,类似 CoT。在流行的开发框架 Langchain 中就封装了帮助实现这个思路的一系列工具。
1.6 提示工程技巧-生成知识(knowledge generation)
1.7 提示工程的总结
1.8 langchain 的介绍
02
2.1 低代码技术介绍
· CRM 类应用搭建 · 机器学习类应用搭建 · 企业应用搭建 · 店铺装修工具 · 物联网、IOT 构建工具 · Web、Mobile 应用开发 · 工作流系统 |
2.2 Hello world:AI2SQL
· 上下文 —— 当前在哪个库,哪个表 · 输入数据 —— 表结构 - DDL · 输出指示符 —— 我希望输出纯正 sql,不想解析一堆内容 |
用户输入复杂的描述,其中甚至带有很多对 SQL 语法的要求,GPT 也能快速准确地返回。
在这个例子中,我们发现构建 GPT 产品时,主要的工作都在组织 prompt 上,因此对 prompt 进行设计可以有效达到目的。同时 SQL 是 GPT 非常擅长编写的语言。注意我在这里特别强调了“非常擅长”,后面还会讲这个的重要性。最后为了让 GPT 感知到我们的表结构,我们利用生成知识(Generated Knowledge Prompting) 这一技巧,让 GPT 掌握了它不知道的东西。
AI2SQL 这一类系统的架构设计如下:
目前这一类的开源产品有 https://github.com/sqlchat/sqlchat 大家可以看看其产品形态。
同样,langchain 在开发这一类应用时也具有天然的优势,因为各种包都是现成的,甚至有一个现成的 AI2SQL 的 chain,如图所示:
2.3 接口网关:构建 AI 友好的应用
低代码绕不开的就是接口服务网关了。通常来讲,用户希望能够通过服务直接获取需要的数据 /API ,而不是对着一堆接口列表进行开发,因此我们的思路是这样的:
分解任务:
· 需要返回接口或者数据 · GPT 是不知道我的接口的 |
· 上下文 —— 当前的接口数据 · 输入数据 —— 用户需要的字段 · 输出指示符 —— 指示输出的类型或格式 |
我们给 GPT 添加一套宠物管理系统,之后看一下效果:
首先我们获取系统内的接口:
我们仍然利用万能的“生成知识”,首先把 Swagger API 加载到系统中,并首先传给 GPT 作为知识和上下文。之后用户的询问会经过代理服务传给 GPT,GPT 的学习能力能够理解很多接口操作,因此 GPT 会首先返回符合要求的接口以及相关的参数。由于用户可能需要直接获取数据,因此我们可以让系统自己去请求数据,之后可以把返回数据再给到 GPT, GPT 会帮你加工成“人话”,最终给到用户,这样就完成了一个接口网关的 GPT 实现。
但这样的设计还存在不少问题,如:
· 接口的能力会限制服务能力,用户的需求是枚举不完的,比如宠物管理系统中,没有用户和宠物的关联接口,提问后 GPT 的反应就很懵了。 |
因此可以考虑这个思路:在缩减 Token 的基础上,能够让 GPT 提供的接口服务更加灵活。
举例来讲 ,一个通常的 RBAC 模型,它的设计是这样的:
· AI 对 GQL,SQL 的知识掌握,是远远比我们喂给它的现成接口要多的! |
因此,AI 可以认为是一个很成熟的 SQL/GQL/React 等的开发者,却并不是一个好的 http 接口的开发者。
AI 友好,即在可以使用各种 prompt engineer + 各种技术栈的基础上, 你仍然可以选择 AI 最会的技能。
2.4 低代码搭建:生成知识技术的大规模使用
· 利用生成知识技术,设计一个 prompt,使 GPT 返回自己的 DSL。 · 利用相关的系统 API,将页面依赖的数据源,系统的组件等信息加载进来。 |
第二个问题,如何实现根据需求二次编辑 DSL 呢,我们当然可以每次都生成一份新的 DSL,但这样很容易浪费 Token。由此我们使用了一个有意思的技术叫 JSON patch:
JSON Path 可以描述 JSON 文档变化. 使用它可以避免在只需要修改某一部分的时候发送整个文档内容. 补丁(Patch)内容的格式也是 JSON.JSON Patch 由 IETF 在 RFC 6902 - JavaScript Object Notation (JSON) Patch 中规范。
举例来讲:
可以看到,JSON patch 能够比较准确的描述对 JSON 这一 DSL 的操作。由此我们可以设计 prompt 让 GPT 返回 JSON patch 和相关修改后的 DSL:
同样我们也可以限制 GPT 只返回 Patch。
2.5 低代码搭建:逻辑编排技术与 GPT
Flow Based Programing (https://github.com/flowbased)是 J. Paul Rodker Morrison 很早以前提出的一种编程范式。FBP 把应用看作一个黑盒子,它能够看到的是一张进程(processes)组成的网,而进程间通过连接(connection)进行通信,进程通过端口(port)来访问连接(这种抽象类似网络编程)。
FBP 有三大概念,支撑整个架构:
基于此类场景,我们设计一个 schema 来存储“图“,兼顾绘图和逻辑:
Logic schema 由三个主要的实体结构构成:
Flow 流程主体, Node 节点描述,Link 节点关系描述:
这里我们仍然使用生成知识 + few shot 的方式对 GPT 进行 Prompt,可见低代码自定义 DSL 这类场景,这种解决方案堪称万金油。最终将 DSL 接入一个流程编排工具或引擎,即可完成整个系统的构建。
同样的实践也可以直接在其他成熟的逻辑编排平台完成,如 Node-red ,sequence Diagrams 等 。
2.6 低代码搭建:数据可视化技术与 GPT
数据可视化的绘制部分相对比较简单。按照通常的思路,我们仍然分析 Prompt 要求:
分解任务:
· 上下文 —— 图表 DSL 的规范 · 输入数据 —— 当前的数据 · 输出指示符 —— 输出一段描述图表的 DSL |
但 AI 时代,这样的可视化真的有用吗?事实上,对于一个能够使用自然语言接触 BI 产品的工程师,它的诉求绝对不只是说一句话制作一个图表那么简单,它需要让 AI 辅助它发现数据的异常,并智能地可视化出来,也就是所谓“增强分析”技术。因此我们对 Prompt 的分解会变成这样:
分解任务:
· 上下文 —— 当前的库表字段,趋势要用什么图表,如何分析异常 · 输入数据 —— 当前的图表数据 · 输出指示符 —— 输出一段描述图表的 DSL |
· 如何判断数据的问题; · 如何根据数据选择合适的可视化图表。 |
可以看到 GPT 有强大的编程能力,直接就将异常数据返回了。因此在可视化之前,可以先让 GPT 基于内置的算法做一次自动化分析,检测数据中的问题。
之后我们需要选择合适的图表,此时我们可以接入一个图表选择模块,这个模块的功能叫“自动化可视化”,自动可视化的概念非常简单,就是根据你的数据结果自动选择合适的可视化方式进行展示,以提升报表整体的可读性,自动化报表与自然语言查询、自然语言生成等技术配合,将大大加快整个分析流程,降低从业者制作报表的成本。简单来讲自动化可视化就是这张图的技术实现:
2.7 文档系统的 GPT 搭建
我第一反应,这是怎么实现的?使用 ChatGPT 应该如何实现?因此仍然回到原来的思考模式上:
分解任务:
· 上下文 —— 全部文档 · 输入数据 —— 我需要哪方面的文档 · 输出指示符 —— 输出一段文档内容 |
· 如何判断用户的提问跟你的文档内容吻合? · 我输入的是中文,这文档是英文啊,如何搜索? |
这里我们就有一种思路,如果我们可以提前把跟用户提问内容有相关性的文章摘录出来,让 GPT 判断,是不是就可以既节省 token, 又不需要逐字阅读?这里就回到一个本质问题:如何判断两段文字。于是我们可以使用 embedding 技术。
在自然语言处理和机器学习领域,"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称为嵌入空间(embedding space),而生成的向量则称为嵌入向量(embedding vector)或向量嵌入(vector embedding)。
嵌入向量可以捕获单词、短语或文本的语义信息,使得它们可以在数学上进行比较和计算。这种比较和计算在自然语言处理和机器学习中经常被用于各种任务,例如文本分类、语义搜索、词语相似性计算等。
在中文语境下,"embeddings" 通常被翻译为 "词向量" 或者 "向量表示"。这些翻译强调了嵌入向量的特点,即将词汇转换成向量,并表示为嵌入空间中的点。embedding 其实来源于 word2vec 技术。
· "犬类捕食啮齿动物" · "我家养了只狗" |
索引:向量数据库使用 PQ、LSH 或 HNSW 等算法对矢量进行索引
查询:向量数据库将索引查询向量与数据集中的索引向量进行比较,找到最相近的结果
后处理:某些场景下向量数据库从数据集中检索最相近的结果后,对其进行后处理以返回最终结果。比如通过使用不同的相似性算法重新排列所有结果。如图所示。
SELECT * FROM items WHERE id != 1 ORDER BY embedding <-> (SELECT embedding FROM items WHERE id = 1) LIMIT 5;
整个过程非常简单,首先将大文本按照一定规则切开成小块(换行/字数),之后批量转换为向量存储起来。之后在用户搜索时,先在向量数据库中查出相似的文本,然后将这些文本 + 用户的 query 发给 GPT,GPT 来判断分析并生成回答即可。
同样我们也可以基于 langchain 快速搭建:
· 聚类(将文本字符串按相似性分组) · 推荐(推荐具有相关文本字符串的项目) · 异常检测(识别相关性较小的异常值) · 多样性测量(分析相似度分布) · 分类(文本字符串按其最相似的标签进行分类) |
2.8 总结
· GPT 具有强大的学习能力,可以降低代码方方面面的知识都灌输给它,给它提供完善的knowledge,甚至可以“教”它一些它不懂的专业知识。 · 对于搭建场景,设计一个完善的 DSL 是重中之重,Prompt 技巧只是补充,DSL 设计得好,使用简单的 few shot 就可以实现大多数场景。 · 可以通过向量数据库+ embedding 的方式,突破 token 的限制,从而实现大规模文本搜索的功能。 · langchain 是实战利器,推荐所有想跟自己系统集成 GPT 能力的开发者使用。 |
03
langchain 是不是很简单,我能不能把 langchain 也低代码,做 AI 系统的低代码化?当然可以!
之前有个产品叫 ChatPDF,可以快速解析用户的 PDF 并总结。根据上一节的内容我们很容易就可以想到可以通过向量数据库 + embedding 解决此类问题。感兴趣的用户可以访问 GitHub - FlowiseAI/Flowise: Drag & drop UI to build your customized LLM flow using LangchainJS 查看演示 flowwise 如何三分钟实现一个 ChatPDF 系统。
如果大家对前沿技术比较关注,就可以看到这是 AutoGPT 的实现原理,虽然代码写得非常面条,但是实现了匪夷所思的功能,圈内也有不少人进行了分析。
AutoGPT 创新的灵感+ 待完善的代码的矛盾组合,称之为 ai-based system,可能未来完全会颠覆传统的系统设计。
而通过工程能力可以大幅度提升 GPT 的效果,因此我们绝对不是“无事可做”。GPT 拥有令人“匪夷所思”的强大的学习理解等等能力。工欲善其事 ,君子善假于物也,一个工程师应该把 GPT 当作自己手里最锋利的武器。更多AIGC原理和实战教程欢迎滑到文末查看!
-End-
原创作者|姜天意
技术责编|loyluo