我的学习笔记

土猛的员外

Midjourney(v5.1) Prompt深度剖析,创造有灵魂的图

原文:Anatomy of Midjourney Promps: In-Depth Study for effective Prompting Strategies — V5.1 examples

作者:Michael King

译者:这是一个非常“平易近人”的Midjourney教程,非常适合对作图有要求的同学一步一步开始自己的Midjourney之旅。

你是否曾经发现自己盯着Midjourney的空白画布,手指悬停在键盘上,让我问自己:“我应该问这个东西什么?

img

我也曾经有过同样的经历,朋友。就像站在一个售卖艺术品的自动贩卖机前一样,但你需要喂它文字而不是硬币。而且并非所有的词语都可以使用,你必须选择正确的单词,并按照正确的顺序排列。这有点像施法一样。有时候你会中大奖,获得比你想象中更美丽、更完美的杰作;但另外一些时候,它可能和问一个魔球没有什么区别。

这个被称为“Midjourney prompting”的功能实际上是一个谜团。这真正是一种舞蹈,在您和AI之间进行交互。您用文字引导着AI生成图像,并共同创造出独特的东西。但步骤并不总是清晰明了:您应该要求简单地描述,a sunset over the ocean(海洋上落日)?还是更加详细地描绘画面以期待AI能够将其呈现出来?或者尝试采取结构化方法,如电影导演指挥镜头?

然后难免需要微调——哦!微调!转眼之间,您正在调整此处单词、那里短语;接下来发生了什么事情呢?您已经修改了提示内容很多次,以至于它几乎无法被识别。但当您最终获得那张令人惊叹的图像时,这一切都是值得的。

那么,你如何破解这个谜题?如何掌握Midjourney Prompt的艺术?我有一些见解要与您分享,这是从许多与AI的深夜交互中获得的。所以请继续关注,因为事情即将变得有趣。


从基础的输入开始

好的,让我们开始吧。想象一下,你站在控制台前,眼睛盯着那个空白画布。手指悬停在键盘上,然后敲出一个简单的单词:“chair(椅子)”。听起来很基础,对吧?但这好歹是个不错的开始。

现在,为了增加趣味性,你决定将混沌度调到50。为什么是50呢?因为我发现中等程度的混沌设置可以引入足够多的不确定性以保持事情有趣。这就像给你的餐点加一点辣酱——不会烧掉你的味蕾,但只要能让舌头感到刺痛就行了。

在这种情况下,“混沌参数”是我们秘密武器。它是万能卡牌、意外元素。它使得人工智能说:“chair(椅子)?好啊!看看我能做些什么!”相信我,在处理人工智能时,稍微变化一下也可以大有裨益。

Prompt:
chair --c 50

img

那么,我们按下回车键,靠在椅子上等待。最终我们得到的是……没错,这就是一把椅子。但它有点像让厨师给你做三明治,结果拿到的只是一片面包和一块奶酪。当然了,从技术上来说这确实算作三明治,但不完全符合你的期望吧?

这就是midjourney prompt的问题所在。如果指令过于模糊不清,则需要AI自行填补空缺部分。虽然AI具备很多技能,但并不能读取人类思想。

增加描述–颜色

因此,让我们更加具体地描述需求吧!我们要对椅子进行改造——涂上新漆!那么颜色呢?为什么不选绿色呢?它既大胆又充满活力,并且代表着生命之色。而且顺便提一下:绿色也正好是我的最爱。

Prompt:
green chair --c 50

img

好的,让我们看看我们得到了什么。啊,是的,我们有绿色的椅子。但它们到处都是!其中一些看起来像从印象派画作中撕下来的,而另一个则清晰明了,就像高分辨率照片一样。这就像一个名为“Green Chairs: A Study in Chaos(绿色椅子:混沌之研究)”的野性、折衷主义艺术展览。很有趣,但不完全符合我们的目标。

你知道吗,在Midjourney Prompt方面有个问题。这有点像与一个天才但略微健忘的艺术家打交道。你必须清楚地表达你想要什么,否则他们会自己创造出新奇别致的东西。虽然这可能会带来一些惊人的惊喜,但也可能让你摸不着头脑,并且纳闷自己怎么会得到一个立体主义解释绿色椅子。

创造真实的图–摄影风格

所以回到绘图板上——或者说键盘上吧。我们想要一张绿色椅子的照片,而不是画作。我们追求现实主义风格,在这里可以感受、触摸和坐在上面的真实存在感。“再试一次”准备好了吗?让我们开始吧…

Prompt:
green chair | photography --c 50

img

哇,这是什么?一把绿色的椅子竟然出现在农田中央?这可真是不寻常。再看那一把孤零零地坐在空旷街道上的绿色椅子,就像一个超现实主义梦境中的场景。得承认AI确实有着非凡的想象力。

但尽管我很享受这个意外之旅,它并不完全符合我们最初设定的目标。就好比点了一份比萨饼却收到了美食汉堡包,虽然看起来很诱人,但并不是你口感所期待的。

设定场所

因此,我们要回归正题。让我们带着这把绿色椅子踏上新旅程,在家庭生活中心留下它温馨舒适的身影吧!想象一个舒适温馨、壁炉边火苗跳动、柔软地毯铺满整个房间……而在其中央,则摆放着我们那张迎人且舒适无比的绿色椅子。这才是我们要为AI艺术家描绘出来的场景。

Prompt:
green chair | photography | living room --c 50

img

啊,成功了!我们在客厅里放上了绿色的椅子。感觉好像我们正在取得进展,不是吗?但等等,这有点…暗,不是吗?就像我们在半夜闯入自己的客厅一样。它有点神秘的氛围,就像一个悬疑惊悚片的开场一样。无疑很引人入胜,但并不是我们所想象中邀请人们来到家里的形象。

你知道这个场景需要什么吗?阳光的洒落。透过窗户射进来明亮而温暖的光线,在地板上投下长长的阴影。一个舒适角落,在那里你可以蜷缩着读一本好书,阳光在书页上跳动。

调试光线

所以让我们再试一次好吧?我们将增加亮度,并注入“bright daylight(明亮白天)”的光芒来为场景带来活力。就像导演调整灯光以设置完美情境。

Prompt:
green chair | photography | living room | bright daylight --c 50

img

现在我们开始谈论了!我们的绿色椅子,在明亮的阳光下晒着,真的开始显眼起来。它有一种积极的氛围和能量,以前是没有的。但是…还缺少一些东西。这个东西可以让它从“”变成“很棒”。

所以,我告诉你一个小秘密。你知道吗?我们的Midjourney AI艺术家可以模仿相机拍摄效果!不是名人,而是相机模型。没错!它可以模仿不同相机模型独特的特点,为您的图像增添特殊风格。

想象一下吧。每台相机都有自己独特捕捉世界方式,“个性”,如果您愿意这么说。有些可能会给您提供清晰、高清晰度图像;其他则可能使您拥有怀旧、略微模糊质感图片。

尝试设定具体的相机(和镜头)

那么,让我们来测试一下Midjourney AI吧!我们将输入两个新提示语句,并分别对应不同相机模型进行仿制处理:尼康D850经典Polaroid即时成像相机——前者因其锐利、鲜艳图像而闻名于世;后者则因其柔软、梦幻般的质感而广受认可。

Prompt:
green chair | photography | living room | bright daylight | Camera: Nikon D850 --c 50

img

Prompt:
green chair | photography | living room | bright daylight | Camera: Polaroid --c 50

img

现在这才像样!我们的绿色椅子,通过两个不同相机的镜头捕捉,每一个都为图像增添了自己独特的风味。就像我们给一件杰作添加了最后的润色。但你知道吗?我还没有准备好放下我的画笔。

为什么只停留在一把绿色椅子上呢?让我们为场景增加更多生气吧!让我们再加入另一个角色来丰富故事情节。对于我们的绿色椅子来说,有什么比泰迪熊更好的配合者呢?这是经典组合,就像花生酱和果冻、电影和爆米花。

想象一下:明亮阳光下沐浴着温暖舒适感觉家庭氛围中,泰迪熊舒适地栖息在我们的绿色椅子上。这是一个唤起人们温馨、舒适、家庭感觉场景。就像我们不仅创造了一幅图像,而且创造了一个记忆。

增加一点摆设

那么让我们重新开始吧! 我们不只是进入了兔子洞里面,在泰迪熊洞里也要深入探索。准备好为我们的杰作增添更多魔力了吗?让我们开始吧……

Prompt:
teddy bear on a green chair | photography | living room | bright daylight | Camera: Nikon D850 --c 50

img

嗯,这很有趣。我们要求一把带小熊的绿色椅子,但是我们得到了一把带小熊的蓝绿色(turquoise)椅子。就像点了一个青苹果却拿到了蓝莓一样,接近但不完全正确。

但你知道吗?这就是整个过程的美妙之处。它充满不可预测性、惊喜和挑战你的思维方式。虽然我们的椅子可能经过了“蓝绿镇(Turquoise Town)”的弯路,但这也是旅程中必须经历的部分。

改变视角

所以,我们将再次调整提示内容。但这次,我们不仅会调整颜色,还会玩转视角。想想看吧!观察事物的方式可以彻底改变你对它的看法。

Prompt:
teddy bear on a green chair | photography | living room | bright daylight | Camera: Nikon D850 | low angle view | --c 50

img

现在这才像话!从新的角度看,我们的绿色椅子和泰迪熊真正开始活起来了。就像我们自己走进了场景,亲眼目睹一样。但是,既然已经到了这一步,为什么要停下呢?

增加一些艺术效果

让我们给场景增加一点戏剧性、特效的调味吧。还有什么比水滴更具戏剧性呢?想象一下,在明亮的阳光下每个水滴反射出闪耀光芒,窗户上雨滴轻柔地拍打声音,绿色椅子和泰迪熊带来舒适温馨感觉。就好像我们正在创造自己的小电影场景。

Prompt:
teddy bear on a green chair | photography | living room | bright daylight | Camera: Nikon D850 | low angle view | Effects: water drops --c 50

img

哇,真的起作用了。我们的绿色椅子场景现在加上了水滴,看起来非常棒。但是你知道吗?我想再推动一下创新边界。

让我们向Midjourney AI艺术家投掷另一个曲线球。我们有绿色椅子、泰迪熊、日光、新鲜视角和水滴。但是让我们再加点料吧!怎么样,在这个场景中添加一些落叶呢?

如果换个场景会怎么样?

想象一下,明亮的彩叶飘落,随着它们的降落捕捉到光芒。我们的场景不再只是简单地展示一个椅子图像,而是变成了生活片段,充满了色彩、运动和能量。就好像我们正在为AI创造注入生命。

Prompt:
brown teddy bear on a green chair | photography | living room | bright daylight | Camera: Nikon D850 | close-up view | Effects: water drops | surrounded by falling leaves --c 50

img

哇,这不是一道令人眼前一亮的景象吗?树叶飘落,阳光透过枝叶洒下来,水滴溅起涟漪……这里有着丰富多彩的视觉和声音。但等等……我们的绿色椅子变得不再那么绿了。还有,难道里面不应该有一个客厅吗?

你看,这就是中途提示的问题所在。它就像赶集场上放羊儿一样棘手。你必须关注所有细节,否则事情很快就会失控。

调整美化参数(stylize)

但别担心。我还有一个法宝——“stylize(美化参数)”。把它想象成导演剪辑版。它让我们可以微调场景,并确保每个细节都符合我们的要求。

而且我们并不只是稍微调整一下。“stylize(美化)”值将被提高到1000!这就像给AI艺术家喊话:“让我们的愿景变为现实!”

因此,请回到键盘前准备好:绿色椅子、泰迪熊、日光、新鲜视角、水滴和落叶以及最大限度地提高stylize的数值——准备好看接下来会发生什么了吗?我知道我准备好了。

Prompt:
teddy bear on a green chair | photography | living room | bright daylight | Camera: Nikon D850 | close-up view | Effects: water drops | surrounded by falling leaves --c 50 --s 1000

