AI专栏

MCP

RAG的局限性

对于AI来说,RAG仅仅是外部知识库,AI只起到一个总结效果。而总结的效果取决于向量相似度匹配,可能遗漏关键信息。

direction: right
结构化数据 -> 文本块
非结构化数据 -> 文本块

文本块 -> 向量数据库 -> 检索文本块 -> 生成最终响应
  • 生成内容不完整:RAG处理的是文本的切片,因此无法看到整篇文档信息。
  • RAG无法判断需要多少切片才能解决问题。
  • 多轮检索能力弱。

MCP基础

Function Calling

Coze的Agent就是基于Function Calling思路封装的。

不过Function Calling成本比较高,需要模型经过专门训练微调才能稳定支持。

这导致有些模型不支持某些插件的调用(例如Trae只有选择Sonnet、GPT等模型才可以处理图片)。

另外,Function Calling不是一项标准,许多模型的实现细节不一样。

Model Context Protocol

MCP是一项标准协议,简单来说就是通用的接口,使AI-外部工具/数据源交互标准化、可复用。

Claude Desktop、Cursor这样的工具在内部实现MCP Client,这个Client通过MCP协议与MCP Server(由服务提供公司自己开发,实现访问数据、浏览器、本地文件等功能,最终通过MCP返回标准格式)交互,最终在MCP Host上展示。

MCP 传输方式

STDIO,本地环境
SSE,并发量不高,单向通信
Streamable HTTP,高并发,需要维护长连接

指标 Function Calling Model Context Portocol
协议 私有协议 开放协议
场景 单次函数调用 多工具协同 + 数据交互
接入方式 函数直接接入 需要MCP Server + MCP Client
耦合度 工具与模型绑定 工具开发与Agent开发解耦
调用方式 API Stdio/SSE

MCP五大能力

  • Tools:提供功能,使LLM能与外部系统交互
  • Resources:提供内容和数据,为LLM和Client提供上下文
  • Prompts:提供Prompt模板,引导LLM交互
  • Sampling:Server借助Client向LLM发起完成请求,实现复杂功能。
  • Roots:Client为Server提供一些资源地址,使Server知道去哪里获取资源。

MCP Server

基本功能

  • 文件、数据访问。如File System MCP Server
  • Web自动化:操作浏览器,如Puppeteer MCP Server
  • 三方工具集成。如高德地图MCP Server
    MCP Server集合(官方)
    MCP.so
    MCP Market
    ​Cherry Stdio可以自动安装MCP Server,但是Windsurf就需要手动安装。

场景:MCP + 数据库,更好的RAG

可以通过MCP使LLM接入数据库,无须手动调用sql接口。

{
"mcpServers": {
"mongodb": {
"command": "npx",
"args": {
"mcp-mongo-server",
"mongodb://site:port/your_table?authSource=admin"
}
}
}
}
{
"mcpServers": {
"mongodb": {
"command": "npx",
// 自动安装
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"~/Downloads"
]
}
}
}

通过这种方式,可以比简单地将数据库内容放到知识库中实现更好的效果。

缺点

MCP会真的调用sql,如果让AI检索大量数据,会消耗大量token,阻塞MCP Client。

许多MCP Client依靠大量系统提示词来实现与MCP的通信,使用MCP,token消耗一定增加。

向量数据库

向量数据库专门存储和查询向量,核心就是相似度查询。
向量数据的特点是单条数据维度高、存储空间占用大。
向量检索只能做到相似查找,返回前K条数据。

chunk: {
"{text0: content...}\n{text1: content...}"
}
vector: {
"{\n text0: content...\n vector:[0.23xx, 0.24xx]\n }\n {\n text1: content...\nvector:[0.25xx, 0.26xx]\n}"
}
知识库文本 -> chunk: split
chunk -> vector: Embedding
chunk -> 向量模型
vector -> 向量数据库: insert

向量模型 -> vector
向量模型 -> 向量数据库
向量模型 -> LLM: Question

用户 -> 向量模型: Question
LLM -> 用户: Answer
  1. 文本向量化(分词、分chunk,通过向量模型转化为向量)。
  2. 将向量化数据和原始文本一起存储到向量数据库。
  3. 向量模型检索向量数据库,并传参给LLM回复。

为什么分块

首先大模型输入有限制,其次文本分块,只检索关键文本,可以减少token消耗。

建立向量索引

想要加速向量搜索速度就需要向量索引。

FLAT索引

将向量以列表形式存储,不压缩和聚类。简单但是效率低。

倒排文件索引(无聚类)

IVF, Inverted File Index

  • 单词词典:以文档文本单词作为主键(也就是说是唯一的),每个单词关联一个或多个文档ID。
  • 倒排列表:记录每个单词存储在哪些文档中,以及单词在文档中的位置。

IVF聚类索引

IVF将原始数据划分为多个簇,为每个簇建立倒排索引,从而加快检索效率。
IVF_FLAT:聚类倒排+Flat结构,适合高精度,性能不高。
PQ, Produce Quantizer,乘积量化,通过向量分割与量化
IVF_PQ:通过乘积量化压缩向量,加速搜索

