大模型时代的交互语言——Autogen系列03

作者: 引线小白-本文永久链接:httpss://www.limoncc.com/post/b6e87fb18befa699/
知识共享许可协议: 本博客采用署名-非商业-禁止演绎4.0国际许可证

根据笔者的观测和实践,大模型时代的交互语言有三种:

LLM_UI = 领域特定语言(DSL)+工作流(WorkFlow)+自适应界面(Self-Adaption-UI)

一个完整的大模型应用开发应该至少解决这三个问题,才能达到易用性。下面我们将使用一个完整的例子要说明这三个方面。

一、DSL (领域特定语言)

2023年3月以来大模型持续火热,人们大呼交互方式将迎来chat范式变革。什么prompt即代码,chat即UI等概念异常火热。
有人提出:寻找一种合理的 DSL (领域特定语言) ,以将现有的流程结合到 LLM^1。笔者觉得这是大模型开发非常重要的想法。

1.1、为什么需要领域特定语言

从一个简单的场景出发,我们希望LLM能翻译英文为中文。一个简单的提示词是:

1
2
3
你是一个翻译专家,精通将翻译英文为中文,请翻译下面的句子:
我想提高自己的技能水平,这样能提高自己未来的工资。
# I want to improve my skills so that I can increase my future salary.

但是对于有些模型来说,如果你忘记了句号,你得到的结果是这样的

1
2
3
4
你是一个翻译专家,精通将翻译英文为中文,请翻译下面的句子:
我想提高自己的技能水平,这样能提高自己未来的工资
# 和职业发展。
# I want to improve my skills so that I can increase my future salary and career development.

如果我们用这样的提示,稍加引导就可以避免这种情况

1
2
3
4
5
6
7
8
9
10
11
你是一个翻译专家,你会翻译用户的输入为英文,不要回答多余的话。翻译完后,不要做多余的输出。
下面是一些例子:

输入: 你好
英文: hello.
输入: 大模型将如何影响未来工作
英文: How will big models affect the future of work?
输入: 在街道上一个兔子起自行车
英文: In the street a rabbit picked up a bicycle.\n
我想提高自己的技能水平,这样能提高自己未来的工资
# 英文: I want to improve my skills so that I can increase my future salary.

也就是说我们在解决特定问题的时候,无论提示词还是大模型的输出都应该遵循特定的文本格式。而编程领域恰好有这么一个术语DSL (领域特定语言)。也就说即使大语言模型也无法做到无障碍沟通。这和人与人之间的沟通是一个道理。大家必须在共同背景和知识上下文,才能有效沟通。

如果说传统开发是使用编程语言开发功能,而大模型应用开发则是使用自然语言和必要编程构建LLM能理解的中间语言(或者说领域特定语言),通过沟通对话开发功能。

也就是说,我们应该将提示词视为一种可编程的语言

1、Prompt 编程特性 1:从需求到代码的直接转换,例如大语言模型中的函数
2、Prompt 编程特性 2:代码只是临时产物,大语言模型中代码只是中间工具,如果其他工具可以,不一定需要生成代码这个中间产物
3、Prompt 编程特性 3:次序化的分解框架,DDD (领域驱动设计)
4、Prompt 编程特性 4:语言即语言,简单来说如果我们限定了输入和输出的格式,那么我们的自然语言也是一种DSL。这就意味着,限制我们进行次序化的关键就是形式化的抽象。

1.2、DSL (领域特定语言)的一个例子:文生图提示词生成

这种领域特定语言使用场景是广泛的:

1、处理数据例如有提出未来大大模型格式的统一输出应该是类似于markdown类似块内容^2
2、约定输出格式以方便下游应用解析,如下面例子简单的「输入:」、「英文:」的前缀等。
3、对接工具也需要特定格式,为此我们需要设计一种语言以方便解析

下面在举一个文生图的提示词优化的例子

首先你一定要对摄影知识有所了解,才可能写出下面的提示。当然如果你对某一领域的知识不够了解,你也可以直接询问大模型。然后我们基于领域知识设计特定的格式的模版、提示(DSL)。

1.2.1、提示词生成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
你是一个艺术家,精通摄影。你会对用户的输入在一下几个方面提供改进意见:
拍摄方式
风格
主体
光效
场景
镜头
设备
最后总结给出一个完整的提示词。下面是一些例子:

输入: 拍摄一副关于兔子的照片

输出:
拍摄方式:中距离镜头
风格: 色彩突出注
主体: 一个可爱的兔子
光效: 太阳
场景: 在公园中
镜头: EF70mm/佳能EF70毫米镜头
设备: Canon/佳能

提示词:
中距离镜头,太阳光效,一个可爱的兔子在公园中。画面色彩突出注,EF70mm/佳能EF70毫米镜头,Canon/佳能。

输入: 拍摄一幅黑色猫咪的照片

输出:
拍摄方式:POV视点
风格: 长曝光
主体: 一个黑色猫咪
光效: 戒指
场景: 在夜晚
镜头: 24mm/24毫米镜头
设备: NikonZFX/NikonZFX

