随着大模型的发展,智能体也是越来越火。看到的很多例子是通过构建DAG的形式形成Agent链,和我需要的不太一样。周末有点时间也是改造了一下之前做的个人超级中心,以初步实现自决策多轮对话智能体。基于该智能体,可实现在多轮对话中实现多重智能体的智能选择。
本次改造涉及新组件引入,其中包括langchain4j、spring state machine以及antdesign prochat。
组件基本介绍
langchain4j
langchain4j可以算是langchain的java版本,不过迭代和功能没有python版本的langchain那么全。目前支持了主流的集成与用法,具体可参考官网: https://docs.langchain4j.dev/
spring state machine
Spring State Machine是一个基于Spring Framework的状态机实现,它允许开发者以声明式的方式构建复杂的状态管理和流程控制逻辑。状态机是软件工程中一个常用的设计模式,用于管理系统在不同状态之间的转换,以及每个状态下应该执行的动作。具体可以参考官网:https://spring.io/projects/spring-statemachine/
ant design prochat
ProChat是基于ant design构建的用于快速构建 LLM 聊天界面的组件库。对于使用ant design框架的开发者来说简直就是福音。具体可参考官网: https://pro-chat.antdigital.dev/
基本实现
基本逻辑
整体流程如上图所示,用户输入信息后,经过super agent根据用户输入的信息决定选择具体的执行智能体,当满足条件1时,选择智能体1,同样满足条件2时,选择智能体2。当选中智能体后,即使用该智能体回答用户问题。
super agent的决策思路
具体逻辑可参考文章:https://sultanov.dev/blog/langchain4j-multi-agent-system-using-state-machine/
基于状态机实现Agent决策,在状态机中定义四个步骤,分别为:
- 用户输入评估
- Agent选择
- Agent校验
- 重新选择Agent
在用户输入评估中,用于判断输入问题是否明确,如果不明确则需要进一步让用户提供相关信息;Agent选择是将Agent名称以及描述记录在markdown表示的表格中,根据用户输入一起提供给大模型进行判断选择,之后输出相应智能体;Agent校验是初步使用选择的Agent回答问题,看是否能够回答用户的最初问题;如果前面选择的Agent不能够回答用户的问题,那么会带着原始选择的智能体相关信息以及用户输入重新进入选择Agent阶段,如此往复。
多轮对话中记忆的使用
langchain4j提供了对话记忆的功能,可扩展ChatMemoryStore接口来实现存储功能。考虑到在一个对话框中的多轮对话,是有可能需要使用多个Agent的,所以我也在多个Agent之间实现记忆共享。
初步使用
目前内部集成了用于知识库检索的RAGAgent和用于普通对话的ChatAgent,我们看一个例子,从知识库中检索一些知识,然后再使用ChatAgent询问知识的正确性。
把如下内容存入知识库中:
代码语言:javascript复制## hbase性能测试结果
| 规格 | 顺序写 | 随机写 | 顺序读 |顺序读|
| - | - | - | -|-|
| 500m,8G | 40843 | 3631 | 6409|7055|
| 1000m,8G | 82940 | 6795 | 13279|15674|
| 2000m,8G | 148700 | 7505 | 23749| 21028|
使用自决策智能体查看hbase性能测试结果。
我们还可以问一下这个结果的合理性。
查看对话历史:
在对话历史中,我们可以发现如果是RAGAgent回答了用户问题,其实是会将用户的问题以及检索出来的信息全部存入记忆中的,这也就为后续其他智能体的回答提供了非常好的背景知识。
总结
目前,这只是一个非常初步的自决策智能体的实现,我希望存入知识库的东西能够在日常使用中合理用起来。