img

大家看到了吗!这就是我们一直追求的完美画面。有绿色的椅子,小熊玩具,阳光、水滴和落叶……就像我们经历了一次视觉之旅,最终抵达目的地。Midjourney真是太棒了。

总结

那么这里有什么要点呢?当你开始Midjourney时,可能没有明确的想法。没关系!只需加入一个简短提示词或两个单词,并看看它会带给你什么灵感。就像坐上过山车而不知道将去何方一样刺激。

但也许你属于计划型人格你已经在脑海中形成了清晰的愿景和画面。在这种情况下,您需要从较长的提示开始,例如四五个单词。然后随着进展逐渐添加更多元素作为构建模块,在每个步骤中都能看到您所创建内容正在成形、演变并越来越精致。

但是,请注意一旦得到完美图像,请勿停止尝试新事物!删除某些元素或添加其他元素可能会带来意外结果——请参见下面的图片示例:我们移除了小熊玩具和绿色椅子,看看我们得到了什么——一个全新的杰作!

归根结底,成功的Midjourney提示都是关于实验和探索。从小处开始,并逐渐建立您的想法。逐个修改参数并观察图像如何演变。这是一次发现、创造和乐趣之旅。

那么,准备好开始自己的Midjourney了吗?我已经准备好了!让我们开始创作吧

Prompt:
photography | living room | bright daylight | Camera: Nikon D850 | close-up view | Effects: water drops | surrounded by falling leaves --c 50 --s 1000 --ar 16:9

img


关于Midjourney的其他文章:






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



Midjourney高级技巧的极简教程

原文:An advanced guide to writing prompts for Midjourney ( text-to-image)

作者:Lars Nielsen

How to write prompts for Text to Image generation by Midjourney , text prompt , #midjourney prompt engineering

Midjourney生成的图像,文本Prompt:beautiful, fantasy city unreal engine

一句话介绍midjourney ?

对于那些还没有听说过Midjourney的人,这里是一个简短介绍:Midjourney是一款文本到图像生成应用程序,类似于OpenAI的DALLE-2和Stable Diffusion的DreamStudio,它使用互联网上发现的大量图片(约6.5亿张)来根据提供的文本提示生成令人惊叹的图像。目前处于测试阶段 - 但每周都在添加更多功能…未来还有很多想象空间!(当前他们的AI引擎为v5.1)

原始的prompt

如果您使用 midjourney 应用程序,则会知道您在文本中越详细描述,输出结果就越生动独特。用户通常使用原始和直接的提示词语,例如:a cowboy wearing a tuxedo on the moon(一个穿着礼服在月球上骑马的牛仔)”,将生成这样的内容:

A guide to writing text prompts for Midjourney , prompt engineering

但是除了简单的原始prompt文本之外,还有更多选项可以创建可预测和一致的图像输出!

现在直接进入文本提示的高级选项列表!

以下是您可以生成图像变体的一些方法以及相应的高级设置:(每个设置的详细信息在列表下方)

  1. 提供风格关键字 — ‘style’
  2. stylize(美化)
  3. chaos(随机性)
  4. Resolution
  5. Aspect ratio(长宽比)
  6. 将图像作为URL prompt上传
  7. 应用权重到图像prompt。
  8. 为某些词加权
  9. 过滤掉某些词

简而言之,您的风格受到所选关键词的影响——您可以指定选择何种类型的风格——此图显示了风格类型的广泛分类。

guide to writing prompts for Midjourney — style groups , prompt engineering

  1. Style — keyword

提供一组与“style”(风格)相关的prompt关键词,可以根据您选择的风格类型创建不同的输出。以下是一些基于您可能想要选择为样式的艺术形式/设计/艺术家/流派的关键词和子类型:

  • 使用不同的设计流派作为style(风格)关键字

A guide to writing text prompts for Midjourney. Text to image generation . Different artist styles , prompt engineering

  • 使用艺术家名称作为style(风格)关键字

您还可以将艺术家指定为样式输出。以下是一些相同prompt的示例:

1
/imagine horse galloping at sunset painting Andy Warhol style

A guide to writing text prompts for Midjourney. Text to image generation . Different artist styles Da Vinci , Salvador Dali

  • 使用渲染/光线属性作为style(样式)关键词

A guide to writing text prompts for Midjourney. Text to image generation . Different artist styles

2. stylize the output(美化输出)

您可以添加设置--s <某个数字>(表示样式)

以下图片来自相同的提示 - 低和高风格化选项。

1
/imagine firefighters --s 6000

A guide to writing text prompts for Midjourney. Text to image generation . stylize option

3. chaos — 提高抽象程度

接受0到100之间的数字,以增加或减少主题中的抽象程度。

1
/imagine Eiffel tower --chaos 60

A guide to writing text prompts for Midjourney. Text to image generation . Different options , chaos

4. Resolution(分辨率)

为了指定输出分辨率,您可以使用一些常用的关键词,如8K、4K、逼真、超逼真、超详细复杂细节等。

或者您也可以选择标准设置以获得可预测的输出。hdquality / --q 是其中两个设置指令。

1
2
/imagine red rose flower --hd
/imagine red rose flower --quality 5

5. Aspect ratio(长宽比)

你可以指定输出图像的宽高比,这被称为纵横比。默认输出是一个正方形图像(1:1 纵横比)。但如果你想要更具电影感的视角——或者只是想制作一张适合笔记本电脑桌面的壁纸,你可以改变纵横比。

1
/imagine jasmine in the wild flower --ar 4:3

如果您想指定自定义图像大小,请使用以下示例。

1
/imagine jasmine in the wild flower --w 600 --h 300

您无法指定自定义的宽高比,但可以指定一些标准的宽高比以及一些非标准的宽高比!(以下是一些示例)

A guide to writing text prompts for Midjourney. Text to image generation . Aspect ratio

6. Image as a prompt

如果您想要在多张图片上获得类似图像风格的输出(当您需要获得一致的输出时),请传递一个图像的URL。

1
/imagine http://www.imgur.com/Im3424.jpg box full of chocolates

生成的图像将同时参考种子图像(来自您传递的URL)和文本prompt。

  • 您可以提供多张图片作为prompt

  • 您可以为这些图片指定权重(请参见下一条)

7. 为图片加权(重)的prompt

如果您希望输出结果更接近于您的提示图像(减少midjourney自己的想象力,请参见上一点),则应该给予该图像更高的权重。 (keyword : --iw <number>) .

1
/imagine http://www.imgur.com/ks34f24.jpg chocolates --iw:4

8. 为prompt中的文本加权

1
/imagine wild animals tiger::2 zebra::4 lions::1.5

9. 从图像中过滤掉词语

使用 --no 关键字来丢弃任何不想要的主题。

1
/imagine KFC fried chicken --no sauce

A guide to writing text prompts for Midjourney. Text to image generation . Negative prompt text

10. 最后,这里有一些你可以尝试使用的有趣关键词

1
2
3
4
5
6
7
Sony Alpha α7, ISO1900, Leica M = 指定任何镜头类型或相机类型。

photorealistic(逼真照片级别) , ultra photoreal(超逼真) , ultra detailed(超详细), intricate details(错综复杂的细节) = 为了指定一些可能的细节和更加现实而不是艺术化的外观。

unreal(虚幻) = 指定虚幻引擎的感觉。

volumetric light(立体光) , cinematic lighting(电影级照明) = 指定一些光线条件。

最后

我们谈论了如何在中途实验的输出图像上获得一定程度的控制。但这还不够。Midjourney 的工作人员为您留下了很大的想象和实验空间。祝您尝试不同的提示并享受创造过程。

译者注:本站后续会提供更多Midjourney相关的文章,包括最新的v5.1的官方教程、一些特殊技巧(模特换衣、家居设计、人物制作等),以及色彩搭配等方面的内容,敬请期待!


关于Midjourney的其他文章:






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



使用GFPGAN将Midjourney生成的人脸精细化

原文:Taking generated Midjourney (MJ) images to the next level

作者:Lars Nielsen

关于本文

本文将简要介绍使用midjourney生成更逼真的合成人脸的操作流程。

糟糕的面部重建

任何使用Midjourney创建涉及人脸图像的人都非常清楚,当涉及到人脸时,使用Midjourney生成的图像效果很差。

例如-下面的图片是使用Midjourney应用程序(升级版)生成的,几乎每个逼真的人脸图像最终都会变形。

text-to-image generation using midjourney #midjourney

由midjourney生成的图像:不良面部构造示例(1)

Restoring face images for text-to-image generation using midjourney

由midjourney生成的图像:不良面部构造示例 (2)

一条面部修复流水线

为了减少面部重建的畸变并使其更有用,这里提供一个快速的图像生成流水线供您尝试 —

text-to-image generation pipeline using midjourney and GFPGAN

使用GFPGAN进行人脸修复的图像生成流程

步骤1:提供一个图片链接作为您的图像prompt,在您的文本prompt中。通过此处的链接学习如何进行高级文本提示生成。(Midjourney写作提示的高级指南)

步骤2:使用关键词和属性进行细化。

步骤3:将经过细化处理后的图像输入GFPGAN。

步骤4:您可以将这个新恢复的图像反馈到图像提示中,或在GFPGAN中继续几次迭代。

.. 注意:这可能需要从面部重建软件(GFPGAN)进行几次迭代,因此最好为此创建一个小型Python脚本。

GANS

GANs(生成对抗网络)是一种神经网络,通过迭代尝试多轮比上一次更好的输出来从随机噪声中生成图像(物体、人脸和几乎任何东西)。经过几次迭代后,它们会生成合成图像,这些图像与最初在训练集中存在的真实图像几乎相似。

很遗憾,我们不会详细介绍GAN的工作原理。)你可以在这本精彩的书中学习GAN(《GANs in Action: Deep learning with Generative Adversarial Networks》——Jakub Langr和Vladimir Bok著)。

GFPGAN(生成式面部先验GAN)

GFPGAN是一种专门用于恢复人脸的GAN实现。正如他们网站上所提到的,他们

