Message模块¶
1. 简介¶
简而言之,Message是大语言模型的输入输出信息进行封装。大家可以使用Message和大语言模型进行交互,后续使用Memory模块也会接触Message。
在ERNIE Bot Agent中,主要有如下4类Message:
HumanMessage:用户输入给模型的普通信息,比如聊天的问题。SystemMessage:用户输入给模型的全局信息,比如角色扮演的指令、输出格式设置的指令。AIMessage:模型返回的信息,比如聊天的回答、触发Function call的回答。FunctionMessage:上一轮模型的输出是带有Funciton call的AIMessage,则用户需要首先调用Function,然后将Function的结果输入给大语言模型。
2. 核心类¶
下面简单介绍Message模块的核心类,详细接口请参考API文档。
Message类是基类,以下是主要的属性和方法。
| 属性 | 类型 | 描述 |
|---|---|---|
| role | str | Message的角色,有四类:user, system, assistant和function |
| content | str | Mesage的文本内容 |
| token_count | int | 文本内容的token长度 |
| 方法 | 描述 |
|---|---|
| to_dict | 将Message中核心属性转成字典 |
| token_count | 设置token_count的大小 |
SystemMessage类继承Message类,以下是主要的属性。
| 属性 | 类型 | 描述 |
|---|---|---|
| role | str | Message的角色,等于system |
| content | str | Mesage的文本内容 |
| token_count | int | 文本内容的token长度,近似计算len(content) |
HumanMessage类继承Message类,以下是主要的属性和新增的方法。
| 属性 | 类型 | 描述 |
|---|---|---|
| role | str | Message的角色,等于user |
| content | str | Mesage的文本内容 |
| token_count | int | 文本内容的token长度 |
| 方法 | 描述 |
|---|---|
| create_with_files | 创建带有File的HumanMessage |
AIMessage类继承Message类,以下是主要的属性。
| 属性 | 类型 | 描述 |
|---|---|---|
| role | str | Message的角色,等于assistant |
| content | str | Mesage的文本内容 |
| token_count | int | 文本内容的token长度 |
| function_call | Optional[FunctionCall] | FunctionCall的schema描述信息 |
FunctionMessage类继承Message类,以下是主要的属性。
| 属性 | 类型 | 描述 |
|---|---|---|
| role | str | Message的角色,等于user |
| content | str | Mesage的文本内容 |
| token_count | int | 文本内容的token长度 |
3. 使用示例¶
为了直观展示,我们举例进行说明,请先确保完成ERNIE Bot Agent的安装和鉴权步骤。
示例1¶
大家在使用ERNIE Bot调用文心一言进行多轮对话时,需要按照规范定义每轮对话的信息(如下),稍显复杂。
import erniebot
erniebot.api_type = "aistudio"
erniebot.access_token = "<access-token-for-aistudio>"
messages = [{
"role": "user",
"content": "我在深圳,周末可以去哪里玩"
}, {
"role": "assistant",
"content":"深圳有许多著名的景点,以下是三个推荐景点:1. 深圳世界之窗,2. 深圳欢乐谷,3. 深圳东部华侨城。"
}, {
"role": "user",
"content": "从你推荐的三个景点中,选出最值得去的景点是什么,直接给出景点名字即可"
}]
response = erniebot.ChatCompletion.create(
model="ernie-3.5",
messages=messages
)
print(response.get_result())
如果基于ERNIE Bot Agent调用文心一言,大家使用Message模块,可以较好地简化代码。
import os
import asyncio
from erniebot_agent.memory import HumanMessage, AIMessage
from erniebot_agent.chat_models import ERNIEBot
os.environ["EB_AGENT_ACCESS_TOKEN"] = "your access token"
async def demo():
model = ERNIEBot(model="ernie-3.5")
# 使用Message模块
messages = [HumanMessage("我在深圳,周末可以去哪里玩"),
AIMessage("深圳有许多著名的景点,以下是三个推荐景点:1. 深圳世界之窗,2. 深圳欢乐谷,3. 深圳东部华侨城。"),
HumanMessage("从你推荐的三个景点中,选出最值得去的景点是什么,直接给出景点名字即可")]
ai_message = await model.chat(messages=messages)
print(ai_message.content)
asyncio.run(demo())
示例2¶
创建各种Message的示例代码如下:
import json
from erniebot_agent.memory import HumanMessage, SystemMessage, FunctionMessage
human_message = HumanMessage(content='你好,你是谁?')
system_message = SystemMessage(content='你是一名数学老师,使用浅显易懂的方法来回答问题')
result = {"temperature": 25, "unit": "摄氏度"}
function_message = FunctionMessage(name='get_current_temperature', content=json.dumps(result, ensure_ascii=False))
print(human_message)
print(system_message)
print(function_message)
示例的输出如下:
<role: 'user', content: '你好,你是谁?'>
<role: 'system', content: '你是一个知识渊博的数学老师,使用浅显易懂的方法来回答问题', token_count: 28>
<role: 'function', name: 'get_current_temperature', content: '{"temperature": 25, "unit": "摄氏度"}'>
示例3¶
使用SystemMessage的示例代码如下:
import os
import asyncio
from erniebot_agent.memory import HumanMessage, SystemMessage
from erniebot_agent.chat_models import ERNIEBot
os.environ["EB_AGENT_ACCESS_TOKEN"] = "your access token"
async def demo():
model = ERNIEBot(model="ernie-3.5")
system_message = SystemMessage(content="你是一名数学老师,尽量使用浅显易懂的方法来解答问题")
messages = [HumanMessage("勾股定理是什么")]
ai_message = await model.chat(messages=messages, system=system_message.content)
print(ai_message.content)
asyncio.run(demo())