ai理解笔记 1.LLMLLMLarge Language Model大语言模型我们目前的所有的大语言模型都是基于Transformer训练出来的大模型工作的过程本质上就是一个文字接龙游戏假设你向大模型提问“马克的视频怎么样“模型接收到这句话之后经过内部的一通运算后会预测下一个概率最高的词比如“特别”模型吐出特别这个词之后它并不会停下来它会把这个刚吐出来的这个词抓回来追加到你刚才的那个输入的后面然后它拿着这个新的输入再去预测下一个字就有点想堆排序一样不断的添加到输出的末尾完成后输出一个特殊的结束标识符整个回答到这里就算是彻底结束了所以这就是为什么大模型要一个词一个词的输出答案因为它就是这么运作的。2.Token用户提交问题给大模型之后大模型每次都会输出一个词但其实这是为了方便你理解而简化的一个链路现实情况是这样的大模型本质上是一个庞大的数学函数里面跑的全是矩阵运算它接收的是数字输出的也是数字压根就不认识人类写的文字所以呢在人类和大模型之间必须有一个中间人来做翻译这个中间人呢就叫做Tokenizer他负责的是编码和解码两件事情编码就是把文字变成数字解码反过来是把数字还原成文字对于用户提问马克的视频怎么样这句话会先交给Tokenizer处理它把这些文字通过编码转换成数字。Tokenizer的编码过程分为两步第一步先是切分把用户的提问分为一个个最小的片段这个就叫Token第二步映射由于模型只认数字Tokenizer就会把每一个Token对应到一个数字上去这个数字就叫做Token IDToken ID和Token是一对一绑定的Token是文字Token ID是数字这两个其实本质上是一个意思只不过是换了种表达方式而已。然后Tokenizer会把这串Token ID组成的列表送进模型就好了。模型在内部运算后最终吐出了一个Token ID这个时候Tokenizer就会把这个Token ID翻译回Token这个就是解码环节的工作了解码只有一步就是映射方向是跟编码反过来的把数字转换成文字因为模型每次只会给出一个Token所以解码环节是不需要切分的解码完成后我们就拿到了大模型输出的第一个Token。所以Token才是大模型处理文本的最基本单元大模型一个Token一个Token的接收输入然后再一个Token一个Token的输出结果对于刚才的那个例子它呢是被切分成了4个Token所以可能想当然的以为Token就是词但是词和Token并没有什么明确的一对一的关系可以把Token理解成模型自己学会的一套文本切分规则切出来的每一块就是它一次能够处理的最小单位。那么Token是如何分割的呢我了解这个我们需要先了解tokenizer这个东西到底是怎么被制造出来的tokenizer其实是被训练出来的tokenizer的训练不是大模型那种神经网络训练那么麻烦用的比较多是unigram和BPE来训练tokenizer我们以BPE为例来实现一个训练过程它的原理很简单大致说来就是从一堆文章里面找出哪些字经常在一起使用然后把这些经常在一起使用的字合起来作为一个Token让我们来看一个具体的例子首先我们要准备一个文章作为训练材料这个文章初始状态为一个个单字然后用这个训练材料做出两个产物一个是词表另外一个是合并规则训练过程所做的第一件事就是把所有的单字拿过来放到词表里面这些单词都是Token然后我们会给这里面的每一个字分配一个数字也就是Token ID所以其实Token ID没有实际意思就是一个唯一的数字而已所以其实一个个单字本身就可以作为tokenizer来使用了但是这样会很占用资源那我们可不可以把常见的两个或多个单字当作一个Token呢所以我们可以让算法扫描整段训练材料统计哪些字或者是哪些词喜欢待在一起比如智和能这两个字一共是在一起出现了5次于是算法执行了第一次合了这两个词并放到词表和合并规则中所以通过这样的方式我们就可以得到一个训练后的tokenizer了所以它的核心组件就是词表和合并规则。最后回到我们一开始的例子中tokenizer是如何将“马克的视频怎么样“切分为4个Token的呢首先把用户的问题拿过来先分成一个一个的单字再把之前训练好的合并规则拿过来看看有没有能够应用上的合并规则有对的上的就将这些单字合成新的Token总的来说tokenizer的训练就是先将每个字当作一个Token放到词表中而后通过多轮的合并经常一块的Token当作新的Token并给上Token ID放到词表然后将用户提出的问题通过词表找到对应的Token来进行切分最后通过Token对应的Token ID将用户提出的问题转换为大模型能看懂的数字矩阵就可以了。3.context对于上面结论来说大模型是通过Tokenizer编码和解码输出一个一个Token那他是怎么做到能够记住之前的聊天内容的呢答案就是我们每次给大模型发送消息的时候并不只会发我们的问题背后的程序会自动把你之前的整段对话历史找出来一起发过去有了用户问题和对话历史模型每次看到的就是完整的对话内容所以他才能够知道之前发生了些什么这就是content上下文起到的作用了它代表大模型每次处理任务时所接收到的信息总和用户问题和对话历史都是大模型所接收到的消息所以它们都是context的一部分除了它们之外context里面还有很多其他的内容比如大模型正在输出的每一个Token也会被追加进来所以context就是大模型每次处理任务时所接收到的信息总和从某种程度上也可以把它看成是大模型的一个临时记忆体4.context window那么这个context能有多大呢它能塞多少Token呢这个呢就引出了context window上下文窗口这个概念代表了context能够容纳的最大的Token数量目前主流的大小还是不少的5. RAG假设你想做一个智能客服这个智能客服可以回答各种关于你们公司产品的问题那应该怎么实现它呢首先这个客服的内部一定要有个大模型比如说是GPT-4、DeepSeek这种因为模型不知道你们公司的产品信息所以光有个模型是不够的你可以把这个手册的全部内容跟着用户问题一起扔给大模型但这其实不是一个很好的解决方案因为这个产品手册太长了即使模型的context window不被撑爆你的成本也无法控制那这该怎么办呢这就需要一个叫做RAG的技术了它的全称是retrieval augmented generation翻译过来就是检索增强生成RAG先从产品手册或者资料库里检索相关的内容再基于这些内容来生成答案也就是说它先检索再生成所以叫做检索增强生成RAG是目前最常用的AI问答方案之一很多企业内的知识助手智能客服用的就是这个技术。下面我们在介绍RAG的基本运行流程首先RAG会把文档切分为多个片段当用户提出问题后我们就用这个问题在所有的片段中寻找相关内容比如在一份上百页的产品手册中可能只有三个片段真正与用户的问题相关我们就把这三个片段单独挑出来把它们和用户的问题一起发给大模型这样模型就只会感知3个相关的片段而不是整个文档。接下来我把整个RAG的流程具体来拆分下RAG的整体流程包含两个部分一个是数据准备部分这个发生在用户提问前我们要在这一部分里把相关的文档都给准备好并完成相应的预处理它一共是包含分片和索引两个环节另外一个是回答部分发生在用户提问之后在用户问完问题之后我们便会触发回答问题的各个环节分别是召回、重排和生成。下面我们一个个介绍这些环节分片就是把文档切分成多个片段分片的方式有很多种我们可以按照字数来分比如说1,000个字一个片段按照段落来分比如说是一个段落一个片段或者是按照章节分等等但不管怎么做我们最后都需要把一篇文档切分为多份切好后这个环节就结束了。然后我们就要进入到下一个环节索引了索引就是通过embedding将每一个片段文本转换为向量然后再将片段文本和对应向量都存储在向量数据库的一个过程具体解释下就是向量是数学里面的一个概念从概念上来讲它代表一个有大小有方向的量在通常情况下我们可以用一个数组来表示它每个向量都有维度维度的大小就等于数字中数字的个数我们在RAG里面用到的向量维度通常情况下都会比较大可能是几百甚至几千一般来说维度越大每个向量所包含的信息也就会越丰富用这些向量做各种工作的可靠性也就越强对于前三维的向量来说我们可以画坐标轴来演示对于embedding就是把文本转换为向量的一个过程比如下图我们通过embedding将一些文本转化为了向量可以明显的看到对于词义相近的文本来说它们也彼此接近这就是embedding的目的这样就可以将用户提出的问题先转化为向量后看相似度把与这个问题相关的文本也找出来最后我们就可以把这些相关文本以及用户的问题一起扔给大模型这样就完成索引的功能了。接下来我们来看下向量数据库的概念向量数据库就是用来存储和查询向量的数据库它为存储向量做了很多优化并且还提供了计算向量相似度等相关的函数方便我们使用向量embedding后的向量就可以放在向量数据库里面方便后续查询比如我们还是以马克喜欢吃水果这句话为例在我们给这句话做了embedding之后就得到了一个向量然后我们需要把这个向量存入到向量数据库中不过注意我们要存的不仅有向量还有原始的文本所以原始文本也要发给向量数据库因为只有这样我们才能够在通过向量相似度查询出相似的向量之后把对应的原始文本也抽取出来发给他模型让他处理我们最终需要的还是原始的文本向量只是一个中间结果所以一般的向量数据库表格里面至少都会有原始文本和向量两列内容本质跟我们平常所用的数据库差不多上面的分片和索引都是用户提问之前提前准备的步骤下面我们就来看看用户提问之后发生了什么首先是召回召回就是搜索与用户问题相关片段的过程这个环节从用户问题开始首先用户的问题会发给embedding模型embedding模型会将它转化为向量然后我们把它发送给向量数据库让他查询与用户问题最为相关的10个片段内容当然也可以是15条这些是不固定的反正返回一批与用户问题最相似的一批片段就行了那向量数据库是怎么知道哪些片段与用户问题最相关的呢这就要计算向量相似度了我们需要计算每个片段与用户问题的向量相似度就是把用户问题向量和片段向量分别带入到一个相似度计算公式中得出向量相似度这个计算公式的第一个参数永远是用户问题所对应的向量第二个参数则是每个片段的向量我们需要按照这个方法把所有的片段都计算完毕后将结果排序后取前10个最大的就好了。这个公式是怎么算出来的呢答案是有很多种目前比较流行的方案是包括余弦相似度、欧式距离和点积大概就是余弦相似度为算两个向量之间夹角的cos值来判断夹角的大小夹角越小相似度就越高欧式距离主要是在计算两个向量之间的距离也就是这段白线的距离距离越小相似度越高点积呢是一种通过代数方式衡量两个向量相似度的方法它不仅要考虑两个向量之间的方向关系也要考虑它们的长度对于下图就是我们首先从a向b引入一条垂线然后a和b的点积就是b点从0开始到与a点垂直的距离和b点整个点距离的乘积乘积越大就代表相似度越高。通过上面的召回介绍我们了解了过程和最后得到了10个与用户问题最相似的片段接下来第二步就是重排重排是从召回的这10份里面再挑3份与用户问题最相似的作为重排的结果但是你可能会想我直接在召回阶段挑前3个不就好了答案是我们在召回和重排阶段用的文本相似度计算逻辑不一样召回阶段的方法特点是成本低、耗时短和准确率低所以适合做初步的筛选目的是短时间内把上千条片段的相似度数值都计算出来并挑出10个最高的而重排的使用的是cross-encoder可以做到提高准确率举个例子就是召回实现了简历筛选从从成千上万份简历里面挑出10个看起来最优秀的进入面试重排就是对这10个进行面试来选出3个最合适的。最后一个阶段就是生成了也就是生成答案现在我们有了用户问题也有与用户问题相关的三个片段我们就可以把这两部分一起发给大模型让它根据片段内容来回答用户问题到此整个流程就结束了。最后我们来整体走一遍流程来加深印象整个流程分为两个部分一个是准备部分它发生在提问前包括分片和索引两个环节一个是回答部分发生在提问后包括召回、重排和生成三个环节由于整个流程分为两个部分所以我们的整体流程也会有两个首先看提问前的准备部分首先我们把相关的资料做个分片然后把所有的片段都扔给embedding模型让他给每个片段都产出一个对应的向量最后我们把向量存入到向量数据库中到这里提问前的准备流程就结束了这就相当于我们的知识库构建已经完毕了等用户来使用了再来看看用户提问之后发生了什么首先用户的问题会给到embedding模型embedding模型会把用户的问题转换为一个向量然后我们把这个向量传给向量数据库让它给我们找到10个与用户问题最相近的片段找到之后我们再把这10个片段送给cross-encoder模型让它做个重排从10个里面再筛选出3个相关程度最高的片段然后我们把这三个与用户问题相关程度最高的片段外加用户的问题一起发给大模型大模型就可以产出最终答案了。使用Python构建RAG系统 —— 用代码还原 RAG系统的每个细节_哔哩哔哩_bilibili马克佬的视频还有演示完整的使用Python来实现RAG系统的视频我看后还是觉得很有帮助的。6. promptPrompt提示词就是我们对大模型输入的指令接到了这个输入之后大模型才会开始运转所以如果输入的提示词过于模糊比如“帮我写一首诗“这时大模型可能会输出古诗、现代诗和打油诗等等所以prompt怎么写直接决定了大模型的输出质量一个好的prompt应该是清晰的那它生成的内容也就更符合你的预期这就是为什么有个专门的领域叫做prompt engineering也就是提示词工程说白了就是研究怎么把话说清楚让大模型更精准地理解你的意图。当然这个领域虽然曾经比较火但现在还在提它的人其实寥寥无几一方面是因为门槛太低本质上就是把话说清楚另一方面是大模型的能力越来越强了即使提示词含糊不清大模型也能大致猜出你的意图来这种情况下也就不需要在提示词上花太多功夫了。我们在明白了prompt的基本概念后有个问题有些时候我们不仅要告诉大模型他要处理的具体任务还要告诉他人设和做事规则也就是告诉大模型他是谁他应该按照什么规则做事所以就引出了两种不同的prompt说明具体任务的是user prompt用户提示词它是用户自己输入的说明人设和做事规则的是system prompt系统提示词它是开发者在后台配置的。相当与你可以先通过给大模型设置它要扮演的角色就是system prompt而后用户输入的内容就是user prompt这时大模型就回先通过设置的角色要求来回答用户。7. Tool我们先来谈一下大模型的一个弱点它无法感知外界环境假设你问大模型今天的天气怎么样它可能会说“抱歉我无法获取实时天气信息我的知识库截止到某年某月无法提供当前的天气数据“因为大模型只是个文字接龙游戏它的能力是根据训练数据来预测下一个词但它真的没有办法去查天气预报网站拿到实时的天气数据这就需要tool了tool翻译成中文就是工具其实就是函数或者用计算机的解释就是方法就是你给它输入它就给你输出比如有一个天气查询工具它的输入可能会包含两个参数分别是城市和日期传入这个函数后内部走完它的代码或调用比如说它可能会去调用气象局的接口但不管怎么样最后它都会给你一个输出告诉你对应的天气信息有了它大模型就可以回答天气相关的问题了。下面完整说下整个流程用户的问题会首先发给平台平台会把用户的问题转发给大模型不过发给大模型的可不止有用户问题还有目前可用的工具列表比如说是天气查询工具、计算器工具等等大模型收到这个问题之后它会自己分析用户想知道天气而大模型没有实时的天气数据但是这里面有一个天气查询工具可以用那大模型就调用这个工具注意大模型无法自己调用工具它唯一的能力就是输出文本所以如果他想调用某个工具的话他就只能借助平台的力量所以此时大模型会生成一个调用天气查询工具的Json指令而后会把这个Json发到平台那边去平台接收到这个指令之后就会真的调用这个工具其实也就是调用了工具背后所对应的一个函数调用结束之后平台会拿到对应的天气信息的Json在平台拿到了工具的调用结果之后他就会把这个信息返回给大模型大模型拿到这个结果后会把它整理成一句人话输出给平台平台会继而把这句话转发给用户这样用户就可以看到结果了。以前可能会觉得调用工具是大模型来调用的但其实大模型只有输出文本的能力最终还是要用平台来完成调用所以最后总结一下tool的本质就是给大模型提供一套它可以调用的外部能力来让大模型能够感知和影响外部环境。8. MCP对于上面讲的使用工具的全流程的里面有个工程上的大问题第一平台要把工具列表传给模型第二还要能调用工具要做到这些我们首先就得把工具接入到平台里面这样平台才知道可用工具列表以及每个工具的用途、参数和调用方法等等。那问题来了这套接入的规范每个平台都不一样的如果你用的是Chegg PPT你得按照Openai的规范接入工具写一套接入代码如果你用的是cloud你得按照Anthropic的规范再写一套接入代码如果你用的是Gemini你得按照Google的规范再写一套因为每个平台的技术标准都不一样所以同一个工具你要写3遍那能不能搞一个统一的标准让所有的平台都遵循这个标准来呢这样工具的开发者只需要写一次代码就可以在所有的平台上使用了这个就是MCP的由来了。MCP的全称是叫做model context Protool翻译过来是叫做模型上下文协议有了MCP之后工具的开发者只需要按照MCP的规范开发一次工具这个工具就可以被所有支持MCP的平台使用了这就像是所有的手机都用type c接口一样有了统一的标准大家都会方便很多。下面我们来一起学习MCP的原理我们要学习MCP的原理我们首先需要MCP Host它本质上就是一个支持MCP协议的软件我们以vs code的Cline为例来学习MCP9. agent通过上面我们知道大模型能借助工具感知外部世界而工具又可以使用MCP这种方式来统一介入那么我们来尝试让大模型解决一个更有难度的问题“今天我这里的天气怎么样如果下雨的话帮我查一下附近有没有卖雨伞的店”假设我们有定位询用户所在地区的经纬度、天气根据经纬度查询天气信息和店铺通过经纬度来查询附近的店铺这三个工具也就是tool如下图就是完整的流程了可以看到这已经不再是简单的工具链流程了在这个步骤中大模型需要一步一步思考当前的情况并决定下一步该做什么从某种程度上来说大模型已经有了一定的自主规划能力我们称这种能够自主规划和自主调用工具直至完成用户任务的系统为agent。10. agent skillagent但在实际的高频使用中你马上就会遇到一个新的痛点举个例子假设你希望大模型成为你的出门小助手每次出门前帮你扫一眼天气并提醒你带东西你肯定有一套自己的出门习惯比如下雨带伞、光照强戴帽子和空气差戴口罩等等你又不想回答太繁琐希望必须按照特定的格式来输出比如先来一句总结然后再列出带原因的物品清单。那在没有额外设定的情况下假定你只问一句我马上要出门该带些什么呢agent虽然会查天气但他不知道你的这些私人规则和格式要求大概率会给你一些不想看到的内容他不能按照你的出门习惯来判断要带的东西最终的输出格式也无法满足你的要求为了拿到让你满意的结果。你每次提问的时候就不得不带上一大串尾巴把你的所有的规则所有的格式要求甚至事例全部都复制粘贴到prompt里面发给他那这时就该agent skill登场了agent skill本质上就是你提前写好给agent的一份说明文档如下图就是这个agent skill它本质上就是一个Markdown文档它的整体结构可以分成两部分1-4行是叫做源数据层它相当于这本说明文档的封面告诉agent这个技能叫什么是负责做什么事情的源数据层至少要有两个为name和description的属性name代表这个agent skill的名字比如我们的agent skill名称是叫做go-out-checklist剩下的description就是描述。然后剩下就叫做指令层把你需要的过程给agent说明白就行了对于如何使用这个skill呢我们按cloud code举例我们首先需要找到用户目录下面的./cloud/skills文件夹第二步是在这个文件夹下创建一个跟你源数据层name名称一摸一样的文件夹用于agent可以识别到这个文件夹下是一个skill文件而后在这个name名称的文件夹下创建一个SKILL.md的文件并把我们上面的skill内容复制进去注意这里的名称必须是大写不然无法识别如果已经通过MCP获取了对应工具的话最后使用cloud code输入对应的内容就可以实现我们想要agent输出的格式了。11.总结LLM代表大模型它是所有AI技术的核心。Token是大模型处理数据的最基本单元。context是大模型每次处理任务时接收到的信息总和可以看作是大模型的临时记忆体里面装着历史记录、系统规则以及当前的输入等等这些数据的基本单位都是Token。而context window代表大模型context最多能够存储的Token量。prompt是用户或系统当前给大模型下达的具体指令或者是问题它分为user prompts和system prompts两大类user prompts代表用户给模型的输入system prompts则是开发者在后台配置的大模型人设和做事规则。Tool是大模型用来感知和影响外部环境的函数。MCP是统一了工具接入格式的标准协议有了MCP之后开发者就只需要按照一个标准来做工具就可以了不需要为每个大模型厂商都做一遍。agent是能自主规划自主调用工具持续运作直至解决用户问题的一个程序。agent skill是给agent看的一个说明文档主要就是用来规定做事步骤和规则的。参考文献【1】从 LLM 到 Agent Skill一期视频带你打通底层逻辑_哔哩哔哩_bilibili【2】RAG 工作机制详解——一个高质量知识库背后的技术全流程_哔哩哔哩_bilibili【3】使用Python构建RAG系统 —— 用代码还原 RAG系统的每个细节_哔哩哔哩_bilibili【4】Token 到底是什么—— 揭秘大模型背后的“文字压缩术”_哔哩哔哩_bilibili