它是开源的,可以在这里获取。 (https://github.com/TencentARC/GFPGAN )

但是对于那些没有支持GPU的机器或不太懂技术(万一你遇到了一些需要修复错误的麻烦),这里有GFPGAN在Hugging Face Spaces上的实现。链接在这里 - https://huggingface.co/spaces/akhaliq/GFPGAN

回到midjourney

这里是我们从midjourney恢复的一些真实输出样本。

Image generated by text prompt through midjourney , facial restoration by GFPGAN

通过midjourney文本提示生成的图像,使用GFPGAN进行面部修复

Image generated by text prompt through midjourney , facial restoration by GFPGAN

通过midjourney文本提示生成的图像,使用GFPGAN进行面部修复

Image generated by text prompt through midjourney , facial restoration by GFPGAN

通过midjourney文本提示生成的图像,使用GFPGAN进行面部修复

有潜力创造出惊人的面部图像

以下是通过midjourney生成的一些人脸图像 - 经过几次迭代。

Sample faces generated and iterated through midjourney + GFPGAN face restoration


关于Midjourney的其他文章:






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



使用Midjourney制作专业级LOGO

原文:Best Logo Prompts for Midjourney V5 AI Image Generator: Blueprint for Amazing Logo included!
作者:Michael King

今天我们将探索一些超棒的提示,帮助你使用最新版本、最强大的Midjourney,像专业人士一样轻松制作出独特、引人注目的标志!


但等等,还有更多!作为这个美妙蛋糕上的额外樱桃,我还会提供一个Blueprint模板,您可以混合、匹配和调整它来创建自己的标志设计杰作。请耐心阅读本文直到最后,因为那里将会有这个时髦的Blueprint。

logo制作的魔法开始了

Prompt:
Design of abstract logo featuring a dog in blue on a pink background. Include lines as an additional design element. --v 5

Prompt:
Design of sketchy logo featuring a bird in green on a blue background. Include pattern as an additional design element. --v 5

Prompt:
Design of professional logo featuring a leaf in green on a brown background. Include curves as an additional design element. --v 5

Prompt:
Design of professional logo featuring a leaf in green on a brown background. Include curves as an additional design element. --v 5

Prompt:
Design of professional logo featuring a leaf in green on a brown background. Include curves as an additional design element. --v 5

Prompt:
Design of sketchy logo featuring a queen in black on a silver background. Include highlights as an additional design element. --v 5

Prompt:
Design of professional logo featuring a fish in yellow on a purple background. Include circle as an additional design element. --v 5

Prompt:
Design of sketchy logo featuring a knight in purple on a black background. Include texture as an additional design element. --v 5

Prompt:
Design of wild logo featuring a heart in multicolored on a red background. Include square as an additional design element. --v 5

Prompt:
Design of futuristic logo featuring a spaceship in white on a brown background. Include star as an additional design element. --v 5

Prompt:
Design of whimsical logo featuring a cat in silver on a gold background. Include diamond as an additional design element. --v 5

Prompt:
Design of vintage logo featuring a star in gray on a blue background. Include pattern as an additional design element. --v 5

Prompt:
Design of professional logo featuring a triangle in pink on a gold background. Include pattern as an additional design element. --v 5

Prompt:
Design of professional logo featuring a computer in blue on a yellow background. Include highlights as an additional design element. --v 5

Prompt:
Design of futuristic logo featuring a cat in purple on a gray background. Include hexagon as an additional design element. --v 5

Prompt:
Design of fancy logo featuring a galaxy in green on a gold background. Include pattern as an additional design element. --v 5

Prompt:
Design of futuristic logo featuring a zombie in green on a purple background. Include pattern as an additional design element. --v 5

Prompt:
Design of abstract logo featuring a skull in blue on a white background. Include highlights as an additional design element. --v 5

Prompt:
Design of playful logo featuring a bird in black on a black background. Include moon as an additional design element. --v 5

Prompt:
Design of watercolor logo featuring a circle in black on a purple background. Include geometric shapes as an additional design element. --v 5

现在,正如承诺的那样,这是我之前提到的超级棒的蓝图模板。使用这个家伙作为起点,并进行自定义以创建一个独一无二的标志:

Prompt Blueprint:

Design of [style风格] logo featuring a [symbol标志] in [color颜色] on a [background背景] background. Include [additional_element额外元素] as an additional design element.

这是一个Logo设计prompt的主要公式,使用下面的 YAML 内容替换方括号中的元素。

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
style:  
- modern
- minimalist
- vintage
- retro
- fun
- futuristic
- abstract
- cartoon
- geometric
- hand-drawn
- typographic
- tribal
- text-based
- illustrative
- photorealistic
- 3D
- grunge
- sketchy
- watercolor
- comic
- cute
- fancy
- feminine
- masculine
- playful
- professional
- simple
- traditional
- trendy
- vibrant
- whimsical
- wild
symbol:
- star
- circle
- triangle
- square
- heart
- diamond
- moon
- hexagon
- leaf
- tree
- wave
- cloud
- sun
- skull
- deer head
- lion head
- bear head
- cat
- dog
- car
- train
- pizza
- coffee cup
- coffee bean
- cupcake
- ice cream cone
- computer
- phone
- camera
- book
- rocket
- airplane
- house
- castle
- sword
- crown
- flower
- bird
- fish
- butterfly
- dragon
- unicorn
- mermaid
- alien
- robot
- spaceship
- planet
- galaxy
- zombie
- ghost
- witch
- wizard
- knight
- princess
- queen
- king
- wheel
- gear
- clock
color:
- red
- orange
- yellow
- green
- blue
- purple
- pink
- brown
- black
- white
- gray
- silver
- gold
- multicolored
background:
- red
- orange
- yellow
- green
- blue
- purple
- pink
- brown
- black
- white
- gray
- silver
- gold
- multicolored
additional_element:
- gradient
- shadow
- border
- pattern
- texture
- geometric shapes
- lines
- curves
- highlights
- 3d effects
- star
- circle
- triangle
- square
- heart
- diamond
- moon
- hexagon

大家看到了吗!有了这些技巧、诀窍和超棒的蓝图,你就可以用Midjourney V5 AI图像生成器征服标志设计世界。记住,熟能生巧,所以不要害怕尝试并让你的创造力奔放!

但在你开始创作标志杰作之前,请帮我一个忙关注我的频道。我承诺会继续提供最新的技巧和诀窍,让您娱乐和知情。

愉快的设计,下次再见并保持好奇心!

作为对您耐心的小小奖励,这里有一个Python脚本,可以动态随机地创建标志提示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import random  
import yaml


def get_options(file_path):
with open(file_path, 'r') as file:
options = yaml.load(file, Loader=yaml.FullLoader)
return options

input_data = get_options('input.yaml')

command = input_data['command']
for key in input_data.keys():
if key != 'command':
command = command.replace(f'[{key}]', input_data[key][random.randint(0, len(input_data[key]) - 1)])

print(command)

关于Midjourney的其他文章:






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



一分钟制作Chatgpt插件

员外注释:Wolfram的ChatGPT插件貌似是目前最好的几个ChatGPT Plugin之一,这篇文章从动手实现,到我意想不到的反向操作电脑(这还可以延伸到各类硬件),最后说原理,对于开发Plugin的开发者应该有一些帮助。

中文译文:ChatGPT的即时插件:介绍Wolfram ChatGPT插件套件

英文原文:Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin Kit

Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin Kit

在一分钟内构建一个新插件…

几周前,我们与OpenAI合作发布了Wolfram插件,使ChatGPT可以使用Wolfram语言和Wolfram|Alpha作为工具,在ChatGPT内部自动调用。可以将其视为向ChatGPT添加广泛的“计算超能力”,从而让它获得 Wolfram语言和Wolfram|Alpha中所有通用的计算功能和计算知识。

但是如果您想制作自己的特殊插件,进行特定的计算或者访问仅在您自己的电脑或电脑系统上可用的数据或服务怎么办呢?今天,我们发布了第一个版本的开发套件来实现这一点。借助整个Wolfram Language技术栈构建,并且我们已经成功地使整个过程变得非常简单——至少基本定制 ChatGPT 插件现在只需要不到一分钟就可以轻松部署。

需要进行一次(非常简单)设置-验证OpenAI身份并安装Plugin Kit。然后你就可以开始创建你的第一个插件。

要运行这里的示例,您需要:

  • 开发者可以访问ChatGPT的OpenAI插件系统

  • 可以访问Wolfram语言系统(包括免费的Wolfram Engine for Developers、Wolfram Cloud Basic等)

  • 您现在还需要使用PacletInstall[“Wolfram/ChatGPTPluginKit”]安装ChatGPT Plugin Kit(插件套件)。

这是一个非常简单的例子。假设你为一个单词创造了一个“强度”的概念,将其定义为“字母数字”的总和(“a”为1,“b”为2等)。在 Wolfram 语言中,您可以计算如下:

img

而且作为十多年来的标准,您可以立即将这样的计算部署为 Wolfram Cloud 中的 Web API——可通过 Web 浏览器、外部程序等立即访问:

img

但是现在有一种新的部署形式:作为ChatGPT的插件。首先,您需要获取插件工具包:

img

然后您就可以立即部署您的插件了。只需要:

img

最后一步是您需要告诉ChatGPT有关您的插件。在Web界面中(按照当前配置),选择“Plugins > Plugin store > Develop your own plugin”(“插件”>“插件商店”>“开发自己的插件”),并将来自ChatGPTPluginDeployment的URL插入到你的对话框中 (通过点击复制按钮获取 img) :

ChatGPT plugin dialog

现在一切准备就绪。您可以开始与ChatGPT谈论“单词强度”,它将调用您的插件(默认情况下称为“WolframCustom”)来计算它们:

img

展开这个对话气泡,可以了解ChatGPT与插件之间的通信:

img

没有插件,它就不知道“字母强度”是什么。但有了插件,它就能够做出各种(相当惊人的)事情——比如这样:

img

关于角马属性的修饰很迷人,但如果打开聊天气泡,就可以看到它是如何得出答案的——它只是开始尝试不同的动物(“狮子”,“斑马”,“角马”):

img

软件工程师会立即注意到,我们设置的插件正在本地主机上运行,也就是在您自己的计算机上执行。正如我们将要讨论的那样,这通常是一件非常有用的事情。但是您也可以使用Plugin Kit创建纯粹在Wolfram Cloud(或者阿里云/腾讯云/华为云…)中执行的插件(例如,您不必在计算机上安装Wolfram Engine)。

你所要做的就是使用ChatGPTPluginCloudDeploy——然后你会得到一个Wolfram Cloud中的URL,你可以告诉ChatGPT这个插件的位置:

img

实际上,您可以直接在网络浏览器中完成整个设置过程,无需进行任何本地 Wolfram 安装。只需在 Wolfram Cloud 中打开一个笔记本,并从那里部署您的插件即可:

Wolfram Cloud notebook

让我们来做一些其他的例子。接下来,让我们发明一个“地理影响圆盘(geo influence disks)”的概念,然后部署一个插件来呈现这样的东西(稍后我们将谈论一些正在进行的细节):

img

现在我们可以安装这个新插件,然后开始向ChatGPT询问“地理影响圆盘(geo influence disks)”:

img

ChatGPT 成功调用了插件,并返回了一张图片。有趣的是,它猜测(事实上是正确的)“地理影响圆盘”应该是什么意思。请记住,它无法看到图片或读取代码,因此它的猜测只能基于 API 函数名称和提出的问题。当然,在调用 API 函数时,它必须有效地理解至少一点内容——x 应该表示位置,而 radius 则表示距离。

再举个例子,我们来制作一个插件,可以向用户(即部署插件的人)发送短信:

img

现在只需要说“发送一条信息…”(“send me a message…”)

img

一条短信将会到达——在这种情况下,它还带有ChatGPT的小装饰:

Rhinoceros alert

这是一个插件,它还会发送提到的动物的“警报图片”:

img

是的,需要许多技术才能实现这一点:

img

Gnu alert

作为另一个例子,让我们创建一个插件来检索我的个人数据——这里是我在 Wolfram databin数据中积累了数年的心率数据:

img

现在我们就可以使用ChatGPT来对这些数据提出自己的问题了:

img

而且,如果安装了主要的Wolfram插件,我们可以通过ChatGPT的“语言用户界面”立即对这些数据进行实际计算:

img

这个例子使用了 Wolfram Data Drop 系统。但是,我们也可以用类似 SQL 数据库(关系型数据库)的东西来做同样类型的事情。如果你已经设置好插件以访问私有数据库,那么通过 ChatGPT 和 Wolfram 插件真正令人惊叹的事情就能够实现。

通过Plugins(插件)操控你的电脑

当您通过ChatGPT的标准Web界面使用它时,ChatGPT是在OpenAI的服务器上运行。但是,通过插件,您可以“回溯”——通过您的Web浏览器——以使事情发生在自己的本地计算机上。我们稍后将讨论这个“引擎盖下”的工作原理,但现在可以说一下:当您使用ChatGPTPluginDeploy(而不是ChatGPTPluginCloudDeploy)部署插件时,在插件中实际运行的Wolfram语言代码将在本地计算机上运行。因此,这意味着它可以访问计算机上的本地资源,如摄像头、扬声器、文件等。

例如,这里我正在设置一个插件来使用我的计算机摄像头拍照(使用 Wolfram 语言的 CurrentImage[ ] 函数)—然后将图片与我指定的任何颜色混合(我们稍后会讨论 CloudExport 的用法):

img

安装插件后,我对ChatGPT说:“想象一下我穿着绿色的衣服!”然后,ChatGPT会立即调用插件,让我的电脑拍摄我的照片,并将其与绿色混合(包括我的“我不知道这是否有效”的表情):

译者:这真的好吗???

img

好的,让我们尝试一个稍微复杂一些的例子。在这里,我们将创建一个插件来让ChatGPT在我的电脑上打开笔记本,并开始写入内容。为了实现这一点,我们将定义几个API端点(并将整个插件命名为“NotebookOperations”):

img

首先,让我们告诉ChatGPT创建一个新笔记本

img

然后在我的屏幕上弹出了一个新的笔记本:

My cat notebook

如果我们查看从中部署插件的 Wolfram 语言会话中的符号 nb,我们将发现它是由 API 设置的:

img

现在让我们使用其他的API端点向笔记本添加内容:

img

这就是我们可以获得的结果:

Cat pictures

这段文字是由ChatGPT编写的;图片则来自于网络图像搜索。 (我们也可以使用Wolfram语言中的新ImageSynthesize[]函数制作全新的猫咪图片。)

最后,让我们请ChatGPT展示一张用CurrentNotebookImage从电脑屏幕上捕捉到的笔记本截图:

img

我们还可以添加另一个端点,使用CloudPublish将笔记本发布到云中,并可能通过电子邮件发送URL。

我们可以将前面的示例视为在笔记本中累积结果。但是我们也可以只在Wolfram语言符号的值中累积结果。这里,我们将符号“result”初始化为空列表。然后,我们定义了一个API来附加到此列表,但是给出了提示,仅当有单词结果时才执行此附加操作:

img

让我们为ChatGPT设置一个“练习”:

img

此时,result仍为空:

img

现在让我们来问第一个问题:

img

ChatGPT并不会直接显示答案。但它会调用我们的API并将其附加到result中:

img

让我们来问问另一个问题:

img

现在 result 中包含了两个答案:

img

如果我们在笔记本中放置Dynamic[result],每当ChatGPT调用API时,我们会看到它动态地改变。

在最后一个例子中,我们从ChatGPT内部修改了符号的值。如果我们感觉勇敢,可以让ChatGPT评估计算机上的任意代码,例如使用调用ToExpression的API。但是,是的,赋予ChatGPT执行自己制作的任意代码的能力似乎会使我们面临某种“天网风险”(并使我们更加想知道“AI宪法”之类的事情)。

但比执行任意代码更安全的做法是让ChatGPT有效地“四处查找”我们的文件系统。让我们设置以下插件:

img

首先,我们设置一个要操作的目录:

img

现在让我们问ChatGPT关于那些文件:

img

使用 Wolfram 插件,我们可以让它制作这些文件类型的饼图:

img

现在我们要求它做一些非常“LLM-ey”的事情,并总结每个文件的内容(在API中,我们使用Import导入文件的纯文本版本):

img

还有很多事情可以做。这里有一个插件,可以计算从您的电脑到服务器的ping时间:

img

img

或者,作为另一个例子,您可以设置一个插件来创建定时任务,在指定的时间提供电子邮件(或短信等)提醒:

img

ChatGPT 负责认真排队任务:

img

然后,每隔大约10秒钟,我的邮箱里就会弹出一个(也许有些可疑的)动物笑话:

Animal jokes

最后一个例子,让我们考虑一下在我的电脑上播放曲调的本地任务。首先,我们需要一个能够解码音符并播放它们的插件(”ChatGPTPluginDeploy”用于告诉ChatGPT插件已经完成了工作——因为ChatGPT本身无法知道这一点):

img

在这里,我们给ChatGPT想要的音符——是的,这立即在我的电脑上演奏出来:

img

现在,作为对一位著名虚构人工智能的致敬,让我们尝试演奏另一首曲子:

img

是的,ChatGPT整理了一些笔记,并将它们打包到插件中;然后插件播放了它们:

img

依然可以运行:

img

但是…等一下!那是什么曲调?ChatGPT似乎还不能像HAL那样(可疑地)宣称:

“没有[HAL] 9000电脑曾经犯过错误或扭曲信息。按任何实际定义的词语,我们都是防错和无误的。“

说说工作原理【敲黑板】

我们现在已经看到了许多使用ChatGPT插件工具包的示例。但是它们是如何工作的?底层是什么?当您运行ChatGPTPluginDeploy时,实际上正在设置一个Wolfram语言函数,可以从ChatGPT内部调用该函数,以便在需要时使用。为了使这个过程顺利进行,需要使用Wolfram语言独特能力的广泛谱系,并与ChatGPT中某些“聪明”的功能相结合。

从软件工程角度来看,ChatGPT插件基本上就是一个或多个Web API(连同告诉ChatGPT如何调用这些API的“清单”)。那么如何在Wolfram语言中设置Web API呢?十年前我们发明了一种极其简单易行的方法。

像Wolfram语言中的所有内容一样,Web API也由符号表达式表示,在这种情况下形式为APIFunction[…]. 那么APIFunction里面有什么呢?其中有两个部分:一段实现所需功能的Wolfram Language代码和规范说明,在将字符串传递给APIFunction之前应该如何解释这些字符串(例如来自Web API)。

以下是一小段 Wolfram Language 代码, 在此案例中用于否定颜色并使其变浅: =>

img

如果我们愿意,我们可以将其重构为一个应用于两个参数的“纯函数”:

img

纯函数本身只是一个符号表达式,它会被计算为其自身:

img

如果需要的话,我们可以给纯函数的参数命名,并将它们与其名称作为键一起提供到一个关联 (img) :

img

但是假设我们想要从 Web API 调用我们的函数。Web API 中的参数始终为字符串。那么,如何将字符串(例如“lime green”)转换为 Wolfram 语言可以理解的符号表达式呢?好吧,我们必须使用 Wolfram 语言的自然语言理解能力。

以下是一个示例,其中我们正在说希望将字符串解释为颜色:

img

那个颜色样本到底是什么?就像 Wolfram 语言中的其他所有内容一样,它只是一个符号表达式:

img

好的,现在我们准备将所有内容打包成APIFunction。第一个参数表示我们要表示的API有两个参数,并描述了我们希望如何解释这些参数。第二个参数给出了实际的Wolfram语言函数,该API计算它们。单独使用,APIFunction只是一个符号表达式,其本身就可以评估:

img

但如果我们为参数提供值(这里使用关联),它将被计算:

img

目前,所有这些都只是在我们的 Wolfram 语言会话中发生。但要获得实际的 Web API,我们只需“云部署”APIFunction

img

现在我们可以从Web浏览器中调用此Web API:

Web API

是的,那就是符号表达式的结果。如果我们想要一些可视化的东西,我们可以告诉APIFunction将其结果作为PNG输出:

img

现在它将显示为网络浏览器中的图像:

Purple box in web browser

(请注意,CloudDeploy 部署的 Web API 默认情况下权限设置为只有我可以运行。如果使用 CloudPublish,则任何人都可以运行它。)

好的,那么我们如何设置我们的 Web API 以便作为 ChatGPT 插件调用呢?一个直接的问题是,在最简单的级别上,ChatGPT 只处理文本,因此我们必须将结果转换为文本。所以让我们进行一些 Wolfram 语言编程来实现这个目标。以下是 Wolfram 知识库中常见颜色值和名称列表:

img

当然,我们也知道许多其他命名颜色的集合,但在这里不必担心它们:

img

现在我们可以使用Nearest函数来找到最接近我们所得颜色的常见颜色:

img

现在让我们将其放入APIFunction中(这里我们已经“图标化”了颜色列表;我们也可以定义一个单独的函数来查找最近的颜色,它会自动随CloudDeploy一起带来):

img

现在我们已经准备好使用ChatGPTPluginDeploy了。 ChatGPT插件的工作方式是,我们必须为与我们的API对应的“端点”命名。 这个名称以及我们在API中用于参数的名称将被ChatGPT用来确定何时以及如何调用我们的插件。 但在这个例子中,我们只想为端点使用某种唯一名称,这样我们就可以在聊天中引用它而不会让ChatGPT将其与其他内容混淆。 所以让我们称之为ColorMangle。 现在让我们进行部署:

img

到目前为止,我们关于APIFunction及其调用的所有内容在ChatGPTPluginDeploy和ChatGPTPluginCloudDeploy中都是相同的。但接下来要说的就不同了。因为ChatGPTPluginDeploy设置API函数在本地计算机上执行,而ChatGPTPluginCloudDeploy则将其设置为在Wolfram Cloud(或Wolfram Enterprise Private Cloud等)上运行。

本地部署和云端部署都有优缺点。在本地运行可以让您获得计算机的本地功能,如相机、文件系统等。在云端运行则允许其他人也能运行您的插件(但目前除非您将插件注册到OpenAI,否则一次只有有限数量的人能安装您的插件)。

好吧,让我们来谈谈本地插件部署。ChatGPTPluginDeploy 在您的计算机上有效地设置了一个最小化 Web 服务器(使用10行 Wolfram 语言代码实现),在 ChatGPTPluginDeploy 选择的端口上运行,并且每当它收到对 API URL 的请求时调用 Wolfram 引擎与您的 API 函数进行交互。

这是 ChatGPTPluginDeploy 正在使用的操作系统套接字(是的,Wolfram 语言将套接字——像其他所有东西一样——表示为符号表达式):

img

好的,但是ChatGPT怎么知道你的API呢?首先,您需要通过ChatGPT UI的 Plugins > Plugin store > Develop your own plugin(插件>插件商店>开发自己的插件)告诉它您正在使用的端口。您可以通过单击ChatGPTPluginDeployment对象中的 img 图标或以编程方式找到端口:

img

您输入此URL,然后告诉ChatGPT“查找清单文件”:

Find manifest file

让我们看一下它找到了什么:

img

这是一个“清单”,它告诉插件安装程序的相关信息。我们没有指定太多内容,所以大部分都是默认值。但清单中重要的一部分是提供API规范URL的部分:http://localhost:59353/.well-known/openapi.json

访问该URL后,我们可以找到这个“OpenAPI规范”:

Validated OpenAPI spec

最后,点击Install localhost plugin,该插件将出现在您的ChatGPT会话中已安装插件列表中

img

当ChatGPT启动时安装了插件,它的“系统提示”中会包含一个额外的部分,让它可以“学习”如何调用该插件:

System prompt

现在我们可以开始使用这个插件了:

img

是的,它有效。但这里有一些魔法。ChatGPT不得不“拆开”我们所要求的内容,意识到API端点称为ColorMangle是相关的,然后确定其颜色参数应该是“青柠绿”,级别应该是“0.5”。打开盒子,我们可以看到它所做的:

img

现在我们可以开始在其他地方使用“颜色混合”——尽管ChatGPT急于告诉我们,“颜色混合”是一种“虚构的操作”,可能是为了避免被指责不尊重某个国家的旗帜颜色:

img

在我们处理的这个案例中,ChatGPT成功地将文本片段正确“连接”到API中的适当参数。而且它是从我们为参数使用的名称(以及我们给出的端点名称)所获得的信息碎片中实现了这一点(相当惊人)。

但有时候我们需要告诉它更多信息,我们可以通过在ChatGPTPluginDeploy内指定插件提示来实现:

img

现在我们不仅需要谈论颜色:

img

起初,它没有成功地“解开”“冰岛的颜色”,但后来它纠正了自己,并得到了答案。(是的,如果我们写一个更好的提示,也许我们本可以避免这种情况。)

实际上,您可以提供多个级别的提示。您可以为整个插件包括一个相当长的提示。然后,您可以为每个单独的API端点提供较短的提示。最后,您可以通过将“color”→ “Color”替换为类似于以下内容来帮助ChatGPT解释API中单个参数:

img

当您设置插件时,它可以包含许多端点,执行不同的操作。此外,在共享提示之外,这特别方便的原因之一是(出于安全原因),任何给定子域只能有一个关联的插件。因此,如果想要具有各种功能,则必须通过使用不同的端点来实现。

对于ChatGPTPluginCloudDeploy,每个子域仅限一个插件意味着任何给定用户一次只能部署一个云插件。但对于本地插件规则略有不同,并且ChatGPTPluginDeploy可以通过在不同端口上运行它们来部署多个插件-事实上,默认情况下ChatGPTPluginDeploy每次调用时都会选择随机未使用的端口。

但是本地插件如何工作?它如何“回到”您的计算机?魔法基本上发生在ChatGPT Web前端中。所有插件工作方式都是当将要调用该插件时,LLM逐标记生成过程停止,并且“外循环”的下一个动作是调用该插件-然后将其提供给LMM在下一步中将添加到字符串中。好吧,在本地插件的情况下,“外循环”使用聊天窗口前端中JavaScript向指定了localhost 端口 的计算机发送请求。(顺便说一下,一旦ChatGPTPluginDeploy打开端口,它将保持打开状态,直到您在其套接字对象上明确调用Close。)

当使用本地插件时,它们在部署插件的Wolfram语言会话中运行其Wolfram语言代码。这意味着例如(如我们在某些情况下看到的那样),设置的值在进行另一个调用时仍然存在。

在云中,它不会立即以这种方式工作,因为每个API调用实际上是独立的。但是可以轻松地将状态保存在云对象中(例如使用CloudPutCloudExpression等)以便可以跨多个API调用具有“持久性内存”。

ChatGPT内部的LLM(目前)仅设置为处理文本。那么图像怎么办?好吧,插件可以将它们放入Wolfram Cloud中,并将其URL传递给ChatGPT。 ChatGPT已经设置能够直接呈现特定类型的东西-如图像。

因此-正如我们上面所看到的-要从插件“输出”图像(或几个图像),我们可以使用CloudExport将每个图像放入云对象中,在PNG格式中进行操作。然后ChatGPT可能需要一些提示来显示嵌入式输出中的图片。

部署Wolfram Language插件于ChatGPT中存在一些稍微棘手的“管道”,其中大部分在ChatGPTPluginDeployChatGPTPluginCloudDeploy中自动处理。但是通过基于Wolfram语言的基本符号结构(及其集成部署功能)来构建,可以非常简单地为ChatGPT创建复杂的自定义Wolfram语言插件,并为LLM和Wolfram语言周围不断发展的生态系统做出贡献。






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



适合全栈工程师的7个网页设计技巧

这是一篇帮助非专业网页设计师快速改善设计感的文章,7个设计技巧,对于全栈工程师也是非常有用的。

这里是原文链接

每个网页开发者都不可避免地会遇到需要做出视觉设计决策的情况,无论他们是否喜欢。

也许你所在的公司没有全职设计师,需要自己实现新功能的用户界面。或者你正在进行一个副业项目,并且想要它看起来比其他基于Bootstrap的网站更好。

很容易就会放弃并说:“我永远无法做出好看的东西,我不是艺术家!”但事实证明,有很多技巧可以提升你的工作水平,而这些技巧并不需要具备图形设计背景。

以下是七个简单的想法,可以用来改善你今天的设计。

1.使用颜色和粗细来创建层次结构,而不是字体大小

1_KYZikUrx9F02cJU9kpn_gQ

在设计 UI 文本时,常见的错误是过度依赖字体大小来控制层次结构。

“这段文本重要吗?让它变大一点。”

“这段文本次要吗?让它变小一点。”

与其完全依靠字体大小,不如尝试使用颜色或者字重来完成同样的工作。

“这段文本重要吗?让它加粗。”

“这段文本次要吗?用浅色调。”

尽量只使用两到三种颜色:

  • 一个深(但不是黑)的颜色用于主内容(例如文章标题)
  • 一个灰色用于辅助内容(例如文章发布日期)
  • 一个浅灰色用于附属内容(例如页脚版权声明)

1_2YuCOOCjdMEJxg-Lb6G2FA

同样,对于 UI 设计工作来说,通常只需要两种字重:

  • 大多数文本使用普通字重(400 或 500,具体取决于字体)
  • 强调文本使用较粗的字重(600 或 700)

1_AHrVF0vTtj-yoyhmBNHNLA

在 UI 设计中避免使用小于 400 的字重;它们可以用于大标题,但在较小的尺寸下阅读起来太困难。如果您考虑使用较轻的字重来弱化某些文本,请改用较浅的颜色或更小的字号。

2.不要在有色背景上使用灰色文字

1_ajjrhpp-l3GDG7ne7Am8fw

将文本变成浅灰色是在白色背景下减弱其重要性的好方法,但在有色背景上看起来并不那么好。

这是因为我们实际上看到的效果是灰色对白色的对比度降低了。

让文本更接近背景颜色才能帮助创建层次结构,而不是使它变成浅灰色。

1_CNaej5BrPr9lWTMAfllfdw

当你在使用色彩丰富的背景时,有两种方法可以降低对比度:

1.降低白色文本的不透明度

使用白色文本并降低不透明度。这样可以让背景颜色透过一点,以某种方式减弱文本与背景之间的冲突。

1_OMntEW2V5jPXrZR6CjrBFQ

2.根据背景颜色手动选择一种颜色

当你的背景是图像或图案时,这比降低不透明度更有效;或者当降低不透明度会使文本感觉过于沉闷或褪色时。

1_OMntEW2V5jPXrZR6CjrBFQ

选择与背景相同色调的颜色,通过调整饱和度和亮度使其看起来合适。

3.Offset阴影

1_LisFGBtYOvR-3cwFTzTDUw

不要使用大的模糊和扩散值来使盒子阴影更加明显,而是添加垂直偏移。

这样看起来更自然,因为它模拟了一个从上方照射下来的光源,就像我们在现实世界中习惯看到的那样。

这也适用于内部阴影,例如您可能会在井或表单输入上使用:

1_qWSsYovqBDKF87f1IVMHsQ

如果你对阴影设计感兴趣,Material Design指南是一个很好的入门材料。

4.使用更少的边框

1_fNm6hXxnBvIcHGp9DQRdRQ

当你需要在两个元素之间创建分隔时,尽量不要立即使用边框。

虽然边框是区分两个元素的好方法,但它们并不是唯一的方法。过多地使用边框会让你的设计感觉繁忙和杂乱。

下次当你想要使用边框时,可以尝试以下这些替代方案:

1.使用盒子阴影

盒子阴影可以很好地勾勒出像边框一样的元素,但更加微妙,并且能够达到相同的目标而不会分散注意力。

1_Pm5PyS0vZ65GuGu8erPRfA

2.使用两种不同的背景

给相邻的元素略微不同的背景颜色通常就足以区分它们。如果您已经使用了不同的背景颜色,另外还加上了边框,请尝试去掉边框;也许您并不需要它。

1_9j89WYXMqsnb_A1v8heXaw

3.添加额外的间距

有什么比增加元素之间的距离更好的方法来创建分隔呢?将事物彼此拉得更远是一种非常好的方式,可以在不引入任何新UI的情况下创建元素组之间的区别。

1_7CEsoYdtFPjMBqpDB58HqQ

5.不要把本来应该很小的图标放大

1_57g05Gl-FjDtcCUtaPPOLw

如果你正在设计一些需要大图标的东西(比如一个落地页的“特性”部分),你可能会本能地选择免费的图标集,例如 Font Awesome 或 Zondicons,并将它们的大小增加到符合你的需求。

毕竟,它们是矢量图像,所以如果你增加了它们的尺寸,质量不会受到影响,对吧?

虽然矢量图像确实不会因为尺寸变大而降低质量,但是那些在 16-24 像素下绘制的图标,在放大到原来大小的 3 倍或 4 倍时永远都不会看起来很专业。它们缺乏细节,并且总是感觉过于“粗壮”。

3icons1

如果你只有小图标,可以尝试将它们放在另一个形状内,并给该形状添加背景色:

3icons2

这样可以让您保持实际图标更接近其预期大小,同时填充更大的空间。

如果您有预算,还可以使用专为较大尺寸设计的高级图标集,例如HeroiconsIconic

6.使用重音符号边框为平淡的设计增添色彩

6-1

如果你不是一名平面设计师,那么如何为你的用户界面增添视觉上的吸引力呢?

一个简单的技巧就是在原本感觉有些单调的界面部分添加彩色边框。

例如,在警告信息旁边加上一条彩色边框:

6-01

或者用于突出显示活动导航项:

6-02

甚至可以跨越整个布局的顶部:

6-03

在UI中添加一个彩色矩形并不需要任何平面设计技能,但它可以大大提升你的网站的“设计感”。

挑选颜色有困难吗?试试从像Dribbble这样受限调色板中选择颜色,以避免被传统调色板无尽可能性所压倒。

7.并非每个按钮都需要有背景颜色。

7-1

当页面上有多个用户可以执行的操作时,很容易陷入仅基于语义设计这些操作的陷阱。

像Bootstrap这样的框架在您添加新按钮时会提供一系列语义样式可供选择,从而鼓励了这种行为:

7-2

“这是一个积极的操作吗?把按钮变成绿色。”

“这会删除数据吗?把按钮变成红色。”

语义是按钮设计中重要的一部分,但有一个更重要的维度经常被忽视:层次结构。

页面上的每个操作都处于一个重要性金字塔中。大多数页面只有一个真正的主要操作,几个不太重要的次要操作和几个很少使用的第三级操作。

在设计这些动作时,重要的是传达它们在层次结构中所处的位置。

  • 主要操作应该显而易见。在这里,实心、高对比度的背景颜色效果非常好。
  • 次要操作应该清晰但不突出。轮廓样式或低对比度的背景颜色是很好的选择。
  • 第三级操作应该可以被发现但不会打扰用户。将这些操作设计成链接通常是最好的方法。

7-3

破坏性的操作呢,它们不应该总是红色吗?

并非如此!如果破坏性操作不是页面上的主要操作,则最好将其作为次要或第三按钮处理。

7-4

将大号、红色和加粗的样式保留给那些在界面中作为主要操作的负面行为,例如确认对话框:

7-5






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



HuggingFace Transformers Agent介绍

本文比较了HuggingFace出品的Transformers Agent与LangChain Agent。

原文链接:Hugging Face Transformers Agent 作者:Sophia Yang。

还有一个Youtube视频,如果可以看且英文尚可的朋友可以直接看,视频更清楚。

以下为翻译正文:


就在两天前,Hugging Face发布了Transformers Agent——一款利用自然语言从精选工具集中选择工具并完成各种任务的代理。这听起来很熟悉吧?没错,它与LangChain Tools和Agents非常相似。在本篇博客文章中,我将介绍Transformers Agent以及与LangChain Agent的比较。

Transformers Agents是什么?

简而言之,它在transformers的基础上提供了一个自然语言API:我们定义了一组策划工具并设计了一个代理来解释自然语言并使用这些工具。

我可以想象HuggingFace的工程师们会这样说:我们在HuggingFace上托管了许多令人惊叹的模型。我们能否将它们与LLMs集成?我们能否使用LLMs来决定使用哪个模型、编写代码、运行代码并生成结果?基本上,没有人需要再学习所有复杂的任务特定模型了。只需给出一个任务,LLMs(代理)就会为我们完成一切。

下面是所有步骤:

img

来源: https://huggingface.co/docs/transformers/transformers_agents

  • Instruction:用户提供的prompt
  • Prompt:一个带有具体指令的提示模板,其中列出了多个可用工具
  • Tools:经过筛选的转换器模型,例如Flan-T5用于问答
  • Agent:一个LLM解释问题、决定使用哪些工具,并生成代码以使用这些工具执行任务
  • 受限制的Python解释器:执行Python代码

它是如何工作的?

Step 1: 实例一个agent.

第一步是实例化一个agent。agent只是一个LLM,可以是OpenAI模型、StarCoder模型或OpenAssistant模型。

使用OpenAI模型需要OpenAI API密钥,并且使用不免费。我们从HuggingFace Hub加载StarCoder模型和OpenAssistant模型,这需要HuggingFace Hub API密钥并且免费使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from transformers import HfAgent

# OpenAI
agent = OpenAiAgent(model="text-davinci-003", api_key="<your_api_key>")

from transformers import OpenAiAgent
from huggingface_hub import login
login("<YOUR_TOKEN>")

# Starcoder
agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder")

# OpenAssistant
agent = HfAgent(url_endpoint="https://api-inference.huggingface.co/models/OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5")

Step 2: 运行agent.

agent.run是一种单次执行方法,可以自动选择任务所需的工具,例如,选择图像生成器工具来创建图像。

img

agent.chat 保留聊天记录。例如,在这里,它知道我们之前生成了一张图片,并且可以转换图像。

img

和LangChain Agent有什么不同?

Transformers Agent仍处于实验阶段。它的范围更小,灵活性较低。目前Transformers Agent的主要重点是使用Transformer模型和执行Python代码,而LangChain Agent则“几乎”可以完成所有任务。让我们分解一下比较Transformers和LangChain Agents之间不同组件:

工具集(Tools)

  • HuggingFace Transfomers Agent 拥有一个惊人的工具列表,每个工具都由Transformer模型驱动。这些工具提供了三个重要优势:
    • 1)尽管Transformers Agent目前只能与少数几个工具交互,但它有潜力与超过100,000个HuggingFace模型进行通信。它拥有完整的多模态功能,包括文本、图像、视频、音频和文档;
    • 2)由于这些模型是专门为特定任务而构建的,因此利用它们可能比仅依赖LLMs更直接,并且可以产生更准确的结果。例如,我们可以简单地部署BART来执行文本分类而不是设计LLM的提示来执行该任务;
    • 3)这些工具解锁了LLMs无法完成的功能。以BLIP为例,它使我们能够生成引人入胜的图像标题——这是LLMs所不能做到的。.
  • LangChain工具都是外部API,例如Google搜索、Python REPL。实际上,LangChain通过load_huggingface_tool函数支持HuggingFace工具。LangChain已经可以完成Transformers Agent所能做的一切。另一方面,Transformers Agents也有可能整合所有的LangChain工具。.
  • 在这两种情况下,每个工具都只是一个Python文件。您可以在此处找到Hugging Face Transformers Agent工具的文件,以及LangChain工具的文件。正如您所看到的,每个Python文件包含一个表示一个工具的类。

