资讯详情

资讯详情

【收藏级】万字拆解大模型应用三件套:RAG、MCP、Agent 从配置到跑通(小白程序员入门必备)

1. 先把 RAG、MCP、Agent 这三件事说清楚RAG、MCP、Agent 这三个词最近一年被反复提起但很多人第一次接触时容易把它们混成一锅粥。我用一句话帮你拆开RAG 解决的是“模型不知道你的私有知识”的问题MCP 解决的是“模型怎么标准化地调用外部工具和数据源”的问题Agent 解决的是“模型怎么自己规划、自己决策、自己把任务跑完”的问题。三者不是替代关系而是层层叠加——RAG 是给模型外挂一个知识库MCP 是给模型外挂一套标准插座Agent 则是让模型拿着这套插座自己去干活。这篇文章面向两类人一类是刚接触大模型应用、想搞明白这三个概念到底怎么落地的小白另一类是有编程基础、想直接拿到可复制配置骨架的程序员。我会从零开始带你搭一条能跑通的调用链路先用统一 Key 把模型调通再挂一个最小 RAG 检索然后接一个 MCP 工具最后用一个 Agent 循环把前面这些东西串起来。每一步都有可复制的配置和验证动作你跟着敲就能看到结果。先说清楚适合谁如果你只是想调个 API 问问题那看完第二节就够了如果你想做知识库问答重点看第三节的 RAG 部分如果你想让模型自己调工具、自己多步推理那 MCP 和 Agent 两节必须动手跑一遍。整条链路我用的是同一套 Key 和同一个入口避免你在多个平台之间来回切换。2. TaoToken 前置一个 Key 打通模型调用2.1 为什么先配 Key 再谈架构很多人一上来就研究 RAG 怎么分块、Agent 怎么规划结果连模型都调不通卡在鉴权上半天。我的建议是先把“能稳定调到一个模型”这件事做扎实再往上叠架构。TaoToken 在这里的角色是一个统一的模型调用入口你拿到一个 Key 之后对话模型、推理模型、编码模型都可以通过同一套接口访问省去你分别去不同平台注册、分别管理额度的麻烦。官网入口在这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后进控制台创建 Key。API 基础地址是 https://taotoken.net/api 注意这个地址不带任何查询参数直接作为 base_url 使用。2.2 拿到 Key 后的第一件事进控制台后找到 API Keys 页面创建一个新 Key复制下来存到环境变量里不要硬编码进代码。我习惯用.env文件管理# .env TAOTOKEN_API_KEYsk-你的key TAOTOKEN_BASE_URLhttps://taotoken.net/api然后在 Python 里这样读import os from openai import OpenAI client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL) ) resp client.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: 用一句话解释什么是RAG}] ) print(resp.choices[0].message.content)这段代码跑通说明你的 Key 和网络链路都没问题。如果报 401检查 Key 是否复制完整如果报连接超时检查 base_url 是否写成了带路径的形式。控制台地址https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API Keys 管理页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。2.3 模型选择建议刚开始跑通链路时用便宜的小模型就行比如 gpt-4o-mini 或者 claude-3-haiku 这类。等链路稳定了再换成推理能力更强的模型去跑 Agent 的多步规划。不要一上来就用最贵的模型调试调试阶段你会反复调用几十次成本差距很明显。3. 可复制配置RAG、MCP、Agent 三件套骨架3.1 RAG 最小可跑骨架RAG 的核心流程就三步把文档切块、把块向量化存起来、查询时检索最相似的块塞进 prompt。下面是一个不依赖重型框架的最小实现用内存做向量存储方便你先跑通再换生产方案。import numpy as np from openai import OpenAI client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL) ) def embed(texts): resp client.embeddings.create( modeltext-embedding-3-small, inputtexts ) return [d.embedding for d in resp.data] # 1. 准备知识块 docs [ TaoToken 提供统一的模型调用入口支持对话、推理、编码等多类模型。, MCP 是模型上下文协议用于标准化模型与外部工具的连接方式。, Agent 通过规划、记忆和工具调用完成多步任务。 ] # 2. 向量化并存储 doc_vecs np.array(embed(docs)) # 3. 检索 def retrieve(query, top_k2): q_vec np.array(embed([query])[0]) scores doc_vecs q_vec / ( np.linalg.norm(doc_vecs, axis1) * np.linalg.norm(q_vec) ) idx np.argsort(scores)[::-1][:top_k] return [docs[i] for i in idx] # 4. 生成 def rag_answer(query): ctx \n.join(retrieve(query)) prompt f根据以下资料回答问题\n{ctx}\n\n问题{query} resp client.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: prompt}] ) return resp.choices[0].message.content print(rag_answer(MCP 是做什么的))这段代码跑通后你会看到模型基于检索到的资料回答而不是靠自己的参数记忆。这就是 RAG 最朴素的价值让模型的回答有据可查。3.2 MCP 配置骨架MCP 的配置通常是一个 JSON 文件描述有哪些 Server、每个 Server 怎么启动。下面是一个settings.json骨架你可以直接改路径用{ mcpServers: { filesystem: { command: npx, args: [ -y, modelcontextprotocol/server-filesystem, /Users/yourname/workspace ] }, fetch: { command: npx, args: [-y, modelcontextprotocol/server-fetch] } } }这个配置的意思是启动两个 MCP Server一个负责读写本地文件系统一个负责抓取网页。模型通过 MCP Client 就能发现并调用这两个 Server 暴露的工具。注意command和args要按你本机的实际路径改Windows 下路径用双反斜杠或正斜杠。如果你用的是支持 TOML 配置的客户端等价写法是[mcp_servers.filesystem] command npx args [-y, modelcontextprotocol/server-filesystem, /Users/yourname/workspace] [mcp_servers.fetch] command npx args [-y, modelcontextprotocol/server-fetch]两种格式选一种就行关键是 Server 名称和启动命令要对得上。3.3 Agent 循环骨架Agent 的本质是一个循环模型思考、决定调哪个工具、执行工具、把结果喂回模型、继续思考直到模型认为任务完成。下面是一个极简的 ReAct 风格循环import json TOOLS { search_docs: lambda q: \n.join(retrieve(q)), calc: lambda expr: str(eval(expr)) } def agent_loop(user_input, max_steps5): messages [ {role: system, content: ( 你可以调用工具。可用工具search_docs(query), calc(expr)。 需要调用时输出 JSON{\tool\:\名称\,\arg\:\参数\}。 否则直接输出最终答案。 )}, {role: user, content: user_input} ] for step in range(max_steps): resp client.chat.completions.create( modelgpt-4o-mini, messagesmessages ) content resp.choices[0].message.content.strip() try: call json.loads(content) result TOOLS[call[tool]](call[arg]) messages.append({role: assistant, content: content}) messages.append({role: user, content: f工具返回{result}}) except (json.JSONDecodeError, KeyError): return content return 达到最大步数未完成 print(agent_loop(帮我查一下 MCP 是什么然后算一下 12*8))这个循环虽然简陋但把 Agent 的核心机制完整暴露出来了规划、工具调用、结果回灌、终止判断。你把这个跑通再去用 LangGraph 之类的框架就知道框架在帮你做什么了。4. 验证请求逐步确认每一层都通了4.1 验证模型调用先跑第二节那段最简单的对话请求。成功标志是终端打印出一句通顺的中文回答。如果这一步失败后面都不用继续先解决 Key 和网络问题。4.2 验证 RAG 检索单独测检索函数不调模型print(retrieve(Agent 怎么完成任务))你应该看到返回的块里包含“规划、记忆和工具调用”那条。如果返回的块不相关说明你的 embedding 或相似度计算有问题先别急着接生成。4.3 验证 MCP Server 启动在终端手动跑一次 Server 启动命令npx -y modelcontextprotocol/server-filesystem /Users/yourname/workspace如果卡住不动说明 Server 正常启动了在等客户端连接。如果报错通常是 Node 版本太低或包名写错。按 CtrlC 退出即可。4.4 验证 Agent 循环跑第三节的agent_loop输入一个需要两步才能完成的问题。成功标志是终端先输出工具调用再输出最终答案。如果模型一直不调工具直接回答说明你的 system prompt 约束不够强把工具格式再写明确一点。5. 本篇常见错排查5.1 401 鉴权失败最常见的原因是 Key 复制时带了空格或者环境变量没加载。在 Python 里打印os.getenv(TAOTOKEN_API_KEY)[:8]确认前几位是否正确。另外注意 base_url 不要写成https://taotoken.net/api/v1直接用https://taotoken.net/api。5.2 RAG 检索结果不相关三个可能一是分块太大一个块里塞了太多主题二是 embedding 模型和查询语言不匹配三是相似度算错了。先用短句、单一主题的块测试确认检索逻辑本身没问题再优化分块策略。5.3 MCP Server 连不上检查三件事Node 是否安装node -v、npx 是否可用、包名是否拼写正确。Windows 用户注意路径分隔符建议统一用正斜杠。如果 Server 需要访问网络确认本机网络策略没有拦截。5.4 Agent 陷入死循环给循环加最大步数限制是最基本的保护。另外在 system prompt 里明确“如果工具返回结果已经足够回答就直接输出答案不要再调用工具”。如果模型反复调同一个工具说明你的工具返回格式让它误以为没拿到结果检查返回内容是否为空。5.5 模型不按 JSON 格式输出小模型经常在 JSON 外面包一层解释文字。两个办法一是用支持结构化输出的接口参数二是在解析前先用正则把第一个{到最后一个}之间的内容抠出来再解析。生产环境建议用前者。6. 把链路跑通之后往哪走链路跑通只是起点。接下来你可以做三件事第一把内存向量库换成真正的向量数据库比如 Chroma 或 Qdrant支撑更大规模的文档第二把 MCP Server 从文件系统扩展到数据库、内部 API让模型能操作真实业务数据第三把 Agent 循环换成带记忆和反思的版本让它能从失败中调整策略。如果你主要在做长期编码或 Agent 类项目建议了解一下 Coding Plan它针对高频调用场景做了额度优化https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果只是想先验证模型效果可以直接在模型对话页面试https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入过程中遇到鉴权或参数问题接入文档在这里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。我自己的习惯是每接一个新工具先写一个最小验证脚本确认单点通了再往链路里加。这样出问题时你能快速定位是哪一层挂了而不是对着一整条链路猜。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →