MCP 协议与工具接入

MCP(Model Context Protocol,模型上下文协议)是一套开放协议,用于规范 LLM 应用与外部工具之间的连接方式:应用侧实现 MCP 客户端(Client),工具侧实现 MCP 服务端(Server)。

它的直接收益是:”N 个应用配 M 个工具”所需的 N×M 段适配代码,收敛为 N+M 段。

具体来说:你想让 Agent 能查 GitHub、查数据库、发 Slack,得写三段适配代码(各一套认证、参数格式、错误处理);再写一个跑在 IDE 里的 Agent,又是三段,内容几乎一样;哪天工具那边换个实现,每个 Agent 里都得跟着改一遍——它们明明在做同一件事。

MCP 把这两个方向都解开了:换 Agent,工具侧不用动;换工具实现,应用侧不用动。两边甚至可以是不同的人、用不同的语言写的。

这篇讲这层协议长什么样:分了哪两层、有哪两种传输、一次连接要走哪三步,以及工具接进来之后怎么进到 Agent 的工具表里。

阅读更多

Function Calling介绍

Function Calling(函数调用)是模型的一项输出能力:模型不只输出自然语言,还能输出一段结构化的调用申请——“我要调用这个函数,参数是这些”。

这个名字起得有误导性,先说清楚最容易搞错的一点:

模型不执行任何函数。 它只是把”我想调什么”表达成一个 JSON 对象。真正去执行的永远是调用方——你的代码。

谁做 做什么
模型 决定要不要调、调哪个、参数填什么,输出成结构化数据
你的代码 接收这个申请,执行,把结果发回去

所以更准确的说法是”函数调用申请“。这个往返的完整形状(tool_use / tool_result 怎么配对)上一篇已经拆过了,这里只记住分工:模型负责开口,你负责动手。

阅读更多

上下文压缩与 Token 管理

Agent 的上下文管理分两层:便宜的那层先把大结果挪出上下文,贵的那层用一次 LLM 调用把历史压成摘要。

设计哲学四个字:能轻则轻。轻量手段能扛住的,绝不动用昂贵的全量摘要。

第 1 层:大结果存磁盘 第 2 层:全量摘要
信息损失 几乎为零 高
API 开销 零 高(多一次 LLM 调用)
定位 便宜的预防 贵但强的兜底

问题本身上一篇已经说清了:messages 只增不减、每轮整个发一遍,token 消耗是平方级增长(ReAct 与 Agent Loop §5)。而上下文窗口是个硬数字——200,000 就是 200,000,超了 API 直接拒绝。

所以不能等它涨到极限,得主动管。

阅读更多

Agent 记忆系统

Agent 的记忆分两层:工作记忆是上下文窗口,只活在当前会话里;长期记忆落在磁盘上,跨会话有效。

长期记忆有三种形态,区别在于谁写的:

形态 是什么 谁写的
项目指令文件 预先写好的项目知识和编码规范 人,写一次
会话持久化 每一轮对话的原始记录 系统,自动追加
自动记忆 从对话里提炼出的偏好、纠正、项目事实 Agent 自己,边用边攒

三种形态最后都变成一段文本,走同一条管线注入到请求里。它们不是三个独立的功能,是同一件事的三个来源。

上一篇讲的是上下文窗口装不下怎么办(上下文压缩与 Token 管理)。这一篇讲另一半:什么东西不该只活在窗口里。

阅读更多

RAG 检索增强生成

RAG(Retrieval-Augmented Generation,检索增强生成)是在生成之前先检索:拿用户的问题去知识库里捞出相关片段,把这些片段和问题一起拼成新的输入,再交给模型生成回答。

它结合了两件事:信息检索(Retrieval)负责从外部知识库找材料,文本生成(Generation)负责把材料组织成回答。

注意这里没有发生的事:没有训练,没有改模型的任何一个参数。 模型拿到的还是那一段文字,只是这段文字里多了它本来不知道的东西。

这是理解 RAG 的关键,也是它所有优点和缺点的来源。最后 §6 会回到这一点上:RAG 本质上是一次 prompt 重构。

阅读更多

向量数据库:FAISS 与 Pinecone

向量数据库是 RAG 流水线里的存储层:把 embedding 之后的向量存起来,支持按相似度找出最近的若干条。

它接在 RAG 的 Indexing 和 Retrieval 之间——文档切块、向量化之后存进来;用户提问时转成向量,从这里捞出最近的几个块。

有一个区分要先说,因为它解释了后面几乎所有行为差异:

Faiss 是「库」,不是「数据库」。

这不是抠字眼。库和数据库能做的事差得很远,而你踩的坑基本都在这个差别里。

阅读更多

Transformer 原理

GPT-3 175B 的配置表里有三个数字,第一次看很容易混在一起:

1
2
3
96 层
12288 隐藏维度
96 个注意力头

它们说的完全不是一回事:

  • 96 层:文字要连续加工 96 轮。
  • 96 个头:每一轮里,同时有 96 个「小组」从不同角度聚合信息。
  • 12288:每个 Token 用 12288 个数字表示。

这一篇就沿着这三个数字,把注意力机制从头捋一遍。

阅读更多

Transformer 原理 2

上一篇把 Q、K、V 和多头注意力拆开了,但那是局部。这一篇把整条链路走完——文字进去,下一个 Token 出来,中间每一步的形状变化都标清楚;最后再按 GPT-3 175B 的真实配置,把「1750 亿参数」这个数自己算一遍。

整套图用的是 GPT-3 175B 的示例尺寸:

1
2
3
4
5
96 个 Transformer 层
每个 Token 12288 维
每层 96 个注意力头
每个头 128 维
FFN 中间层 12288 × 4 = 49152 维
阅读更多

python基本语法

这份笔记整理的是 Python 的基础语法:三元表达式、and / or / not、列表推导式、lambda、tuple、yield 生成器、try / except、with ... as ...、类型标注、@dataclass、Literal。

这些都是和js不一样的,所以放在这里边讲一下。

阅读更多

python异步编程

asyncio 是 Python 3.4 版本引入的标准库,用于编写单线程并发代码,主要处理网络 I/O、文件 I/O 等。它使用 async / await 语法,让异步代码看起来像同步代码一样直观。

Python 异步编程主要就是:当一个任务正在等待网络、数据库、文件或定时器时,不让程序傻等,而是先去执行其他任务。 它解决的核心问题是:大量任务都要等待时,怎么更高效地利用这段等待时间。

阅读更多