ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

图解AI核心技术:大模型、RAG、智能体、MCP,收藏这篇就够了!

图解AI核心技术:大模型、RAG、智能体、MCP,收藏这篇就够了! 1. 大模型、RAG、智能体、MCP 到底各管什么一张知识地图先建立起来刚接触 AI 技术栈的开发者最容易卡在概念混战里大模型、RAG、智能体、MCP 这四个词天天见但真让你说清楚它们各自解决什么问题、谁依赖谁很多人会含糊。我试过把官方文档翻一遍再动手发现光看定义没用必须把它们放进同一条数据流里看关系立刻就清楚了。先给一个最直白的类比。大模型是「大脑」负责理解和生成RAG 是「开卷考试时递进来的参考书」让大脑回答前先查资料智能体是「会自己拆任务、调工具的执行者」它决定什么时候翻书、什么时候算数、什么时候问别人MCP 则是「统一的插座标准」让智能体能即插即用地接上各种外部工具和数据源而不用每接一个工具就重写一遍胶水代码。这四个东西不是并列关系而是层层叠加的协作关系。大模型提供基础推理能力RAG 解决大模型知识过时和幻觉的问题智能体在 RAG 之上加入规划与工具调用MCP 把工具接入这件事标准化。你完全可以只用大模型也可以只加 RAG但一旦要做能自主完成复杂任务的系统四者就会自然串起来。对刚入门的开发者来说最实用的认知框架是先问「这个任务需要模型知道它训练时不知道的东西吗」需要就上 RAG再问「这个任务需要多步决策和调用外部能力吗」需要就上智能体最后问「工具会越来越多、要跨模型跨平台复用吗」需要就上 MCP。按这个顺序判断你不会一上来就堆一堆用不上的组件。下面这张对照表是我自己整理后一直在用的建议先收藏后面每一节都会围绕它展开。概念解决的核心问题关键输入关键输出典型依赖大模型理解与生成自然语言、代码Prompt、上下文文本/结构化结果算力、推理服务RAG知识时效性与事实准确性用户问题、向量库带依据的回答大模型、向量库、嵌入模型智能体多步任务规划与执行目标、工具列表完成的任务结果大模型、工具、记忆MCP工具接入的标准化工具定义、资源可被模型发现的工具智能体、MCP 服务端理解这张表之后你会发现很多「AI 应用」其实就是这四个模块的不同组合。客服机器人通常是「大模型 RAG」自动化办公助手是「大模型 智能体 MCP」而一个能查数据库、能发邮件、能调 API 的复杂系统四个全用上。这一节的目标不是让你立刻写代码而是先在心里建好地图。地图建好了后面配置和验证才不会迷路。接下来我会先讲怎么准备一个统一的模型接入入口因为无论你练 RAG 还是智能体都得先有一个能稳定调用大模型的通道否则后面每一步都会被环境问题打断。2. 用 TaoToken 打通大模型调用入口RAG 与智能体的统一前置不管你后面要练 RAG 还是智能体第一步都是让代码能稳定调到大模型。很多新手卡在这一步不同厂商的接口格式不一样换一个模型就要改一遍代码练 RAG 时用 A 模型练智能体时想换 B 模型结果配置全乱。我的做法是先接一个兼容 OpenAI 接口规范的统一入口把模型调用这件事固定下来后面所有实验都复用同一套配置。TaoToken 就是这样一个入口官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。它的接口遵循 OpenAI 兼容格式意味着你之前写过的 openai 库调用代码基本不用改只换 base_url 和 key 就能跑。这对练 RAG 和智能体特别友好因为这两个方向都会频繁切换模型做对比。先说清楚它适合谁如果你是想系统学习 AI 技术栈的开发者需要一个稳定的模型调用通道来跑通 RAG、智能体、MCP 的完整链路那它正好合适。如果你只是偶尔问几个问题直接用网页版模型对话就够了不必折腾 API。但只要你打算写代码、做实验、搭 demo统一入口就是刚需。准备工作分三步。第一步注册并登录后进入控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在里面找到 API Keys 管理页面地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 创建一个新的 Key 并复制保存。注意 Key 只在创建时完整显示一次丢了就得重建。第二步确认你要用的模型 ID。不同任务适合不同模型练 RAG 时通常选上下文窗口大、指令遵循好的模型练智能体时更看重工具调用能力。你可以在模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 里先手动试几个模型感受一下差异再决定代码里默认用哪个。第三步把配置写进环境变量不要硬编码在代码里。这是很多人踩过的坑Key 写死在脚本里一提交到仓库就泄露。正确做法是用 .env 文件或系统环境变量管理。下面是一个 .env 示例路径放在项目根目录即可。# .env 文件放在项目根目录 TAOTOKEN_API_KEYsk-你的实际Key TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODELgpt-4o-mini如果你用的是 Python可以这样读取并初始化客户端。注意 base_url 一定要带上 /api 后缀这是最常见的配置错误之一。import os from openai import OpenAI from dotenv import load_dotenv load_dotenv() client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL), ) resp client.chat.completions.create( modelos.getenv(TAOTOKEN_MODEL), messages[{role: user, content: 用一句话解释什么是 RAG}], ) print(resp.choices[0].message.content)如果你更习惯用 Node.js配置逻辑完全一样只是库不同。下面是对应片段。// 需要先 npm install openai dotenv import OpenAI from openai; import dotenv/config; const client new OpenAI({ apiKey: process.env.TAOTOKEN_API_KEY, baseURL: process.env.TAOTOKEN_BASE_URL, }); const resp await client.chat.completions.create({ model: process.env.TAOTOKEN_MODEL, messages: [{ role: user, content: 用一句话解释什么是 MCP }], }); console.log(resp.choices[0].message.content);这里要强调一个关键点无论你后面用 LangChain、LlamaIndex 还是自己手写 RAG底层模型调用都可以指向同一个 base_url。这样你在对比不同模型对 RAG 效果的影响时只需要改一个环境变量不用动业务代码。智能体框架也是同理工具调用最终还是要落到模型接口上。还有一个容易被忽略的准备确认你的网络环境能正常访问该 API 地址。如果你在公司内网或受限环境先确认出网策略避免后面调试时把网络问题误判成代码问题。配置完成后先别急着搭 RAG下一节我会给你一份可直接复制的完整配置把大模型、RAG、智能体、MCP 四块的最小示例串起来让你一次跑通整条链路。3. 可复制的最小配置把大模型、RAG、智能体、MCP 串成一条链路这一节是整篇的核心我会给你一份可以直接复制运行的最小配置把四个概念串起来。不要被「四个」吓到最小示例里每个模块只保留最必要的部分目的是让你看到它们如何协作而不是做一个生产级系统。跑通之后你再按需替换成真实组件。先看整体结构。我们做一个「能查本地知识库并调用工具」的小助手用户提问后智能体先判断是否需要查资料需要就通过 RAG 检索本地文档检索结果连同问题一起交给大模型生成回答如果问题需要计算或查外部数据智能体通过 MCP 调用对应工具。整个流程用一份配置文件描述代码只负责执行。先建项目结构保持简单ai-stack-demo/ ├── .env ├── config.toml ├── main.py ├── rag_store/ │ └── docs.json └── mcp_servers/ └── calc_server.py配置文件用 TOML把模型、RAG、智能体、MCP 四块参数集中管理。这样你调参时只改一个文件不用满项目找。# config.toml [model] base_url https://taotoken.net/api model_id gpt-4o-mini temperature 0.3 max_tokens 1024 [rag] enabled true store_path rag_store/docs.json top_k 3 chunk_size 300 [agent] max_steps 5 enable_reflection true [mcp] enabled true servers [mcp_servers/calc_server.py]RAG 部分最小实现不需要向量数据库先用一个 JSON 文件存文档片段用关键词匹配做检索目的是让你看清「检索 → 拼接上下文 → 生成」这条链路。真实项目里把这里的检索函数换成向量库查询即可。# rag.py import json def load_docs(path): with open(path, r, encodingutf-8) as f: return json.load(f) def retrieve(query, docs, top_k3): # 最小实现按关键词命中数排序真实项目替换为向量检索 scored [] for d in docs: score sum(1 for kw in query if kw in d[text]) scored.append((score, d)) scored.sort(keylambda x: x[0], reverseTrue) return [d for _, d in scored[:top_k]] def build_context(query, docs): hits retrieve(query, docs) return \n.join(f[{i1}] {h[text]} for i, h in enumerate(hits))智能体部分最小实现是一个循环让模型决定下一步是「直接回答」还是「调用工具」最多循环 max_steps 次。这里用 JSON 格式约定模型的输出方便解析。# agent.py import json def run_agent(client, model, question, context, tools, max_steps5): messages [ {role: system, content: 你可以调用工具。需要工具时输出 JSON{\tool\:\名称\,\args\:{...}}否则直接回答。}, {role: user, content: f参考资料\n{context}\n\n问题{question}}, ] for _ in range(max_steps): resp client.chat.completions.create(modelmodel, messagesmessages) content resp.choices[0].message.content try: action json.loads(content) if tool in action: result tools[action[tool]](**action.get(args, {})) messages.append({role: assistant, content: content}) messages.append({role: user, content: f工具返回{result}}) continue except json.JSONDecodeError: pass return content return 达到最大步数未完成MCP 部分最小实现用一个本地 Python 函数模拟工具服务端真实项目里换成标准 MCP server。这里关键是让工具「可被发现」智能体通过配置知道有哪些工具可用。# mcp_servers/calc_server.py def add(a, b): return a b def multiply(a, b): return a * b TOOLS { add: add, multiply: multiply, }主程序把四块拼起来读取配置、加载文档、注册工具、跑智能体。# main.py import os, json, tomllib from openai import OpenAI from dotenv import load_dotenv from rag import load_docs, build_context from agent import run_agent from mcp_servers.calc_server import TOOLS load_dotenv() with open(config.toml, rb) as f: cfg tomllib.load(f) client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlcfg[model][base_url], ) docs load_docs(cfg[rag][store_path]) question RAG 和智能体有什么区别顺便帮我算 12 乘 8 context build_context(question, docs) if cfg[rag][enabled] else answer run_agent( client, cfg[model][model_id], question, context, TOOLS, cfg[agent][max_steps], ) print(answer)这份配置的价值在于四个概念不再是抽象名词而是四个可以单独开关的模块。你可以把 rag.enabled 设为 false 看纯大模型的表现也可以把 mcp.enabled 关掉看智能体退化后的行为。对照实验做几次理解会深很多。下一节我们逐步验证每个模块是否真的跑通。4. 逐步验证每个模块从单模型调用到完整链路跑通配置写好了不代表跑通了必须一步步验证。我的习惯是从最底层往上验每层单独确认出问题时才能快速定位是哪一块的锅。这一节给你一份可执行的操作清单按顺序做每步都有预期结果。第一步验证大模型调用。先不碰 RAG 和智能体只跑最基础的对话确认 Key、base_url、模型 ID 三件套正确。from openai import OpenAI import os from dotenv import load_dotenv load_dotenv() client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL), ) resp client.chat.completions.create( modelos.getenv(TAOTOKEN_MODEL), messages[{role: user, content: 回复连接成功}], ) print(resp.choices[0].message.content)预期结果是模型返回一句确认文本。如果这一步就报错先别往下走直接跳到第 5 节排查。这一步通过说明你的模型入口是通的后面所有问题都不会是「连不上」导致的。第二步验证 RAG 检索。单独调用检索函数确认能从文档里捞出相关内容。准备一个 docs.json放几条测试文档。[ {id: 1, text: RAG 是检索增强生成先检索再生成}, {id: 2, text: 智能体可以规划任务并调用工具}, {id: 3, text: MCP 是模型上下文协议标准化工具接入} ]然后单独跑检索from rag import load_docs, build_context docs load_docs(rag_store/docs.json) ctx build_context(RAG 是什么, docs) print(ctx)预期结果是打印出包含「RAG 是检索增强生成」的上下文。如果检索为空检查关键词是否匹配、文档路径是否正确。这一步通过说明检索链路没问题。第三步验证智能体循环。先不给工具只让它回答确认循环能正常退出。from agent import run_agent from openai import OpenAI import os from dotenv import load_dotenv load_dotenv() client OpenAI(api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL)) ans run_agent(client, os.getenv(TAOTOKEN_MODEL), 你好, , {}, max_steps3) print(ans)预期结果是直接返回回答不进入工具调用分支。如果它反复循环到最大步数说明模型输出格式不符合预期检查 system prompt 里的 JSON 约定。第四步验证工具调用。给智能体一个明确需要计算的问题看它是否触发工具。from mcp_servers.calc_server import TOOLS ans run_agent(client, os.getenv(TAOTOKEN_MODEL), 帮我算 12 乘 8, , TOOLS, max_steps5) print(ans)预期结果是模型先输出工具调用 JSON工具返回 96模型再基于结果给出最终回答。如果模型直接心算而不调工具说明工具描述不够清晰或者模型本身工具调用能力弱换一个更擅长 function calling 的模型再试。第五步跑完整链路。用 main.py 一次性验证四块协作问题里同时包含「需要查资料」和「需要计算」两部分看它是否既用了 RAG 又用了工具。python main.py预期结果是回答里既引用了文档内容又给出了正确的计算结果。到这里四个模块就算全部跑通了。整个过程我建议你每步都截图或记录输出后面出问题时对照着看能省很多时间。验证通过后你已经有了一套可运行的最小系统。接下来要做的不是加功能而是先搞清楚常见报错怎么排查因为真实项目里 80% 的时间都花在排障上。5. 本篇常见报错排查401、local proxy failed、reading choices、OAuth跑通最小示例后你大概率会在某个环节遇到报错。这一节我把最常见的几类错误和排查路径列出来都是真实会遇到的对照着查能快速定位。第一类401 未授权。这是最高频的错误几乎都是 Key 的问题。典型报错长这样openai.AuthenticationError: Error code: 401 - {error: {message: Invalid API key}}排查顺序先确认 .env 里的 TAOTOKEN_API_KEY 是否完整复制有没有多余空格或换行再确认这个 Key 是否被删除或过期去 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 重新生成一个最后确认代码读取环境变量的时机load_dotenv() 必须在创建 client 之前调用。很多人把 load_dotenv() 写在 client 之后导致读到空值。第二类local proxy failed。这个报错通常出现在网络层提示本地代理连接失败。典型信息APIConnectionError: Connection error. local proxy failed遇到这个先检查你的运行环境是否有本地代理配置干扰比如系统环境变量里残留的 HTTP_PROXY、HTTPS_PROXY。如果有临时清掉再试。另外确认 base_url 拼写正确必须是 https://taotoken.net/api 少写 /api 或写成 http 都会连不上。如果你在容器里跑检查容器网络是否能出网。第三类reading choices 相关错误。典型报错KeyError: choices或者TypeError: NoneType object is not subscriptable这通常意味着返回结构和你预期的不一样。原因可能是模型 ID 写错了接口返回了错误信息而不是正常结果但你的代码直接去取 choices[0]。正确做法是先打印完整响应再解析resp client.chat.completions.create(...) print(resp) # 先看结构 print(resp.choices[0].message.content)如果 resp 里没有 choices看它的 error 字段通常是模型名不对或参数越界。确认模型 ID 拼写max_tokens 不要超过模型上限。第四类OAuth 相关报错。如果你在配置某些客户端工具时看到 OAuth 失败典型信息OAuth error: invalid_client这类问题多出现在客户端工具的授权配置环节。排查时确认回调地址是否和配置一致客户端 ID 和密钥是否匹配。如果你用的是 Claude Code 这类工具配置时三件套必须齐全Base URL 填 https://taotoken.net/api Key 填你的 API KeyModel ID 填你要用的模型名。三者缺一不可少填一个就会出现授权或调用失败。为了让你对照更方便我把常见报错和排查方向整理成表报错关键词最可能原因优先排查401 Invalid API keyKey 错误或未加载.env 内容、load_dotenv 顺序local proxy failed网络或 base_url 错误代理变量、/api 后缀reading choices响应结构异常模型 ID、打印完整响应OAuth invalid_client授权配置不全Base URL、Key、Model ID 三件套排障的核心思路是「先分层再定位」先确认是网络层、认证层还是解析层的问题再针对性检查。不要一看到报错就改代码很多时候问题在配置。如果你在接入过程中反复卡住可以直接去接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 对照官方说明通常能快速找到对应配置项。6. 从概念到落地按你的目标选对下一步概念和最小示例都跑通之后下一步怎么走取决于你的目标。我把常见路径分成三类你对号入座即可。如果你的目标是「验证模型效果、做对比实验」那重点应该放在模型对话和参数调优上。你可以用模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 快速试不同模型对同一问题的回答差异把表现好的模型 ID 记下来再写进你的 RAG 或智能体配置里。这个阶段不用急着上复杂框架先把「哪个模型适合哪类任务」摸清楚。如果你的目标是「长期做编码、搭 Agent 工作流」那重点应该放在 Coding Plan 上地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。它适合需要持续调用模型、频繁迭代代码的场景。你可以把前面最小示例里的模型调用替换成 Coding Plan 的配置然后在真实项目里逐步把 RAG 的检索换成向量库、把 MCP 的本地工具换成标准服务端。每换一块都回到第 4 节的验证清单重新跑一遍确保没破坏原有链路。如果你的目标是「先把接入和排障彻底搞明白」那就把 API Keys 和接入文档这两个页面吃透。API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 管理你的凭证接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 有完整的参数说明和示例。遇到报错先查文档比在网上乱搜快得多。最后分享一个我自己的实用技巧把第 3 节的 config.toml 当成你的「实验记录本」。每次调整模型、检索参数、工具列表都在配置里改而不是散落在代码各处。这样你回头对比不同配置的效果时只需要保存不同的 toml 文件随时切换。配合第 4 节的验证清单你就能用一套可复现的流程把大模型、RAG、智能体、MCP 这四个概念真正变成手上能跑的东西而不是停留在名词解释层面。
返回列表