Agent

  • HuggingFace Transformers Agent使用此提示模板根据工具的描述确定要使用哪个工具。它会要求LLM提供解释,并在提示中提供一些few-shot学习示例。
  • LangChain默认使用ReAct框架来确定基于工具描述要使用哪个工具。该框架在这篇论文中有所描述。它不仅可以做出决策,还提供思考和推理,类似于Transformers Agent使用的解释方式。此外,LangChain有四种代理类型

自定义Agent

在这两种情况下,创建自定义代理并不太困难::

  • 请查看此 Colab 结尾处的 HuggingFace Transformer Agent 示例。
  • 在这里查看LangChain的示例

“Code-execution”

  • Hugging Face Transformers Agent在LLM选择工具并生成代码后,将“代码执行”作为其中一步。这限制了Transformers Agent的目标仅限于执行Python代码。
  • LangChain包括“代码执行”作为其工具之一,这意味着执行代码不是整个过程的最后一步。这提供了更多灵活性,可以根据任务目标来决定如何使用它:可以执行Python代码,也可以像进行Google搜索并返回搜索结果等其他操作。.

结论

在这篇博客文章中,我们探讨了Hugging Face Transformers代理的功能,并将其与LangChain代理进行了比较。我期待着在Transformers代理方面看到更多的发展和进步。

