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

FastMCP与FastAPI:构建自定义MCP服务器

FastMCP与FastAPI:构建自定义MCP服务器

模型上下文协议(Model Context Protocol, MCP)是一种让AI模型与外部工具和服务交互的标准。本文将介绍FastMCP和FastAPI,并通过实例展示如何创建自定义MCP服务器。

MCP基础概念

MCP允许语言模型:

  • 访问外部工具和API
  • 执行实时计算和查询
  • 与文件系统和服务交互

简单来说,MCP让AI模型能"走出"对话框,调用各种功能。

FastMCP介绍

FastMCP是一个Python库,简化了MCP服务器的构建。它提供了:

  • 易用的装饰器语法
  • 自动处理请求/响应
  • 参数验证和错误处理

FastAPI介绍

FastAPI是一个现代Web框架,用于构建API:

  • 高性能(基于ASGI)
  • 自动生成交互式文档
  • 数据验证和序列化
  • 基于Python类型提示

FastMCP与FastAPI的结合

二者结合的优势:

  • FastAPI提供了Web服务器基础架构
  • FastMCP添加了模型交互能力
  • 共享相似的装饰器语法和类型系统

自定义MCP服务器示例

# 示例1:基础计算器服务器
from fastmcp import MCPServer, Request
from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()
mcp_server = MCPServer(app)class CalculationRequest(BaseModel):x: floaty: float@mcp_server.mcp_endpoint
async def add(request: Request[CalculationRequest]) -> float:"""将两个数字相加"""data = request.paramsreturn data.x + data.y@mcp_server.mcp_endpoint
async def subtract(request: Request[CalculationRequest]) -> float:"""从第一个数字中减去第二个数字"""data = request.paramsreturn data.x - data.y@mcp_server.mcp_endpoint
async def multiply(request: Request[CalculationRequest]) -> float:"""将两个数字相乘"""data = request.paramsreturn data.x * data.y@mcp_server.mcp_endpoint
async def divide(request: Request[CalculationRequest]) -> float:"""将第一个数字除以第二个数字"""data = request.paramsif data.y == 0:raise ValueError("除数不能为零")return data.x / data.yif __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)# 示例2:天气信息服务器
from fastmcp import MCPServer, Request
from fastapi import FastAPI
from pydantic import BaseModel
import random
from datetime import datetime, timedeltaapp = FastAPI()
mcp_server = MCPServer(app)class WeatherRequest(BaseModel):city: strdays: int = 1class WeatherInfo(BaseModel):date: strtemperature: floatcondition: strhumidity: int@mcp_server.mcp_endpoint
async def get_weather(request: Request[WeatherRequest]) -> list[WeatherInfo]:"""获取指定城市的天气预报"""data = request.params# 这里使用模拟数据,实际应用中会调用真实的天气APIweather_conditions = ["晴朗", "多云", "小雨", "大雨", "雷雨", "小雪"]result = []today = datetime.now()for i in range(data.days):date = today + timedelta(days=i)result.append(WeatherInfo(date=date.strftime("%Y-%m-%d"),temperature=round(random.uniform(15, 30), 1),condition=random.choice(weather_conditions),humidity=random.randint(30, 90)))return resultif __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8001)# 示例3:文件操作服务器
from fastmcp import MCPServer, Request
from fastapi import FastAPI
from pydantic import BaseModel
import os
import jsonapp = FastAPI()
mcp_server = MCPServer(app)# 模拟文件系统(实际应用中使用真实文件系统)
file_system = {}class FileWriteRequest(BaseModel):filename: strcontent: strclass FileReadRequest(BaseModel):filename: strclass FileListRequest(BaseModel):directory: str = "/"class FileDeleteRequest(BaseModel):filename: str@mcp_server.mcp_endpoint
async def write_file(request: Request[FileWriteRequest]) -> bool:"""将内容写入文件"""data = request.paramsfile_system[data.filename] = data.contentreturn True@mcp_server.mcp_endpoint
async def read_file(request: Request[FileReadRequest]) -> str:"""读取文件内容"""data = request.paramsif data.filename not in file_system:raise ValueError(f"文件 {data.filename} 不存在")return file_system[data.filename]@mcp_server.mcp_endpoint
async def list_files(request: Request[FileListRequest]) -> list[str]:"""列出指定目录中的文件"""return list(file_system.keys())@mcp_server.mcp_endpoint
async def delete_file(request: Request[FileDeleteRequest]) -> bool:"""删除文件"""data = request.paramsif data.filename not in file_system:raise ValueError(f"文件 {data.filename} 不存在")del file_system[data.filename]return Trueif __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8002)# 示例4:综合应用 - 个人助手服务
from fastmcp import MCPServer, Request
from fastapi import FastAPI
from pydantic import BaseModel
from datetime import datetime
import json
import randomapp = FastAPI()
mcp_server = MCPServer(app)# 模拟数据存储
notes_db = []
todos_db = []
contacts_db = []class Note(BaseModel):id: int = Nonetitle: strcontent: strcreated_at: str = Noneclass Todo(BaseModel):id: int = Nonetask: strcompleted: bool = Falsedue_date: str = Noneclass Contact(BaseModel):id: int = Nonename: strphone: stremail: str = Noneclass SearchRequest(BaseModel):query: str@mcp_server.mcp_endpoint
async def add_note(request: Request[Note]) -> Note:"""添加一条笔记"""note = request.paramsnote.id = len(notes_db) + 1note.created_at = datetime.now().isoformat()notes_db.append(note)return note@mcp_server.mcp_endpoint
async def get_notes(request: Request) -> list[Note]:"""获取所有笔记"""return notes_db@mcp_server.mcp_endpoint
async def add_todo(request: Request[Todo]) -> Todo:"""添加一个待办事项"""todo = request.paramstodo.id = len(todos_db) + 1if not todo.due_date:todo.due_date = (datetime.now() + timedelta(days=1)).isoformat()todos_db.append(todo)return todo@mcp_server.mcp_endpoint
async def get_todos(request: Request) -> list[Todo]:"""获取所有待办事项"""return todos_db@mcp_server.mcp_endpoint
async def complete_todo(request: Request[int]) -> Todo:"""标记待办事项为已完成"""todo_id = request.paramsfor todo in todos_db:if todo.id == todo_id:todo.completed = Truereturn todoraise ValueError(f"待办事项 #{todo_id} 不存在")@mcp_server.mcp_endpoint
async def add_contact(request: Request[Contact]) -> Contact:"""添加联系人"""contact = request.paramscontact.id = len(contacts_db) + 1contacts_db.append(contact)return contact@mcp_server.mcp_endpoint
async def get_contacts(request: Request) -> list[Contact]:"""获取所有联系人"""return contacts_db@mcp_server.mcp_endpoint
async def search(request: Request[SearchRequest]) -> dict:"""搜索笔记、待办事项和联系人"""query = request.params.query.lower()matching_notes = [note for note in notes_db if query in note.title.lower() or query in note.content.lower()]matching_todos = [todo for todo in todos_db if query in todo.task.lower()]matching_contacts = [contact for contact in contacts_db if query in contact.name.lower()]return {"notes": matching_notes,"todos": matching_todos,"contacts": matching_contacts}if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8003)

小白指南:逐步理解

1. 什么是MCP?

想象你的AI助手(如ChatGPT)是一个聪明的专家,但被关在一个房间里,只能通过纸条与外界交流。MCP就像是给这个专家配备了一部电话,让它能打电话给各种服务:查天气、计算数学问题、管理你的日程等。

2. FastMCP和FastAPI的角色

  • FastAPI:提供电话线路和基础设施
  • FastMCP:定义通话协议,确保AI能正确拨号和理解回复

3. 搭建MCP服务器的步骤

  1. 安装必要的库:

    pip install fastmcp fastapi uvicorn
    
  2. 创建服务器框架:

    from fastmcp import MCPServer
    from fastapi import FastAPIapp = FastAPI()
    mcp_server = MCPServer(app)
    
  3. 定义数据模型(请求和响应的结构)

  4. 创建功能端点(用@mcp_server.mcp_endpoint装饰器)

  5. 启动服务器:

    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
    

实际应用场景

  • 数据分析助手:连接数据处理工具
  • 客户服务机器人:访问CRM系统和知识库
  • 智能文档助手:处理和生成各类文档
  • 个人生产力工具:管理日程、笔记和待办事项

最佳实践

  1. 明确定义数据模型:使用Pydantic确保输入输出格式正确
  2. 添加详细文档:每个端点都应有清晰的描述
  3. 实现错误处理:优雅处理异常情况
  4. 使用异步功能:充分利用FastAPI的异步特性
  5. 添加验证和安全措施:保护服务器不受恶意请求攻击

