ARTICLE DETAIL

资讯详情

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

大模型应用开发实战:Agent Skills、Multi-Agent与RAG

大模型应用开发实战:Agent Skills、Multi-Agent与RAG 这个标题的含金量不在“教程”两个字而在它把 2026 年大模型应用开发最核心的四个技术栈串成了一条线大模型基础、Agent Skills、Multi-Agent 和 RAG。市面上讲单个概念的视频很多但从入门到代码实战一条路走完的很少。这篇文章我会按实际学习路径拆解这套内容先说清楚四个概念分别解决什么问题再给出环境准备、代码示例、测试验证和常见坑位。读完你能判断自己适合从哪一阶段切入以及怎么把教程中的知识转成自己的项目能力。1. 核心能力速览与学习目标先看这套教程覆盖的内容轮廓本质上是一个“大模型应用开发完整学习链路”。技能模块核心概念解决什么问题实战落点入门难度AI 大模型基础Token、上下文窗口、Prompt、Function Calling让模型理解任务并稳定输出API 调用、提示词工程低Agent感知-规划-行动-反思循环让模型自主完成多步任务工具调用、任务拆解中Agent Skills自然语言描述的可复用技能让 Agent 按需调用专项能力技能文件、技能注册中高Multi-Agent多智能体协作、角色分工、消息传递复杂任务拆给多个角色并行处理多智能体编排与通信高RAG向量检索、文档切片、重排、知识库问答让模型基于私有知识库回答文档问答、知识库系统中这套内容最值得关注的不是单个知识点而是它把“模型能力”和“工程能力”缝合在一起只调 API 不算应用开发真正要做的是让模型能查资料、能调工具、能分工协作。Agent Skills 在这条线里是承上启下的关键一环它既依赖大模型能力又为 Multi-Agent 提供模块化基础。从适用人群看这套内容适合三类读者刚入门大模型开发先掌握 Prompt、API 调用、上下文管理再逐步进入 Agent 概念。做过 ChatBot 但没做过复杂 Agent需要理解工具调用和多步任务编排Agent Skills 是非常好的切入角度。想在企业场景落地RAG 和 Multi-Agent 部分直接对应文档问答、智能客服、数据分析助手等场景。不太适合的人群是想直接看“部署某个开源模型”或“跑通某个现成 WebUI”的朋友这套内容核心是应用层开发逻辑不是模型部署教程。2. 技术栈定位Agent Skills 是什么和 Agent 有什么区别很多人在入门时会把 Agent Skills 和 Agent 混在一起先说清楚这两者的关系。Agent 是一个完整的自主执行单元。它具备感知环境、拆解任务、调用工具、决策下一步行动的能力。一个 Agent 通常由大模型、提示词、工具列表、记忆机制和执行循环组成。Agent Skills 是模型的能力扩展模块。它的核心特征是用自然语言描述的、可复用的一组技能指令。模型在需要某种专项能力时会动态加载对应的技能描述而不是在执行前把所有技能全部预置在上下文里。对比一下对比维度AgentAgent Skills本质一个完整的自主执行单元一组可复用的能力描述核心问题如何拆解任务并决定行动如何让模型快速获得专项能力生命周期常驻运行、持续思考按需加载、用完即走复杂度高涉及规划、记忆、工具管理相对低本质是结构化的指令文件与任务的关系负责“做”负责“会”这种设计的实际收益很直接不需要为每个新任务重新训练模型也不需要把所有能力都塞进上下文。技能文件可以被多个 Agent 共享也可以被同一个 Agent 在不同场景下动态选用。代码层面一个技能文件可以理解为skill_name: document_parser description: 解析 PDF、Word 文档提取正文和表格结构 instructions: | 1. 接收文档路径参数 2. 提取纯文本内容 3. 保留表格结构并转换为 Markdown 4. 输出结构化结果 relevant_context: 文档解析、办公自动化、知识库构建模型在执行文档解析任务时会根据任务类型检索并加载这段技能描述然后结合具体工具完成解析。这种方式比“把所有指令写死在系统提示词里”更灵活也比“每个任务单独微调模型”更经济。3. RAG 在整套体系中的位置与实战价值RAG 不是 Agent 的对立面而是 Agent 的知识来源。没有 RAG 的 Agent 只能依赖模型内部知识遇到私有文档、实时数据、领域知识时就无法回答。RAG 的作用就是把外部知识注入生成过程。一个典型的 RAG 流程包含四个环节文档加载读取 PDF、Word、HTML、Markdown 等格式的原始文件。文本切片把长文档切分成合理长度的块切片策略直接影响检索质量。向量化与存储用 Embedding 模型把文本块转成向量存入向量数据库。检索与生成根据用户问题检索相似文本块拼入上下文交给大模型生成回答。在代码实战中一个最小可用的 RAG 链路可以用 Python 快速验证from langchain_community.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.vectorstores import FAISS from langchain_community.embeddings import HuggingFaceEmbeddings # 1. 加载文档 loader TextLoader(./docs/introduction.md) documents loader.load() # 2. 切片 splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50, separators[\n\n, \n, 。, , ] ) chunks splitter.split_documents(documents) # 3. 向量化并构建索引 embeddings HuggingFaceEmbeddings(model_nameshibing624/text2vec-base-chinese) vector_store FAISS.from_documents(chunks, embeddings) # 4. 检索 query 这份文档介绍了什么 docs vector_store.similarity_search(query, k3) for i, doc in enumerate(docs): print(f--- 第 {i 1} 个检索结果 ---) print(doc.page_content)这个链路在教程中的价值不只是跑通一个向量检索它的重点是帮助你理解四个决策点切片大小切太细丢失上下文切太粗检索不精准。500-800 字是常见起点具体要看你文档的语言和结构。Embedding 模型选择中文场景用中文优化的模型效果通常更好需要在效果和资源占用之间权衡。检索数量k 值太小可能遗漏关键信息k 值太大会把噪声也塞进上下文。重排环节如果要做高质量 RAG还需要在初次检索后加入重排模型把最相关的文本块排到最前面。这套体系在实际项目中的链路通常是用户提问 → 判断是否需要检索 → 调用 RAG 流程取出证据 → 交给大模型生成回答。再往上一层Agent 可以决定“这个问题是否需要查知识库”甚至可以在回答后继续追问、总结、生成报告。4. 环境准备与前置条件在开始代码实战之前先把环境准备好。这套教程内容以 Python 为主涉及常见的依赖管理和接口调用。4.1 操作系统与语言版本操作系统建议使用 Windows 10/11、Ubuntu 20.04 或 macOS 12。Python 版本建议 3.10 及以上3.9 也可以运行但部分新特性受限。包管理工具使用 pip建议先创建虚拟环境隔离依赖避免全局污染。python -m venv agent_env # Windows agent_env\Scripts\activate # Linux / macOS source agent_env/bin/activate4.2 依赖安装教程涉及大模型 API 调用、Agent 框架、RAG 相关组件。以下是一个通用依赖清单实际项目按需安装即可pip install openai langchain langchain-openai langchain-community faiss-cpu \ sentence-transformers python-dotenv如果使用云端大模型 API通常只需要保证网络可访问不需要本地 GPU。如果需要本地部署开源模型做 Embedding 或对话则需准备 NVIDIA 显卡并安装 CUDA 环境。常见显卡显存要求以实际模型规模为准一般 8G 显存可以运行中等规模的对话模型和常见 Embedding 模型更大模型需要更高显存或使用量化版本。4.3 模型访问方式选择模型中使用的模型分为两类类别示例运行方式资源要求对话大模型GPT 系列、Claude、国产大模型云端 API 调用无需本地 GPU对话大模型Qwen、Llama 系列本地部署或 Ollama 启动需要显卡8G 起步Embedding 模型text2vec、bge 系列本地运行CPU 可跑GPU 更快重排模型bge-reranker本地运行CPU/GPU 均可4.4 环境变量配置把 API Key 存到.env文件不要在代码中硬编码OPENAI_API_KEYsk-xxxxxxxx BASE_URLhttps://api.example.com/v1 EMBEDDING_MODELshibing624/text2vec-base-chinese然后在代码中加载import os from dotenv import load_dotenv load_dotenv() api_key os.getenv(OPENAI_API_KEY)这套环境准备的核心目的不是“安装完就好”而是保证后续所有代码实战都能在统一环境下运行。5. 从入门到代码实战五个阶段的拆解这套教程的价值在于它的进阶路径非常清晰下面按阶段拆解每个阶段的核心任务和代码关键点。5.1 第一阶段大模型 API 基础调用这个阶段解决的最基础问题是如何让大模型稳定输出你想要的内容。核心代码就是一个对话补全请求from openai import OpenAI client OpenAI(api_keyos.getenv(OPENAI_API_KEY), base_urlos.getenv(BASE_URL)) response client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: 你是智能客服助手回答简洁专业。}, {role: user, content: 请帮我查询订单状态的操作步骤。} ], temperature0.3 ) print(response.choices[0].message.content)这一阶段要掌握的重点不是语法而是System Prompt 的设计决定了模型的角色和行为边界是后续所有 Agent 工作的基础。Temperature 参数需要稳定输出的任务用低温度创意生成任务用高温度。上下文管理messages 列表是模型看到的所有历史对话超过上下文窗口会报错或截断。Function Calling让模型输出结构化调用参数这是 Agent 工具调用的基础能力。5.2 第二阶段从 Prompt 到 Agent当你发现单个 Prompt 无法完成多步任务时就需要引入 Agent 概念。一个最简单的 Agent 结构是“循环 工具调用”。tools [ { type: function, function: { name: get_weather, description: 获取指定城市的天气, parameters: { type: object, properties: { city: {type: string, description: 城市名称} }, required: [city] } } } ] messages [{role: user, content: 北京明天适合出门吗}] response client.chat.completions.create( modelgpt-4o-mini, messagesmessages, toolstools ) # 判断模型是否请求调用工具 message response.choices[0].message if message.tool_calls: # 解析工具调用参数执行真实函数把结果传回模型 print(message.tool_calls)这个阶段的核心理解点是Agent 不是一种神秘的模型而是“模型 工具 循环逻辑”的组合。模型负责任务理解和决策工具提供外部能力循环让整个过程可以自主推进。5.3 第三阶段RAG 知识库实战当 Agent 需要回答私有领域问题时需要在工具集中加入“知识检索”工具。这个阶段把 RAG 能力封装成一个可调用的函数def search_knowledge_base(query: str, k: int 3) - str: docs vector_store.similarity_search(query, kk) return \n\n.join([doc.page_content for doc in docs])然后把这个函数注册为 Agent 的工具让模型根据用户问题判断是否需要调用检索工具再结合检索结果生成回答。这个阶段最容易踩的坑有三个检索质量差问题不在接口而在切片策略和 Embedding 模型选择。上下文被噪声污染检索结果和问题无关反而干扰生成质量需要调整 k 值或加入重排。知识时效性RAG 的结果依赖索引库内容文档更新后必须重新切片和向量化否则回答是过时的。5.4 第四阶段Agent Skills 从理论到实战这是教程内容进阶的关键节点。Agent Skills 的核心不是“调用工具”而是让模型具备某种专项能力并可以按需加载。一个实际的技能文件结构大致包括技能名称、触发条件、执行步骤、注意事项、输出格式。例如构建一个“会议纪要生成技能”name: meeting_minutes description: 根据会议对话文本生成结构化会议纪要 trigger: 用户提供会议记录或要求生成会议纪要 steps: - 提取参会人、时间、主题 - 总结讨论要点 - 列出待办事项及负责人 - 生成 Markdown 格式纪要 output_format: markdown模型在处理会议相关内容时通过技能检索找到这个文件按其指导完成生成。这个模式的工程价值在于技能文件可以复用同一个技能在不同 Agent 中都能使用。技能文件可以持续迭代修改描述和步骤即可调整行为无需改动代码。技能文件可以共享团队内部沉淀最佳实践。实战时可以把技能文件放在统一目录中通过一个加载器在运行时注入给模型import os import yaml SKILLS_DIR ./skills def load_skill(skill_name: str) - str: path os.path.join(SKILLS_DIR, f{skill_name}.yaml) with open(path, encodingutf-8) as f: skill_data yaml.safe_load(f) return yaml.dump(skill_data, ensure_asciiFalse)5.5 第五阶段Multi-Agent 多智能体协作单 Agent 处理复杂任务时容易出现两个问题上下文过长导致混乱、一个模型承担所有角色导致效率下降。Multi-Agent 的思路是把任务拆开让多个 Agent 分工协作。常见协作模式有三种主管-执行者模式一个主管 Agent 负责拆解任务多个执行 Agent 负责具体实现。流水线模式任务按步骤依次传递前一个 Agent 的输出是后一个 Agent 的输入。评审模式一个 Agent 负责生成另一个 Agent 负责检查反馈迭代到满意为止。代码层面多智能体框架的核心是消息传递机制。以一个简化版本为例class Agent: def __init__(self, name, system_prompt): self.name name self.system_prompt system_prompt def run(self, task): response client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: self.system_prompt}, {role: user, content: task} ] ) return response.choices[0].message.content # 创建多个角色 writer Agent(writer, 你是文案撰写专家输出简洁有吸引力。) reviewer Agent(reviewer, 你是文案审核专家检查逻辑和表达给出修改建议。) # 流水线协作 draft writer.run(写一段产品介绍文案) feedback reviewer.run(f请审核以下文案\n{draft})这个阶段学习重点是理解角色设计和任务分配逻辑。多智能体不是越多越好关键是任务边界清晰、角色职责不重叠、消息传递不丢失。6. 功能测试与效果验证学习过程中不能只看代码跑通还要建立一套测试验证标准。建议按以下维度逐项验证。6.1 单 Agent 功能测试测试项输入示例通过标准失败排查方向基础对话任意业务问题回答结构完整、语气符合预设角色System Prompt 是否明确、模型上下文是否够工具调用查询天气、计算器模型正确输出 tool_calls 参数Function Calling 描述是否清晰、参数定义是否正确多轮任务连续提问并追问模型能理解指代关系不重复提问上下文是否及时追加、是否需要记忆机制长文本处理输入超过 3000 字文档不截断、能按指令提取信息上下文窗口是否超限、是否用流式输出6.2 RAG 检索质量测试这个部分需要准备一组有明确答案的测试问题比如从你自己的文档中提取 20 个事实型问题然后人工判断检索结果的相关性。典型测试维度检索结果是否包含答案所在原文位置。检索结果前 3 条是否都是相关内容。相似语义提问是否能检索到相同内容比如“如何退款”和“退钱流程”。问题超出文档范围时是否不硬答。如果检索结果不理想优先调整切片大小、重叠长度、Embedding 模型和 k 值不要一开始就改大模型。6.3 Multi-Agent 协作测试测试场景协作模式通过标准观察重点生成 审核评审模式第二 Agent 能指出第一 Agent 的具体问题并给出修改建议审核结果是否流于形式信息收集 总结流水线模式汇总结果覆盖每个子任务的输出消息传递是否完整复杂任务拆解主管-执行者任务拆解合理、执行者不重复动作主管的规划能力测试过程中一定要记录每个角色的输入输出避免“黑盒式”调用导致问题无法定位。建议在 Agent 执行时打印完整的 messages 日志出现异常时先看消息传递链路。7. 接口 API 与批量任务扩展学完基础链路后可以把技能封装成 API 服务让其他系统调用。7.1 用 FastAPI 封装 Agent 服务from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class QueryRequest(BaseModel): question: str history: list [] class QueryResponse(BaseModel): answer: str sources: list [] def run_agent(question: str, history: list): # 在这里串联 RAG 检索、技能调用和模型生成 return 生成的回答 app.post(/agent/chat, response_modelQueryResponse) async def chat(request: QueryRequest): answer run_agent(request.question, request.history) return QueryResponse(answeranswer, sources[]) if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8000)启动服务后可以用 curl 验证接口curl -X POST http://127.0.0.1:8000/agent/chat \ -H Content-Type: application/json \ -d {question: 根据知识库回答退款流程是什么}7.2 批量任务处理批量任务与单次调用的核心区别在于需要错误隔离和进度追踪。建议给每条任务增加唯一 ID、状态字段和失败重试机制。import json import time from concurrent.futures import ThreadPoolExecutor, as_completed def process_one_task(item): 处理单条任务返回带状态的结果。 try: result run_agent(item[question], item.get(history, [])) return {id: item[id], status: success, result: result} except Exception as exc: return {id: item[id], status: failed, error: str(exc)} def batch_process(all_items, max_workers4): results [] with ThreadPoolExecutor(max_workersmax_workers) as executor: future_map {executor.submit(process_one_task, item): item for item in all_items} for future in as_completed(future_map): results.append(future.result()) return results tasks [ {id: 001, question: 问题一}, {id: 002, question: 问题二}, ] output batch_process(tasks) print(json.dumps(output, ensure_asciiFalse, indent2))批量任务的关键参数是并发数。并发太高会导致 API 限流或服务超时安全做法是从 1 开始逐步上调观察响应时间和失败率。第一次跑批量任务时建议先加载一个只有几条数据的小文件验证全流程再扩展到完整数据集。8. 资源占用与性能观察这套教程涉及的是应用层开发性能观察的重点不是显存而是以下四个维度维度观察方式常见瓶颈优化手段Token 消耗API 控制台统计上下文包含过多无效信息精简 Prompt、及时清理历史、使用摘要压缩接口延迟记录单次请求耗时模型规格过大、上下文过长换更快的模型、减少携带的历史轮次检索耗时打印检索阶段耗时Embedding 模型推理慢、库太大本地向量数据库、预加载模型、批量向量化本地资源任务管理器 / nvidia-smiEmbedding 和重排模型同时运行小模型用 CPU 即可、大模型按需加载如果使用本地运行 Embedding 模型一个常见误区是每次检索都重新加载模型。更高效的做法是初始化一次全局复用from functools import lru_cache lru_cache(maxsize1) def get_embeddings_model(): return HuggingFaceEmbeddings(model_nameshibing624/text2vec-base-chinese)对需要频繁测试的本地推理场景建议记录“模型首次加载耗时”和“单次推理耗时”这样你能区分“模型加载慢”和“推理本身慢”两种问题。9. 常见问题与排查方法学习这套内容时最常遇到的问题集中在这几个方向问题现象可能原因排查方式解决方案API 调用返回 401API Key 错误或环境变量未加载打印 os.getenv 结果确认检查 .env 文件路径和变量名API 调用返回超时网络不稳或上下文过长缩短 messages 长度再测试减少历史轮数、设置更长 timeout工具调用返回空结果Function Calling 参数格式错误打印模型完整 response检查工具描述和参数是否匹配检索结果与问题无关切片过大或 Embedding 模型不匹配输出检索到的原始文本块调整 chunk_size、换用中文优化模型长文档被截断超出上下文窗口统计 prompt 字符数增加文本压缩或分块处理Agent 循环不停止缺少停止条件打印执行轮次设置最大循环次数和终止判断批量任务部分失败单条输入异常或限流检查任务日志中的 error 字段增加重试机制和失败隔离多 Agent 输出混乱角色职责重叠或消息传递不清晰检查每个 Agent 的输入和输出重新定义角色边界明确消息格式本地模型推理慢CPU 推理或模型过大查看 GPU 占用率使用量化模型或换 GPU端口被占用上一次服务未退出检查端口监听状态换端口或结束旧进程排查思路的通用顺序是先确认请求是否发出再确认模型是否返回再确认数据处理是否异常最后确认逻辑分支是否正确。不要同时修改多个变量一次只改一个点否则无法定位根因。10. 最佳实践与合规提醒整个学习过程和应用开发过程有几个值得提前遵守的实践原则1. 先小后大分步验证。不要一开始就跑复杂多 Agent 流程。先把单 Agent 的“问题 → 调用工具 → 返回结果”链路跑通再叠加 RAG最后再拆多个角色。每个阶段都能独立验证时组合问题才更容易定位。2. 日志和中间结果全程可见。在 Agent 执行的关键节点添加打印语句记录每一轮的输入、工具调用参数、工具返回结果。出现问题时这些日志是第一手线索。生产环境建议接入完整的日志采集系统。3. 模块化设计技能文件。每个技能文件只解决一个问题描述和步骤要具体、可执行不要写模糊的“根据情况进行处理”之类的表述。技能文件尽量用版本控制管理方便回溯和协作。4. 数据安全与合规边界。使用 RAG 处理文档时要确保文档来源的合法性和授权范围不要将包含个人隐私、商业机密的文档未经脱敏就放入知识库。涉及人脸、声音、肖像等敏感素材时必须获得明确授权。调用第三方大模型 API 时注意是否允许上传数据、数据是否被用于模型训练、是否符合企业数据合规要求。接口服务部署在公网时必须增加鉴权机制避免服务被滥用。5. 不要把模型输出直接用于正式场景。大模型存在幻觉风险涉及事实性回答、法律建议、医疗建议时需要人工复核。商用场景要设计好兜底逻辑模型不确定时说“不知道”而不是编造。6. 保留一套最小可运行配置。把环境依赖、模型名称、参数配置记录为配置文件团队新成员可以快速复现运行环境。不要把配置散落在多个脚本里。7. 性能优化要基于数据不要靠猜测。先记录各环节耗时和 Token 消耗再判断瓶颈。盲目加入缓存和重排层可能让系统更复杂但收益很小。11. 总结与下一步这套“Agent Skills 从入门到实战”教程的价值不在于某一个知识点讲得多深而在于它把大模型应用开发的关键链路完整串联起来从 API 基础调用开始一路走向 Agent、Agent Skills、Multi-Agent 和 RAG每个阶段都能落到代码实战。入门最值得先做的一件事是先把第一阶段的大模型 API 调通然后加上一个 Function Calling 工具调用感受一次“模型决定调用工具”的完整过程。这一步是理解 Agent 的钥匙。最容易踩的坑是跳过基础直接上 Multi-Agent导致问题出现时无法判断是提示词问题、工具问题还是协作逻辑问题。建议严格按照“单 Agent → 单 Agent 加工具 → RAG 知识库 → Agent Skills → Multi-Agent”的顺序推进。后续可以继续扩展的方向包括引入 Agentic RAG 让 Agent 自主决定检索策略、为技能文件增加版本管理和自动测试、把多 Agent 流程封装成可视化工作流、将整套链路接入企业现有业务系统。把这套内容啃下来再配合两三个完整项目实践你就能从“会调 API”进阶到“能搭建完整的大模型应用”。建议收藏备用遇到不确定的概念时回来对照着过一遍。
返回列表