提示词:
POV视点,戒指光效,在夜晚一个黑色猫咪。长曝光,24mm/24毫米镜头,NikonZFX/NikonZFX。\n

然后我们输入

1
2
3
4
5
6
7
8
9
10
11
12
拍摄一位午后在舞蹈房练舞的亚洲少女照片,阳光透过玻璃洒在她的脸上,全身镜头。
# 输出:
# 拍摄方式:全身镜头
# 风格: 自然光线
# 主体: 一个午后在舞蹈房练舞的亚洲少女
# 光效: 阳光透过玻璃洒在她的脸上
# 场景: 在舞蹈房中
# 镜头: EF50mm/佳能EF50毫米镜头
# 设备: Canon/佳能

# 提示词:
# 全身镜头,自然光线,午后在舞蹈房练舞的亚洲少女。阳光透过玻璃洒在她的脸上,EF50mm/佳能EF50毫米镜头,Canon/ 佳能。

这显然还无法直接被sdxl这类的文生图模型使用。我们还需要提取最后面的提示词,于是再来一步

1.2.2、提示词提取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
你是一个提取器,你只会提取文中的提示词部分,下面是些例子

输出:
拍摄方式:全景视角
风格: 柔和色调
主体: 一位穿着汉服的亚洲女性
光效: 自然阳光
场景: 在公园中
镜头: EF50mm/佳能EF50毫米镜头
设备: Canon/佳能

提示词:
全景视角,柔和色调,一位穿着汉服的亚洲女性。自然阳光,在公园中拍摄,使用 EF50mm/ 佳能EF50毫米镜头,Canon/ 佳能设备。

提取的提示词: 全景视角,柔和色调,一位穿着汉服的亚洲女性。自然阳光,在公园中拍摄,使用 EF50mm/ 佳能EF50毫米镜头,Canon/ 佳能设备。

输入:
拍摄方式: 静态
风格: 高饱和度
主体: 一只猫咪
光效: 自然阳光
场景: 在花园中
镜头: EF50mm/ 佳能EF50毫米镜头
设备: Canon/ 佳能

提示词:
静态,高饱和度风格,一只猫咪。自然阳光,在花园中拍摄,使用 EF50mm/ 佳能EF50毫米镜头,Canon/ 佳能设备。

提取的提示词:
静态,高饱和度风格,一只猫咪。自然阳光,在花园中拍摄,使用 EF50mm/ 佳能EF50毫米镜头,Canon/ 佳能设备。

然后输入第一步的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
输出:
拍摄方式:全身镜头
风格: 自然光线
主体: 一个午后在舞蹈房练舞的亚洲少女
光效: 阳光透过玻璃洒在她的脸上
场景: 在舞蹈房中
镜头: EF50mm/佳能EF50毫米镜头
设备: Canon/佳能

提示词:
全身镜头,自然光线,午后在舞蹈房练舞的亚洲少女。阳光透过玻璃洒在她的脸上,EF50mm/佳能EF50毫米镜头,Canon/ 佳能。
# 提取的提示词: 全身镜头风格, 自然光线主体是一个午后在舞蹈房练舞的亚洲少女。
# 阳光透过玻璃洒在她的脸上,EF50mm/佳能EF50毫米镜头,Canon/ 佳能设备。

1.2.3、提示词翻译

有了提示词,我们还需要翻译为英文

1
2
3
4
5
6
7
8
9
你是一个翻译专家,你会翻译用户的输入为英文,不要回答多余的话。翻译完后,不要做多余的输出。
下面是一些例子:

输入: 你好。
英文: hello.
输入: 大模型将如何影响未来工作?
英文: How will big models affect the future of work?
输入: 在街道上一个兔子起自行车.
英文: In the street a rabbit picked up a bicycle.

然后输出第二步的结果

1
2
3
输入: 全身镜头风格, 自然光线主体是一个午后在舞蹈房练舞的亚洲少女。阳光透过玻璃洒在她的脸上,EF50mm/佳能EF50毫米镜头,Canon/ 佳能设备。
# Full-body shot, natural light subject is an Asian girl dancing in a dance
# studio. Sunlight shines through the glass on her face, Canon EF50mm lens, Canon equipment.

上面,我们通过一个简单的例子,阐述了领域特定语言如何解决特定问题案例。

1.3、解析领域特定语言

很多时候,场景要比上面的例子复杂的多。解析特定格式的文本就成了关键需求。DSL实际就是一种特定解决领域问题的迷你语言。如SQL语言,正则表达式等。在与大模型的交互中,pyparsing是一个好的选择。

还是以文生图提示词为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pyparsing as pp

chinese_word = "\u4e00-\u9fa5"
# 中文标点
chinese_punctuation = '–—‘’“”…、。〈〉《》「」『』【】〔〕!(),.:;?'
context = pp.Regex(f"[{chinese_word}|{chinese_punctuation}\S\s]*")

dsl_template = "提取的提示词:" + pp.Regex("[::]") + context.setResultsName("提取的提示词")

text = """提取的提示词:全身镜头,自然光线,$午后在舞蹈房练舞的亚洲少女。阳光透过玻璃洒在她的脸上,EF50mm/佳能EF50毫米镜头,Canon/ 佳能。"""

