函数链:最佳提示工程技巧!

更新时间:2023/10/11, 10:23

阅读完本文后,您将能够结合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损坏时重试生成的简单示例。

希望这对你有所帮助。

AI奇想空间
AI奇想空间
https://aimazing.site
AI惊奇站是一个汇聚人工智能工具、资源和教程的导航网站。 在这里,你可以发现最新的AI技术、工具和应用,学习如何使用各种AI平台和框架,获取丰富的AI资源。 欢迎广大AI爱好者加入我们的社区,开启你的AI之旅!
AI交流群
Copyright © 2024 AI奇想空间.微信