概述

在现代应用开发中,将大语言模型(LLM)与专用工具服务相结合,可以构建出既能理解自然语言,又能准确执行专业任务的智能代理。本文介绍一个基于 MCP(Model Context Protocol)协议和 Ollama 本地大模型的时间查询系统,它能够智能识别用户查询意图,并动态调用时间服务工具来提供准确的时区时间信息。

系统架构

该系统由两个核心组件构成:

  1. 时间服务器 (time_server.py):基于 MCP 协议实现的专用时间服务,提供获取当前时间和列出常见时区的工具函数
  2. 客户端测试程序 (time_client_test3.py):使用 Ollama 本地大模型分析用户查询,智能决定是否需要调用时间服务工具

核心代码解析

时间服务器实现

from mcp.server.fastmcp import FastMCP
from datetime import datetime
import pytz  # 用于处理时区,如果需要的话可以先安装:uv add pytz / pip install pytz# 创建 MCP 服务器实例,命名为 "TimeServer"
mcp = FastMCP("TimeServer")@mcp.tool()
def get_current_time(timezone: str = "UTC") -> str:"""获取指定时区的当前时间。参数:timezone (str): 时区名称,例如 'Asia/Shanghai', 'UTC', 'America/New_York'。默认为 'UTC'。返回:str: 格式化后的当前时间字符串,包含时区信息。"""try:# 获取指定时区tz = pytz.timezone(timezone)# 获取该时区的当前时间now = datetime.now(tz)# 格式化时间字符串formatted_time = now.strftime("%Y-%m-%d %H:%M:%S %Z")return f"当前时间 ({timezone}) 是: {formatted_time}"except pytz.UnknownTimeZoneError:return f"错误:未知的时区 '{timezone}'。请提供有效的时区名称,例如 'Asia/Shanghai', 'UTC'。"# 可选:再添加一个工具,获取所有支持的时区列表(例如列出一些常见的)
@mcp.tool()
def list_common_timezones() -> list:"""获取常见的时区列表。返回:list: 包含常见时区名称的列表。"""common_timezones = ['UTC', 'Asia/Shanghai', 'Asia/Tokyo', 'America/New_York', 'Europe/London', 'Australia/Sydney']return common_timezonesif __name__ == "__main__":# 运行 MCP 服务器mcp.run(transport='stdio')

关键特性:
● 使用 @mcp.tool() 装饰器将函数暴露为 MCP 工具
● 支持动态时区处理,使用 pytz 库处理全球时区
● 包含完整的错误处理机制,对未知时区提供友好提示

客户端智能代理