. . .

By Sophia Yang on May 12, 2023

Sophia Yang 是一位高级数据科学家。欢迎在领英推特YouTube上关注她,并加入DS/ML读书俱乐部❤️。






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



Enabling conversational interaction on mobile with LLMs 中文版

译者注:

本文为《Enabling conversational interaction on mobile with LLMs》的中文翻译稿,Google发布的这篇文章对大语言模型在应用侧的发展有很积极的意义。LLM目前还是聚焦在文本上,因为是语言模型啊。但是这篇文章在研究的是如何让LLM看懂UI,并可以和文本内容进行转化相互转换:比如,看到UI内容进行提问、理解屏幕展现的主要内容是什么、让大模型看图阅读理解,还有一个就是像人一样去操作(这个我觉得是RPA的增强版)。

英文原文:Enabling conversational interaction on mobile with LLMs

-------------------------- 以下为正文 ----------------------------

2023年5月12日星期五
由谷歌Research的学生研究员Bryan Wang和研究科学家Yang Li发布

移动设备上的智能助手已经显著提升了基于语言的交互,例如设置定时器、打开手电筒等简单日常任务。尽管取得了进展,但这些助手在支持移动用户界面(UI)中的对话式交互方面仍存在很大局限。例如,无法回答关于屏幕上显示的特定信息的用户问题。助手需要具有图形用户界面(GUI)的计算理解能力,才能实现这种功能。

