Lisp 格式的提示词主要用于让 Claude 等模型生成特定的输出,以下是一些关于其使用的要点:
接下来,我们直接用Lisp来构建prompt,让Claude直接根据用户输入的领域和产品(也可自定义我们的产品特点),直接输出情绪营销语句~用Lisp这种编程语言是之前prompt圈李继刚刚哥带火了一波,使用下来更为凝练和简洁。当然,用我们一直倡导的Markdown的格式来写prompt的效果是一样的~[heading3]Lisp格式prompt(Claude专用)[heading3]Markdown格式prompt(GPT/国内大模型可用)@TODO待优化[content]备注:GPT等模型在卡片生成这步需要进行一些调整,不稳定。最好自定义html/css样式来进行强约束。[heading3]极简版输出(GPT o1系列,一步步思考推理)[heading2]打开Claude进行初始化[content]直接打开Claude首页,把上述提示词发送。初始化完成,接下来就可以直接进行使用~
我们平时写提示词用的更多的是Markdown语法。Markdown语法很简单,并且大语言模型能很好的“理解”标题、列表、加粗强调等这些语法。用Markdown写提示词不是更直白吗?我们把这段Lisp提示词翻译成Markdown试试效果。Markdown版本与Lisp版本的提示词在语义上几乎是一致的。只是中间我多加了一句“一步步思考,严格按照大步骤以及处理流程执行。”因为不加这句,Claude还是不能保证会逐步执行。下面是Lisp版本提示词的输出效果。不知啥原因,我通过API调用Claude,输出效果很难达到李继刚文章中那种水平,用网页版也许会好一些。下面是Markdown版本的提示词输出的结果:对比下两者的效果,可以发现一个明显差异:在Lisp版本中,SVG图形的丰富度和表现力稳定地优于Markdown版本。这是个意外发现!我们会在后面再细细探讨。Markdown版本与Lisp版本提示词的另一个重要差异在执行过程,它会输出中间“思考”过程。小确幸这个函数的所有子步骤都被充分展开并且按顺序执行了。而且,由于大语言模型的自回归机制,前面步骤的输出,会自然地被作为上下文传入给后面的步骤。虽然在这个任务中,从文本处理后的输出结果上可能看不出太大差异,但在多数场景下,这样一步一步思考是会有正向收益的。除此之外,让大语言模型将“思考”过程外化出来后有一个很大的好处,就是你可以调试优化这个流程。从过程输出中你可以看到哪些步骤生成了有用的增量信息,哪些步骤是无用的。另外在调试过程中,你还可能从大语言模型的输出中发现新的灵感。然而,用Lisp版本的提示词,很难让大语言模型这么有条理地执行一个流程。
我们发现用Lisp编写的提示词,生成SVG图形的效果要明显优于Markdown版本。这有点反直觉。因为一般来讲,我们会认为编写提示词的目标是把任务描述清楚,即传达语义,语法应该没什么影响,即使有影响,也不太可能会这么明显。以下是我的一个直觉性解释。这跟任务的特性相关,我们这里是在让大语言模型生成SVG代码。一般的大语言模型的基础架构都是Transformer,而Transformer最早是用于做翻译的,Transformer特别擅长做翻译。翻译就是从一种语言映射到另一种语言,从一个sequence映射到另一个sequence。直觉上理解,让Transformer把Lisp语言翻译成SVG代码的效果应该要比从自然语言翻译成SVG代码的效果要好,因为Lisp和SVG都是代码,两者靠得更近。前文讲到语言的表达能力,此处我们确实受到Markdown表达能力的限制。你很难用Markdown清晰准确的描述出一张SVG卡片的设计规范、元素构成,还有各种配置参数,你需要一种更加结构化的语言。用Lisp的List结构来干这件事儿,绰绰有余。还有一点需要注意,在SVG-Card这跟函数中,Lisp更多是被作为描述性语言在使用,而不是程序性语言。这个函数是在描述一种结构或者一种配置,而不是在描述一个复杂的流程,这里不涉及交错的函数调用过程。直觉上理解,从一种结构映射到另一种结构会相对简单。从此经验中可以提炼出一条更一般性的直觉:对于大语言模型来讲,syntax matters too。在实际应用中,我可能会采用下面这种组合形式的提示词。如果你是通过Chatbot界面使用大语言模型的话,只能这样杂糅成一条提示词。不过一般情况下,我会把这个流程拆成工作流,通过多次调用大语言模型来实现。下面是Markdown+Lisp混合版本的提示词输出的结果: