两种不同生命周期的请求指令管理
在应用开发实践中,您可能会注意到,对于请求指令信息的管理,存在生命周期的区别。
在大部分情况下,我们会有使用以下两类生命周期的诉求:
- 在agent对象中常驻:这些请求指令信息提交给agent对象后,agent对象在后续的每次模型请求中,都应该使用到,通常用于agent角色设定、用户信息设定、agent对象全局行为指导等场景
- 仅对单次请求生效,请求完成后清除:这些请求指令信息仅作用于当次请求,在请求完成后,agent对象需要清除这些请求指令信息,避免后续请求中重复使用,通常用于表达当次请求的输入信息、解决思路、输出要求等仅和当次请求相关的指令信息内容
要如何满足开发者对这两类不同生命周期的请求指令信息的管理诉求,是本篇文档主要讨论的内容。
槽位(Slot)
在讨论如何进行不同生命周期的请求指令信息设定前,我们得先了解下槽位(Slot)的设定。
槽位是Agently 框架为开发者能够抹平模型差异,对模型输出诉求进行统一的业务表达而做的关键设计。
槽位从业务表达的视角出发,仅考虑对常见的业务场景大类的抽象,而不考虑不同模型的请求参数差异。
举一个具体的例子,在AI应用开发中,对模型进行角色设定指导是一个常见的业务诉求,但不同模型可能有的通过在消息队列中以{ "role": "system", "content": "<角色设定要求>" }
的格式对模型进行输入,有的则通过类似META
、system
或character
参数进行设定,有的则需要开发者自行在常规消息列如{ "role": "user", "content": "<普通输入中插入的角色设定要求>" }
或是特定的全局PROMPT
参数中自行构造。这对于开发者而言,无疑增加了非常多没有必要的隐含背景信息检索和学习成本。而Agently 框架则认为,这并不是业务开发中应该关注的问题,而应该由框架来屏蔽这些差异。
Agently 框架为开发者提供了以下可用槽位:
general
: agent应该知道的全局信息,通常被视作system prompt或类似位置的信息role
: agent自身的角色设定信息user_info
: agent需要了解的用户相关的信息abstract
: 对于之前对话(尤其是较长对话)的总结信息chat_history
: 按照OpenAI消息列格式的对话记录listinput
: 和本次请求相关的输入信息info
: 为本次请求提供的额外补充信息instruct
: 为本次请求提供的行动指导信息output
: 对本次请求的输出提出格式和内容的要求
两种不同生命周期的请求指令信息设定
如本文档开头所说,Agently 框架为开发者提供了两种不同生命周期的请求指令信息设定方式,分别是:
-
.set_agent_prompt(<slot name>, <value>)
:向指定槽位填入信息,此信息将长时间保存在当前agent对象身上,除非主动修改、删除或是agent对象被回收销毁 -
.set_request_prompt(<slot name>, <value>)
:向指定槽位填入信息,此信息只在本次请求时生效,当执行.start()并请求完成返回结果之后,信息就会被清理
其中<slot name>
为上面的列表中的槽位名称,而<value>
可接收大部分格式的变量或值,框架将帮你进行自动转换
是的,你可以放心地向<value>
中传入各种格式的数据,无论是字典(dict)还是列表(list),无论是你自己手撸的复杂结构数据,还是从别的系统里取出来的复杂结构变量
agent = agent_factory.create_agent()
# 这部分设定信息将长期保存在agent对象中,除非主动修改、删除或是agent对象被回收销毁
agent.set_agent_prompt("role", [
{ "姓名": "小A" },
{ "年龄": "22" },
{ "性别": "女" },
{ "身份": "你的人工智能小助手" },
])
# 这部分设定信息仅作用于当次请求,在请求完成后,agent对象需要清除这些请求指令信息
agent.set_request_prompt("input", "你是谁?")
result = agent.start()
print(result)
# 她真的记住了吗?
agent.set_request_prompt("output", "你的身份")
result = agent.start()
print(result)
简化表达
当然,我们不需要每次都写那么复杂的表达,下面是简化的写法:
[Agent Prompt]:
.set_role()
.set_user_info()
[Request Prompt]:
.general()
.role()
.user_info()
.abstract()
.chat_history()
.input()
.info()
.instruct()
.output()