先前研究调查了几个重要技术构建块,以启用与移动端 UI 的对话式交互,包括为用户总结移动屏幕以快速理解其目的、将语言指令映射到 UI 操作和建模 GUI 使其更适合基于语言进行交互。然而,每个构建块只涉及对话式交互中有限方面,并需要大量精心策划大规模数据集和训练专用模型。此外,在移动 UI 上可能发生各种各样的对话式交互。因此,必须开发一种轻量级、通用化方法来实现对话式交互

在 CHI 2023 上发布《利用大型语言模型实现与移动 UI 的对话式交互》,我们调查了利用大型语言模型(LLMs)实现与移动 UI 的多样化对话式交互的可行性。最近的预训练LLM(如PaLM)已经展示了自适应各种下游语言任务的能力,只需提供少量目标任务的示例即可。我们提出了一套Prompt技术,使交互设计师和开发人员能够快速原型化和测试与用户的新语言交互,从而节省了在投资专用数据集和模型之前的时间和资源。由于 LLMs 只接受文本token作为输入,因此我们贡献了一种生成移动 UI 文本表示形式的新算法。我们的结果表明,该方法使用每个任务仅两个数据示例即可实现竞争性表现。更广泛地说,我们展示了LLMs从根本上改变未来的“会话交互设计”流程的潜力。

LLM4Mobile 1

展示我们在使用LLMs实现移动UI各种对话交互的工作的动画。

通过UI对LLMs提示

通过prompt,LLMs支持上下文少样本学习——而不是为每个新任务微调或重新训练模型,只需使用目标任务的几个输入和输出数据示例即可提示LLM。对于许多自然语言处理任务(例如问答或翻译),少样本prompt的表现与针对每个任务训练模型(穷举)的基准方法效果是差不多的。但是,语言模型只能接受文本输入,而移动端UI却是多模式的,在其视图层次结构数据中包含文本、图像和结构信息(即包含UI元素详细属性的结构化数据)和截图。此外,将移动端屏幕的视图层次结构数据直接输入到LLMs中并不可行,因为它包含过多信息,如把每个UI元素的详细属性等内容都写出来,那可能超过LLMs输入的token长度限制。

为了解决这些挑战,我们开发了一系列让大语言模型(LLMs)可以“看懂”移动端UI的技术。我们提供了一种算法,使用深度优先搜索遍历将Android UI 的视图层次转换成HTML语法生成移动UI 的文本表示形式。我们还利用思维链提示技术,将一些生成的中间结果合理拼接起来,一并推给LLM以得出最终的推理能力。

LLM4Mobile 2

展示使用移动UI进行少样本提示LLMs过程的动画。

我们的快速设计始于一个前言,它说明了prompt的目的。前言后面是多个实例,包括输入、思维链(如果适用)和每个任务的输出。每个实例其实就是一屏(移动端屏幕)的元素转化为HTML的各种语法输入。根据输入,可以提供思维链以引导LLMs进行逻辑推理。由于这一步骤是可选项,所以在上面的动画中没有显示。任务输出是目标任务所需的结果,例如屏幕摘要或用户问题答案等。通过在prompt中包含多个示例,可以实现少量提示功能。在预测过程中,我们将新输入屏幕附加到prompt末尾并将其馈送给模型。

实验

我们进行了四项关键建模任务的全面实验:

  • (1)屏幕提问生成
  • (2)屏幕摘要
  • (3)屏幕问答
  • (4)将指令映射到UI操作。

实验结果表明,我们的方法在每个任务只使用两个数据示例的情况下就达到了比较好的性能。

image7

任务一:屏幕提问生成

给定一个移动UI屏幕,屏幕提问生成的目标是综合相关用户输入所需的UI元素,产生连贯、语法正确的自然语言问题。

我们发现LLMs可以利用UI上下文来为相关信息生成问题。相比于启发式方法(基于模板的生成),LLMs在提问的质量方面表现显著优异。

image8

LLM生成的示例屏幕提问。 LLM可以利用屏幕上下文来生成与移动UI上每个输入字段相关的语法正确的问题,而模板方法在理解方面则不足。

我们还展示了LLMs将相关的输入字段组合成一个问题以实现高效沟通的能力。例如,要求最低和最高价格的筛选器被合并为一个问题:“价格范围是多少?

image4

我们观察到LLM可以利用其先前的知识,将多个相关的输入字段组合起来询问一个问题。

在一次评估中,我们征求了人类对提问的语法正确性(Grammar)和与其生成所需输入字段相关性(Relevance)的评分。除了人工标注的语言质量外,我们还自动检查了LLMs覆盖生成问题所需所有元素的能力(Coverage F1)。我们发现,由LLM生成的问题几乎完美无缺地符合语法规范(4.98/5),并且高度相关于屏幕上显示的输入字段(92.8%)。此外,LLM在全面涵盖输入字段方面表现出色(95.8%)。

Template 2-shot LLM
Grammar 3.6 (out of 5) 4.98 (out of 5)
Relevance 84.1% 92.8%
Coverage F1 100% 95.8%

任务2:屏幕摘要

屏幕摘要是自动生成描述性语言概述,涵盖移动屏幕的基本功能。该任务有助于用户快速了解移动端UI的目的,特别是当UI在视觉上不可访问时。

我们的研究结果表明,LLMs可以有效地总结移动端UI的基本功能,它们可以生成比我们之前使用UI特定文本介绍的Screen2Words基准模型更准确的摘要,如下面着色文本和框所示。

image10

2-shot LLM生成的示例摘要。我们发现LLM能够利用屏幕上的特定文本来组成更准确的摘要。

有趣的是,我们观察到LLMs在创建摘要时,利用他们的先前知识来推断未在UI中呈现的信息

在下面的例子中,LLM推断地铁站属于伦敦地铁系统,而输入UI并不包含此信息。

image3

LLM利用其先前的知识来帮助总结屏幕内容。

人类评估认为LLM摘要比基准更准确,但它们在BLEU(是一种用于评估机器翻译从一种自然语言到另一种自然语言的文本质量的算法)等指标上得分较低。感知质量和度量分数之间的不匹配反映了最近的研究结果,即尽管自动度量没有反映出来,LLM撰写的摘要更好。

image2
image2-1

上图:自动度量标准下的屏幕摘要表现。下图:由人类评估者投票确定的屏幕摘要准确性。

任务三:屏幕问答

给定一个移动端UI和一个开放式问题,要求提供有关UI的信息,模型应该提供正确的答案。我们专注于事实性问题,这些问题需要基于屏幕上呈现的信息来回答。

image1

屏幕QA实验的示例结果。LLM明显优于现成的QA基线模型。

我们使用四个指标来报告性能:完全匹配(预测答案与真实答案完全相同)、包含真实答案(回答完整地包含了真实答案)、子字符串匹配(回答是真实答案的子字符串)以及基于整个数据集中预测和真实答案共享单词的微型F1分数。

我们的结果表明,LLM可以正确回答与用户界面相关的问题,例如“标题是什么?”。 LLM比基线QA模型DistillBERT表现显著更好,达到了66.7%的完全正确率。值得注意的是,0-shot LLM取得了30.7% 的精确匹配分数,这表明该模型具有固有的问答回复能力。