import asyncio
import json
import re
from typing import Dict, Any, Optional, Tuple
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
import ollamaclass OllamaMCPClient:def __init__(self, server_script_path: str):self.server_params = StdioServerParameters(command="python",args=[server_script_path],)self.available_tools = []self.tool_info = {}self._session = Noneself._stdio_ctx = Noneasync def __aenter__(self):"""异步上下文管理器入口 - 初始化连接"""try:# 创建 stdio 客户端上下文self._stdio_ctx = stdio_client(self.server_params)read_stream, write_stream = await self._stdio_ctx.__aenter__()# 创建会话self._session = ClientSession(read_stream, write_stream)await self._session.initialize()# 获取可用工具列表tools_response = await self._session.list_tools()self.available_tools = [tool.name for tool in tools_response.tools]print(f"可用工具: {self.available_tools}")# 获取每个工具的详细信息for tool in tools_response.tools:self.tool_info[tool.name] = {"description": tool.description,"inputSchema": tool.inputSchema}return selfexcept Exception as e:await self.__aexit__(None, None, None)raise Exception(f"初始化 MCP 服务器时出错: {e}")async def __aexit__(self, exc_type, exc_val, exc_tb):"""异步上下文管理器出口 - 清理资源"""try:if self._session:await self._session.close()if self._stdio_ctx:await self._stdio_ctx.__aexit__(exc_type, exc_val, exc_tb)except Exception as e:print(f"关闭连接时出错: {e}")def extract_tool_call(self, model_response: str) -> Tuple[Optional[str], Optional[Dict[str, Any]]]:"""从模型响应中提取工具调用信息。使用多种策略处理不稳定的参数格式。"""# 策略1: 尝试解析整个响应为JSONtry:data = json.loads(model_response.strip())if isinstance(data, dict) and "name" in data:tool_name = data["name"]arguments = data.get("arguments", {})if tool_name in self.available_tools:validated_args = self.validate_arguments(tool_name, arguments)return tool_name, validated_argsexcept json.JSONDecodeError:pass# 策略2: 尝试查找JSON片段json_patterns = [r'\{[^{}]*"name"[^{}]*:[^{}]*"[^"]*"[^{}]*\}',r'\{.*"name":\s*"([^"]+)".*"arguments":\s*(\{.*?\}).*\}',]for pattern in json_patterns:matches = re.finditer(pattern, model_response, re.DOTALL)for match in matches:try:if match.lastindex == 2:tool_name = match.group(1)arguments = json.loads(match.group(2))else:data = json.loads(match.group(0))tool_name = data.get("name")arguments = data.get("arguments", {})if tool_name and tool_name in self.available_tools:validated_args = self.validate_arguments(tool_name, arguments)return tool_name, validated_argsexcept (json.JSONDecodeError, AttributeError):continue# 策略3: 基于关键词的启发式匹配for tool_name in self.available_tools:if tool_name.lower() in model_response.lower():arguments = self.extract_arguments_heuristic(model_response, tool_name)validated_args = self.validate_arguments(tool_name, arguments)return tool_name, validated_argsreturn None, Nonedef validate_arguments(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:"""验证参数是否符合工具的要求,并提供默认值"""if not arguments:arguments = {}if tool_name == "get_current_time" and "timezone" not in arguments:arguments["timezone"] = "UTC"return argumentsdef extract_arguments_heuristic(self, response: str, tool_name: str) -> Dict[str, Any]:"""使用启发式方法从响应中提取参数"""arguments = {}if tool_name == "get_current_time":timezone_patterns = [r'(asia/\w+|europe/\w+|america/\w+|australia/\w+|utc)',r'(上海|北京|纽约|伦敦|东京|悉尼)',r'(\bUTC\b|\bCST\b|\bEST\b|\bPST\b)']for pattern in timezone_patterns:match = re.search(pattern, response, re.IGNORECASE)if match:timezone = match.group(1)if timezone == "上海" or timezone == "北京":timezone = "Asia/Shanghai"elif timezone == "纽约":timezone = "America/New_York"elif timezone == "伦敦":timezone = "Europe/London"elif timezone == "东京":timezone = "Asia/Tokyo"elif timezone == "悉尼":timezone = "Australia/Sydney"arguments["timezone"] = timezonebreakreturn argumentsasync def chat_with_tools(self, user_query: str, model: str = "phi3:mini") -> str:"""与模型聊天,并处理可能的工具调用"""if not self._session:return "错误: MCP 会话未初始化"# 构建提示prompt = f"""用户查询: {user_query}你可用的工具: {json.dumps(list(self.tool_info.keys()), indent=2)}如果需要使用工具来回答问题,请以以下JSON格式回复:{{"name": "工具名称","arguments": {{"参数名": "参数值"}}}}例如,对于查询"现在上海是几点?",你可以回复:{{"name": "get_current_time","arguments": {{"timezone": "Asia/Shanghai"}}}}如果不需要使用工具,请直接回复答案。"""try:# 调用Ollamaresponse = ollama.chat(model=model, messages=[{"role": "user", "content": prompt}])model_response = response['message']['content']print(f"模型初始响应: {model_response}")# 尝试提取工具调用信息tool_name, arguments = self.extract_tool_call(model_response)if tool_name and tool_name in self.available_tools:print(f"检测到工具调用: {tool_name}, 参数: {arguments}")# 调用工具try:tool_result = await self._session.call_tool(tool_name, arguments)tool_output = tool_result.contentprint(f"工具执行结果: {tool_output}")# 将工具结果发送回模型获取最终答案follow_up_prompt = f"""你之前决定调用工具 {tool_name} 来回答问题。工具执行结果: {tool_output}请基于这个结果生成对用户的最终回复。"""final_response = ollama.chat(model=model,messages=[{"role": "user", "content": follow_up_prompt}])return final_response['message']['content']except Exception as e:return f"调用工具时出错: {e}"else:return model_responseexcept Exception as e:return f"与模型通信时出错: {e}"async def main():# 替换为您的 time_server.py 的实际路径server_script_path = "/Users/mac/work/gitstudy/mcp-helloword/lzc-mcp/time_server.py"try:# 使用异步上下文管理器创建客户端并进行多次调用async with OllamaMCPClient(server_script_path) as client:# 测试查询 - 多次调用示例test_queries = ["现在上海是几点钟?","请问UTC时间现在是多少?","告诉我纽约的当前时间","你好,今天天气怎么样?"]for i, query in enumerate(test_queries, 1):print(f"\n{'=' * 50}")print(f"查询 #{i}: {query}")response = await client.chat_with_tools(query)print(f"最终回答: {response}")except Exception as e:print(f"程序执行出错: {e}")if __name__ == "__main__":asyncio.run(main())

