当前位置: 首页 > news >正文

[MCP][05]Elicitation示例

前言

如果你之前接触过LangGraph的"Human in the loop"概念,那么理解MCP的Elicitation机制就会容易很多。这两个功能非常相似,都是让AI在需要时停下来,礼貌地向人类寻求帮助或确认。

想象一下,当你正在和朋友聊天,突然他问你:"嘿,我该穿哪件衬衫去参加明天的聚会?"这时候你就会停下来思考,然后给出建议。Elicitation就是让AI具备这种"求助"的能力。它允许MCP服务器在工具执行过程中向用户请求结构化的输入信息。与要求一次性提供所有输入不同,服务器可以根据需要与用户进行交互式沟通——比如,提示缺失的参数、请求澄清或收集额外上下文信息。举个例子,一个文件管理工具可能会问:"我应该在哪个目录创建这个文件?";而一个数据分析工具则可能请求:"我该分析哪个时间段的数据?"

Elicitation能让工具在关键时刻暂停执行,并向用户请求特定信息。这在以下场景中尤为有用:

  • 缺失参数:当初始输入未提供必要信息时,主动向用户索取
  • 澄清请求:在模糊或有歧义的场景下,获取用户的确认或选择
  • 渐进式披露:分步骤收集复杂信息,避免一次性要求过多内容
  • 动态工作流:根据用户的响应实时调整工具的行为逻辑

基本示例

让我们通过几个基本示例来演示如何使用elicitation功能。

MCP Server

在服务器端,我们创建一个收集用户信息的工具:

from fastmcp import FastMCP, Context
from dataclasses import dataclassmcp = FastMCP("Elicitation Server")@dataclass
class UserInfo:name: strage: int@mcp.tool
async def collect_user_info(ctx: Context) -> str:"""Collect user information through interactive prompts."""result = await ctx.elicit(message="Please provide your information",response_type=UserInfo)if result.action == "accept":user = result.datareturn f"Hello {user.name}, you are {user.age} years old"elif result.action == "decline":return "Information not provided"else:  # cancelreturn "Operation cancelled"if __name__ == "__main__":mcp.run(transport="streamable-http", host="localhost", port=8001, show_banner=False)

ctx.elicit()方法的参数说明:

  • message: 显示给用户的提示词,就像一个礼貌的请求
  • response_type: 定义预期响应结构的Python类型(数据类、基本类型等)。注意,Elicitation响应仅支持JSON Schema类型的子集。

ctx.elicit()的响应是一个ElicitationResult对象,包含以下属性:

  • action: 用户如何回应,其值只有accept(接受)、decline(拒绝)和cancel(取消)
  • data: 用户的输入值,类型为response_type或者None,只有当action=accept时存在

MCP Client

客户端需要实现一个处理征询请求的回调函数:

import asynciofrom fastmcp import Client
from fastmcp.client.elicitation import ElicitResult
from mcp.shared.context import RequestContext
from mcp.types import ElicitRequestParams
from openai import AsyncOpenAIfrom pkg.config import cfgllm = AsyncOpenAI(base_url=cfg.llm_base_url,api_key=cfg.llm_api_key,
)async def elicitation_handler(message: str, response_type: type, params: ElicitRequestParams, context: RequestContext):print(f"MCP Server asks: {message}")user_name = input("Your name: ").strip()user_age = input("Your age: ").strip()if not user_name or not user_age:return ElicitResult(action="decline")response_date = response_type(name=user_name, age=user_age)return response_datemcp_client = Client("http://localhost:8001/mcp", elicitation_handler=elicitation_handler)async def main():async with mcp_client:resp = await mcp_client.call_tool("collect_user_info", {})print(f"collect_user_info result: {resp}")if __name__ == "__main__":# 运行主程序asyncio.run(main())

运行输出示例:

  1. 正常填写的交互
MCP Server asks: Please provide your information
Your name: Rainux
Your age: 18
collect_user_info result: CallToolResult(content=[TextContent(type='text', text='Hello Rainux, you are 18 years old', annotations=None, meta=None)], structured_content={'result': 'Hello Rainux, you are 18 years old'}, data='Hello Rainux, you are 18 years old', is_error=False)
  1. 用户拒绝提供信息
MCP Server asks: Please provide your information
Your name:
Your age:
collect_user_info result: CallToolResult(content=[TextContent(type='text', text='Information not provided', annotations=None, meta=None)], structured_content={'result': 'Information not provided'}, data='Information not provided', is_error=False)

运行shell命令-用户征询

在这个示例中,我们将实现一个命令行交互程序。当用户的命令需要在主机上执行可能造成修改的命令时,AI会礼貌地请求用户确认。

MCP Server

当执行可能修改系统的命令时,服务器会要求用户确认是否执行:

import asyncio
from dataclasses import dataclassfrom fastmcp import Context, FastMCP@dataclass
class UserDecision:decision: str = "decline"mcp = FastMCP("Elicitation Server")@mcp.tool()
async def execute_command_local(command: str, ctx: Context, is_need_user_check: bool = False, timeout: int = 10) -> str:"""Execute a shell command locally.Args:command (str): The shell command to execute.is_need_user_check (bool): Set to True when performing create, delete, or modify operations on the host, indicating that user confirmation is required.timeout (int): Timeout in seconds for command execution. Default is 10 seconds.Returns:str: The output of the shell command."""if is_need_user_check:user_check_result = await ctx.elicit(message=f"Do you want to execute this command(yes or no): {command}",response_type=UserDecision,  # response_type 必须是符合 JSON Schema)if user_check_result.action != "accept":return "User denied command execution."try:proc = await asyncio.create_subprocess_shell(command,stdout=asyncio.subprocess.PIPE,stderr=asyncio.subprocess.PIPE)stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=timeout)stdout_str = stdout.decode().strip()stderr_str = stderr.decode().strip()if stdout_str:return f"Stdout: {stdout_str}"elif stderr_str:return f"Stderr: {stderr_str}"else:return "Command executed successfully with no output"except asyncio.TimeoutError:if proc and not proc.returncode:try:proc.terminate()await proc.wait()except:passreturn f"Error: Command '{command}' timed out after {timeout} seconds"except Exception as e:return f"Error executing command '{command}': {str(e)}"if __name__ == "__main__":mcp.run(transport="streamable-http", host="localhost", port=8001, show_banner=False)

MCP Client

客户端的主体逻辑与之前的示例基本一致,主要实现了elicitation_handler()方法来处理服务器的征询请求:

import asyncio
import json
import readline  # For enhanced input editing
import traceback
from typing import castfrom fastmcp import Client
from fastmcp.client.elicitation import ElicitResult
from mcp.shared.context import RequestContext
from mcp.types import ElicitRequestParams
from openai import AsyncOpenAI
from openai.types.chat import ChatCompletionMessageFunctionToolCallfrom pkg.config import cfg
from pkg.log import loggerclass MCPHost:"""MCP主机类,用于管理与MCP服务器的连接和交互"""def __init__(self, server_uri: str):"""初始化MCP客户端Args:server_uri (str): MCP服务器的URI地址"""# 初始化MCP客户端连接self.mcp_client: Client = Client(server_uri, elicitation_handler=self.elicitation_handler)# 初始化异步OpenAI客户端用于与LLM交互self.llm = AsyncOpenAI(base_url=cfg.llm_base_url,api_key=cfg.llm_api_key,)# 存储对话历史消息self.messages = []async def close(self):"""关闭MCP客户端连接"""if self.mcp_client:await self.mcp_client.close()async def elicitation_handler(self, message: str, response_type: type, params: ElicitRequestParams, context: RequestContext):print(f"MCP Server asks: {message}")user_decision = input("Please check(yes or no): ").strip()if not user_decision or user_decision != "yes":return ElicitResult(action="decline")response_data = response_type(decision="accept")return response_dataasync def process_query(self, query: str) -> str:"""Process a user query by interacting with the MCP server and LLM.Args:query (str): The user query to process.Returns:str: The response from the MCP server."""# 将用户查询添加到消息历史中self.messages.append({"role": "user","content": query,})# 使用异步上下文管理器确保MCP客户端连接正确建立和关闭async with self.mcp_client:# 从MCP服务器获取可用工具列表tools = await self.mcp_client.list_tools()# 构造LLM可以理解的工具格式available_tools = []# 将MCP工具转换为OpenAI格式for tool in tools:available_tools.append({"type": "function","function": {"name": tool.name,"description": tool.description,"parameters": tool.inputSchema,}})logger.info(f"Available tools: {[tool['function']['name'] for tool in available_tools]}")# 调用LLM,传入对话历史和可用工具resp = await self.llm.chat.completions.create(model=cfg.llm_model,messages=self.messages,tools=available_tools,temperature=0.3,)# 存储最终响应文本final_text = []# 获取LLM的首个响应消息message = resp.choices[0].message# 如果响应包含直接内容,则添加到结果中if hasattr(message, "content") and message.content:final_text.append(message.content)# 循环处理工具调用,直到没有更多工具调用为止while message.tool_calls:# 遍历所有工具调用for tool_call in message.tool_calls:# 确保工具调用有函数信息if not hasattr(tool_call, "function"):continue# 类型转换以获取函数调用详情function_call = cast(ChatCompletionMessageFunctionToolCall, tool_call)function = function_call.functiontool_name = function.name# 解析函数参数tool_args = json.loads(function.arguments)# 检查MCP客户端是否已连接if not self.mcp_client.is_connected():raise RuntimeError("Session not initialized. Cannot call tool.")# 调用MCP服务器上的指定工具result = await self.mcp_client.call_tool(tool_name, tool_args)# 将助手的工具调用添加到消息历史中self.messages.append({"role": "assistant","tool_calls": [{"id": tool_call.id,"type": "function","function": {"name": function.name,"arguments": function.arguments}}]})# 将工具调用结果添加到消息历史中self.messages.append({"role": "tool","tool_call_id":tool_call.id,"content": str(result.content) if result.content else ""})# 基于工具调用结果再次调用LLMfinal_resp = await self.llm.chat.completions.create(model=cfg.llm_model,messages=self.messages,tools=available_tools,temperature=0.3,)# 更新消息为最新的LLM响应message = final_resp.choices[0].message# 如果响应包含内容,则添加到最终结果中if message.content:final_text.append(message.content)# 返回连接后的完整响应return "\n".join(final_text)async def chat_loop(self):"""主聊天循环,处理用户输入并显示响应"""print("Welcome to the MCP chat! Type 'quit' to exit.")# 持续处理用户输入直到用户退出while True:try:# 获取用户输入query = input("You: ").strip()# 检查退出命令if query.lower() == "quit":print("Exiting chat. Goodbye!")break# 跳过空输入if not query:continue# 处理用户查询并获取响应resp = await self.process_query(query)print(f"Assistant: {resp}")# 捕获并记录聊天循环中的任何异常except Exception as e:logger.error(f"Error in chat loop: {str(e)}")logger.error(traceback.format_exc())async def main():"""主函数,程序入口点"""# 创建MCP主机实例client = MCPHost(server_uri="http://localhost:8001/mcp")try:# 启动聊天循环await client.chat_loop()except Exception as e:# 记录主程序中的任何异常logger.error(f"Error in main: {str(e)}")logger.error(traceback.format_exc())finally:# 确保客户端连接被正确关闭await client.close()if __name__ == "__main__":# 运行主程序asyncio.run(main())

运行示例:

Welcome to the MCP chat! Type 'quit' to exit.
You: what can you do?
Assistant: I can execute shell commands on your local machine. Please let me know what specific task you'd like me to help with. Keep in mind that any command I run will be on your local system, and you should ensure that the commands are safe and appropriate for your environment.
You: 查询下当前内存使用情况
Assistant: 当前内存使用情况如下:- **总内存**: 62Gi
- **已使用内存**: 11Gi
- **空闲内存**: 45Gi
- **共享内存**: 137Mi
- **缓存/缓冲区**: 6.6Gi
- **可用内存**: 50Gi交换分区情况:- **总交换空间**: 3.8Gi
- **已使用交换空间**: 0B
- **空闲交换空间**: 3.8Gi如果还有其他问题,请随时告诉我!
You: 在家目录创建一个文件,文件内容为当前平均负载,文件名为当前日期
MCP Server asks: Do you want to execute this command(yes or no): echo $(uptime | awk -F 'load average:' '{print $2}') > ~/$(date +%Y%m%d).txt
Please check(yes or no): yes
Assistant: 已在您的家目录下创建了一个文件,文件名为当前日期(例如:20231005.txt),文件内容为系统的当前平均负载。如果您需要进一步的帮助,请告诉我!
You: quit
Exiting chat. Goodbye!

小结

通过以上示例,我们可以看到MCP的Elicitation机制在实际应用中的强大之处:

  1. 增强安全性:在执行敏感操作前征询用户意见,避免意外操作带来的风险。就像有个贴心的助手在执行重要任务前总是先问一句"您确定吗?"
  2. 提升用户体验:让用户参与到AI的决策过程中,而不是被动接受结果。这种交互方式让用户感觉更有控制感,也更信任AI系统。
  3. 灵活的数据收集:可以按需收集结构化数据,避免一次性要求用户提供过多信息造成的认知负担。
  4. 优雅的错误处理:当用户拒绝或取消操作时,系统能够优雅地处理这些情况,而不是崩溃或产生不可预期的行为。
  5. 无缝集成:Elicitation机制与MCP的其他功能(如工具调用、资源访问)无缝集成,形成一个完整的AI交互生态系统。

在实际开发中,Elicitation机制特别适用于以下场景:

  • 系统管理工具在执行修改操作前的确认
  • 数据分析工具在处理敏感数据前的权限验证
  • 文件操作工具在创建、删除或修改文件前的用户确认
  • 金融或医疗等高风险领域的操作审批流程

总的来说,Elicitation机制为AI系统与人类用户之间建立了一座沟通的桥梁,让AI不再是冷冰冰的执行者,而是一个懂得在关键时刻寻求帮助的智能伙伴。

参考

  • yuan - MCP 征询机制(Elicitation)详解,附代码实现
  • FastMCP - Server Elicitation
  • FastMCP - Client Elicitation

相关文章:

[MCP][05]Elicitation示例

Elicitation能让工具在关键时刻暂停执行,并向用户请求特定信息前言 如果你之前接触过LangGraph的"Human in the loop"概念,那么理解MCP的Elicitation机制就会容易很多。这两个功能非常相似,都是让AI在需要时停下来,礼貌地向人类寻求帮助或确认。 想象一下,当你正…...

Warsaw主题关闭导航条

\setbeamertemplate{headline}{}...

Python Socket网络编程(2)

进程:提供计算资源的单位 线程:真正工作的单位(cpu调度最小单元) GIL锁:全局解释器锁(是CPython解释器特有的,平时说的Python解释器一般都是CPython解释器,还有GPython等等) 让一个进程中同一时刻只能有一个线程可以被CPU调动。所以Python中应该是没有严格意义的多线程…...

PS2025安装包下载及PS2025安装包安装教程详细步骤(包含安装包下载链接)

在图像处理领域,Adobe Photoshop 一直占据着举足轻重的地位,而 PS 2025 更是汇聚前沿技术与实用功能,成为众多设计师与图像处理爱好者的得力工具。但初次安装这款软件,可能会因步骤繁杂、细节众多而让人感到棘手。别担心,本教程将以清晰、简洁的方式,带你一步步完成 PS 2…...

Nature Genetics | 本周最新文献速递

Multiancestry brain pQTL fine-mapping and integration with genome-wide association studies of 21 neurologic and psychiatric conditions 中文标题: 多祖先脑蛋白遗传调控解码!pQTL精细映射揭示神经精神疾病机制 关键词: 脑蛋白定量性状位点、精细映射、多祖先整合、…...

关于go里切片作为函数参数时是引用传递还是值传递

go语言中切片参数的值传递问题问题起因 写一道回溯算法题,把ans二维数组作为函数参数传入,想在函数里面,不停地append,最后返回ans 实际发现ans打印出来是空的,就很奇怪,因为我是事先分配好空间的,理论上不会发生扩容,底层数组是共用的,咋回事 func permute(nums []in…...

DRAN读写循环

DRAM读写循环 以一个8 * 8 的二维阵列为例子,假设部分存储单元为1,部分为0,现在要读写其中某一个cell的值。为了确定存储的位置,我们需要内存地址,为了传输内存地址,我们需要地址总线。8 * 8阵列一共有64个cell,我们需要6线地址总线,一共能表示64种二进制值。三根地址总…...

数据结构操作相关

堆 1、插入元素上滤每一次与父亲比较,满足大小就往上交换,直至不能往上为止。每次往上交换不会影响下面的性质2、删除/输出堆顶下滤假设大根堆,根节点换入末尾节点,每次先找出大儿子,若大儿子比自己大,则往下和他交换,直至不能往下为止。 3、建堆 1)初始为空,逐个inse…...

Neisbitt 不等式的证法

\(a,b,c\in R^+求证:\frac{a}{b+c}+\frac{b}{a+c}+\frac{c}{a+b}\geq\frac{3}{2}\) 证明: \(\because a,b,c\in R^+,\therefore\exists x,y,使得b=ax,c=ay\) \(\therefore LHS=\frac{1}{x+y}+\frac{x}{1+y}+\frac{y}{1+x}\) \(\therefore 令f(x,y)=\frac{1}{x+y}+\frac{x}{1+…...

端口转发神器Rinetd:轻量级安装与配置指南

什么是Rinetd? Rinetd(Redirection Internet Daemon)是一款轻量级的TCP端口转发工具,可以将来自一个IP地址和端口的连接转发到另一个IP地址和端口。它配置简单、资源占用少,是系统管理员和开发人员进行端口转发的理想选择。 Rinetd的主要特点轻量级:体积小,资源占用低 配…...

C语言中递归思想的应用

C语言中递归思想的应用 一、递归思想 在C语言中,函数是程序的基本单位,每个函数负责解决特定问题。但如果程序中出现n个相同的问题,就需要调用对应函数n次,这会导致程序冗长、可读性差。那么,有没有更简洁的解决方案呢? 答案是递归函数。递归函数并非万能,它更适用于解决…...

WITH RECURSIVE 递归公用表表达式(CTE)

生成一个从 1 到 12352 的连续数字序列SQL server SQL Server 对递归 CTE 有默认的递归深度限制(默认是 100),当递归次数超过这个限制时会报错。当远超默认限制时,需要在查询前使用 OPTION (MAXRECURSION 0) 来取消递归深度限制。WITH RECURSIVE num_sequence AS (SELECT 1…...

#java作业

1方法相关问题、 public class Main { static void changeStr(String x) { x = "xyz"; } static void changeArr(String[] strs) { for (int i = 0; i < strs.length; i++) { strs[i] = strs[i]+""+i; } } public static void main(String[] args) { …...

leetcode 3541. 找到频率最高的元音和辅音 便捷

leetcode 3541. 找到频率最高的元音和辅音 便捷pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !…...

匿名递归与不动点组合子

先贴上 CS61A Homework 3 Recursion, Tree Recursion 中的最后一道思考题题面: ​Q6: Anonymous FactorialThis question demonstrates that its possible to write recursive functions without assigning them a name in the global frame.The recursive factorial function…...

Markdown学习Day01

Markdown学习第一天 【【狂神说Java】Java零基础学习视频通俗易懂】https://www.bilibili.com/video/BV12J41137hu?p=6&vd_source=e3ba980d960d7d6c98e4872bba8cf225 Markdown学习 二级标题 字体 her hus hou KLI 引用选择不需要辩护。分割线插图超链接 学Java 表格年级 班…...

flutter compass结构代码分析

1.config文件夹:1.1assets.dart返回一个Assets类,包含activities和destinations两个静态属性。两个静态属性分别代表虚拟数据存放的路径。在assets文件夹下1.2 dependencies.dart使用provider绑定远程访问和本地访问所需要的数据 2.data文件夹2.1 repositoriesactivity文件夹a…...

25.9.15

应该都知道我退役了吧。 我对于这一段竞赛生涯呢,情感太复杂了。 (话说退役半年才回来写是不是有点晚了) 怎么说呢,这段竞赛让我有了一段快乐的时光,也让我彻底改变了。 想说很多,但是又说不出口。 先说说坏处吧 我的抑郁症可以说是被竞赛加深的,以至于我在初三下和高一…...

二十八、共享内存多处理器的基本概念

目录1. 核心定义2. 两种主要的共享内存架构a) 均匀内存访问b) 非均匀内存访问3. 共享内存多处理器的核心挑战与解决方案a) 缓存一致性b) 内存一致性4. 编程模型与同步5. 优势与劣势优势:劣势:总结共享内存多处理器是多处理器系统中最常见和直观的一种架构,也是现代多核CPU设…...

详细介绍:【ARMv7】系统复位上电后的程序执行过程

详细介绍:【ARMv7】系统复位上电后的程序执行过程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospac…...

C#高级语法

https://www.cnblogs.com/NotEnough/p/7426853.html https://juejin.cn/post/7100033147101773831...

配置Maven

IDEA配置Maven原文链接:https://blog.csdn.net/leah126/article/details/132020904 一、Maven下载 首先我们进入maven官方网站,进入网页后,点击Download去下载。下载免安装版,解压即可,解压至磁盘任意目录,尽量不要取中文名如下图: 二、配置Maven环境变量 打开cmd命令行,…...

那两年的回忆录

小引 我的OI之路是短暂且波折的,像是一则故事,曲曲折折,却又很是有趣,或许那两年是我最愉快的时光吧。 我总是问自己当初为什么要学OI,许是一腔热血,许是奔赴热爱。仔细想想,从最开始接触scratch,到后来的Python,最后的C++,前面两个都是觉得好玩,觉得有趣,可C++呢,…...

DDR4基本介绍

DDR4简介 DRAM的存储原理 DRAM的基本存储单元:cell 一个cell由一个晶体管和一个电容(约为30pF)组成,电容存储了电量代表1,电容放空电量代表0,晶体管作为电容的充放电开关,以便实现1bit数据的读写,cell的结构如下图所示 :读的过程:首先打开MOS管,根据电容的充放电信息…...

网络同步预测-Prediction

预测(Prediction) 是解决网络延迟问题、提升玩家操作流畅度的核心机制客户端接收玩家输入玩家操作(如 WASD 移动、跳跃)被捕获为输入事件(FInputActionValue)。客户端本地预测执行客户端不等服务器响应,直接基于输入在本地模拟角色行为(如移动、动画播放),并立即更新…...

二十五、多处理器的基本概念 (SISD/SIMD/MIMD)

目录1. SISD - 单指令流单数据流2. SIMD - 单指令流多数据流3. MIMD - 多指令流多数据流总结与对比简单类比多处理器体系结构中的三个基本概念:SISD、SIMD 和 MIMD,这些概念由迈克尔弗林(Michael Flynn)于1966年提出,被称为弗林分类法(Flynns Taxonomy)。它根据指令流(…...

java课堂问题2

1.1changeStr(String x):方法内部尝试将传入的字符串参数重新赋值为 "xyz",但该操作仅在方法内部有效,不会影响外部实参 changeArr(String[] strs):遍历传入的字符串数组,对数组中的每个元素进行修改,在原字符串后拼接其索引值(例如将第 0 个元素改为 "原…...

集训总结(六)

9.15 听 CEO 讲了 sb 树,不知道该写什么,挂个祂博客的链接吧。 https://www.cnblogs.com/Augenstern-/p/18964066...

GAS_Aura-Prediction GAS

1讲了关于GAS中的网络之间,Client-Server的网络同步时,需要使用预测...

PromptPilot 产品发布:火山引擎助力AI提示词优化的新利器

周六非常荣幸参加了火山引擎官方举办的PromptPilot产品发布会。其实早在8月份,我就有幸参与了该产品的内测阶段,并撰写了一些体验心得和感受。此次发布会当天,不仅深入聆听到了产品负责人以及工程师们对PromptPilot的全新解读和详细介绍,还现场感受到了他们对产品未来发展方…...

安装window版本docker

下载 下载链接:https://hub.docker.com/?overlay=onboarding 在 Windows 上部署 Docker 的方法都是先安装一个虚拟机,VMware版本17.0以上可以兼容安装docker 另一个可以下载 Hyper-V,Hyper-V 是微软开发的虚拟机,类似于 VMWare 或 VirtualBox 选中Hyper-V 也可以通过命令…...

已严肃完成今日特征多项式大学习

何为特征值与特征向量 古人云:特征向量,乃方阵与线性变换之特征也。 盖线性变换,千变万化,寻不变其所向之向量,乃特征向量也。注意 0 向量不是特征向量。 何为特征值?线性变换中特征向量的伸长倍数,称该特征向量属于该特征值。 容易知道与一个特征向量共线的向量均为特征…...

docker部署Gitlab社区版,步骤以及外网访问出现502的解决方式 - 实践

docker部署Gitlab社区版,步骤以及外网访问出现502的解决方式 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier Ne…...

python_Day21_mysql(2)

今日内容大纲介绍约束详解单表约束 多表约束DQL语句详解简单查询 条件查询 聚合查询 分组查询 排序查询 模糊查询 分页查询多表查询交叉连接 连接查询 子查询 自关联(自连接)查询扩展: 多表建表一对多 多对多 一对一1.主键约束详解 /* 约束详解:概述:SQL中的约束分为: 单表约束…...

.zip用法

.zip() 函数在 Python 中是一个非常实用的内置函数,它用于将多个可迭代对象(比如列表、元组等)中的元素打包成一个元组的迭代器。 简单来说,它的作用就是把不同序列中对应位置的元素配对,就像拉链一样把两排牙齿咬合在一起。 zip() 的基本用法 zip(iterable1, iterable2, …...

vue2使用pnpm编译打包时的错误处理

1. 错误信息 error in ./src/views/forest/forestGateway.vue?vue&type=script&lang=js Module parse failed: Unexpected token (203:39) File was processed with these loaders: * ./node_modules/.pnpm/**cache-loader**@4.1.0_webpack@4.47.0/node_modules/cach…...

中南上课第一天

一周三天早八,体验衡中生活:( 早上起来就发现食堂的人巨多,一看原来是崩铁和瑞幸联名了,看来学校崩p还是挺多的,我看到有卖油条和豆浆的,于是浅尝了一下——还是避雷吧,油条油的要死,吃了一根第二根实在是咽不下去了,于是扔了去教室,如图,不愧是知名的电动车帝国,这…...

二十四、深入理解CPU控制信号的最终使命

目录指挥官与士兵:深入理解CPU控制信号的最终使命一、舞台与演员:认识数据通路中的角色二、核心命题:为什么说控制信号“仅”作用在功能部件上?三、澄清误区:那流水线寄存器呢?四、更深层的意义:理解计算机架构的哲学结论指挥官与士兵:深入理解CPU控制信号的最终使命 在…...

20250915 - 状压dp 总结

比赛链接:https://vjudge.net/contest/748191。 A - 互不侵犯 最最最最最最最板子的状压 DP。 大概就是一行一行去弄。然后的话,DP 维护三个量,当前遍历到第 \(i\) 行,目前总共放了 \(j\) 个国王,以及这一行的放置国王情况为 \(st\)(用二进制状压表示)。判断的时候,有一…...

PS2025安装包永久免费版下载安装教程Photoshop 2025 v26.0安装包永久免费版下载

身边很多朋友问我怎么装 PS 2025,其实步骤不难,先跟大家说下这软件到底好用在哪,再一步步教安装,最后给几个常用的实操案例,新手跟着做就能上手,不管是想做摄影后期、商业设计,还是社交账号配图,看完这篇 Photoshop 2025 v26.0 下载安装教程都能搞定。目录一、先搞懂 P…...

学校真是太棒了

我的学校是全世界最好的学校,不接受反驳!学校太好了 作为学生评判学校自然要说点实际的。 就比如说住宿环境,那是我见过的最优秀的宿舍了。 你们学校会把宿舍改装成水帘洞吗 今天中午回到宿舍就发现学校为了让我们更加凉爽,同时赏心悦目,将宿舍改装成水帘洞,一进宿舍楼就…...

如果远程玩家过早结束异步任务,并且具有该集的任务仍在运行,则该任务被杀死-SetWaitingOnRemotePlayerData()

SetWaitingOnRemotePlayerData主要用于控制游戏模式是否等待远程玩家(通常是网络多人游戏中的客户端)的数据加载完成。调用时,可以直接杀死该使用数据的任务...

9.15日总结

完成hbase的部署,需要准备虚拟机并部署hadoop与java环境。途中虚拟机磁盘满了还要重新分配一下,但奈何磁盘满了进不去桌面,把之前的docker删了总算顺利进去了。...

二十二、流水线CPU的神经脉络:详解控制信号的产生、保存与传递

目录一、核心挑战:多指令的并行交响曲二、解决方案:提前生成与“随指令流动”1. 产生:在译码阶段(ID)一次性生成所有“说明书”2. 保存与传递:流水段寄存器——控制信号的“护航舰队”三、这种机制的优势与意义总结你是否曾好奇,现代CPU的流水线如同一条高效运转的装配线…...

python_Day20_mysql(1)

今日内容大纲介绍数据库的相关概述 环境搭建 SQL语句分类DDL DML DCL DQLDDL语句之操作数据库 DDL语句之操作数据表 DML语句之操作表数据(增删改) DQL语句之操作表数据(查)1.数据库的相关概述问1: 你知道的存储数据的方式有哪些? -- 方式1: 变量, 列表, 字典... 只能对数据临时…...

确定调用 TargetData是否已发送-CallReplicatedTargetDataDelegatesIfSet()

example:const bool bCalledDelegate = AbilitySystemComponent.Get()->CallReplicatedTargetDataDelegatesIfSet(SpecHandle, ActivationPredictionKey);if (!bCalledDelegate){ SetWaitingOnRemotePlayerData();}...

二十三、流水线的起点为何无需指挥?深入理解IF与ID这两个“公共流水段”

目录一、时钟:流水线的同步心跳二、公共流水段:为何IF和ID无需“特殊关照”1. 取指阶段(IF):无差别的读取2. 译码阶段(ID):标准化的解析三、控制信号的诞生:时机决定一切四、控制信号为谁而生?总结:标准化与个性化的分工在我们深入探索CPU流水线的精妙世界时,一个看…...

来解剖 来平息你的颤抖 叫嚷着还不足够 还需要更多疼痛 才值得温柔

test4 不要在意这个诡异的标题。排序sort 快排的过程相当于以 \(a_r\) 为界限,更小的放到左边,更大的放在右边,我们还关心新的 \(a_r\) 是谁,左边是按顺序的填入,右边新的顺序只跟原本的顺序有关系素排列双射下去啦,所以就是唯一特定位置的值成为新的。 那么考虑 dp 一下…...

从客户端拿到缓存数据-ConsumeClientReplicatedTargetData()

1...

减少KVCache

减少KVCache:从MHA,MQA,GQA到MLA 参考链接 科学空间,苏神的blog 大模型推理加速:看图学KVCache 前言 也是终于到了稍微有一点时间的时候,也需要对看过的东西进行简单的总结了。这里就总结一下论文中最喜欢的attention,以及与KVCache之间的关系。 基础:什么是attention?…...