KD树索引

二叉树结构,存储多维向量数据。按照层级组织数据从而实现高效的向量搜索。

Ball树索引

非平衡树结构,类似于球形。

HNSW索引

Hierarchical Navigable Small World
图结构,通过分层图加速效率。在每一层将向量连接成图,查询时从高层图到低层图,直到找到最近邻。
HNSW在召回率和索引性能之间有较好的平衡。

Locality Sensitive Hashing

LSH将相似向量映射到同一个桶来加速检索。适合高维稀疏向量数据。

向量库

向量库存储静态数据。向量库只存储Embeddeing向量嵌入,不存储Embedding关联对象(因此不需要修改)。

  • FAISS
  • HNSWLib
  • ANNOY

相似度

欧几里得距离

欧式算法通过距离来匹配相似度
欧式算法可以反映向量绝对距离,适合需要量化数据的场景。
例如推荐系统,需要的不仅仅是历史行为,还要历史数据的数值。

二维欧式距离
d=(x2x1)2+(y2y1)2d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}

三维
d=(x2x1)2+(y2y1)2+(z2z1)2d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2}

依此类推…

余弦相似度

余弦相似度通过角度匹配相似度
很明显,余弦相似度只关注角度,适合高维相似度检索,如语义搜索、文档分类
余弦相似度范围从-1到1,1表示完全相似0度、0表示垂直90度、-1表示完全相反180度

向量点积除以向量模长
cos(θ)=ABABcos(\theta) = \frac{A \cdot B} {|\vec A| \cdot |\vec B|}

高维算法
A=(a1,a2,...,an);B=(b1,b2,...,bn)A = (a_1, a_2, ..., a_n); B = (b_1, b_2, ..., b_n)

AB=(a1b1,a2b2,...,anbn)A \cdot B = (a_1b_1, a_2b_2, ..., a_nb_n)

AB=a12+...+an2b12+...+bn2|\vec A| \cdot |\vec B| = \sqrt{a_1^2 + ... + a_n^2} \cdot \sqrt{b_1^2 + ... + b_n^2}

点积相似度(投影)

不除以模长,与角度无关;对长度敏感,两个向量长度不同,方向相同,点积会受影响。
点积正数,两个向量正相关;点积为0,无线性相关;点积负数,两个向量负相关
AB=(a1b1,a2b2,...,anbn)A \cdot B = (a_1b_1, a_2b_2, ..., a_nb_n)

高并发下大模型性能

  • 首包延迟:用户首次接收到模型响应的时间,对于一些思考模型来说,可能会很长。
  • 模型并发能力:有的大模型/平台有并发数限制。
  • 输出超限:要计算token,看模型是否一次返回的内容过多,超出限制导致无效调用。[1]
  • 兜底返回:调用模型有时时间太长,不确定模型有没有响应,最好设置一个超时重试时间。
  • 多线程:使用线程池来多线程批量请求。
    批量请求是指凑齐token为512,确保批次张量维度一致。

隐私计算

SecretFlow

举个例子,A、B、C三个人想要知道他们的平均工资,但是又不希望透露隐私,他们可以这么做:

过程加密

MPC

Multi-Party Computation
MPC,多方安全计算:使用MPC三方分别加密自己的数据,其他人不能解密

  • 秘密分享法(Secret Sharing):把数据切片分发。
  • 加密协议法:用加密算法让多方协作计算。
  • 布尔电路/算数电路法:把整个计算过程拆成很多小步骤,每一步都用安全协议保护。

HE

Homomorphic Encryption
HE,同态加密:使用加密数据运算,但是仍然能得出相同的加密后的结果

普通加密只能保密,不能计算,但是同态加密专门设计成可以计算的加密算法,保证加密后运算的结果密文,解密后和明文计算结果一致。

  • 部分同态加密,只能加或者乘,如Paillier
  • 全同态加密,同时支持加和乘,如Gentry方案、CKKS

TEE

Trusted Execution Environment
TEE,可信计算环境:计算过程放在一个可信的小黑盒里,不让外面看见

TEE会在OS内部抽象出一个小黑盒,黑盒以外的部分,OS无法窥视黑盒的内容。
数据在TEE之外是加密的,在TEE之内才会解密运算。

如何保证计算结果正确

Remote Attestation
RA,远程认证:TEE启动会生成一份报告,包括TEE身份指纹、当前程序Hash、运行环境信息。根据Hash可以验证是不是同一份程序。

结果加密

DP

Differential Privacy
DP,差分隐私:在数据里随机加入噪音,让人类无法识别。在数据量庞大的时候,整体的噪音量是很小的,不影响计算结果。

FL

Federated Learning
FL,多方想要统计一份数据,如果是把多方数据汇合到一处进行统计,那容易泄露隐私。
因此联邦学习是将初始模型分发给各方,各方在本地统计、训练,最终将训练成果反馈给总部。


  1. 问小白就有这个问题 ↩︎