结语

FastMCP和FastAPI的结合为AI模型提供了强大的扩展能力。通过本文介绍的示例,即使是编程新手也能构建自己的MCP服务器,让AI助手拥有更多实用功能。随着MCP生态系统的发展,我们可以期待更多创新应用的出现。

相关文章:

FastMCP与FastAPI:构建自定义MCP服务器

FastMCP与FastAPI:构建自定义MCP服务器 模型上下文协议(Model Context Protocol, MCP)是一种让AI模型与外部工具和服务交互的标准。本文将介绍FastMCP和FastAPI,并通过实例展示如何创建自定义MCP服务器。 MCP基础概念 MCP允许语言模型: 访问外部工具…...

基于 springboot+vue+elementui 的办公自动化系统设计(

基于 springbootvueelementui 的办公自动化系统设计(前端代码在oa文件夹里) 系统主要功能: 1、统一的信息发布平台:公告栏,公司活动,项目进度,公司周报 2、统一的文件管理平台:收文管理、发文管理。文件查询…...

Java发展史及版本详细说明

Java发展史及版本详细说明 1. Java 1.0(1996年1月23日) 核心功能: 首个正式版本,支持面向对象编程、垃圾回收、网络编程。包含基础类库(java.lang、java.io、java.awt)。支持Applet(浏览器嵌入…...

高企复审奖补!2025年合肥市高新技术企业重新认定奖励补贴政策及申报条件

一、合肥市高新技术企业重新认定奖励补贴政策 (一)高新区高新技术企业重新认定复审补贴奖励 重新认定为国家高新技术企业的给予5万元一次性奖励。 (二)经开区高新技术企业重新认定复审补贴奖励 对重新认定的企业,给…...

elementui日历显示红点及根据日程范围判断是否有红点

生成指定日期范围内的所有日期 generateDateRange(startStr, endStr) {const dates []; 日期列表const start new Date(startStr); 日程开始日期const end new Date(endStr); 日程结束日期end.setHours(23, 59, 59, 999); 结束的那一天设置为23点59分59秒// 生成日期范围内…...

第六章 QT基础:5、QT的UDP网络编程

在 Qt 中,QUdpSocket 类用于实现基于 UDP 协议的网络通信。UDP(用户数据报协议)是一种无连接的协议,与 TCP 不同,它不需要建立连接,因此它的传输速度较快,但也不保证数据的可靠传输。 1. Qt UDP…...

JAVA设计模式——(五)享元模式(Flyweight Pattern)

JAVA设计模式——(五)享元模式(Flyweight Pattern) 概念理解实现创建内部状态定义享元工厂测试 适用性 概念 使共享对象可以有效的支持大量的细粒度对象。主要采用池技术实现。 理解 享元模式主要解决大量对象的共享&#xff0…...

电竞俱乐部护航点单小程序,和平地铁俱乐部点单系统,三角洲护航小程序,暗区突围俱乐部小程序

电竞俱乐部护航点单小程序开发,和平地铁俱乐部点单系统,三角洲护航小程序,暗区突围俱乐部小程序开发 端口包含: 超管后台, 老板端,打手端,商家端,客服端,管事端&#x…...

mybatis log convert使用

1. idea 搜索插件 mybatis log convert. 安装后重启idea 启动程序. 日志打印后选中输出的内容右键。这里随意选中一段日志做演示 必须要在console中复制才能使用这个日志解析 2. 还有一种用法。没找到...

[U-Net]DA-TRANSUNET

论文题目:DA-TRANSUNET: INTEGRATING SPATIAL AND CHANNEL DUAL ATTENTION WITH TRANSFORMER U-NET FOR MEDICAL IMAGE SEGMENTATION ∗ 中文题目:DA-TRANSUNET:结合空间和通道双注意力与Transformer U-NET的医学图像分割算法 0摘要 精确的医学图像分割对疾病定量和治疗评…...

AI大模型从0到1记录学习 数据结构和算法 day20

4.3 分治算法 4.3.1 概述 分治算法的基本思想为:将原问题递归的分解为若干个(通常是两个以上)规模较小、相互独立且性质相同的子问题,直到子问题足够简单,简单到可以直接求解。然后再返回结果,逐个解决上层…...

面阵相机中M12镜头和远心镜头的区别及性能优势

以下是关于面阵相机中M12镜头和远心镜头的区别及性能优势的详细分析,结合知识库内容整理如下: 一、M12镜头与远心镜头的核心区别 1. 设计原理与光学特性 特性M12镜头远心镜头光学设计标准镜头设计,无特殊光学校正,依赖传统光路。…...

[创业之路-385]:企业法务 - 初创公司如何做好商业秘密的管理

一、商业秘密的定义与价值 定义: 商业秘密是企业的核心资产,包括技术信息(如算法、配方)和经营信息(如客户名单、定价策略),具有非公开性、商业价值、保密性三大特征。价值: 初创公…...

Qt5.15.2+OpenCV4.9.0开发环境搭建详细图文教程(OpenCV使用Qt自带MinGW编译的全过程,包教包会)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…...

怎么实现RAG检索相似文档排序:similarities

怎么实现RAG检索相似文档排序:similarities top_5_indices = similarities.argsort()[-5:][::-1] 这行代码的作用是从一组相似度得分中获取相似度最高的5个元素的索引。 similarities:这是一个包含了某个问题与所有文档之间余弦相似度得分的一维数组(假设 similarities 是通…...

NLP高频面试题(五十三)——深度学习正则化详解

一、动因篇 为什么要正则化? 深度神经网络通常包含数以万计甚至数以亿计的参数,模型容量极大,极易在有限的训练数据上“记住”噪声与异常样本,从而出现过拟合(overfitting)现象。过拟合导致模型在训练集上表现优异,但在测试集或真实场景中泛化能力大幅下降。正则化(r…...

2.idea查看某个类的方法名称和实现

2.idea查看某个类的方法名称和实现 ctrl鼠标左键单击类名 点击侧边栏Structure可看到方法名称的统计,这样直观...

FeignClient用法笔记

1. FeignClient简介 在微服务架构中总需要各个服务相互调用,各个服务又是以接口方式暴露,所以需要Http远程调用;为了简化调用,Spring Cloud OpenFeign 库提供了org.springframework.cloud.openfeign.FeignClient 注解&#xff1a…...

【Redis】 Redis中常见的数据类型(二)

文章目录 前言一、 List 列表1. List 列表简介2.命令3. 阻塞版本命令4. 内部编码5. 使用场景 二、Set 集合1. Set简单介绍2. 普通命令3 . 集合间操作4. 内部编码5. 使用场景 三、Zset 有序集合1.Zset 有序集合简介2. 普通命令3. 集合间操作4. 内部编码5. 使用场景 结语 前言 在…...

电力作业安全工器具全解析:分类、配置与检查要点

在电力行业,每一次作业都面临潜在危险,安全工器具是保障作业人员生命安全的关键。今天,金能电力带大家深入了解电力作业中常见的安全工器具,以及它们的检查与使用要点。 电力作业中安全工器具种类繁多。绝缘安全工器具因直接关联带…...

PowerBI-使用参数动态修改数据源路径

PowerBI-使用参数动态修改数据源路径 在PowerQuery中可以使用参数,通过参数我们可以将多个文件路径相同的字符串进行替换。 以一个案例分享下过程: 第一步,导入一个含有多个sheet表的EXCEL工作薄,点击转换数据,如图…...

Temperature

模型中Temperature参数的详细解释 ​​Temperature​​ 是生成模型(如GPT、LLaMA等)中用于控制输出多样性和随机性的关键超参数。它通过调整模型预测概率分布的平滑程度,直接影响生成文本的创造性与稳定性。 模型中Temperature参数的详细解…...

C++ 日志系统实战第二步:不定参数函数解析

全是通俗易懂的讲解,如果你本节之前的知识都掌握清楚,那就速速来看我的项目笔记吧~ 相关技术知识补充 不定参宏函数 在 C 语言中,不定参宏函数是一种强大的工具,它允许宏接受可变数量的参数,类似于不定参函数&#…...

【高并发】 MySQL锁优化策略

在数据库高并发场景中,行锁、表锁和高并发处理是密切相关的概念,它们共同影响着系统的并发性能和数据一致性。以下是三者的详细解释及高并发处理的策略: 1. 行锁(Row-Level Locking) 行锁是数据库中最小的锁粒度&…...

C语言——填充矩阵

C语言——填充矩阵 一、问题描述二、格式要求1.输入形式2.输出形式3.样例 三、实验代码 一、问题描述 编程实现自动填充nn矩阵元素数值,填充规则为:从第一行最后一列矩阵元素开始按逆时针方向螺旋式填充数值1,2,…,nn…...

CSS3 基础(背景-文本效果)

二、背景效果 属性功能示例值说明background设置背景颜色或渐变background: linear-gradient(45deg, #4CAF50, #FF5722);设置背景颜色、图片或渐变效果。background-size调整背景图片大小background-size: cover;设置背景图片的显示大小,如 cover 或 contain。back…...

点云配准算法之NDT算法原理详解

一、算法概述 NDT(Normal Distributions Transform)最初用于2D激光雷达地图构建(Biber & Straer, 2003),后扩展为3D点云配准。它将点云数据空间划分为网格单元(Voxel),在每个体…...

springboot在eclipse里面运行 run as 是Java Application还是 Maven

在 Eclipse 里运行 Spring Boot 项目时,既可以选择以“Java Application”方式运行,也可以通过 Maven 命令来运行,下面为你详细介绍这两种方式及适用场景。 以“Java Application”方式运行 操作步骤 在项目中找到带有 SpringBootApplicat…...

Redis 基础和高级用法入门

redis 是什么? Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上&#xff1a…...

使用vue2开发一个在线旅游预订平台-前端静态网站项目练习

hello,大家好,今天给大家再分享一个前端vue2练习项目-在线旅游预订平台。我们在学习编程的时候,除了学习编程的基础知识,为了让我们快速的掌握一门编程技术,肯定离不开各种项目的练习,今天分享的这个前端练习项目&…...

Ext Direct 功能与使用详解

Ext Direct 是 Ext JS 框架中的一个功能模块,旨在简化前端 JavaScript 应用与后端服务器之间的通信。其核心思想是通过远程过程调用(RPC)协议,将服务器端的方法透明地映射为前端可直接调用的 JavaScript 函数,从而减少手动编写 Ajax 请求和处理响应的代码量。 一、Ext Dir…...

Android移动应用开发入门示例:Activity跳转界面

介绍如何使用LinearLayout布局实现基本的UI设计,并实现两个Activity之间的跳转,适合刚接触Android Studio的新手学习。我们将使用Java语言开发,布局采用XML文件。以下为完整源码与运行说明: 案例前的准备工作: 1.1XM…...

【hadoop】HBase分布式数据库安装部署

一、HBase集群的安装与配置 步骤: 1、使用XFTP将HBase安装包hbase-1.2.0-bin.tar.gz发送到master机器的主目录。 2、解压安装包: tar -zxvf ~/hbase-1.2.0-bin.tar.gz 3、修改文件夹的名字,将其改为hbase,或者创建软连接也可…...

理解npm的工作原理:优化你的项目依赖管理流程

目录 什么是npm npm核心功能 npm 常用指令及其作用 执行npm i 发生了什么? 1. 解析命令与参数 2. 检查依赖文件 3. 依赖版本解析与树构建 4. 缓存检查与包下载 5. 解压包到 node_modules 6. 更新 package-lock.json 7. 处理特殊依赖类型 8. 执行生命周期脚本 9. …...

【Python笔记 04】输入函数、转义字符

一、Input 输入函数 prompt是提示,会在控制台显示,用作提示函数。 name input("请输入您的姓名:") print (name)提示你输入任意信息: 输入input test后回车,他输出input test 二、常用的转义字符 只讲…...

MySQL数据库基本操作-DQL-基本查询

数据库的操作中,查询是最重要的 一、基本查询-数据准备 -- 数据准备 create database if not exists mydb2; use mydb2; create table product( pid int primary key auto_increment, pname varchar(20) not null, price double, category_id varchar(20) …...

13、性能优化:魔法的流畅之道——React 19 memo/lazy

一、记忆封印术(React.memo) 1. 咒语本质 "memo是时间转换器的记忆晶石,冻结无意义的能量波动!" 通过浅层比较(shallowCompare)或自定义预言契约,阻止组件在props未变时重新渲染。 …...

低代码平台开发手机USB-HID调试助手

项目介绍 USB-HID调试助手是一种专门用于调试和测试USB-HID设备的软件工具。USB-HID设备是一类通过USB接口与计算机通信的设备,常见的HID设备包括键盘、鼠标、游戏控制器、以及一些专用的工业控制设备等。 主要功能包括: 数据监控:实时监控和…...

Langchain_Agent+数据库

本处使用Agent数据库,可以直接执行SQL语句。可以多次循环查询问题 前文通过chain去联系数据库并进行操作; 通过链的不断内嵌组合,生成SQL在执行SQL再返回。 初始化 import os from operator import itemgetterimport bs4 from langchain.ch…...

Code Splitting 分包策略

以下是关于分包策略(Code Splitting)的深度技术解析,涵盖原理、策略、工具实现及优化技巧: 一、分包核心价值与底层原理 1. 核心价值矩阵 维度未分包场景合理分包后首屏速度需加载全部资源仅加载关键资源缓存效率任意修改导致全量缓存失效按模块变更频率分层缓存并行加载单…...

AI 开发入门之 RAG 技术

目录 一、从一个简单的问题开始二、语言模型“闭卷考试”的困境三、RAG 是什么—LLM 的现实世界“外挂”四、RAG 的七步流程第一步:加载数据(Load)第二步:切分文本(Chunking)第三步:向量化&…...

day36图像处理OpenCV

文章目录 一、图像预处理18 模板匹配18.1模板匹配18.2 匹配方法18.2.1 平方差匹配18.2.2 归一化平方差匹配18.2.3 相关匹配18.2.4 归一化相关匹配18.2.5 相关系数匹配18.2.6 归一化相关系数匹配 18.3 绘制轮廓18.4案例 一、图像预处理 18 模板匹配 18.1模板匹配 模板匹配就是…...

系统与网络安全------弹性交换网络(3)

资料整理于网络资料、书本资料、AI,仅供个人学习参考。 STP协议 环路的危害 单点故障 PC之间的互通链路仅仅存在1个 任何一条链路出现问题,PC之间都会无法通信 解决办法 提高网络可靠性 增加冗余/备份链路 增加备份链路后交换网络上产生二层环路 …...

FPGA上实现YOLOv5的一般过程

在FPGA上实现YOLOv5 YOLO算法现在被工业界广泛的应用,虽说现在有很多的NPU供我们使用,但是我们为了自己去实现一个NPU所以在本文中去实现了一个可以在FPGA上运行的YOLOv5。 YOLOv5的开源代码链接为 https://github.com/ultralytics/yolov5 为了在FPGA中…...

verilog和system verilog常用数据类型以及常量汇总

int和unsigned 在 Verilog-2001 中,没有 int 和 unsigned 这样的数据类型。这些关键字是 SystemVerilog 的特性,而不是 Verilog-2001 的一部分。 Verilog-2001 的数据类型 在 Verilog-2001 中,支持的数据类型主要包括以下几种: …...

wordpress学习笔记

P1 P2 P3...

Rust 学习笔记:编程语言的相关概念

Rust 学习笔记:编程语言的相关概念 Rust 学习笔记:编程语言的相关概念动态类型 vs 静态类型动态类型 (Dynamically Typed)静态类型 (Statically Typed)对比示例 强类型 vs 弱类型强类型 (Strongly Typed)弱类型 (Weakly Typed)对比示例 编译型语言 vs 解…...

react nativeWebView跨页面通信

场景 react native项目里,有一些移动端的应用喜欢使用h5来开发,会出现需要跨tab和跨页面通信的场景,可以使用pubsub-js来实现通信。 实现思路 在react native 层实现pubsub的公共API,提供订阅消息、发布消息、取消订阅接口&…...

Python爬虫(3)HTML核心技巧:从零掌握class与id选择器,精准定位网页元素

目录 一、背景与意义‌二、class与id的基础概念与语法规则‌2.1 什么是class与id?‌2.2 核心区别总结 三、应用场景与实战案例‌3.1 场景1:CSS样式管理‌3.2 场景2:JavaScript交互‌3.3 场景3:SEO优化与语义化‌ 四、常见误区与最…...

BGE(BAAI General Embedding)模型详解

BGE(BAAI General Embedding)模型详解 BGE(BAAI General Embedding)是北京智源人工智能研究院(BAAI)推出的通用文本嵌入模型系列,旨在为各种自然语言处理任务提供高质量的向量表示。 一、BGE模…...