阅读完本文后,您将能够结合Power Prompts和函数链创建超强大的工作流程和脚本!
什么是函数链?
我喜欢简单,所以让我们以一个简单的例子来理解这个概念,不到2分钟。
假设你正在开发一个AI工具,例如一个"博客标题生成器"工具。
你主要需要3件事情:
-
正确的提示。
-
将提示集成到应用程序代码或脚本中。
-
工具的用户界面。
如何创建正确的提示?
提示是你的工具的核心,所以我相信你必须在这一步投入时间以获得最好的结果。
我有一份完整的关于创建完美提示的指南。你可以在这里查看。
但是让我在这里与你分享一个快速的逐步过程,来创建适合你工具的正确提示。
步骤1:明确目标。
你必须确切地知道自己在寻找什么,以及你希望提示生成什么。
例如,如果你正在创建一个博客大纲生成器,那么你希望输出是一个有结构的大纲。
如果你正在创建一个标题生成器,你希望输出是一份包含X个标题的列表,以此类推。
步骤2:了解提示的主要组成部分
在制作提示时,考虑到这些重要的组成部分:角色,指令,上下文,输入,输出和可选示例。
-
角色:将这视为一种角色扮演游戏,你对AI说“扮演”一个特定的角色或实体。它可以是任何东西,从一名解决谜团的侦探,到一名语言翻译员。
-
指令:在这里,你告诉AI要做什么。“写一首诗”,“回答这个问题”,“翻译这段文字”都是指令的例子。这是你对AI的“命令”。
-
上下文:为提示提供背景或设置。这可能包括目标受众、响应风格、时间范围等。
-
输入:这是指你希望AI专注的特定主题或内容。这非常重要,特别是当你创建提示模板时。
-
输出:你想要的回应是什么?这可以是段落、项目符号、JSON、XML、表格、列表、图表或任何其他结构。你可以根据自己的需求塑造AI的回应。
-
示例(可选):在某些场景下,提供一个示例可能是有用的,因为它可以帮助指导AI的输出。就像向AI展示你想要的快照一样。
博客标题生成器的示例提示:
扮演专业博客作家的角色。
你的任务是为一篇关于[主题]的博客创建10个标题。
这些标题应该优化用于搜索引擎优化(SEO),并且要引人入胜且有吸引力,增加我的点击率。
[主题] = "输入主题"
如果你使用ChatGPT测试这个提示,你会得到以下输出:
不错,但主要问题是输出包含了额外的文本和标题。那又怎样?
问题在于,如果你想在你的工具中使用这个提示,并将其集成到你的脚本中,解析标题并以你希望的方式使用它将会很困难,特别是当你正在开发UI时。
例如,你可以测试一下我的博客标题生成器,在那里你会看到我将标题以特殊卡片的形式显示,像这样:
所以,简而言之,我们需要一种方法来从提示中获得一个结构化的JSON响应,这样我们可以轻松地解析和读取输出,并在脚本和代码中使用它们。
这就是函数链的用处。
它是一种提示工程策略,帮助你构建与代码和脚本轻松链接的提示。
如何从提示中输出JSON?
这里,魔法开始了!
我知道,如果你在提示方面有一些经验,你可以告诉提示输出JSON。例如,我们可以这样编辑提示:
扮演专业博客作家的角色。
你的任务是为一篇关于[主题]的博客创建10个标题。
这些标题应该优化用于搜索引擎优化(SEO),并且要引人入胜且有吸引力,增加我的点击率。
[主题] = "输入主题"
输出:JSON TITLES的数组。
我们会得到类似这样的东西:
不错,我们得到了JSON,但是还是有一些文本。
然后,我们可以再次更新提示:
扮演专业博客作家的角色。
你的任务是为一篇关于[主题]的博客创建10个标题。
这些标题应该优化用于搜索引擎优化(SEO),并且要引人入胜且有吸引力,增加我的点击率。
[主题] = "输入主题"
输出:仅仅是JSON TITLES的数组,没有任何文本
然后...
完美,我们得到了一个仅仅是JSON数组的输出!这正是我们寻求的。
不要庆祝!
根据我在构建100多个脚本和AI工具方面的经验,语言模型有时会产生幻象,生成损坏的JSON,如缺少逗号或括号。
也许有人会告诉我OpenAI刚刚发布了一个名为函数调用的功能来解决这个问题。
不要再庆祝!
我也测试了这个功能,进行了很多测试,真的是很多次!
但是,模型仍然会产生错误的JSON。这里是OpenAI论坛上关于这个问题的一个简单讨论。
不久,我将发表一篇关于使用OpenAI的函数调用功能的完整文章,分享我的测试和结果。
解决方案是什么?
解决方案简单地分为两个部分。
第一个部分是在提示工程中:制作、测试和优化适合你场景的最佳提示。
第二个部分是在你的脚本和代码中。我将与你分享我的提示和一个用Python处理这个问题的示例代码!
下面是我目前使用的生成博客文章标题的提示:
我希望你扮演一名专业博客标题生成器。考虑到标题既要优化用于搜索引擎优化,又要引人入胜、让人点击并阅读博客文章。
同时,它们还应该富有创意和智慧。
试着想出一些出人意料和令人惊讶的标题。
不要使用太通用的标题,也不要使用被过度使用的标题。我最多需要生成10个标题。
我的博客文章关于{主题}
重要提示:输出应该是一个没有字段名的10个标题的JSON数组。确保JSON格式正确。
示例输出:
[ "标题 1", "标题 2", "标题 3", "标题 4", "标题 5", "标题 6", "标题 7", "标题 8", "标题 9", "标题 10"]
此提示是我高级提示库的一部分。
你可以看到最后一部分:
输出应该是一个没有字段名的10个标题的JSON数组。确保JSON格式正确。
然后,我给出了一个示例输出。
这在保持一致的有效JSON输出方面帮助了很多。
但是仍然会有时候,我在检查日志时会看到一些损坏的JSON。
到目前为止,我找到的最好的解决方案是在我的Python代码中处理这个问题。
在返回JSON之前,我尝试解析和检查是否有效。如果无效,我会再次调用语言模型API发出另一个请求,以获得有效的输出。
我最多重试5次,但到目前为止,我还没有使用超过1次,所以我们可以说它工作得很完美。
这是我的代码示例:
retry_count = 0
max_retries = 5
while retry_count < max_retries:
generated_titles_string = None
try:
prompt = generate_youtube_titles_2.format(
topic=user_topic, style=user_style
)
generated_titles_string = await llm.basic_function_call(prompt)
generated_titles_json = json.loads(
generated_titles_string.choices[0]["message"]["function_call"][
"arguments"
]
)
return TitlesGeneratorResponse(
success=True, message="Done", titles=generated_titles.titles
)
except (json.JSONDecodeError, ValidationError):
logger.warning(
f"Failed during JSON decoding or validation. Retry count: {retry_count + 1}. Generated String: {generated_titles_string}"
)
retry_count += 1
注意:这段代码只是一个示例,用于说明这个想法,并不能直接运行,因为你需要我在代码中使用的其他函数。
但这是一个关于如何在JSON损坏时重试生成的简单示例。
希望这对你有所帮助。