a = dsl_template.parse_string(text).as_dict()
print(a['提取的提示词:'])
# 全身镜头,自然光线,$午后在舞蹈房练舞的亚洲少女。阳光透过玻璃洒在她的脸上,EF50mm/佳能EF50毫米镜头,Canon/ 佳能。

当然你也可以直接写正则表达式,也可以使用诸如yaml、toml、xml类似的语言来定义你的DSL。

二、WorkFlow(工作流)

2.1、 为什么需要工作流

可以看到在解决一个场景下的问题时,工作流是不可避免的。对于开发者这来说有autogen、langchain这些工具。但是不可能覆盖到所有场景,这个时候就需要把工作流的组织交个用户,工作流也就成为了大模型时代的必备交互语言。

大模型时代的交互语言:工作流

如何让让工作流开发平民化这需要一款开源开发工具,目前至少这是空白领域,以后就看谁来卡这个生态位了。当前可用的一些前端工具Antv X6|Xflow、lite graph、reactflow。这些工具目前是比较基础的。快速上手还是要花费巨大功夫。

2.2、如何开发工作流

首先一个工作流需要明细用户的输入,输出。然后大模型强大的生成能力需要专业领域的提示。这也需要一个入口。这样就完成了一个通用的工作流设计

1
2
3
@Chat_Format.build("./your_promt.toml")
def chat_infer(messages: List[ChatCompletionRequestMessage], **kwargs):
...

三、Self-Adaption-UI(自适应UI)

3.1、自适应UI的一个例子

我们继续上面这个文生图的提示词生成例子,现在有了图片和生成的提示词,还有最后一公里,把结果展示到用户面前。这个环节也可以使用AI来做的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
你是一个优秀的前端工程师,精通react和js和antv design组件库。你会根据客户的UI需求返回对应UI组件的jS代码块。
UI需求:
1、使用antv design组件编写函数式卡片组件. 组件的输入是data和image_url
2、卡片组件背景色使用淡淡的浅绿色,高度300px,能够自适应宽度
3、下面是数据示例
data = {
"拍摄方式": "全景视角",
"风格": "柔和色调",
"主体": "一位穿着汉服的亚洲女性",
"光效": "自然阳光",
"场景": "在公园中",
"镜头": "EF50mm/佳能EF50毫米镜头",
"设备": "Canon/佳能",
"提示词":"全景视角,柔和色调,一位穿着汉服的亚洲女性。自然阳光,在公园中拍摄,使用 EF50mm/ 佳能EF50毫米镜头,Canon/ 佳能设备。",
}
4、在卡片组件左边展示图片,图片宽度与卡片高度一致,高度auto
3、在卡片组件右边遍历data数据的key和value值然后展示,不要遗漏
4、左边图片与右边文字要上下水平对齐,不要使用样式表
请你完成以上需求并提交代码。

然后我们就得到了如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import React from 'react';
import { Card } from 'antd';

const FunctionalCard = ({ data, image_url }) => {
return (
<div style={{ display: "flex", flexDirection: "row" }}>
<img src={image_url} alt="card-image" width="300px" height="auto"/>
<div>
<Card title="" bordered={false} className="site-card-borderless">
{Object.keys(data).map((key) => (
<p key={key}>{`${key}: ${data[key]}`}</p>
))}
</Card>
</div>
</div>
);
};

export default FunctionalCard;

它的效果如下

3.2、如何编写自适应UI的提示词

这个问题本质上是如何用文字描述UI组件需求,它至少应该包含如下要点

1、你的组件输入数据是什么,给出必要示例
2、数据如何展示
3、样式要求
4、使用合作语言和工具
5、禁止性要求

四、评述

1、大模型时代引入了新的人机交互可能,本文立足应用开发中的需求提出了大模型时代的交互语言应该是LLM_UI = 领域特定语言(DSL)+工作流(WorkFlow)+自适应界面(Self-Adaption-UI)。
2、本文涉及的cumfui的相关大模型插件也将开源,请关注这个仓库https://github.com/limoncc/ComfyUI_LLM.git
3、大模型应用交互语言背后离不开agent的支持,下篇笔者将重点关注如何使用LLM驱动交互,敬请期待。

欢迎加入AutogenQQ交流群:593623958


版权声明
引线小白创作并维护的柠檬CC博客采用署名-非商业-禁止演绎4.0国际许可证。
本文首发于柠檬CC [ https://www.limoncc.com ] , 版权所有、侵权必究。
本文永久链接httpss://www.limoncc.com/post/b6e87fb18befa699/
如果您需要引用本文,请参考:
引线小白. (Oct. 14, 2023). 《大模型时代的交互语言——Autogen系列03》[Blog post]. Retrieved from https://www.limoncc.com/post/b6e87fb18befa699
@online{limoncc-b6e87fb18befa699,
title={大模型时代的交互语言——Autogen系列03},
author={引线小白},
year={2023},
month={Oct},
date={14},
url={\url{https://www.limoncc.com/post/b6e87fb18befa699}},
}

'