提示工程(Prompt Engineering)是与大语言模型交互的一项关键技术,作为以大语言模型为大脑的智能体,提示工程同样扮演着重要角色。

本文为小伙伴们介绍AgentScope中的提示工程。

1.提示工程

1.1.提示工程在智能体中的作用

在智能体中,提示工程用于帮助大模型理解复杂问题,给出准确的答案,以支撑智能体完成各类任务。

提示工程的主要作用可归纳为以下几点:

  • 明确任务和指令:针对具体任务,将用户需求和预期输出转化为明确的任务描述和指令。
  • 上下文提供:提供必要的上下文信息,帮忙模型理解和处理复杂问题。
  • 思维链推理:对于复杂问题,可以通过提示词进行逐步推理(Chain-of-Thought Prompting),即通过逐步生成中间推理步骤来解决问题。
  • 控制输出格式:提示可以规定输出的具体格式,如列表、表格、段落等,使得生成的内容更加规范、易于理解和使用。

1.2.多智能体构建提示工程的难点

在多智能体系统中,由于任务的复杂性和需要基础的模型的多样性,构建提示工程面临挑战:

  • 复杂多样:在多智能体系统中,每个智能体可能具有不同的特性、能力和目标。需要考虑到每个智能体的独特性和差异性,增加了提示工程的复杂性。
  • 部分模型不支持角色扮演:大多数语言模型都是为聊天场景设计的,角色只支持"user""assistant",不支持角色扮演。
  • 对话管理差异:某些模型规定发言必须在"user""assistant"之间交替进行,且序列的首尾都应由"user"发言。这导致当单一代理需要连续扮演多个角色时,构建对话变得困难。

1.3.AgentScope的提示工程构建策略

针对上述难点,是否有统一的提示工程构建方案来普适不同模型呢?根据工程实践,答案是没有,不存在"适用于所有模型API"的提示词构建方案

AgentScope的解决方案是,针对不同的模型API,提供对应的内置提示构建策略。这些策略在对应Model Wrapper类的format函数中实现的,它接受Msg对象的列表作为输入,并重新组织成一个Msg对象的列表。AgentScope为以下模型API提供了内置的提示构建策略:

  • OpenAIChatWrapper
  • DashScopeChatWrapper
  • DashScopeMultiModalWrapper
  • OllamaChatWrapper
  • OllamaGenerationWrapper
  • GeminiChatWrapper
  • ZhipuAIChatWrapper

这些策略可以帮助开发者快速开始使用AgentScope,简化了多智能体对话的构建过程。

2.AgentScope提示工程构建策略详解

下面,我们以OpenAI聊天模型API为例,详细看下AgentScope的提示构建策略。

2.1.内置策略-OpenAIChatWrapper

AgentScope针对OpenAI聊天模型封装的提示构建接口是OpenAIChatWrapper

OpenAIChatWrapper封装了OpenAI聊天API,它以字典列表作为输入,其中字典必须遵循以下规则:

  • 需要rolecontent字段,以及一个可选的name字段。
  • role字段必须是"system""user""assistant"之一。

2.1.1.非视觉模型的提示构建

OpenAIChatWrapper提供format方法来构建多角色的对话提示。

  • 要点1format方法的参数很简单:
    • System角色:Msg对象,要求是包含rolecontentname三个字段的字典。
    • 非System角色:Msg对象的列表,即上述格式字典的列表。
  • 要点2:使用name字段区分对话中的不同发言者。

示例代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from agentscope.models import OpenAIChatWrapper
from agentscope.message import Msg

# 初始化model wrapper
model = OpenAIChatWrapper(
    config_name="",
    model_name="gpt-4",
)

# 实例化prompt提示
prompt = model.format(
   Msg("system", "You're a helpful assistant", role="system"),   # Msg对象
   [                                                             # Msg对象的列表
      Msg(name="Bob", content="Hi.", role="assistant"),
      Msg(name="Alice", content="Nice to meet you!", role="assistant"),
   ],
)

2.1.2.视觉模型的提示构建策略

对于支持视觉的模型(如gpt-4o),同样还是用format方法来构建提示,使用url字段承载图片信息。

  • 要点1format方法的参数:
    • System角色:Msg对象,要求是包含rolecontentname三个字段的字典。
    • 非System角色:Msg对象的列表,每个Msg对象的要求是包含rolecontentnameurl四个字段的字典。
  • 要点2url可以是图片网络地址或本地地址的字符串,也可以是多个图片的地址字符串的列表。
    • 如果是网络图片url,将直接传递给OpenAI Chat API;
    • 如果本地图片url,将被转换为base64格式。

示例代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from agentscope.models import OpenAIChatWrapper
from agentscope.message import Msg

# 初始化model wrapper
model = OpenAIChatWrapper(
    config_name="",
    model_name="gpt-4o",
)

# 实例化prompt提示
prompt = model.format(
   Msg("system", "You're a helpful assistant", role="system"),   # Msg 对象
   [                                                             # Msg 对象的列表
      Msg(name="user", 
          content="Describe this image", 
          role="user", 
          url="https://xxx.png"),  # 图片网络地址
      Msg(name="user", 
          content="And these images", 
          role="user", 
          url=["/Users/xxx/test.png", "/Users/xxx/test.mp3"]),  # 图片url地址
   ],
)
 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
# 打印提示内容
print(prompt)

[
    {
        "role": "system",
        "name": "system",
        "content": "You are a helpful assistant"
    },
    {
        "role": "user",
        "name": "user",
        "content": [
            {
                "type": "text",
                "text": "Describe this image"
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://xxx.png"  # 网络图片,将url直接传递给模型
                }
            },
        ]
    },
    {
        "role": "user",
        "name": "user",
        "content": [
            {
                "type": "text",
                "text": "And these images"
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": "data:image/png;base64,YWJ..." # 本地图片,将图片的base64信息传递给模型
                }
            },
        ]
    },
]

3.总结

本文要点如下:

  • 智能体系统中提示工程的作用和构建难点:

  • AgentScope的提示工程构建策略:

    • 不存在"适用于所有模型API"的提示词构建方案。
    • AgentScope针对不同的模型API,提供对应的内置提示构建策略。

参考:https://arxiv.org/pdf/2402.14034