在多智能体系统(MAS)的应用中,Agent 的控制难度着实不小,常常会出现让它往东,它却往西的情况。尤其是在复杂的 MAS 系统里,这种不可控性更为明显。我们曾尝试利用大量数据进行微调,满心以为能得到一个稳定的输出结果,可事实证明,我们还是过于天真了。
在生产系统的开发过程中,我们发现不能一次性给大语言模型(LLM)布置过多任务,更不能让它直接处理创造性任务。正确的做法是将任务进行拆解,细化为一个个清晰明确的小任务。通过工作流的方式,引导 Agent 逐步完成这些任务,将其 “活动范围” 限定在一定范围内,避免它 “胡思乱想”,这样才能确保任务得以真正完成。
例如,在长文本标书撰写的场景中,可以让每个智能体负责其中的一部分内容,最后再将各部分合成完整的标书;在医疗领域的 MAS 应用里,每个节点可以作为一个工具,将这些工具的信息整合后提供给上游的 Agent 作为参考;还可以利用 Agent 进行电脑配置清单的推荐,并且同时满足 N 种复杂的兼容性要求。这些不同类型的复杂任务,Agent 都能够胜任,其应用价值不容小觑。
打基础部分的具体安排如下:
day3:构建意图分流路由,确保每个人都能做合适的事,各司其职(本篇内容)。
day4:为智能体添加长期和短期记忆,让它能够记住该记的信息。
day5:管理智能体的短期记忆,使其能够记住最新且重要的事情。
day6:管理智能体的长期记忆,让智能体可以长期记住用户的特性,比如用户的姓名、生日等信息。
day7:从对话记录中提取重要信息,形成用户专属记忆。
day8:将长短记忆入库,这样即使用户退出访问,记忆信息也能即时同步。
后续,我们还会根据实际情况,增加函数 tool 的相关内容以及进一步完善 RAG 的接入。掌握了这些知识后,你基本就能够使用 LangGraph 进行开发工作了。
接下来,我们准备了几个从 0 到 1 的系列内容。我们将使用 agent、langgraph 和知识图谱,打造一个与为客户做的项目 demo 类似的示例。
人的专注力有限,通常只有 10 分钟左右,话不多说,让我们赶紧动手实践吧!以下是本次要探讨的几个关键问题:
什么是智能体路由?它有哪些重要作用?
如何实现智能切换 Agent 以及条件转换等高级玩法?
跑起来!我们将一边运行代码,一边深入探讨其中的细节。
第一部分:智能体路由的概念与作用
想象一下,当你走进学校门口,会看到一个指示牌,上面清晰地标注着:上课去课室,看书去图书馆,跑步去操场。在智能体系统中,也存在类似的 “指示牌” 机制。
例如,当用户进行闲聊时,系统会调用 chat model 进行回复;当用户需要约医生时,系统会调用函数来查询档期;当客户想要投诉时,系统会将任务转交给人工处理。
此外,还有许多自定义的方案。而实现这一切的关键,就是路由(Routers)。在 langgraph 中,路由是非常重要的组成部分。今天,我们就通过以下例子来入门理解。
这是一个简单的示例,在这个例子中,智能体在路由机制下,能够自主决定是使用 tools 来处理任务,还是直接用自然语言进行响应回复。
第二部分:实现智能体切换等高阶玩法的方法
在医疗多智能体系统中,我们广泛应用了 MAS。其中,有专门负责调用数据库的 Agent,也有专门用于分析健康状态的 Agent 等等。而负责规划解决方案并分配子任务的工作流,需要完成多个智能体之间的切换,并且实现共享数据和背景信息,这些都是通过【路由】来解决的。
在 LangGraph 中,有一些关键的参数和函数定义:
destination
表示要导航到的目标代理,即 LangGraph 中的节点名称。
payload
用于传递给该代理的信息,也就是 LangGraph 中的状态更新。
以下是一些具体的函数定义示例:
每个代理都对应着相应的节点函数,这些函数可以根据条件返回一个对象。节点函数会结合带有系统提示的 LLM 和一个工具,当需要切换给另一个代理时,工具可以发出信号。LLM 则会通过工具调用进行响应。之后,通过添加节点和边,系统就可以正式开始工作了:
第三部分:运行代码并深入探讨细节
下载好打包好的环境后,就可以跟着以下步骤进行操作了:
进入 conda 环境。养成每个项目使用一个独立环境的习惯,输入指令conda activate agent激活环境。当看到前面有括号圈起来的 “agent” 时,就说明激活成功了。
进入放置实践代码的路径。使用cd命令进入相应目录,这里存放着代码和依赖,例如cd G:\LangGraph\day3。
进入 jupyter 进行实操。输入指令jupyter notebook,系统会自动进入并跳转到浏览器。
针对入门,我们使用了两个示例:
工具的路由:当遇到需要使用 tools 的任务时,就调用 tools;如果不需要,则由大模型直接回复,不使用 tools。
以下是核心代码示例:
创建工具:
把工具与大模型绑定:
创建节点和边:我们要实现的逻辑是,当需要调用工具时就调用,不需要时模型直接回复。例如,在实际应用中,如果是医疗相关的任务,就调用工具;如果不是医疗相关的,则直接当作闲聊处理,这是最基础的用法。
最后,我们可以把定义的节点和边的逻辑打印出来,方便查看和理解:
今天的内容相对比较基础简单,希望大家都能有所收获,顺利掌握相关知识并进行实践操作。
领取专属 10元无门槛券
私享最新 技术干货