Lisp 是一门“古老”的编程语言,其语法核心是 List 结构或“S 表达式”,需要用一对括号把元素括起来,且 List 结构里可以嵌套 List,使得程序呈现出一对对括号嵌套的样子。Lisp 语法简洁且优美,兼具简洁性和强大的表达能力。
在提示词编程方面,用 Lisp 编写的提示词生成 SVG 图形的效果明显优于 Markdown 版本。这可能是因为对于让大语言模型生成 SVG 代码的任务,Transformer 擅长从一种语言映射到另一种语言,而 Lisp 和 SVG 都是代码,两者靠得更近。此外,Markdown 表达能力有限,难以清晰准确描述 SVG 卡片的设计规范等,而 Lisp 的 List 结构更适合。在 SVG-Card 函数中,Lisp 更多作为描述性语言而非程序性语言。
在网文创作中,也有 Lisp 格式的提示词,如在帮人做世界观故事时会用到,不同版本可适用于不同的模型和需求。
李继刚写的提示词有个特点——它们是用Lisp语言编写的。比如,[下面这段提示词](https://mp.weixin.qq.com/s?__biz=MzkxMzc1NzM1Mw==&mid=2247483803&idx=1&sn=485c2f271172a7efcb0735310f8ff191&scene=21#wechat_redirect):Lisp是一门“古老”的编程语言。Lisp语言有个特点——它的语法非常地简洁且优美。它的语法核心是List结构,或者叫“S表达式“,其典型特征就是需要用一对括号把元素括起来。List结构里又可以嵌套List,所以Lisp程序呈现出来的样子就是一对对括号里嵌套着一对对括号嵌套着一对对括号。List结构使得Lisp的语法足够简洁,同时又有非常强的表达能力。这两者兼备,才可以称得上优美。也许你会觉得,语言最重要的功能是传递语义,语法其实没那么重要。如果你是程序员,你就不会这么觉得了。对编程语言来讲,syntax matters[1]。对于大语言模型来讲,语法重要吗?看了李继刚的提示词,你可能会有一个随之而来的疑问:有必要用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混合版本的提示词输出的结果:
因为要帮人做世界观故事,所以一时兴起搓了这么个东西;两个版本,下面这个是lisp格式,用POE的Claude-3.5-Sonnet-200k测试没什么问题,默认是玄幻类型,可以自己改,字数的话也可以自由调整,这些其实都可以在对话时提要求;下面这个是通用版,建议chatgpt 4o,不过kimi、通义之类的都可以,就是可能不稳定。其实写作助手我试过很多,可以说都不太好用,毕竟对方也不是专为你的文章写的,所以最重要的是有能力根据自己需求调整。