项目的起因是,在使用 SpringAi 1.0 的时候想要使用 Qwen 作为 ChatModel ,但发现 SpringAi 没有写对应的依赖,而且要用某一个 LLM 还要引用对应的依赖。后面就想自己抽象一层,能让 LLM 无缝接入,就开始看源码和 debug ,这样就有了初版。
后面看来几篇博文,表达的意思大概是现有的几款框架( LangChain 等)能够解决 80%的问题,但是剩下 20%是无法逾越的鸿沟,最终还是要深入底层修改 Prompt 等。所以要使用“搭积木”的方式搭建属于企业自身业务的框架。受此启发在 SpingAi 的基础上,搞了这么个项目。
ChatModel
接口,屏蔽底层实现差异,降低开发复杂度。@Bean(ChatModelConstants.KIMI_K2_CHAT_MODEL)
public KimiChatModel kimiK2ChatModel(@Qualifier("kimiApi") AiCommonApi kimiApi){
return (KimiChatModel) LLMEnum.KIMI.genChatModel(
KimiOptions.builder()
.model(ChatModelEnum.KIMI_K2)
.temperature(0.7)
.maxTokens(8048)
.build(),
kimiApi
);
}
@Bean(AgentConstants.RAG_AGENT)
public RagAgent ragAgent(@Qualifier(ChatModelConstants.QWEN_3_PLUS_CHAT_MODEL) QwenChatModel qwenChatModel,
RagTools ragTools){
return RagAgent.builder()
.chatModel(qwenChatModel)
.prompt(AgentPromptConstants.RAG_AGEMNT_SYSTEM_PROMPT)
.tools(ragTools)
.build();
}
@Override
public Map<Long,ChatRecordMsgJsonDto> queryMsg(List<Long> ids) {
if (CollectionUtils.isEmpty(ids)){
return Map.of();
}
return where(aiChatRecordMsgMapper)
.in(BaseDO::getId, ids)
.hasMap(
BaseDO::getId,
v-> JSONObject.parseObject(v.getMsgDetail().toString(),ChatRecordMsgJsonDto.class)
);
}
JDK21+Spring Ai 1.0+Spring Boot 3.4+PostgreSql+Redis7.x
1
snow0 11 小时 5 分钟前
Agent 有类似 LangChain 里面的高阶功能 loop 、策略配置吗
我看上面代码构建的 Agent 只循环一次 |
![]() |
2
serverKnignt OP @snow0 可以看下项目里面使用 Agent 快速搭建 OWL 的那个例子,在这个 OwlAgentStrategy 类中。项目主要是想要快速构建单个 Agent ,然后如何搭配使用要看自己具体的需求。未来会对 Prompt 进行优化,更加系统化和规范化。
|
![]() |
3
serverKnignt OP @snow0 单个 Agent 的话,可以看下 RagAgent 这个是在单个 Agent 中增加逻辑,不是简单的调用 LLM 。
|
4
snow0 8 小时 9 分钟前
@serverKnignt #2 🤝我学习下
|