Agentic Loop与MCP:大模型能力扩展技术解析
一、什么是MCP
MCP(Model Context Protocol)是一种用于大语言模型与外部工具交互的协议框架。它允许大语言模型能够调用各种外部工具来扩展其能力边界,如访问文件系统、搜索引擎、数据库等。
MCP的核心价值
- 能力扩展:使大语言模型突破知识边界和计算能力的限制
- 标准化接口:提供统一的工具调用标准,降低集成成本
- 复杂任务处理:通过递进式工具调用,解决复杂问题
- 灵活扩展:开发者可方便地添加自定义工具
MCP通过宿主应用、客户端、服务器和大语言模型的协作,实现了AI与工具的无缝对接,为AI应用提供了强大的扩展性。
二、各组件职责
宿主应用(Host)
- 提供用户界面,接收用户输入
- 展示AI响应和工具执行结果
- 管理用户会话和界面状态
- 维护对话历史和上下文管理
宿主应用最简实现:
// host.ts - 宿主应用简化实现
import { MCPClient } from './client';class MCPHost {private client: MCPClient;private conversationHistory: any[] = [];constructor() {// 初始化MCP客户端this.client = new MCPClient();}// 应用启动async start() {// 初始化客户端await this.client.initialize();console.log("MCP宿主应用启动成功");}// 处理用户消息async handleUserMessage(userInput: string) {// 添加用户消息到历史this.conversationHistory.push({ role: "user", content: userInput });// 发送消息给客户端处理const response = await this.client.processMessage(userInput, this.conversationHistory);// 添加响应到历史this.conversationHistory.push({ role: "assistant", content: response });// 返回响应给UIreturn response;}
}
MCP客户端(Client)
- 管理注册连接mcp server
- 解析模型输出中的工具调用指令
- 使用stdio标准IO以及RPC规范与mcp server通信让其执行工具方法
注意:实际开发中,推荐使用Model Context Protocol官方SDK,官方提供了Python、TypeScript、Java、Kotlin、C#等多种语言的SDK实现。本文为了更清晰地展示底层实现细节,自行实现了一些核心方法,帮助读者理解MCP客户端的工作原理。
2.1 客户端核心结构
MCP客户端最简实现:
// client.ts - MCP客户端简化实现
import { LLMProvider } from './llm-provider';
import { spawn } from 'child_process';
import * as fs from 'fs';
import * as path from 'path';export class MCPClient {private servers: Map<string, any> = new Map();private availableTools: any[] = [];private maxAgentLoops = 20;private llmProvider: LLMProvider;constructor() {this.llmProvider = new LLMProvider();}// 初始化客户端async initialize() {// 读取MCP服务器配置const configPath = path.join(process.env.HOME || process.env.USERPROFILE || '', 'mcp_config.json');const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));// 连接到每个配置的MCP服务器for (const [serverName, serverConfig] of Object.entries(config.mcpServers)) {console.log(`正在连接到MCP服务器: ${serverName}`);try {// 创建与服务器的连接const serverConnection = await this.connectToServer(serverName, serverConfig);this.servers.set(serverName, serverConnection);// 获取服务器提供的工具列表const tools = await this.fetchToolsFromServer(serverConnection);this.availableTools.push(...tools.map(tool => ({...tool,serverName})));console.log(`已连接MCP服务器 ${serverName} 并发现 ${tools.length} 个工具`);} catch (error) {console.error(`连接MCP服务器 ${serverName} 失败:`, error);}}console.log(`已连接 ${this.servers.size} 个MCP服务器,共发现 ${this.availableTools.length} 个工具`);}// 连接到MCP服务器private async connectToServer(serverName: string, config: any) {// 根据配置启动服务器进程const childProcess = spawn(config.command,config.args || [],{cwd: config.cwd || process.cwd(),stdio: ['pipe', 'pipe', 'pipe']});// 简单封装连接对象const serverConnection = {name: serverName,process: childProcess,async sendRequest(request: any) {return new Promise((resolve, reject) => {// 将请求写入标准输入childProcess.stdin.write(JSON.stringify(request) + '\n');// 从标准输出读取响应childProcess.stdout.once('data', (data) => {try {const response = JSON.parse(data.toString());resolve(response);} catch (error) {reject(new Error(`无法解析服务器响应: ${error.message}`));}});// 处理错误childProcess.on('error', reject);});}};return serverConnection;}// 从服务器获取工具列表private async fetchToolsFromServer(serverConnection: any) {const request = {jsonrpc: "2.0",id: this.generateId(),method: "listTools",params: {}};const response = await serverConnection.sendRequest(request);if (response.error) {throw new Error(`获取工具列表失败: ${response.error.message}`);}return response.result.tools || [];}// 处理消息并执行Agentic Loopasync processMessage(userInput: string, history: any[]) {// 准备LLM请求const llmRequest = this.prepareLLMRequest(userInput, history);// 执行Agentic Looplet loopCount = 0;let finalResponse = "";while (loopCount < this.maxAgentLoops) {// 调用LLM获取响应const llmResponse = await this.llmProvider.generateResponse(llmRequest);// 检查是否包含工具调用const toolCalls = this.extractToolCalls(llmResponse);if (toolCalls.length === 0) {// 无工具调用,循环结束finalResponse = llmResponse.content;break;}// 首先添加包含工具调用的assistant消息到历史llmRequest.messages.push({role: "assistant",content: null,tool_calls: toolCalls.map((toolCall, index) => ({id: `call_${Date.now()}_${index}`,type: 'function',function: {name: toolCall.name,arguments: JSON.stringify(toolCall.arguments)}}))});// 执行工具调用for (const toolCall of toolCalls) {const result = await this.callTool(toolCall);// 将工具结果添加到对话历史llmRequest.messages.push({role: "tool",name: toolCall.name,content: JSON.stringify(result)});}loopCount++;}return finalResponse;}// 调用工具async callTool(toolCall: { name: string, arguments: Record<string, any> }) {console.log(`客户端调用工具: ${toolCall.name},参数:`, toolCall.arguments);// 查找支持此工具的服务器const tool = this.availableTools.find(t => t.name === toolCall.name);if (!tool) {throw new Error(`未知工具: ${toolCall.name}`);}const serverConnection = this.servers.get(tool.serverName);if (!serverConnection) {throw new Error(`未找到支持工具 ${toolCall.name} 的服务器`);}// 创建标准JSON-RPC请求const request = {jsonrpc: "2.0",id: this.generateId(),method: "callTool",params: {name: toolCall.name,arguments: toolCall.arguments || {}}};// 发送请求并获取响应const response = await serverConnection.sendRequest(request);// 处理错误if (response.error) {throw new Error(`工具调用失败: ${response.error.message}`);}// 返回结果return response.result;}// 准备LLM请求private prepareLLMRequest(userInput: string, history: any[]) {return {messages: [...history],tools: this.availableTools.map(tool => ({type: "function",function: {name: tool.name,description: tool.description,parameters: {type: tool.inputSchema.type,properties: tool.inputSchema.properties,required: tool.inputSchema.required}}}))};}// 从LLM响应中提取工具调用private extractToolCalls(response: any) {// 简化实现,假设response包含tool_calls属性return response.tool_calls || [];}// 生成唯一IDprivate generateId() {return `req-${Date.now()}-${Math.floor(Math.random() * 1000)}`;}
}
@modelcontextprotocol/sdk 的callTool
方法实现
官方SDK也是基于JSON-RPC 2.0协议实现,是客户端与服务器交互的核心接口:
JSON-RPC 2.0格式
MCP客户端和服务器之间的通信基于JSON-RPC 2.0协议:
请求格式
{"jsonrpc": "2.0","id": "request-123","method": "callTool","params": {"name": "calculator","arguments": {"a": 5,"b": 3,"operation": "multiply"}}
}
成功响应格式
{"jsonrpc": "2.0","id": "request-123","result": {"content": [{"type": "text","text": "15"}],"isError": false}
}
错误响应格式
{"jsonrpc": "2.0","id": "request-123","error": {"code": -32000,"message": "Unknown tool 'calculator'"}
}
大语言模型(LLM)
- 处理用户输入并生成回复
- 根据需要输出标准格式的工具调用指令
- 根据工具执行结果给出自然语言结果或暂时由于信息不足需要调用更多的工具而继续对话
LLM提供者最简实现:
// llm-provider.ts - LLM提供者简化实现
export class LLMProvider {// 向大语言模型发送请求并获取响应async generateResponse(request: any) {console.log("向LLM发送请求:", request);// 这里应该调用实际的LLM API// 为简化示例,返回模拟响应// 模拟LLM可能返回工具调用或直接回答const useTool = Math.random() > 0.5;if (useTool) {return {content: "我需要先获取一些信息...",tool_calls: [{name: "calculator",arguments: {a: 5,b: 3,operation: "multiply"}}]};} else {return {content: "这是我直接生成的回答,不需要使用工具。",tool_calls: []};}}
}
MCP服务器(Server)
- 接收来自Client的RPC工具调用请求
- 管理和执行注册的工具
- 将工具执行结果返回给Client
- 可能包含多种工具的实现或与外部工具服务的连接
MCP服务器最简实现(使用官方SDK):
// mcp-server.js - 基于SDK的MCP服务器简单实现
const { createServer } = require('@modelcontextprotocol/server');// 创建一个MCP服务器实例
const server = createServer({name: 'simple-tools'
});// 注册一个简单的计算器工具
server.registerTool({name: 'calculator',description: '执行简单的数学计算',parameters: {type: 'object',properties: {a: { type: 'number', description: '第一个数字' },b: { type: 'number', description: '第二个数字' },operation: { type: 'string', description: '操作类型',enum: ['add', 'subtract', 'multiply', 'divide']}},required: ['a', 'b', 'operation']},execute: async ({ a, b, operation }) => {let result;switch (operation) {case 'add':result = a + b;break;case 'subtract':result = a - b;break;case 'multiply':result = a * b;break;case 'divide':if (b === 0) {throw new Error('除数不能为零');}result = a / b;break;default:throw new Error(`不支持的操作: ${operation}`);}return { result: result.toString() };}
});// 启动服务器,使用标准输入/输出作为传输层
server.start({ transport: 'stdio' });
console.error('计算器MCP服务器已启动');
三、MCP系统工作流程
3.1 系统初始化过程
系统启动时,会进行以下初始化步骤:
初始化关键步骤
-
Host启动:
- 宿主应用启动,加载mcp server配置文件
- 创建MCP Client实例
-
Client初始化:
- 加载MCPServer配置列表
- 为每个配置创建连接
-
工具发现与注册:
- Client连接到各MCPServer
- 请求并获取每个Server提供的工具列表
- 注册工具信息(名称、描述、输入模式、所属服务器)
- 返回完整工具列表给Host
-
UI初始化:
- Host更新UI展示可用工具
- 准备就绪,等待用户输入
MCP服务器配置示例:
{"mcpServers": {"calculator": {"command": "node","args": ["/absolute/path/to/mcp-server.js" // 请替换为实际的服务器脚本路径]}}
}
注意:请根据实际环境替换服务器脚本路径
- Windows示例: "C:\path\to\mcp-server.js" 或 "C:/path/to/mcp-server.js"
- MacOS/Linux示例: "/Users/username/projects/mcp-server.js" 或 "/home/username/projects/mcp-server.js"
3.2 完整交互流程
MCP的各个组件之间有清晰的调用关系,下图展示了从用户输入到最终输出的完整流程:
四、Agentic Loop循环实现
Agentic Loop是MCP系统实现工具调用的核心机制,它允许模型进行多次连续的工具调用,实现复杂任务分解和递进式解决问题。
4.1 Agentic Loop工作原理
Agentic Loop的核心思想是让大语言模型根据情况决定是直接回答还是通过工具获取更多信息。循环机制使模型能够分步骤解决复杂问题。
4.2 循环控制与终止条件
MCP系统通常设置最大循环次数(如20次)以防止无限循环。循环在以下情况终止:
- 模型返回不包含工具调用的完整回答
- 达到最大循环次数
- 遇到无法处理的错误
4.3 关键步骤详解
-
循环初始化:
- 用户发送请求
- Client构建所有可用工具的大模型请求参数
- Client将用户问题到对话历史以及将可用的MCP工具添加到上下文消息体中
- 设置循环计数器和最大循环次数
-
LLM推理:
- Client向LLM发送完整请求
- LLM返回响应,可能会包含工具调用指令,也可能会直接做出回答,由大模型自主推理是否需要借助工具
-
工具调用处理:
- Client解析响应,检查是否包含工具调用
- 如有工具调用,Client调用@modelcontextprotocol/sdk里client的callTool方法
- 获取mcp server工具执行结果并添加到历史
-
循环继续或终止:
- 若大模型继续返回工具调用且未达到最大循环次数,回到步骤2继续
- 若大模型未返回工具调用或达到最大次数,终止循环,输出大模型最终回答
4.4 对话历史管理
在Agentic Loop中,每轮工具调用的结果都会被添加到对话历史中,这样LLM可以利用之前工具调用的结果进行推理。这种方式使LLM能够参考历史信息,实现多步骤的复杂问题解决。
完整系统协作流程示例:
// example.ts - 展示MCP系统协作
import { MCPHost } from './host';async function runMCPExample() {// 创建并启动宿主应用const host = new MCPHost();await host.start();// 模拟用户提问const userQuestion = "计算5乘以3等于多少?";console.log(`用户: ${userQuestion}`);// 宿主应用处理用户消息const response = await host.handleUserMessage(userQuestion);console.log(`助手: ${response}`);
}// 运行示例
runMCPExample().catch(console.error);
五、最终实现效果
六、总结
MCP的技术实现是一个多层次、多组件协作的过程,它通过标准化的协议实现了大语言模型与外部工具的无缝交互。通过Agentic Loop循环机制,系统能够支持复杂任务的递进式解决,而基于JSON-RPC 2.0协议的通信方式则确保了通信的可靠性和跨平台兼容性。这种设计使得开发者可以轻松地扩展和定制工具功能,从而大幅提升AI应用的能力边界。
相关文章:
Agentic Loop与MCP:大模型能力扩展技术解析
一、什么是MCP MCP(Model Context Protocol)是一种用于大语言模型与外部工具交互的协议框架。它允许大语言模型能够调用各种外部工具来扩展其能力边界,如访问文件系统、搜索引擎、数据库等。 MCP的核心价值 能力扩展:使大语言模…...
贪心算法 Part04
总结下重叠区间问题 LC 452. 用最少数量的箭引爆气球 和 LC 435. 无重叠区间 本质上是一样的。 LC 452. 用最少数量的箭引爆气球 是求n个区间当中 , 区间的种类数量 k。此处可以理解为,重叠在一起的区间属于同一品种,没有重叠的区间当然…...
Spring事务简单操作
什么是事务? 事务是一组操作的集合,是一个不可分割的操作 事务会把所有的操作作为⼀个整体, ⼀起向数据库提交或者是撤销操作请求. 所以这组操作要么同时 成功, 要么同时失败. 事务的操作 分为三步: 1. 开启事start transaction/ begin …...
04算法学习_209.长度最小的子数组
04算法学习_209.长度最小的子数组题目描述:个人代码:学习思路:第一种写法:题解关键点: 第二种写法:题解关键点: 个人学习时疑惑点解答: 04算法学习_209.长度最小的子数组 力扣题目链…...
./build/mkfs.jffs2: Command not found
参考文章:https://blog.csdn.net/FLM19990626/article/details/132070195 sudo apt-get install lib32stdc6 sudo apt-get install lib32z1 sudo apt-get install mtd-utils sudo apt-get install man-db sudo apt-get install liblzo2-dev:i386sudo ldconfig...
从零基础到最佳实践:Vue.js 系列(4/10):《Vue Router 路由管理:深入探索与实战应用》
引言 在现代前端开发中,单页应用(SPA)凭借其流畅的用户体验和高性能成为主流。Vue Router 作为 Vue.js 的官方路由管理工具,为开发者提供了强大的路由管理能力,帮助实现页面导航、权限控制和动态内容加载。本文将从基…...
深入解析C++静态成员变量与函数
当然可以!下面是对这段 C 代码的逐行详细注释说明和解释,帮助你理解静态成员变量和静态成员函数的使用。 🧱 类定义部分:MyClass cpp 深色版本 #include <iostream> 说明:包含标准输入输出流库,用于…...
基于JDBC的信息管理系统,那么什么是JDBC呢?什么又是DAO类?
1.JDBC JDBC 即 Java Database Connectivity,是 Java 语言中用于与数据库进行交互的一套 API。它提供了一种标准的方式,让 Java 程序能够连接到各种不同类型的数据库,并执行 SQL 语句来实现对数据库的查询、插入、更新和删除等操作。 主要功…...
Java虚拟机 -虚拟机栈
虚拟机栈详解 虚拟机栈概述案例常见的跟虚拟栈异常相关的异常StackOverflowError异常OutOfMemoryError异常 栈的基本存储单位局部变量表IDEA Jclasslib Bytecode Viewer插件slot 操作数栈方法调用(待后续补充) 虚拟机栈 上一篇文章,我们简单…...
【AI News | 20250521】每日AI进展
AI Repos 1、OpenHands OpenHands(前身为OpenDevin)是一个由AI驱动的软件开发代理平台,它能够像人类开发者一样修改代码、运行命令、浏览网页、调用API,甚至从StackOverflow复制代码片段。用户可以通过OpenHands Cloud轻松上手&a…...
RAG 挑战赛冠军方案解析:从数据解析到多路由器检索的工程实践,推荐阅读!
多路由器 动态知识库:RAG 冠军方案的核心技术揭秘 源码地址:https://github.com/IlyaRice/RAG-Challenge-2/tree/main 公司年报智能问答比赛任务简介 比赛的任务是基于公司年度报告构建一个问答系统。简单来说,比赛当天的流程如下ÿ…...
Java基础 Day17
一、递归 方法直接或者间接调用本身 将大问题, 层层转化为一个与原问题相似的、规模更小的问题来解决 二、异常 程序在编译或执行过程中,出现的非正常的情况 (错误) 语法错误不是异常 1、阅读异常信息 从下往上看:发生异常的位置、异常名称、发生异…...
系分论文《论软件系统安全分析和应用》
系统分析师论文范文系列 【摘要】 2023年3月,我司承接了某知名电商企业“智能化供应链管理系统”的开发任务,我作为系统分析师负责全面的安全分析与设计工作。该系统以提升电商供应链效率为核心,整合仓储、物流、支付等模块,并需应…...
蓝耘Ubantu服务器测试最新 PP-StructureV3 教程
一、服务器配置 二、安装Anaconda3 进入云服务器后删除minconda文件夹 官网: https://repo.anaconda.com/archive/ 在里面找到自己系统的安装包,然后右击复制链接安装。 一定要选择Anaconda,因为很多依赖问题用Minconda容易报错。 wget https://repo…...
File文件
路径: 相对路径:以 当前工作目录(或指定的基准目录)为起点,描述目标文件或目录的位置,不包含根目录信息,仅表示与基准目录的相对位置关系。绝对路径:从文件系统的 根目录 开始&…...
Wireshark抓包分析小程序接口请求教程
## 1. 准备工作 ### 1.1 安装Wireshark - 访问Wireshark官网 (https://www.wireshark.org/) 下载最新版本 - 按照安装向导完成安装 - 确保安装时选择安装WinPcap或Npcap(用于网络数据包捕获) ### 1.2 配置环境 - 确保电脑已连接网络 - 如果使用手机…...
C++之模板进阶(探索C++模板:非类型参数与特化技巧)
本节目标: 1.非类型模板参数 2.类模板的特化 3.类模板特化的应用之类型萃取 4.模板的分离编译 非类型模板参数 模板参数分 类型形参与非类型形参 类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称 非类型形…...
【项目记录】准备工作及查询部门
1 开发规范 1.1 前后端分离开发 现在的企业项目开发有2种开发模式:前后台混合开发和前后台分离开发。 前后台混合开发,顾名思义就是前台后台代码混在一起开发 这种开发模式有如下缺点: 1. 沟通成本高:后台人员发现前端有问题&a…...
chromedp -—— 基于 go 的自动化操作浏览器库
chromedp chromedp 是一个用于 Chrome 浏览器的自动化测试工具,基于 Go 语言开发,专门用于控制和操作 Chrome 浏览器实例。 chromedp 安装 go get -u github.com/chromedp/chromedp基于chromedp 实现的的简易学习通刷课系统 目前实现的功能ÿ…...
企业级调度器LVS
访问效果 涉及内容:浏览拆分、 DNS 解析、反向代理、负载均衡、数据库等 1 集群 1.1 集群类型简介 对于⼀个业务项⽬集群来说,根据业务中的特性和特点,它主要有三种分类: 高扩展 (LB) :单个主机负载不足的时候…...
MySQL中的重要常见知识点(入门到入土!)
基础篇 基础语法 添加数据 -- 完整语法 INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);-- 示例 insert into employee(id,workno,name,gender,age,idcard,entrydate) values(1,1,Itcast,男,10,123456789012345678,2000-01-01) 修改数据 -- 完整语法 UPDA…...
29.第二阶段x64游戏实战-技能冷却
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:28.第二阶段x64游戏实战-代码实现遍历技能 找技能冷却要通过一个技能cd长点的&…...
第19天-Python自动化生成PPT图文教程(基于python-pptx)
环境准备 pip install python-pptx Pillow 基础示例:批量插入图片 from pptx import Presentation from pptx.util import Inches import os from PIL import Image def create_image_slides(): # 初始化演示文稿 prs = Presentation() # 获取当前目录所…...
基于STM32的骑行语音播报系统
目录 一、前言 二、项目功能说明 三、主要元器件 四、原理图与PCB 五、手机APP 六、完整资料 一、前言 项目成品图片: 哔哩哔哩视频链接: 咸鱼商品链接: 基于STM32的骑行语音播报系统 二、项目功能说明 基础功能: 1&…...
springboot链接nacos测试
代码资料链接:https://download.csdn.net/download/ly1h1/90881498 场景说明:本次测试是springboot项目,可以链接上ncaos,将对应命名空间下的配置信息读取出俩,然后可以在接口进行返回显示。 0.环境配置 1.代码结构 …...
【初识】内网渗透——基础概念,基本工具使用
目录 一、域,工作组,域控制器,活动目录相关概念: 域环境: 工作组: 域控制器DC: 活动目录AD: 二、内网的基本场景: 三、内网渗透基本测试方案: #案例1一基本信…...
AI练习:混合圆
方法一:在圆内 1.画圆 选择椭圆工具,按住Shift键绘制正圆; CtrlC复制,CtrlF原地粘贴,按住Shift键缩小圆,移动位置; 再CtrlC,CtrlF,再按住Shift键缩小圆,移…...
心知天气 API 获取天气预报 2025/5/21
心知天气 API 获取天气预报 2025/5/21 URL格式: https://api.seniverse.com/v3/weather/now.json?key填你的秘钥&locationbeijing(这里填城市 可以用拼音)&languagezh-Hans&unitc 返回格式如下:...
PCB设计教程【入门篇】——电路分析基础-元件数据手册
前言 本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理 目录 前言 一、数据手册的重要…...
java上机测试错题回顾(1)
平时不能摸鱼太多,这样导致到最后不能摸鱼...... 看了看日历原来是6.12就结课了,啊哈哈,真没几天准备了,期末月你要来了吗? 1 参数传递,值传递~! 题目 以下代码的输出结果为( &a…...
HTTP相关内容
应用层 自定义应用层协议,协议:约定 1.约定好通信传输的信息 2.约定好数据的组织格式(xml, json(重点), protobuf) 也可以基于现成的应用层协议,来进行开发 协议的种类非常多(HTTP 协议属于翘楚,1.手机,2 网站) 跟正确的说,咱们现在使用的是 HTTPS 这个协议,HTTP和HTTPS …...
【笔记】排查并解决Error in LLM call after 3 attempts: (status code: 502)
#工作记录 一、问题描述 在部署运行部署对冲基金分析工具 ai-hedge-fund 时,不断出现以下报错,导致项目运行异常: Error in LLM call after 3 attempts: (status code: 502) Error in LLM call after 3 attempts: [WinError 10054] 远程主…...
基于python的机器学习(七)—— 数据特征选择
目录 一、特征选择概念 二、特征选择的方法 2.1 过滤式特征选择 2.1.1 方差分析 2.1.2 相关系数 2.1.3 卡方检验 2.2 包裹式特征选择 2.2.1 递归特征消除 2.3 嵌入式特征选择 2.3.1 决策树特征重要性 一、特征选择概念 特征选择是机器学习非常重要的一个步骤&#x…...
从电商角度设计大模型的 Prompt
从电商角度设计大模型的 Prompt,有一个关键核心思路:围绕具体业务场景明确任务目标输出格式,帮助模型为运营、客服、营销、数据分析等工作提效。以下是电商场景下 Prompt 设计的完整指南,包含通用思路、模块范例、实战案例等内容。…...
从零基础到最佳实践:Vue.js 系列(5/10):《状态管理》
引言 你是不是正在用 Vue.js 开发一个很酷的应用,然后发现组件之间的数据传递变得越来越混乱?比如,一个按钮的状态要传到好几层组件,或者多个页面需要共享同一个用户信息。这时候,状态管理就登场了!在 Vue…...
git checkout HEAD
git checkout HEAD 主要用于将工作目录和暂存区的内容重置为当前 HEAD 指向的提交状态,常用于撤销未提交的修改15。具体行为如下: 一、核心作用 恢复工作区文件 将指定文件或全部文件恢复到 HEAD 指向的提交状态,丢弃工作区中未暂存的修改…...
git工具使用
安装Git 在开始使用Git之前,需要在本地计算机上安装Git工具。Git支持Windows、macOS和Linux系统。可以从Git官方网站下载适合操作系统的安装包,并按照安装向导进行安装。 bash复制插入 # 在Linux上安装Git sudo apt-get install git# 在macOS上安装Git…...
极大似然估计与机器学习
复习概统的时候突然发现好像极大似然估计MLE与机器学习的数据驱动非常相似,都是采样样本然后估计模型参数。貌似,后知后觉的才意识到极大似然估计就是机器学习有效的数学保证 下面以拟合线性分布的最小二乘与分类问题为例推到以下如何从似然函数推导出M…...
基于 Guns v5.1 框架的分页教程
基于 Guns v5.1 框架的分页教程 第一步:Controller 层处理前端请求 在 Controller 中,需要接收 Bootstrap Table 传来的分页参数(limit, offset, sort, order)。Guns 提供了封装好的 PageFactory 类来简化 Page 对象的创建。 R…...
从零搭建SpringBoot Web 单体项目【基础篇】2、SpringBoot 整合数据库
系列文章 从零搭建SpringBoot Web单体项目【基础篇】1、IDEA搭建SpringBoot项目 从零搭建 SpringBoot Web 单体项目【基础篇】2、SpringBoot 整合数据库 目录 一、项目基础环境说明 二、数据库整合流程 1. 添加 MyBatis-Plus 相关依赖(pom.xml) 2…...
Supplemental Table 5FAM49B H-SCORE与其他临床特征的关系
以下是针对 Supplemental Table 5 中不同变量类型所需检验方法的 SPSS纯界面操作步骤(严格匹配原文统计方法): Supplemental Table 5 SPSS操作步骤 目标:分析FAM49B H-SCORE与其他临床特征的关系,按变量类型选择检验方法。 变量与检验方法对应表 变量变量类型检验方法SP…...
信息系统项目管理师考前练习4
项目范围基准变更 当客户提出新增功能需求时,项目经理首先应该: A. 立即更新范围说明书 B. 提交变更请求并评估影响 C. 要求团队加班实现 D. 拒绝变更以保持进度 答案:B 解析:所有范围变更必须走正式变更流程(第5版强调变更控制),评估影响是第一步。 混合项目管理模式…...
C语言判断素数(附带源码和解析)
素数,也称为质数,是一个大于 1 的自然数,除了 1 和它本身外,不能被其他自然数整除。换句话说,素数只有两个因子:1 和它自身。例如,2、3、5、7、11 和 13 都是素数。 素数在数学和计算机科学中扮…...
汽车电子电气架构诊断功能开发全流程解析
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
Xilinx XCAU10P-2FFVB676I 赛灵思 Artix UltraScale+ FPGA
XCAU10P-2FFVB676I 是 AMD Xilinx 推出的 Artix UltraScale™ FPGA 器件,内部集成了约 96,250 逻辑单元,满足中等规模高性能应用的需求。该芯片采用 16 nm FinFET 制程工艺,核心电压典型值约 0.85 V,能够在较低功耗下提供高达 775…...
DS18B20 温度传感器实验探索与实践分享
DS18B20 温度传感器实验探索与实践分享 在嵌入式系统开发领域,温度监测是常见的应用场景。本次实验聚焦于 DS18B20 温度传感器,旨在掌握其工作原理、单总线通信方式,以及实现温度采集与数码管显示,同时开启温度报警功能。接下来&…...
RT_Thread——内存管理
文章目录 一、为什么要自己实现内存管理二、RT-Thread 的内存管理方法2.1 小内存管理算法2.2 slab 管理算法2.3 memheap 管理算法 三、Heap 相关的函数3.1 rt_system_heap_init3.2 rt_malloc/rt_realloc/rt_calloc2.3 rt_free2.4 rt_malloc_sethook/rt_free_sethook 一、为什么…...
Temporary failure in name resolution
这个错误 ping: baidu.com: Temporary failure in name resolution 通常表示 DNS 解析的问题,也就是说你的系统无法通过域名服务器解析 baidu.com 的 IP 地址。 解决方案: 检查 DNS 配置( 有效 ): 确保系统的 DNS 配置是正确的。你可以检查 …...
【动手学深度学习】1.4~1.8 深度学习的发展及其特征
目录 1.4. 起源1.5. 深度学习的发展1.6. 深度学习的成功案例1.7. 特点1.8. 小结 1.4. 起源 深度学习的起源可追溯至多个领域的长期发展: 统计学基础:早期统计学方法(如伯努利分布、高斯分布、最小均方算法)和估计思想(…...
深度学习之序列建模的核心技术:LSTM架构深度解析与优化策略
LSTM深度解析 一、引言 在深度学习领域,循环神经网络(RNN)在处理序列数据方面具有独特的优势,例如语音识别、自然语言处理等任务。然而,传统的 RNN 在处理长序列数据时面临着严重的梯度消失问题,这使得网…...