Models Exact Matches Contains GT Sub-String of GT Micro-F1
0-shot LLM 30.7% 6.5% 5.6% 31.2%
1-shot LLM 65.8% 10.0% 7.8% 62.9%
2-shot LLM 66.7% 12.6% 5.2% 64.8%
DistillBERT 36.0% 8.5% 9.9% 37.2%

任务4:将指令映射到UI操作

给定一个移动端UI屏幕和自然语言控制UI的指令,模型需要预测执行指示动作的对象ID。例如,当使用“打开Gmail”进行指导时,模型应正确识别主屏幕上的Gmail图标。这个任务对于使用语音输入等语言输入来控制移动应用程序非常有用。我们之前介绍过这个基准任务。

image1-2

使用PixelHelp数据集中的数据作为示例。该数据集包含常见UI任务(如打开wifi)的交互跟踪。每个跟踪都包含多个步骤和相应的说明。

我们使用Seq2Act论文中的Partial和Complete指标评估了我们方法的性能。Partial指正确预测单个步骤的百分比,而Complete则衡量准确预测整个交互跟踪的部分。虽然我们基于LLM的方法没有超过在大规模数据集上训练得到的基准结果,但仅仅使用两个提示数据示例就取得了显着表现。

Models Partial Complete
0-shot LLM 1.29 0.00
1-shot LLM (cross-app) 74.69 31.67
2-shot LLM (cross-app) 75.28 34.44
1-shot LLM (in-app) 78.35 40.00
2-shot LLM (in-app) 80.36 45.00
Seq2Act 89.21 70.59

结论与总结

我们的研究表明,在移动端UI上原型设计新语言交互可以像设计数据示例一样容易。因此,交互设计师可以快速创建功能模拟以测试与最终用户的新想法。此外,开发人员和研究人员可以在投入大量精力开发新数据集和模型之前探索目标任务的不同可能性。

我们调查了促使LLMs能够在移动端UI上实现各种对话交互的可行性。我们提出了一套提示技术,用于适应LLMs到移动UIs中。我们进行了广泛的实验来评估我们方法的有效性,并针对四个重要建模任务进行了比较。结果显示,与传统机器学习流水线(包括昂贵的数据收集和模型训练)相比,使用LLMs可以快速实现新颖基于语言的交互,并取得竞争性能。

致谢

感谢本文合著者Gang Li, 以及同事Chin-Yi Cheng、Tao Li、Yu Hsiao、Michael Terry 和 Minsuk Chang 的讨论和反馈意见。特别感谢Muqthar Mohammad 和Ashwin Kakarla 在协调数据收集方面提供宝贵帮助。感谢John Guilyard为博客创建动画和图形。






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



AI大模型已经对我产生了巨大影响

五一小长假回来这一周,虽只有三天,对我来说却是翻天覆地的!

我回到了研发中心

研发中心是我2017年来力石的第一站,当时担任研发部经理,那会儿就相当于现在的研发总监。2019年初离开研发中心,后面辗转到大数据产品中心、BOD中心和运营中心。四年后,又回到了研发中心,虽然,现在的力石和那会儿比已经很大,此研发中心非彼研发中心!

因为AI浪潮而回来

这次回到研发中心最大的原因ChatGPT带来的这波AI浪潮,AI太热了,热到身边几乎无人不知,且有“妖魔化”的趋势,言必大模型。对于大模型来势汹汹,至少在目前的能力范围内,我们还算应对有度。相比于国内大多数人是在看热闹,我们已经做了几件事:

  • 3月份已经搭建了大模型,并在公司内部进行了内测,也邀请了为数不多的客户进行了测试,效果还算不错;
  • 目前团队已经可以自主训练大模型,包括ChatGLM-6B、LLaMa系列和GPTNeox(如Dolly2)等,且开源了一个30亿参数的Lora版本大模型训练Project;
  • 结合大模型已经出来一两个应用Demo,比如根据给定的文件资料来提问题,答案会限定在给定资料范围内。

因为以上这些原因,加上公司对“小知”这个产品一直以来的期望,所以老板极力主张我放掉手上的“活”,全力去带小知这个产品。

关于销售工作的感悟

最近一年不到,除了直属团队的管理之外,我做的最认真的工作是销售。

其实我不是销售小白,之前自己两次创业,做的就是2B(软件业务)、2C(卖真皮女包)的销售,但是这一年做的更多是2G的销售。那是真的不一样啊,与人相处,还要处理各种复杂的人际关系,这一点和前面的销售面临的难题是完全不一样的。

从去年6月份的良渚项目开始,六个项目只丢了一个,成绩上来说还算可以。通过这一年,我也更加认识了自己:

  • 作为销售,我是愚笨的,这点从几个客户委婉地对话中我能清晰地感觉到。乐观的角度来看是我比较真诚,不会工于心计;
  • 作为一个“资深”老研发,一个懂产品的人,做销售真的很有优势。其中有两个项目,我自己完成了商务销售、售前文档编写的工作,还在后面一大段时间兼任了项目经理。如果我在和客户的相处中再“八面玲珑”一点,那应该是了不得的;
  • 但是现在停下来仔细想,问自己,我发现自己是不喜欢项目类型的销售工作的。我更喜欢的是产品,是一种可扩展、可复制,边际成本更低的方式去服务客户;
  • 我以前非常排斥所谓的“方法论”,因为我觉得事物是发展变化的,方法论代表的是迂腐。但是这一年销售工作中遇到的棘手麻烦,都有一些方法论帮我度过。这些方法论大多是一些思维模型,可以用draw.io把图画出来,就能推导出整个问题的突破口在哪里,也就发现了“解题钥匙”。

接下来有时间,我会再好好总结一下这一年的经验收获,对我自己肯定是很有帮助的。

接下来的工作

这周把手上的项目都交接掉了,但是近一个月内应该还会帮着过渡一段时间。接下来会更加潜心在小知这个产品上,期待着小知能翻天覆地,守得云开见月明!

新领导让我多关注关注PMF的事情,也就是寻找和调整产品-市场的结合点。这件事两年前老板也和我说过,说明PMF在他们眼里是我的一个标签了,这时候不自觉地想到老板的一句话——公司不缺你这么一个销售,你去做销售不划算!

嗯,那就好好搞产品吧。

就像插秧一样,退步方为向前!

最后感谢老华这一年的互相扶助和照顾,你差点把我培养成3T(IT、DT、OT)人才了,哈哈哈。






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!



AI编程语言--Mojo

为什么要发明Mojo?

当我们开始创建Modular(公司名)时,并没有打算构建一种新的编程语言。但是,当我们致力于统一全球ML/AI基础设施的平台时,我们意识到整个技术栈上的编程过于复杂。此外,我们手工编写了大量的MLIR(一种用于编译器和工具链的领域特定语言,旨在提高代码生成的可重用性和灵活性)代码,并且还不太遂人愿。

我们想要的是一种创新和可扩展的编程模型,可以针对加速器和其他在机器学习中普遍存在的异构系统。这意味着需要具有强大的编译期元编程自适应编译技术集成、整个编译流程中缓存等功能,但这些功能在现有语言上都不支持。

虽然加速器很重要,但最常见而被忽视的“加速器”之一是主机CPU。今天,CPU拥有许多类似张量核心加速块和其他AI加速单元,但它们也作为专用加速器无法处理(例如数据加载、预处理和后处理,以及与外部系统集成)操作时候使用。因此,显而易见我们不能使用一种仅适用于特定处理器的“加速语言”来提升AI。

应用人工智能系统需要解决所有这些问题,我们认为没有理由不能只用一种语言来完成。于是,Mojo诞生了。

我们决定将Mojo的创新放在编译器内部,也会对当前和新兴加速器进行优化和支持。但在语言层面,并不需要进行大刀阔斧地创新。因此,我们选择采用Python生态系统,因为它被广泛使用、受到AI生态系统的喜爱,并且非常好用!

Mojo 是 Python 家族的一员

Mojo语言有着崇高的目标——我们希望与Python生态系统完全兼容,同时也需要可预测的底层(语言的)性能和底层(系统级)控制,并且需要能够将代码子集部署到加速器上。我们还不希望出现生态系统分裂的情况——我们希望人们随着时间推移发现我们的工作是有用的,并且不想再次发生像Python 2 => Python 3迁移这样的事情。

这些都是非常重要的目标!

幸运的是,虽然Mojo是一个全新的代码库,但在概念上并没有从零开始。采用Python大大简化了我们的设计工作,因为大多数语法已经被指定了。相反,我们可以把精力集中在构建编译模型和设计特定系统编程功能上。此外,我们还受益于其他语言(例如Clang、Rust、Swift、Julia、Zig、Nim等)所做出来巨大贡献,并利用MLIR编译器生态系统。同时,由于对Swift编程语言有经验,在将庞大Objective-C社区迁移到新语言方面也获得了很多好处。

此外,我们认为Mojo正确长期目标应该提供Python超集(即与现有程序兼容),并立即采用CPython以实现长尾生态系统。对于Python程序员来说,我们期望Mojo会让你有亲切感,并它还提供开发系统级代码的能力,使您能够做到Python无法胜任那些本来需要使用C和C++来做的事情。我们不参与“静态更好”或者“动态更好”的观点——我们认为在正确使用他们,两者都很好,并且语言应该使程序员能够做出决策。

Mojo和Python有多兼容?

Mojo已经支持许多Python的核心功能,包括async/await、错误处理、可变参数等等,但是…它仍然处于早期阶段,并且缺少许多功能 ——所以今天它们并不是非常兼容。 Mojo甚至还没有支持类(Class)!

尽管如此,我们还是要谈一下两个非常显著但却不同的兼容性方面的经验: “Clang”编译器的作用对象是LLVM中的C、C++和Objective-C(以及CUDA、OpenCL等),其主要目标是成为GCC、MSVC和其他现有编译器的“兼容替代品”。虽然和我们今天的话题很难进行直接比较,但Clang问题的复杂性似乎比实现Python兼容替代品大一个数量级。所以这件事情的完美解决可以给大家带来信心,相信我们能够正确地为Python社区做出贡献。

另一个例子就是Swift编程语言,它采用了Objective-C运行时和语言生态系统,并逐步将数百万程序员(以及大量代码)转移到完全不同的编程语言上。通过Swift, 我们学会了如何“运行时兼容”,并与遗留运行时合作。在Python和Mojo方面,在CPython运行时下直接协作,并具有与CPython类和对象集成类似的支持,而无需编译代码。这将使我们能够与现有代码的大量生态系统进行交流,同时提供渐进式迁移方法,其中为迁移付出的增量工作将产生增量收益。

总体而言,我们相信兼容性、设计持续警惕和逐步实现完全兼容性的北极星会在时间上帮助我们达到目标。

与Python的有意区别

兼容性和可迁移性是成功的关键,但我们也希望Mojo成为一种一流的语言,并且不能因为无法引入新关键字或添加几个语法规则而受到限制。因此,我们对兼容性的处理方式有两个方面:

  1. 我们利用CPython来运行所有现有的Python3代码,“开箱即用”,不需要修改并使用其运行时,在整个生态系统中实现完全兼容。但以这种方式运行代码将得不到使用Mojo的任何好处,这个生态系统存在和可用将快速加速Mojo的启动,并利用Python已经非常适合高级编程这一事实。

  2. 我们将提供一个机械化迁移工具,为那些想要将Python代码转移到Mojo上提供很好的兼容性。例如,Mojo提供了反引号功能,可以使用任何关键字作为标识符,从而为使用这些关键字作为标识符或关键字参数的代码提供了一个简单机械化迁移路径。迁移到Mojo上后,则可以利用先进的系统编程特性。

总之,这使得Mojo能够在大多数基于CPython环境下良好地集成,并且让程序员能够逐步地(每次模块或文件)将代码转移到Mojo上。苹果公司执行Objective-C到Swift迁移时也采用了这种方法。Swift代码能够子类化和利用Objective-C类,并且程序员可以逐步地在他们的应用程序中采用Swift。Swift还支持构建对于Objective-C程序员有用的API,我们期望Mojo也是实现CPython API的好方式。

