|
|
@@ -283,24 +283,243 @@ public abstract String act();
|
|
|
- **ReAct 配置**:是否启用 ReAct 模式
|
|
|
- **RAG 配置**:向量存储、TopK、分数阈值等
|
|
|
- **记忆配置**:存储类型、过期时间等
|
|
|
+- **MCP 配置**:MCP Hub 地址、鉴权信息等
|
|
|
|
|
|
-## 6. 系统工作流程
|
|
|
+## 6. MCP 功能集成
|
|
|
|
|
|
-### 6.1 典型流程
|
|
|
+### 6.1 MCP 架构设计
|
|
|
+
|
|
|
+**核心实现文件**:
|
|
|
+- `McpClientService.java`:MCP 客户端服务,负责与 MCP Hub 通信
|
|
|
+- `McpTool.java`:MCP 工具封装,将 MCP 工具转换为 Spring AI 工具
|
|
|
+- `McpServerConfig.java`:MCP 服务器配置
|
|
|
+
|
|
|
+**设计理念**:
|
|
|
+- **模块化设计**:独立的 MCP 客户端模块,与其他模块解耦
|
|
|
+- **会话管理**:支持多会话管理,每个会话对应一个 MCP 连接
|
|
|
+- **智能路由**:支持智能路由模式,提供更智能的工具搜索和执行
|
|
|
+
|
|
|
+### 6.2 MCP 核心功能
|
|
|
+
|
|
|
+**功能列表**:
|
|
|
+1. **连接管理**:建立和管理与 MCP Hub 的 SSE 连接
|
|
|
+2. **工具列表**:获取 MCP Hub 提供的工具列表
|
|
|
+3. **工具调用**:调用 MCP Hub 中的工具
|
|
|
+4. **智能路由**:使用智能路由搜索和执行工具
|
|
|
+
|
|
|
+**关键代码**:
|
|
|
+
|
|
|
+```java
|
|
|
+// MCP 连接管理
|
|
|
+public synchronized String connect(String group) {
|
|
|
+ // 如果已有连接,先关闭
|
|
|
+ if (sessions.containsKey(group)) {
|
|
|
+ closeSession(sessions.get(group));
|
|
|
+ }
|
|
|
+
|
|
|
+ SessionInfo sessionInfo = new SessionInfo();
|
|
|
+ sessionInfo.setGroup(group);
|
|
|
+ sessionInfo.setSessionId(UUID.randomUUID().toString()); // 临时ID,会被覆盖
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 获取 sessionId
|
|
|
+ String sessionId = getMCPSessionId();
|
|
|
+
|
|
|
+ sessionInfo.setSessionId(sessionId);
|
|
|
+ sessions.put(group, sessionInfo);
|
|
|
+
|
|
|
+ log.info("MCP 连接成功 [group={}, sessionId={}]", group, sessionId);
|
|
|
+ return sessionId;
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("MCP 连接失败 [group={}]: {}", group, e.getMessage());
|
|
|
+ throw new RuntimeException("无法建立 MCP 连接: " + e.getMessage(), e);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 工具调用
|
|
|
+public ToolCallResult callTool(String group, String toolName, Map<String, Object> arguments) {
|
|
|
+ SessionInfo session = getOrCreateSession(group);
|
|
|
+
|
|
|
+ ToolCallParams params = ToolCallParams.builder()
|
|
|
+ .name(toolName)
|
|
|
+ .arguments(arguments)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ JsonRpcRequest request = JsonRpcRequest.builder()
|
|
|
+ .jsonrpc("2.0")
|
|
|
+ .id(requestIdGenerator.incrementAndGet())
|
|
|
+ .method("tools/call")
|
|
|
+ .params(objectMapper.valueToTree(params))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ JsonNode response = sendRequest(session, request);
|
|
|
+ return parseToolCallResult(response);
|
|
|
+}
|
|
|
+
|
|
|
+// 智能路由搜索工具
|
|
|
+public ToolCallResult searchTools(String group, String query, int limit) {
|
|
|
+ SessionInfo session = getOrCreateSession(group);
|
|
|
+
|
|
|
+ if (!"intelligence".equals(session.getMode())) {
|
|
|
+ // 如果不是智能路由模式,先切换到智能路由
|
|
|
+ connectIntelligence(group);
|
|
|
+ session = sessions.get(group);
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> arguments = Map.of(
|
|
|
+ "query", query,
|
|
|
+ "limit", limit
|
|
|
+ );
|
|
|
+
|
|
|
+ ToolCallParams params = ToolCallParams.builder()
|
|
|
+ .name("search_tools")
|
|
|
+ .arguments(arguments)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ JsonRpcRequest request = JsonRpcRequest.builder()
|
|
|
+ .jsonrpc("2.0")
|
|
|
+ .id(requestIdGenerator.incrementAndGet())
|
|
|
+ .method("tools/call")
|
|
|
+ .params(objectMapper.valueToTree(params))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ JsonNode response = sendRequest(session, request);
|
|
|
+ return parseToolCallResult(response);
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 6.3 MCP 工具集成
|
|
|
+
|
|
|
+**McpTool 实现**:
|
|
|
+
|
|
|
+```java
|
|
|
+public class McpTool implements ToolCallback {
|
|
|
+
|
|
|
+ private final String name;
|
|
|
+ private final String description;
|
|
|
+ private final String group;
|
|
|
+ private final McpClientService mcpClientService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ToolDefinition getToolDefinition() {
|
|
|
+ return ToolDefinition.builder()
|
|
|
+ .name(name)
|
|
|
+ .description(description)
|
|
|
+ // MCP 工具的参数 schema 由 MCP Hub 提供
|
|
|
+ // 这里使用一个通用的 object schema
|
|
|
+ .inputSchema("""
|
|
|
+ {
|
|
|
+ "type": "object",
|
|
|
+ "properties": {
|
|
|
+ "args": {
|
|
|
+ "type": "object",
|
|
|
+ "description": "工具参数,由 MCP Hub 定义"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ """)
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String call(String toolInput) {
|
|
|
+ log.info("执行 MCP 工具 [name={}, group={}, input={}]", name, group, toolInput);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 解析输入参数
|
|
|
+ Map<String, Object> args = parseInput(toolInput);
|
|
|
+
|
|
|
+ // 调用 MCP Hub
|
|
|
+ ToolCallResult result;
|
|
|
+ // 这里简化处理,实际应该根据会话的模式来选择调用方法
|
|
|
+ // 暂时使用普通的 callTool 方法
|
|
|
+ result = mcpClientService.callTool(group, name, args);
|
|
|
+
|
|
|
+ if (result.isError()) {
|
|
|
+ log.error("MCP 工具执行失败 [name={}]: {}", name, result.getContent());
|
|
|
+ return "工具执行失败: " + result.getContent();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 返回结果内容
|
|
|
+ String content = result.getContent();
|
|
|
+ log.info("MCP 工具执行成功 [name={}], 结果长度: {}", name,
|
|
|
+ content != null ? content.length() : 0);
|
|
|
+
|
|
|
+ return content != null ? content : "工具执行成功,但无返回内容";
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("MCP 工具执行异常 [name={}]: {}", name, e.getMessage(), e);
|
|
|
+ return "工具执行异常: " + e.getMessage();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 6.4 MCP 配置
|
|
|
+
|
|
|
+**配置项**:
|
|
|
+
|
|
|
+```java
|
|
|
+@Data
|
|
|
+@Configuration
|
|
|
+@ConfigurationProperties(prefix = "mcp.hub")
|
|
|
+public class McpServerConfig {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * MCP Hub 基础 URL
|
|
|
+ */
|
|
|
+ private String baseUrl = "https://ai-paas-mcp-endpoint.njuu.top";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 鉴权 token
|
|
|
+ */
|
|
|
+ private String authorization = "sqGYuMvKgdxmzmTM5lNBgLdVpl6XNnPX";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 连接超时(秒)
|
|
|
+ */
|
|
|
+ private int connectTimeout = 10;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 请求超时(秒)
|
|
|
+ */
|
|
|
+ private int requestTimeout = 60;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否自动重连
|
|
|
+ */
|
|
|
+ private boolean autoReconnect = true;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 7. 系统工作流程
|
|
|
+
|
|
|
+### 7.1 典型流程
|
|
|
|
|
|
1. **客户端请求**:客户端发送聊天请求
|
|
|
2. **配置加载**:加载对应 Agent 的配置
|
|
|
3. **记忆检索**:获取对话历史
|
|
|
4. **RAG 处理**:执行 RAG 检索,获取相关知识
|
|
|
5. **ReAct 处理**:执行 ReAct 思考和行动
|
|
|
+ - **工具调用**:如需调用工具,可选择本地工具或 MCP 工具
|
|
|
+ - **MCP 工具调用**:通过 McpClientService 调用 MCP Hub 中的工具
|
|
|
6. **响应生成**:生成响应并返回给客户端
|
|
|
7. **记忆更新**:更新对话记忆
|
|
|
|
|
|
-### 6.2 异步处理
|
|
|
+### 7.2 MCP 集成流程
|
|
|
+
|
|
|
+1. **MCP 连接**:建立与 MCP Hub 的 SSE 连接
|
|
|
+2. **工具发现**:获取 MCP Hub 提供的工具列表
|
|
|
+3. **工具注册**:将 MCP 工具注册为 Spring AI 工具
|
|
|
+4. **工具调用**:在 ReAct 过程中调用 MCP 工具
|
|
|
+5. **结果处理**:处理 MCP 工具返回的结果
|
|
|
+
|
|
|
+### 7.3 异步处理
|
|
|
|
|
|
系统使用 Spring 的异步处理能力,将保全信息等耗时操作异步解耦,提高系统响应速度。
|
|
|
|
|
|
-## 7. 技术选型
|
|
|
+## 8. 技术选型
|
|
|
|
|
|
| 技术 | 版本 | 用途 |
|
|
|
|------|------|------|
|
|
|
@@ -310,21 +529,38 @@ public abstract String act();
|
|
|
| Kryo | 5.x | 高效序列化 |
|
|
|
| Ollama | 0.1.x | 本地模型 |
|
|
|
| Maven | 3.x | 构建工具 |
|
|
|
+| MCP Hub | - | 工具服务平台 |
|
|
|
|
|
|
-## 8. 未来扩展
|
|
|
+## 9. 未来扩展
|
|
|
|
|
|
-### 8.1 存储扩展
|
|
|
+### 9.1 存储扩展
|
|
|
- **MySQL 存储**:实现多一级别的 MySQL 存储,支持更复杂的查询和分析
|
|
|
|
|
|
-### 8.2 模型扩展
|
|
|
+### 9.2 模型扩展
|
|
|
- **模型列表**:补充更多模型支持
|
|
|
- **多模态调用**:实现完整的多模态调用功能
|
|
|
|
|
|
-### 8.3 客户端集成
|
|
|
-- **MCP 完整集成**:完善 MCP 客户端功能
|
|
|
+### 9.3 客户端集成
|
|
|
+- **MCP 功能增强**:扩展 MCP 客户端功能,支持更多 MCP Hub 特性
|
|
|
- **A2A 集成**:实现 A2A 相关功能
|
|
|
|
|
|
-### 8.4 工具完善
|
|
|
+### 9.4 工具完善
|
|
|
- **工具连接**:完善工具连接和使用
|
|
|
- **辅助工具**:补充更多辅助工具
|
|
|
+- **工具管理**:实现工具的动态注册和管理
|
|
|
+
|
|
|
+### 9.5 智能路由优化
|
|
|
+- **智能路由增强**:优化智能路由算法,提高工具匹配准确性
|
|
|
+- **多模态工具**:支持多模态工具的智能路由
|
|
|
+
|
|
|
+## 10. 总结
|
|
|
+
|
|
|
+AI PaaS 平台采用分层架构设计,实现了配置管理、Agent 核心、记忆系统、RAG 功能和 MCP 集成。系统架构清晰,代码组织合理,功能完整。
|
|
|
+
|
|
|
+- **记忆层**:使用 Kryo 序列化和 Redis 存储,实现了高效的对话记忆管理
|
|
|
+- **RAG**:实现了完整的 RAG 流程,包括查询词生成、向量检索、结果处理和关键信息提取
|
|
|
+- **ReAct**:实现了 ReAct 模式,包含思考和行动两个阶段,支持工具调用
|
|
|
+- **MCP 集成**:实现了与 MCP Hub 的完整集成,支持工具发现、调用和智能路由
|
|
|
+
|
|
|
+系统已经具备了 AI PaaS 平台的核心功能,为未来的扩展和优化奠定了基础。MCP 功能的集成使得系统能够利用外部工具服务,大大扩展了 Agent 的能力范围。
|
|
|
|