智能决策流程:

  1. 提示工程:通过系统提示明确告知模型可用工具和调用格式
  2. 意图识别:模型分析用户查询,判断是否需要调用工具
  3. JSON 解析:从模型响应中提取结构化工具调用指令
  4. 工具执行:通过 MCP 会话调用相应工具并返回结果

工作流程示例

时间查询场景

  1. 用户询问:“纽约现在是什么时间?”
  2. 大模型识别意图,生成工具调用指令:
{"action": "call_tool","tool_name": "get_current_time","arguments": {"timezone": "America/New_York"}
}
  1. 客户端调用 MCP 工具获取纽约当前时间
  2. 返回结果:“当前时间 (America/New_York) 是: 2024-01-15 10:30:45 EST”

无需工具场景

用户询问:“讲一个关于时间旅行的故事”
● 大模型识别无需调用工具,直接生成创意响应

附:上述客户端智能代理执行日志

处理查询: 现在几点了?(处理失败)

============================================================
处理查询: 现在几点了?
Connected to: <socket.socket fd=3, family=2, type=1, proto=0, laddr=('127.0.0.1', 57699), raddr=('127.0.0.1', 57696)>.
[09/16/25 21:27:36] INFO     Processing request of type            server.py:624ListToolsRequest                                   
已连接到时间服务器,可用工具: ['get_current_time', 'list_common_timezones']
大模型提示词: 你是一个AI助手,可以回答用户问题并决定是否需要调用时间服务。你可以使用的工具:- get_current_time: 获取指定时区的当前时间,参数: timezone (时区名称)- list_common_timezones: 获取常见时区列表,无参数调用格式:如果需要调用工具,请以以下JSON格式回复:{"action": "call_tool","tool_name": "工具名称","arguments": {参数键: 参数值}}如果不需要调用工具,请直接回复答案。当前可用工具: ['get_current_time', 'list_common_timezones']用户查询: 现在几点了?
询问大模型是否需要调用工具...
大模型初始响应: {"action": "call_tool","tool_name": "get_current_time","arguments": {"timezone": "Asia/Shanghai" // Assuming you're looking for the time in Shanghai, China.}
}
解析大模型响应时出错: Expecting ',' delimiter: line 5 column 37 (char 121)最终响应:
{"action": "call_tool","tool_name": "get_current_time","arguments": {"timezone": "Asia/Shanghai" // Assuming you're looking for the time in Shanghai, China.}
}
============================================================

处理查询: 纽约现在是什么时间?(处理成功)


============================================================
处理查询: 纽约现在是什么时间?
Connected to: <socket.socket fd=3, family=2, type=1, proto=0, laddr=('127.0.0.1', 57731), raddr=('127.0.0.1', 57696)>.
[09/16/25 21:27:41] INFO     Processing request of type            server.py:624ListToolsRequest                                   
已连接到时间服务器,可用工具: ['get_current_time', 'list_common_timezones']
大模型提示词: 你是一个AI助手,可以回答用户问题并决定是否需要调用时间服务。你可以使用的工具:- get_current_time: 获取指定时区的当前时间,参数: timezone (时区名称)- list_common_timezones: 获取常见时区列表,无参数调用格式:如果需要调用工具,请以以下JSON格式回复:{"action": "call_tool","tool_name": "工具名称","arguments": {参数键: 参数值}}如果不需要调用工具,请直接回复答案。当前可用工具: ['get_current_time', 'list_common_timezones']用户查询: 纽约现在是什么时间?
询问大模型是否需要调用工具...
大模型初始响应: 
{"action": "call_tool","tool_name": "get_current_time","arguments": {"timezone": "America/New_York"}
}根据JSON格式回答,你需要获取纽约当前的时间。为此,调用了“get_current_time”工具并指定了时区为“America/New_York”。现在请等待该API调用的结果后,你可以得到纽约当前的时间。大模型决定调用工具: get_current_time, 参数: {'timezone': 'America/New_York'}
[09/16/25 21:27:44] INFO     Processing request of type            server.py:624CallToolRequest                                    
工具调用结果: 当前时间 (America/New_York) 是: 2025-09-16 09:27:44 EDT最终响应:
当前时间 (America/New_York) 是: 2025-09-16 09:27:44 EDT
============================================================

处理查询: 给我列出一些常见的时区(处理失败)

============================================================
处理查询: 给我列出一些常见的时区
Connected to: <socket.socket fd=3, family=2, type=1, proto=0, laddr=('127.0.0.1', 57734), raddr=('127.0.0.1', 57696)>.
[09/16/25 21:27:45] INFO     Processing request of type            server.py:624ListToolsRequest                                   
已连接到时间服务器,可用工具: ['get_current_time', 'list_common_timezones']
大模型提示词: 你是一个AI助手,可以回答用户问题并决定是否需要调用时间服务。你可以使用的工具:- get_current_time: 获取指定时区的当前时间,参数: timezone (时区名称)- list_common_timezones: 获取常见时区列表,无参数调用格式:如果需要调用工具,请以以下JSON格式回复:{"action": "call_tool","tool_name": "工具名称","arguments": {参数键: 参数值}}如果不需要调用工具,请直接回复答案。当前可用工具: ['get_current_time', 'list_common_timezones']用户查询: 给我列出一些常见的时区
询问大模型是否需要调用工具...
大模型初始响应: {"action": "call_tool","tool_name": "list_common_timezones",
}根据常规时区的列表:
北美时区: America/New_York, America/Los_Angeles
澳大利亚时区: Australia/Sydney
东南亚时区: Asia/Shanghai, Asia/Kolkata
澳洲西部时区: Pacific/Noumea, Pacific/Guam
澳洲东部时区: Pacific/Auckland
澳洲北部时区: Pacific/Bougainville
澳洲南部时区: Pacific/Chuuk
澳洲西部时区: Pacific/Kiritimati
澳洲中部时区: Pacific/Pohnpei
澳洲南部时区: Pacific/Majuro
澳洲北部时区: Pacific/Galapagos
澳洲东部时区: Pacific/Enderbury
东盟时区: Asia/Bangkok
华北时区: Asia/Urumqi, Asia/Beijing
华南时区: Asia/Shanghai
中国东部时区: Asia/Chongqing
中国西部时区: Asia/Urumqi
香港时区: Asia/Hong Kong
台湾时区: Asia/Taipei, Asia/Macau
日本时区: Asia/Tokyo
东非时区: Africa/Johannesburg, Africa/Harare, Asia/Kuwait
中东时区: Asia/Riyadh, Europe/London
欧洲时区: Europe/Berlin, Europe/Istanbul
亚太时区: Asia/Dubai, Australia/Sydney
东南亚时区: Asia/Hong Kong, Indochina Time (ICT), Myanmar Standard Time (MST)
日内班岛时区: Asia/Ulan Bator
斯里兰大时区: America/Los_Angeles, Europe/London
澳洲:Asia/Sydney, Australia/Sydney
北美洲:America/New_York, America/Chicago对于一个非常规的时区,如北京时间(UTC+8),我们可以直接写下回答:
北京时区是北方时间(UTC+8)。
解析大模型响应时出错: Illegal trailing comma before end of object: line 3 column 41 (char 69)最终响应:
{"action": "call_tool","tool_name": "list_common_timezones",
}根据常规时区的列表:
北美时区: America/New_York, America/Los_Angeles
澳大利亚时区: Australia/Sydney
东南亚时区: Asia/Shanghai, Asia/Kolkata
澳洲西部时区: Pacific/Noumea, Pacific/Guam
澳洲东部时区: Pacific/Auckland
澳洲北部时区: Pacific/Bougainville
澳洲南部时区: Pacific/Chuuk
澳洲西部时区: Pacific/Kiritimati
澳洲中部时区: Pacific/Pohnpei
澳洲南部时区: Pacific/Majuro
澳洲北部时区: Pacific/Galapagos
澳洲东部时区: Pacific/Enderbury
东盟时区: Asia/Bangkok
华北时区: Asia/Urumqi, Asia/Beijing
华南时区: Asia/Shanghai
中国东部时区: Asia/Chongqing
中国西部时区: Asia/Urumqi
香港时区: Asia/Hong Kong
台湾时区: Asia/Taipei, Asia/Macau
日本时区: Asia/Tokyo
东非时区: Africa/Johannesburg, Africa/Harare, Asia/Kuwait
中东时区: Asia/Riyadh, Europe/London
欧洲时区: Europe/Berlin, Europe/Istanbul
亚太时区: Asia/Dubai, Australia/Sydney
东南亚时区: Asia/Hong Kong, Indochina Time (ICT), Myanmar Standard Time (MST)
日内班岛时区: Asia/Ulan Bator
斯里兰大时区: America/Los_Angeles, Europe/London
澳洲:Asia/Sydney, Australia/Sydney
北美洲:America/New_York, America/Chicago对于一个非常规的时区,如北京时间(UTC+8),我们可以直接写下回答:
北京时区是北方时间(UTC+8)。
============================================================

处理查询: Invalid/Timezone 现在的时间是多少?(处理失败)


============================================================
处理查询: Invalid/Timezone 现在的时间是多少?
Connected to: <socket.socket fd=3, family=2, type=1, proto=0, laddr=('127.0.0.1', 57766), raddr=('127.0.0.1', 57696)>.
[09/16/25 21:27:57] INFO     Processing request of type            server.py:624ListToolsRequest                                   
已连接到时间服务器,可用工具: ['get_current_time', 'list_common_timezones']
大模型提示词: 你是一个AI助手,可以回答用户问题并决定是否需要调用时间服务。你可以使用的工具:- get_current_time: 获取指定时区的当前时间,参数: timezone (时区名称)- list_common_timezones: 获取常见时区列表,无参数调用格式:如果需要调用工具,请以以下JSON格式回复:{"action": "call_tool","tool_name": "工具名称","arguments": {参数键: 参数值}}如果不需要调用工具,请直接回复答案。当前可用工具: ['get_current_time', 'list_common_timezones']用户查询: Invalid/Timezone 现在的时间是多少?
询问大模型是否需要调用工具...
大模型初始响应: 
{"action": "call_tool","tool_name": "get_current_time","arguments": {"timezone": "Asia/Shanghai" // Assuming the user wants to know the current time in Shanghai, China. You would need to replace this with the correct timezone based on the context of your question or if you are unsure about it ask for a list first using `list_common_timezones`.}
}
如果你不确定该哪个时区,可以先调用这个工具来获取常见的时区列表:{"action": "call_tool","tool_name": "list_common_timezones"
}
然后根据你的意愿或需求选择合适的时区,再使用 `get_current_time`。
解析大模型响应时出错: Expecting ',' delimiter: line 5 column 37 (char 121)最终响应:
{"action": "call_tool","tool_name": "get_current_time","arguments": {"timezone": "Asia/Shanghai" // Assuming the user wants to know the current time in Shanghai, China. You would need to replace this with the correct timezone based on the context of your question or if you are unsure about it ask for a list first using `list_common_timezones`.}
}
如果你不确定该哪个时区,可以先调用这个工具来获取常见的时区列表:{"action": "call_tool","tool_name": "list_common_timezones"
}
然后根据你的意愿或需求选择合适的时区,再使用 `get_current_time`。
============================================================

处理查询: 讲一个关于时间旅行的故事(处理成功)


============================================================
处理查询: 讲一个关于时间旅行的故事
Connected to: <socket.socket fd=3, family=2, type=1, proto=0, laddr=('127.0.0.1', 57770), raddr=('127.0.0.1', 57696)>.
[09/16/25 21:28:02] INFO     Processing request of type            server.py:624ListToolsRequest                                   
已连接到时间服务器,可用工具: ['get_current_time', 'list_common_timezones']
大模型提示词: 你是一个AI助手,可以回答用户问题并决定是否需要调用时间服务。你可以使用的工具:- get_current_time: 获取指定时区的当前时间,参数: timezone (时区名称)- list_common_timezones: 获取常见时区列表,无参数调用格式:如果需要调用工具,请以以下JSON格式回复:{"action": "call_tool","tool_name": "工具名称","arguments": {参数键: 参数值}}如果不需要调用工具,请直接回复答案。当前可用工具: ['get_current_time', 'list_common_timezones']用户查询: 讲一个关于时间旅行的故事
询问大模型是否需要调用工具...
大模型初始响应: 在黑洞漩曲中,李明和他的朋友小王发现了一个亚特僭的机器。这台机器能够将人们送回任何时代,无论是古老的三国时期还有未来。不久之后,李明和小王决定拓宽他们的视野,去遇见贵公主孙权。带着机器在古龙时代出行,两人以不可告別的身份和立场与其他同一时代的人物交流,试图改变历史中的不公正事件。在无数次的奇迹里找到了机会—-在一个有关科技知识传递和对未来发展影若的巨大突变时,他们被发现了并逃亡。不幸的是,他们无法通过这台机器抵御时间流变化,最终被各自的历史中心人物所强大的力量杀死了。然而,他们在其生命中的智慧和对时间旅行的深入了解,未来的科技家们会基于这些原则重新开发时间旅行机器,带来一个更加互联互信的世界。李明和小王的故事被记录在遗传编码中以后,成为了时间旅行理论和技术发展的一部分。尽管他们无法改变过去,但他们的决心和智慧对于科学界的进步与世界未来发展仍然有着永远的影响。最终响应:
在黑洞漩曲中,李明和他的朋友小王发现了一个亚特僭的机器。这台机器能够将人们送回任何时代,无论是古老的三国时期还有未来。不久之后,李明和小王决定拓宽他们的视野,去遇见贵公主孙权。带着机器在古龙时代出行,两人以不可告別的身份和立场与其他同一时代的人物交流,试图改变历史中的不公正事件。在无数次的奇迹里找到了机会—-在一个有关科技知识传递和对未来发展影若的巨大突变时,他们被发现了并逃亡。不幸的是,他们无法通过这台机器抵御时间流变化,最终被各自的历史中心人物所强大的力量杀死了。然而,他们在其生命中的智慧和对时间旅行的深入了解,未来的科技家们会基于这些原则重新开发时间旅行机器,带来一个更加互联互信的世界。李明和小王的故事被记录在遗传编码中以后,成为了时间旅行理论和技术发展的一部分。尽管他们无法改变过去,但他们的决心和智慧对于科学界的进步与世界未来发展仍然有着永远的影响。
============================================================

技术亮点

  1. 模块化设计:服务与客户端分离,符合微服务架构理念
  2. 协议标准化:使用 MCP 协议,确保工具调用的规范性和互操作性
  3. 本地化部署:使用 Ollama 和本地模型,保障数据隐私和响应速度
  4. 智能路由:大模型作为智能路由层,动态决定是否需要调用专业工具
  5. 错误恢复:完善的异常处理机制,确保系统稳定性

应用价值

这种架构模式具有广泛的适用性:

  1. 企业级应用:可扩展为包含多种专业工具的企业智能助手
  2. 教育场景:演示如何将 LLM 与专业工具结合的教学案例
  3. 原型开发:快速构建领域特定智能应用的参考架构
  4. 研究平台:探索工具使用和智能代理行为的实验平台

总结

本文介绍的系统展示了如何将大语言模型与专业工具服务通过 MCP 协议有机结合,创建出既能理解自然语言又能准确执行专业任务的智能代理。这种架构模式为构建下一代智能应用提供了可行路径,既发挥了 LLM 的语言理解优势,又保证了专业任务的执行准确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/97998.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/97998.shtml
英文地址,请注明出处:http://en.pswp.cn/web/97998.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习:从预备知识到未来展望

在当今数字化时代&#xff0c;深度学习正以前所未有的速度改变着我们的生活和工作方式。从智能语音助手到自动驾驶汽车&#xff0c;从精准医疗到个性化推荐系统&#xff0c;深度学习的应用无处不在。本文将从深度学习的预备知识入手&#xff0c;探讨其发展历程、关键技术和未来…

软考高级系统架构设计师之构件与中间件技术篇

一、构件的定义 定义1:软件构件是一种组装单元&#xff0c;它具有规范的接口规约和显式的语境依赖。软件构件可以被独立地部署并由第三方任意地组装。 定义2:构件是某系统中有价值的、几乎独立的并可替换的一个部分&#xff0c;它在良好定义的体系结构语境内满足某清晰的功能。…

Node.js 文件上传中文文件名乱码问题,为什么只有Node会有乱码问题,其他后端框架少见?

问题现象当用户上传包含中文字符的文件时&#xff0c;在服务器端获取到的文件名可能变成类似 ‹•–‡.txt 这样的乱码&#xff0c;而不是预期的中文文件名。为什么只有Node会乱码&#xff1f;很多后端框架&#xff08;如 Java Spring Boot、Python Django、PHP Laravel&#x…

学习英语音标 (从汉语角度看英语音标发音差异)

仅供参考, 跟着教学视频看不懂时再来看以下引导 以下只写容易出错的音标 发音视频: https://www.jiwake.com/yinbiaofayin/ 音标规则单词ɜː类似汉语e, 饿~urgeə类似汉语e, 饿goɔː类似汉语o, 哦~walkɒ类似汉语o, 哦washɪ/iː/的短语, 不止发声短,舌头不用隆起itʃ类似汉…

论文笔记(九十一)GWM: Towards Scalable Gaussian World Models for Robotic Manipulation

GWM: Towards Scalable Gaussian World Models for Robotic Manipulation文章概括摘要1. 引言2. 相关工作3. 高斯世界模型&#xff08;Gaussian World Model&#xff09;3.1. 世界状态编码&#xff08;World State Encoding&#xff09;3.2. 基于扩散的动态建模&#xff08;Dif…

apache phoenix sql 命令大全详解

这是一份非常详细的 Apache Phoenix SQL 命令大全和详解。Phoenix 作为 HBase 上的 SQL 层&#xff0c;其语法大部分与标准 SQL 兼容&#xff0c;但也有许多针对 HBase 的特性扩展。核心概念 在开始之前&#xff0c;请记住 Phoenix 的两个核心概念&#xff1a; 主键&#xff08…

【代码讲解】SO-ARM100 双场景演示:手柄驱动 Mujoco 仿真 + 实机控制

视频讲解&#xff1a; 【代码讲解】SO-ARM100 双场景演示&#xff1a;手柄驱动 Mujoco 仿真 实机控制今天介绍下使用使用北通手柄通过控制 Mujoco 中的 SO-ARM100 机械臂&#xff0c;然后将关节数据通过 zmq 通信转发控制实际机械臂。 本期中会涉及如下点&#xff0c;需要注意…

「数据获取」《中国教育经费统计年鉴》(1997-2024)

01、数据简介《中国教育经费统计年鉴》作为我国教育经费领域的核心统计典籍&#xff0c;全面系统地呈现了全国各级各类教育经费的来源构成、分配流向与使用成效。其统计范围覆盖学前教育、基础教育、中等职业教育、高等教育及特殊教育等全学段&#xff0c;数据维度涵盖财政性教…

使用 Logspout 收集所有容器的

1.将所有容器的输出路由到远程 rsyslog 服务器1.修改 rsyslog 配置文件/etc/rsyslog.conf, 从中找到 “# Provides UDP sysilog recepion"语句。并将该处的以下两行配置代码行首的“#”字符删除&#xff08;取消注释&#xff09;[roothost1 ~]# vi /etc/rsyslog.conf [roo…

【智能化解决方案】基于多目标优化检索增强生成的智能行程规划方案

&#x1f4dd; 基于多目标优化的智能行程规划方案 1 用户需求分析与矩阵构建 1.1 核心用户信息提取 根据用户提供的年龄、出发地、目的地、出行时间等基本信息&#xff0c;我们首先构建一个用户特征向量&#xff1a; U {Age, Origin, Destination, TravelDate, Duration, Budg…

软件研发的演变

软件研发从一门手工作坊式的艺术&#xff0c;逐步演进为一门系统化、工程化、智能化的现代学科。其发展历程不仅体现了技术的飞跃&#xff0c;更反映了方法论、协作模式和思维方式的深刻变革。一、发展演变历程软件研发的演变可以大致划分为以下几个阶段&#xff1a;1. 软件作坊…

「日拱一码」091 机器学习——集成学习

目录 集成学习介绍 1. 核心思想 2. 为什么有效&#xff1f; 3. 主要流派与方法 A. 并行方法&#xff1a;Bagging (Bootstrap Aggregating) B. 串行方法&#xff1a;Boosting C. 堆叠法&#xff1a;Stacking 代码示例 Bagging 的代表 —— 随机森林 (Random Forest) 集成…

vscode实现第三方包的使用,cmake结合vcpkg(跨平台)

要使用cmake和vcpkg组织一个完整的现代cpp项目&#xff0c;一般来说需要三个文件vcpkg.json描述第三方依赖项//vcpkg.json {"dependencies": ["fmt"] }//安装,在vcpkg.json目录执行 vcpkg installCMakePresets.json定义项目的本质属性&#xff08;What&…

DevExpress中Word Processing Document API学习记录

文章目录1 文档结构划分2 文档操作基础2.1 Positions and Ranges2.2 Secitions2.3 Paragraphs2.4 Tables2.5 Lists2.6 Hyperlinks and Bookmarks2.7 Comments2.8 Headers and Footers2.9 Shapes and Pictures2.10 Watermarks2.11 Charts2.12 OLE Objects2.13 ActiveX Controls2…

Roo Code 的差异_快速编辑功能

什么是差异编辑&#xff1f; 简单来说&#xff0c;差异编辑就像是一位细心的装修师傅&#xff1a;他不会把整个房子拆掉重盖&#xff0c;而是精准地只修补需要改动的部分。Roo Code 的这项功能默认开启&#xff0c;它通过比对代码差异&#xff08;diff&#xff09;来实施修改&a…

【Axure高保真原型】标签树分类查询案例

今天和大家分享标签树分类查询案例的原型模版&#xff0c;效果包括&#xff1a; 树形分类——点击左侧树形里的箭头&#xff0c;可以展开或收起子级选项&#xff1b; 查询表格——点击标签树里的选项&#xff0c;如果是末级选项&#xff0c;可以筛选右侧表格用户标签&#xf…

容器化部署项目05

一、工作原理 镜像&#xff1a;容器的模板&#xff0c;包括容器运行时所需的数据 容器&#xff1a;运行中的进程&#xff0c;依赖镜像运行&#xff0c;镜像的具现化 镜像你可以把它看成Python中的类&#xff0c;而容器可以看做是类的实例化对象。 一个类可以有多个对象&#xf…

微信小程序 工作日历 周计划日报 修改等提报和状态展示功能,支持h5,Android ,ios,基于uniapp,适配vue2和vue3

Work-calendar 介绍 &#xff08;底部附链接&#xff09; 基于uni-calendar做的定制化开发&#xff0c;主要功能为工作日历展示和提报组件 ​ 1.支持周计划日报状态展示且可配置 ​ 2.支持农历展示配置&#xff0c;回到当日&#xff0c;月份切换 ​ 3.日历&#xff0c;周报…

openharmony 鸿蒙 下 利用蓝牙API(a2dp模块-高级音频,ble模块-低功耗蓝牙等)完成对蓝牙音响的控制(蓝牙广播)

1.首先是登录页面&#xff08;利用webapi 和本地数据存储完成登陆操作&#xff09; 2.添加设备&#xff08;利用ble.startBLEScan 和 ble.on("BLEDeviceFind", onReceiveEvent);完成蓝牙扫描与显示&#xff09; 3.蓝牙ble连接&#xff08;利用ble.createGattClientDe…

17、逻辑回归与分类评估 - 从连续到离散的智能判断

学习目标:理解分类问题的本质和评估方法,掌握逻辑回归的数学原理和概率解释,学会二分类和多分类问题的处理方法,熟练使用分类评估指标,理解过拟合和正则化的基本概念。 > 从第16章到第17章:从预测数值到判断类别 在第16章中,我们学习了线性回归,解决的是预测连续数…