[开源]Java AI 智能体 全场景应用开发框架支持已知 AI 开发的各种能力

开源系统
2026-06-08 22:41 6 次浏览 • 0 次下载 100KB
[开源]Java AI 智能体 全场景应用开发框架支持已知 AI 开发的各种能力

一、开源项目简介

Solon-AI

Java AI(智能体) 全场景应用开发框架(支持已知 AI 开发的各种能力)
【基于 Solon 应用开发框架构建】

Java AI(智能体) 全场景应用开发框架(LLM,Function Call,RAG,Embedding,Reranking,Flow,MCP Server,Mcp Client,Mcp Proxy)。同时兼容 java8 ~ java24。

面向全场景的 Java AI 应用开发框架(支持已知 AI 开发的各种能力)。是 Solon 项目的一部分。也可嵌入到 SpringBoot2、jFinal、Vert.x 等框架中使用。

二、开源协议

使用Apache-2.0开源协议

三、界面展示

图片

 

图片

四、功能概述

(v3.1.0 后支持)

本系列主要介绍 Solon AI 插件(AI “通用”应用开发框架)的使用。Solon-AI 通过方言适配的设计,可兼容各大语言模型(LLM)接口调用。

这里讲的 AI 主要是指生成式人工智能(Generative Artificial Intelligence)。也会称为“大模型”,或者“大语言模型”。按生成内容分的话,常见的有:

模型

作用

聊天生成模型(ChatModel)

用于生成聊天对话、或文字创作、或解惑答疑等

图片生成模型(ImageModel)

用于生成图片

视频生成模型(VideoModel)

用于生成视频

其它模型还会有(更多,不列):

模型

作用

嵌入模型(EmbeddingModel)

用于生成矢量数据,进而实现相似查询

排序模型(RankingModel)

用于排序

不同模型间,会有相互协作。比如 ChatModel 生成的内容,可用于 ImageModel 和 VideoModel。而 EmbeddingModel 与 ChatModel 协作,可实现 RAG(即本地数据与大模型协作,增强生成效果)。也支持 MCP 协议,实现 Tool 服务发布,和 Tool 服务使用。

在使用时,可以粗浅得认为它是个 http-api 接口(平易近人些)。见常的几种术语,也是差不多的意思:

  • ai
  • 大模型
  • 生成式大语言模型
  • 大语言模型
  • 语言模型

目前 AI 常见的应用建设(solon-flow 提供“流程编排”支持)

来源:Solon-AI 官方文档

五、技术选型

主要接口体验示例

  • ChatModel(通用接口,基于方言适配实现不同提供商与模型的扩展)
ChatModel chatModel = ChatModel.of("http://127.0.0.1:11434/api/chat")
                .provider("ollama") //需要指定供应商,用于识别接口风格(也称为方言)
                .model("qwen2.5:1.5b")
                .build();
//同步调用,并打印响应消息
System.out.println(chatModel.prompt("hello").call().getMessage());
//响应式调用
chatModel.prompt("hello").stream(); //Publisher<ChatResponse>
  • Function Calling(或者 Tool Calling)
//可以添加默认工具(即所有请求有产),或请求时工具
chatModel.prompt("今天杭州的天气情况?")
    .options(op->op.toolsAdd(new FunctionTools()))
    .call();
  • Vision(多媒体感知)
chatModel.prompt(ChatMessage.ofUser("这图里有方块吗?", Image.ofUrl(imageUrl)))
    .call();
  • RAG(EmbeddingModel,Repository,DocumentLoader,RerankingModel)
//构建知识库
EmbeddingModel embeddingModel = EmbeddingModel.of(apiUrl).apiKey(apiKey).provider(provider).model(model).batchSize(10).build();
RerankingModel rerankingModel = RerankingModel.of(apiUrl).apiKey(apiKey).provider(provider).model(model).build();
InMemoryRepository repository = new InMemoryRepository(TestUtils.getEmbeddingModel()); //3.初始化知识库
repository.insert(new PdfLoader(pdfUri).load());
//检索
List<Document> docs = repository.search(query);
//如果有需要,可以重排一下
docs = rerankingModel.rerank(query, docs);
//提示语增强是
ChatMessage message = ChatMessage.augment(query, docs);
//调用大模型
chatModel.prompt(message)
    .call();
  • Ai Flow(模拟实现 Dify 的流程应用)
id: demo1
layout:
  - title: "开始"
    type: start
  - title: "文件提取"
    meta.input: "file" # 可视界面的配置(通过元信息表示)
    meta.output: "fileTxt"
    task: @FileLoaderCom
  - title: "LLM"
    meta.model: "Qwen/Qwen2.5-72B-Instruct" # 可视界面的配置(通过元信息表示)
    meta.input: "fileTxt"
    meta.messages:
      - role: system
        content: "#角色\n你是一个数据专家,删除数据的格式整理和转换\n\n#上下文\n${fileTxt}\n\n#任务\n提取csv格式的字符串"
    task: @ChatModelCom
  - title: "参数提取器"
    meta.model: "Qwen/Qwen2.5-72B-Instruct" # 可视界面的配置(通过元信息表示)
    meta.output: "csvData"
    task: @ParamExtractionCom
  - title: "执行代码"
    meta.input: "csvData"
    task: |
      import com.demo.DataUtils;

      String json = DataUtils.csvToJson(node.meta().get("meta.input"));  //转为 json 数据
      String echatCode = DataUtils.jsonAsEchatCode(json); //转为 echat 图表代码
      context.result = echatCode; //做为结果返回
  - title: "结束"
    type: end
# FlowEngine flowEngine = FlowEngine.newInstance();
# ...
# flowEngine.eval("demo1");
  • MCP server(支持多端点)
//组件方式构建
@McpServerEndpoint(name="mcp-case1", sseEndpoint = "/case1/sse")
public class McpServerTool {
    @ToolMapping(description = "查询天气预报")
    public String getWeather(@ToolParam(description = "城市位置") String location) {
        return "晴,14度";
    }
}
//原生 java 方式构建
McpServerEndpointProvider serverEndpoint = McpServerEndpointProvider.builder()
        .name("mcp-case2")
        .sseEndpoint("/case2/sse")
        .build();
serverEndpoint.addTool(new MethodToolProvider(new McpServerTool()));
serverEndpoint.postStart();
  • MCP client
McpClientToolProvider clientToolProvider = McpClientToolProvider.builder()
                .apiUrl("http://localhost:8080/case1/sse")
                .build();
String rst = clientToolProvider.callToolAsText("getWeather", Map.of("location", "杭州"));