构建Mojo和迁移支持需要一些时间,但我们相信这将使我们集中精力,避免分心。我们也认为与CPython的关系可以从两个方向建立——如果CPython团队最终在Mojo而不是C中重新实现解释器,那不是很酷吗?

关于动机

Mojo的目标是将创新的编程模型带到加速器和其他在机器学习中普遍存在的异构系统中。话虽如此,最重要和普遍的“加速器”之一实际上是主机CPU。这些CPU正在获得许多类似张量核心的加速块和其他专用AI加速单元,但它们也重要地作为“后备”,以支持加速器不支持的操作。这包括数据加载、预处理、后处理以及与使用C++编写的外部系统集成等任务。

因此,我们意识到无法构建一个仅针对问题狭窄子集(例如仅适用于张量)的有限制语言。我们需要支持全面通用编程范畴。同时,我们没有看到需要在语法或社区方面进行创新,因此决定采用并完善Python生态系统。

为什么是Python?

Python是机器学习领域和其他许多领域的主导力量。它易于学习,被重要的程序员群体(例如数据科学家)所知晓,拥有一个惊人的社区、大量有价值的包以及各种良好的工具。通过其动态编程特性,Python支持开发美观而富有表现力的API,这使得像TensorFlow和PyTorch这样的机器学习框架将Python作为前端来使用他们在C++中实现高性能运行时。

对于Modular来说,Python是我们API使用端技术栈中不可动摇的一部分——这是由我们客户决定的。考虑到我们技术栈中其他所有内容都可以协商处理,因此“Python优先”方法似乎很合理。

更加主观地说,我们认为Python是一种优美语言——用简单和可组合的抽象来设计,避免了不必要的、多余的、缩进式的标点符号,并且构建了强大的(动态的)元编程特性,这些特性是扩展到我们需要的模块化的一个途径。我们希望那些处于Python生态系统中的人们看到我们新方向时会将其视为推动Python迈向下一个级别——完善它——而不是试图与之竞争。

Python的问题

Python存在着众所周知的问题,最明显的是低级性能差和CPython实现决策(如GIL)。虽然有许多积极的项目正在进行中以改善这些挑战,但Python带来的问题更深层次地影响了人工智能领域。在本文中,我们不会谈论那些技术限制,而是将重点放在这些限制对2023年产生的影响上。

请注意,在本节中提到的Python都指CPython实现。稍后我们将讨论其他实现。

(Python和C/C++)两个世界的问题

由于各种原因,Python并不适合系统编程。幸运的是,Python在作为粘合层方面有着惊人的优势,并且与C和C++之类的低级绑定允许使用具有更好性能特征的C、C++和许多其他语言构建库。这就是使得像numpy、TensorFlow和PyTorch以及生态系统中大量其他库成为可能的原因。

然而,虽然这种方法是构建高性能Python库的有效方式,但它也带来了一些代价:构建这些混合库非常复杂,需要对cpython内部有低级别理解,并需要掌握C/C++/…编程知识(从根本上破坏了最初使用Python的目标之一),使得难以发展大型框架,并且(在ML情况下)将世界推向比“急切模式”系统更差基础可用性的“图形化”编程模型。TensorFlow就是一个例子,但PyTorch 2中大部分工作都集中在发现图形以启用更积极地编译方法。

除了两个世界问题本质上涉及到系统复杂性外,在生态系统中所有其他事物都变得更加复杂。调试器通常无法跨越Python和C代码进行步进调试,而那些可以的调试器也没有被广泛接受。对于软件包生态系统来说,处理C/C++代码而不是单个世界是一种痛苦。像PyTorch这样具有重要C++投入的项目正在有意识地尝试将其代码库中更多的内容移植到Python中,因为他们知道这样做会提高可用性。

三个世界的问题以及N个时间的问题

两个世界的问题在Python生态系统中普遍存在,但对于机器学习框架的开发人员来说情况更加糟糕。人工智能得到了广泛的加速,而这些加速器使用定制编程语言如CUDA。虽然CUDA是C++开发的,但它有自己特殊的问题和限制,并且没有像调试器或分析工具一样一致性强大的工具。此外,它实际上被锁定在单个硬件制造商!

人工智能领域在硬件方面拥有令人难以置信数量的创新成果,因此复杂性正在失控地螺旋上升。现在已经有许多尝试为加速器构建受限编程系统(OpenCL、Sycl、OneAPI等)。这种复杂度爆炸趋势还在继续增长,并且这些系统都没有解决困扰行业并使其受损最严重的基本工具和生态系统碎片化问题。

移动端和服务器部署

Python 生态系统面临的另一个挑战是部署。这包括希望仔细控制依赖项的人,一些人更喜欢能够部署密封编译的a.out文件,多线程和性能也非常重要。我们希望看到 Python 生态系统在这些领域迈出步伐。

相关工作:改进Python的其他方法

有许多方法可以改进Python,包括让Python变得更快和替换GIL的工作,看起来像Python但是它们是其子集的语言以及与Python集成但不是第一类语言的嵌入式DSL。虽然我们无法列出所有努力,但我们可以谈论这些领域中的一些挑战以及为什么它们不适合Modular使用。

改进CPython和JIT编译Python

最近,人们在改善CPython性能和其他实现问题方面投入了大量精力,这对社区来说产生了巨大的成果。这项工作非常棒,因为它逐步改进了当前的CPython实现。Python 3.11通过内部改进提供了比Python 3.10快10-60%的改进,并且Python 3.12旨在通过跟踪优化器更进一步地提高性能。许多其他项目正在尝试驯服GIL,并且像PyPy(以及许多其他项目)使用JIT编译和跟踪方法加速Python。

这些都是伟大的努力,但对于将统一语言放到加速器上并不有帮助。如今,许多加速器仅支持非常有限的动态特性或者以可怕的性能支持动态特性。此外,系统程序员不仅寻求“性能”,他们通常还想要很多关于计算发生方式“可预测和控制”的内容。

虽然我们欣赏这些方法,并认为它们对社区具有价值和吸引力,但遗憾的是它们不能满足我们的需求。我们希望消除在Python库中使用C或C++所需,在某些情况下完全不接受动态特性,因此这些方法并没有帮助。

Python子集和其他类似Python的语言

有许多尝试构建“可部署”Python的方法,其中一个例子是PyTorch项目中的TorchScript。这些方法很有用,因为它们通常提供低依赖性的部署解决方案,并且有时具有高性能。由于它们使用类似Python语法,所以比起新颖的语言更容易学习。

另一方面,这些语言并没有得到广泛采用-因为它们是子集,通常不与Python生态系统互操作,在工具(例如调试器)方面也不太好,并且经常单方面更改Python中不便利的行为,从而破坏兼容性并使生态系统分裂。例如,其中许多会将简单整数的行为更改为包装而非生成与Python兼容的数学结果。

这些方法存在挑战之处在于他们试图解决 Python 的弱点, 但却不能像 Python 强项那样出色地完成任务. 最好情况下, 这些可以提供 C 和 C++ 的新选择 - 但如果不能解决 Python 的动态使用场景,则无法解决“两个世界问题”。此方法导致了碎片化和不兼容性, 并使迁移变得困难甚至不可能 - 回想一下从 Python 2 到 Python 3 的迁移是多么具有挑战性。

Python中的嵌入式DSL

另一种常见的方法是在Python中构建嵌入式DSL,通常使用Python装饰器安装。有许多这样的例子,例如TensorFlow中的@tf.function装饰器、OpenAI Triton编程模型中的@triton.jit等。这些系统的一个主要优点是它们与所有Python生态系统工具兼容,并且可以本地集成到Python逻辑中,允许嵌入式小语言与动态用例下Python强大功能共存。

不幸的是,这些系统提供的嵌入式小语言经常具有令人惊讶的限制,在调试器和其他工作流工具方面集成效果不佳,并且不支持我们为统一异构计算并编写大规模内核和系统所寻求的本地语言集成水平。我们希望通过简化事物并使其更加一致来推进整个系统可用性。嵌入式DSL是快速启动演示程序的便捷方式,但我们愿意付出额外努力和工作来为我们自己设定目标。

一览Mojo编程风格

您可以像使用Python一样从终端运行Mojo程序。因此,如果您有一个名为hello.mojo(或hello.(火)——是的,文件扩展名可以是这个表情符号!)的文件,请键入mojo hello.mojo:
这个(火)就像:

^_^因为这个表情打不出来。

1
2
3
4
5
6
7
8
9
10
11
$ cat hello.(火)
def main():
print("hello world")
for x in range(9, 0, -3):
print(x)
$ mojo hello.(火)
hello world
9
6
3
$

你可以使用表情符号或.mojo后缀。

如果您对深入了解 Mojo 的内部实现细节感兴趣,可以查看标准库中的类型、笔记本中的示例代码、博客和其他样例代码。

考虑到我们的兼容性目标以及Python在高级应用和动态API方面的优势,我们不必花费太多时间来解释语言中这些部分是如何工作的。另一方面,Python对系统编程的支持主要委托给C语言,并且我们希望提供一个在该领域表现出色的单一系统。因此,本节将详细介绍每个主要组件和功能,并说明如何使用它们并附有示例。

letvar声明

在Mojo中的def内部,您可以为一个名称分配一个值,并且它会隐式地创建一个函数作用域变量,就像Python一样。这提供了一种非常动态和低仪式感的编写代码的方式,但由于以下两个原因而具有挑战性:

  1. 系统程序员经常希望声明某个值是不可变的,以实现类型安全性和性能。
  2. 他们可能希望在赋值时如果错误拼写了变量名,则会出错。

为支持此功能,Mojo提供了作用域运行时值声明:let是不可变的,var是可变的。这些值使用词法作用域并支持名称遮蔽:

1
2
3
4
5
6
7
def your_function(a, b):
let c = a
c = b # error: c is immutable

if c != b:
var c = b
stuff()

letvar声明支持类型说明符以及模式,还支持延迟初始化:

1
2
3
4
5
6
7
8
9
10
def your_function():
let x: Int8 = 42
let y: Int64 = 17

let z: Int8
if x != 0:
z = 1
else:
z = foo()
use(z)

Note that let and var are completely opt-in when in def declarations. You can still use implicitly declared values as with Python, and they get function scope as usual.

请注意,在def声明中,letvar是完全可选的。您仍然可以像Python一样使用隐式声明的值,并且它们会像往常一样获得函数作用域。

struct类型(译者:这是Rust的概念)

Mojo基于MLIR和LLVM,这两个编译器和代码生成系统在许多编程语言中都得到了广泛应用。这使我们能够更好地控制数据组织、直接访问数据字段以及其他提高性能的方式。现代系统编程语言的一个重要特征是,在不损失性能的情况下,在复杂低级操作之上构建高级别且安全的抽象。在Mojo中,这由struct类型提供。

在Mojo中,struct类似于Python class:它们都支持方法、字段、运算符重载、元编程装饰器等功能。它们之间的区别如下:

  1. Python类是动态的:它们允许动态分派、monkey-patching(或“swizzling”)以及在运行时动态绑定实例属性。

  2. Mojo structs是静态的:它们在编译时绑定(您不能在运行时添加方法)。Structs允许您通过牺牲灵活性来换取性能,并且易于使用而又安全。

以下是一个简单定义struct的示例:

Here’s a simple definition of a struct:

1
2
3
4
5
6
7
8
9
10
struct MyPair:
var first: Int
var second: Int
def __init__(self&, first: Int, second: Int):
self.first = first
self.second = second
def __lt__(self, rhs: MyPair) -> Bool:
return self.first < rhs.first or
(self.first == rhs.first and
self.second < rhs.second)

从语法上讲,与 Python 类相比,结构体中的所有实例属性都必须使用 var let 声明显式声明。

好了,详细的Mojo语法手册可以看这里






关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


TorchV AI支持试用!

如您有大模型应用方面的企业需求,欢迎咨询!