目录
引言
最近一直在学习Cangjie Magic智能体框架的使用,今天分享一下拦截器(Interceptor),在官方的文档中称为“Agent 劫持机制”。
拦截器的工作原理
Agent
拥有可变属性 mut prop interceptor: Interceptor
可用于设置消息处理劫持 Agent。它的定义如下:
enum InterceptorMode {
| Always
| Periodic(Int64)
| Conditional((Request) -> Bool)
}
class Interceptor {
public init(interceptorAgent: Agent, mode!: InterceptorMode = InterceptorMode.Always)
}
当设置拦截器后,每当原本Agent 接收到消息(以 Request
类型表示)时,如果拦截条件成立,那么该消息将交由劫持 Agent 来处理,而不是原本 Agent 进行处理。有三种劫持模式判别条件是否成立:
Always
永远劫持Periodic
周期性地劫持,即原本 Agent 每处理指定数量的消息后,下一条消息将被劫持Conditional
使用判别函数进行判断,如果函数返回true
,则劫持消息
简单的例子如下:
let ag1 = Foo()
let ag2 = Bar()
ag1.interceptor = Interceptor(ag2, mode: InterceoptorMode.Periodic(2))
ag1.chat("msg 1")
ag1.chat("msg 2")
ag1.chat("msg 3") // ag2 will handle with this request message
这里ag1和ag2 不能是同一个,否则会出现连环触发导致死机。
另外,目前拦截器只在chat函数时工作,不能用于asyncChat。
使用拦截器实现敏感词检查
拦截器中应用最灵活的应该是Conditional
。下面演示一下用拦截器实现敏感词检查。
public class WarningAgent <: BaseAgent {
public init() {
super (
model: unsafe { zeroValue<ChatModel>() }, // will not use model
name: "Warning Agent",
description: "This is an agent that generates warning messages"
)
}
override public func chat(request: AgentRequest): AgentResponse {
return AgentResponse("Question >>> ${request.question}\n 含有敏感词")
}
}
private func checkFunc(request: AgentRequest) : Bool {
return request.question.indexOf("一只耳") != None
}
main() {
let agent = BlackCatAssistant()
let ag = WarningAgent()
agent.interceptor = Interceptor(ag, mode: InterceptorMode.Conditional(checkFunc))
let result = agent.chat("一只耳来啦")
println(result)
}
这个例子是在官方的入门示例基础上修改的,我们检查到用户输入的单词中有敏感词就拦截原有Agent的执行,返回警告信息。
程序执行结果如下
结束语
Cangjie Magic框架总体设计还是挺丰富的,基本上涵盖了最常见的各种机制。后面将尝试做一个实际的案例。