🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度
你是不是经常听到“大模型”、“Agent”、“RAG”这些词,感觉它们很火,但又觉得离自己很远,或者概念太多根本记不住?你不是一个人。很多开发者,甚至一些技术博主,都只是停留在“知道名字”的阶段,一旦被问到“它们之间到底什么关系”、“我该从哪开始用”,就立刻卡壳。
这篇文章要解决的,就是这个问题。我们不堆砌晦涩的论文术语,也不做泛泛而谈的趋势分析。我将用一个贯穿始终的“智能开发助手”场景,把大模型、提示词、Agent、Skill、RAG、MCP、工作流这七个核心概念串起来,让你不仅知道它们是什么,更知道它们为什么出现、解决了什么具体问题,以及你该如何上手实践。
我的核心判断是:AI 应用的开发,正从“单点提示词技巧”演变为“系统工程”。理解这套“系统工程”的组件和协作方式,是当前开发者用好 AI 的关键。下面,我们就从最基础的“大模型”开始,一步步搭建起你的认知框架。
1. 基石:大模型(LLM)—— 不是万能,而是“通才”
大模型(Large Language Model, LLM)是这一切的起点。你可以把它理解为一个博览群书、记忆力超强的“通才实习生”。它读过互联网上几乎所有的公开文本,所以它能和你聊历史、写诗、编代码、解数学题。
但它的核心局限是什么?
- 知识截止:它的知识停留在训练数据截止的那个时间点(例如 GPT-4 可能是 2023 年初)。它不知道之后发生的新闻、你公司内部的文档、或者你私人的笔记。
- “幻觉”:当被问到它不知道的事情时,它倾向于“自信地编造”一个听起来合理的答案,而不是说“我不知道”。
- 缺乏“行动”能力:它很会“说”,但不会“做”。它无法替你查询数据库、发送邮件、调用 API 或操作浏览器。
所以,直接问大模型:“帮我根据我们公司 Q3 的销售数据写一份总结报告。” 它大概率会瞎编一份数据。大模型本身,是一个强大的文本理解和生成引擎,但它不是一个完整的应用。我们需要其他技术来弥补它的短板。
2. 沟通术:提示词(Prompt)—— 如何给“通才”下指令
既然大模型是“通才”,我们如何让它完成特定任务?靠的就是提示词(Prompt)。提示词就是你给大模型的指令和上下文。
从“聊天”到“工程”的演变:
- 基础提示词:
“写一首关于春天的诗。” - 角色设定提示词:
“你是一个经验丰富的 Python 后端开发专家。请用 Flask 框架编写一个简单的用户登录 API 接口。”(这通过设定角色,引导模型输出更专业的代码) - 结构化提示词(Few-Shot Learning):这是提示词工程的核心。你不光告诉它做什么,还给它几个例子。
# 这是一个将用户问题分类的提示词示例 prompt = """ 你是一个客服问题分类机器人。请将用户的问题分类为 [技术故障, 账户问题, 计费咨询, 产品功能, 其他]。 示例: 用户:我的账号无法登录了。 分类:账户问题 用户:新上线的图表功能怎么用? 分类:产品功能 用户:服务器响应很慢。 分类:技术故障 现在请对以下问题进行分类: 用户:我这个月的账单金额不对。 分类: """ # 期望输出:计费咨询提示词的局限性:它本质上是将“知识”硬编码在指令里。当知识量很大、需要实时更新、或者属于私有信息时,维护一个庞大的提示词是不现实的。这就引出了 RAG。
3. 外接大脑:RAG(检索增强生成)—— 给模型“开卷考试”
如何让大模型获取它“不知道”的知识?比如你公司的内部文档、最新的行业报告、或者你的个人知识库。
最朴素的想法是:把这些文档全部塞进提示词里。但大模型有上下文长度限制(比如 128K tokens),而且每次问答都传输大量文本,速度慢、成本高。
RAG(Retrieval-Augmented Generation)提供了优雅的解决方案。它的核心思想是:“开卷考试”。
- 检索(Retrieval):将你的知识库(文档、网页、数据库)拆分成片段(Chunks),建立索引(类似图书馆的目录)。
- 增强(Augmentation):当用户提问时,系统根据问题,从索引中快速检索出最相关的几个知识片段。
- 生成(Generation):将这些检索到的片段作为“参考资料”,和用户问题一起,构成新的提示词,交给大模型生成最终答案。
一个极简的 RAG 流程代码示意:
# 伪代码,展示 RAG 核心逻辑 from your_vector_store import VectorStore # 向量数据库,用于存储和检索 from your_llm import LLM # 大模型 # 1. 知识库预处理(通常离线进行) documents = ["文档1内容...", "文档2内容...", ...] vector_store = VectorStore() vector_store.add_documents(documents) # 文档切片并转换为向量存入 # 2. 用户提问时 user_query = "我们公司今年的差旅报销政策有什么变化?" # 3. 检索相关片段 relevant_chunks = vector_store.search(user_query, top_k=3) # 检索最相关的3个片段 # 4. 构建增强提示词 context = "\n\n".join(relevant_chunks) augmented_prompt = f""" 请基于以下参考资料回答问题。如果资料中没有相关信息,请直接说“根据现有资料无法回答”。 参考资料: {context} 问题:{user_query} 答案: """ # 5. 调用大模型生成答案 answer = LLM.generate(augmented_prompt) print(answer)RAG 解决了大模型的“知识”问题,但它仍然不会“行动”。它只能基于已有文本回答问题。如果要执行“查一下我明天的会议安排并邮件通知参会人”这样的任务,就需要 Agent。
4. 执行者:Agent(智能体)—— 会思考、会拆解、会调用工具
Agent 是大模型应用的一次范式升级。如果说之前是大模型“亲自”回答问题,那么 Agent 就是大模型作为“大脑”,指挥一个“身体”(各种工具)去完成任务。
Agent 的核心工作流:
- 规划:理解用户复杂目标(如“策划一次团队建设活动”),并将其拆解为可执行的子任务(确定预算、调研地点、收集人员时间、预订场地)。
- 工具调用:为每个子任务选择合适的工具(Skill)来执行。例如,用“搜索引擎”工具调研地点,用“日历”工具查看大家空闲时间,用“邮件”工具发送通知。
- 反思与迭代:检查工具执行的结果,判断任务是否完成。如果未完成或结果不理想,则调整计划或重新执行。
一个 Agent 的决策循环伪代码:
# 伪代码,展示 Agent 的思考-行动循环 class SimpleAgent: def __init__(self, llm, tools): self.llm = llm self.tools = tools # 一个工具字典,如 {'search': GoogleTool, 'calculator': CalcTool} def run(self, user_goal): plan = self.llm.generate(f"请将目标拆解为步骤:{user_goal}") steps = parse_plan(plan) for step in steps: # 思考:这一步需要用什么工具?输入是什么? thought = self.llm.generate(f"为了完成‘{step}’,我应该使用哪个工具?可用工具:{list(self.tools.keys())}") tool_name, tool_input = parse_thought(thought) # 行动:调用工具 if tool_name in self.tools: tool = self.tools[tool_name] result = tool.execute(tool_input) print(f"[行动] 使用 {tool_name},输入‘{tool_input}’,结果:{result}") else: result = f"错误:找不到工具 {tool_name}" # 观察:将结果纳入上下文,决定下一步 # ... Agent 会根据结果决定继续下一步、重试还是调整计划 return "任务完成"Agent 让大模型从“聊天机器人”变成了“数字员工”。而 Agent 赖以行动的那些“工具”,就是 Skill。
5. 技能包:Skill(技能)—— Agent 的“手和脚”
Skill(有时也叫 Tool 或 Function)是 Agent 能够调用的具体能力单元。一个 Skill 通常对应一个具体的 API、函数或操作。
常见的 Skill 类型:
- 信息获取类:网络搜索、数据库查询、知识库检索(RAG 本身也可以被看作一个强大的检索 Skill)。
- 计算与逻辑类:计算器、代码解释器、数据分析。
- 系统交互类:读写文件、执行命令行命令。
- 应用操作类:发送邮件、创建日历事件、操作 CRM 系统、控制智能家居。
- 多模态类:生成图片、识别图像内容、文本转语音。
定义一个简单的计算器 Skill:
# 一个简单的 Skill 示例 class CalculatorSkill: name = "calculator" description = "执行数学计算。输入一个数学表达式,如 '2 + 3 * 4'。" def execute(self, expression: str) -> str: try: # 警告:实际生产中请使用更安全的评估方法,如 ast.literal_eval 或自定义解析器 # 此处仅为演示 result = eval(expression) return str(result) except Exception as e: return f"计算错误:{e}" # 将 Skill 注册给 Agent my_agent.tools['calculator'] = CalculatorSkill()当用户对 Agent 说“请计算一下 125 的平方根加上 50 是多少”时,Agent 会规划出“需要计算”,然后调用calculator这个 Skill,传入表达式“sqrt(125) + 50”,得到结果后再组织语言回复给用户。
那么,如何让不同的 Agent 系统能方便地发现和使用这些 Skill 呢?这就需要一套“协议”,也就是 MCP。
6. 连接器:MCP(模型上下文协议)—— Skill 的“通用插座”
MCP(Model Context Protocol)是一个由 Anthropic 公司提出的开放协议。你可以把它理解为Skill 的“USB-C 标准”。
在没有 MCP 之前,每个 AI 应用平台(如 Claude Desktop、Cursor、自己开发的 Agent 系统)都需要为每一个想集成的工具(如 GitHub、Jira、数据库)单独开发适配器,工作量大且不通用。
MCP 解决了什么问题?
- 标准化:它定义了 Skill(在 MCP 中称为“资源”和“工具”)应该如何被描述、被发现、被调用。
- 解耦:Skill 提供者(如 GitHub)只需要实现一个标准的 MCP 服务器,任何支持 MCP 协议的客户端(如 Claude Desktop)就能立即使用这些 Skill,无需额外开发。
- 可组合性:开发者可以像搭积木一样,将不同的 MCP 服务器提供的 Skill 组合起来,构建更强大的 Agent。
一个 MCP 服务器的简单概念示例:MCP 服务器通过标准接口(如 stdio 或 HTTP)向客户端宣告:“我提供了以下工具:search_web(搜索网页)、read_file(读取文件)”。客户端(如 AI 助手)就能在需要时,按照协议格式请求调用这些工具。
MCP 与 Function Calling 的区别:大模型自带的 Function Calling 是一种“请求-响应”机制,用于描述和调用单个函数。而MCP 是一个常驻的、独立的服务协议,它管理着多个工具的声明、上下文提供(如实时数据流)和调用,更适合构建复杂的、可插拔的 AI 应用生态。
最后,我们将所有这些概念串联起来,就形成了AI 工作流。
7. 交响乐:工作流(Workflow)—— 编排一切
工作流(或称为 Agentic Workflow)是最高层次的抽象。它定义了多个步骤、多个 Agent 或组件(如 RAG、Skill)如何协同工作,以完成一个复杂的业务目标。
一个“智能周报生成”工作流可能如下:
- 触发:每周五下午 5 点自动触发。
- 数据收集(使用 Skill):
- 调用
Jira Skill,获取本周分配和已解决的任务。 - 调用
GitHub Skill,获取本周提交的代码和 PR 记录。 - 调用
Calendar Skill,获取本周参加的会议。
- 调用
- 信息整合(使用 RAG):将收集到的结构化数据转换成文本,与过往周报模板一起,作为上下文输入给大模型。
- 内容生成(使用大模型+提示词):大模型基于整合的信息和指令(提示词:“请生成一份简洁专业的工程师周报,突出进展和风险”),生成周报草稿。
- 审查与发布(使用 Agent):一个审查 Agent 检查草稿的完整性和语气,必要时进行调整。最后调用
Email Skill或Slack Skill将周报发送给经理。
用 YAML 描述一个简化的工作流配置:
# workflow_weekly_report.yaml name: "工程师智能周报" triggers: - type: "schedule" cron: "0 17 * * 5" # 每周五17:00 steps: - name: "收集Jira任务" type: "skill" skill: "jira_mcp" action: "get_my_issues_this_week" - name: "收集GitHub活动" type: "skill" skill: "github_mcp" action: "get_my_prs_and_commits" - name: "整合数据并生成报告" type: "llm_chain" prompt: | 你是一名工程师。请根据以下数据,撰写一份本周工作周报。 数据: JIRA任务:{{steps.收集Jira任务.output}} GitHub活动:{{steps.收集GitHub活动.output}} 要求:分点列出,语言精炼。 llm: "gpt-4" - name: "发送报告" type: "skill" skill: "email_mcp" action: "send" inputs: to: "manager@company.com" subject: "工程师周报 - {{current_date}}" body: "{{steps.整合数据并生成报告.output}}"工作流将大模型、提示词、RAG、Agent、Skill、MCP 等技术点,组合成了一个能自动运行、解决实际问题的完整应用。
8. 实践入门:从零搭建一个本地 AI 查询助手
理论讲完了,我们来点实际的。下面是一个极简的实践方案,使用 Ollama(本地运行大模型)、LangChain(编排框架)和 Chroma(向量数据库),快速搭建一个能查询你个人文档的本地 AI 助手。
8.1 环境准备
确保你已安装 Python(3.8+)和 pip。
# 创建一个新的虚拟环境(推荐) python -m venv ai_assistant_env source ai_assistant_env/bin/activate # Linux/Mac # ai_assistant_env\Scripts\activate # Windows # 安装核心库 pip install langchain langchain-community chromadb pypdf sentence-transformers pip install ollama # Ollama的Python客户端8.2 启动本地大模型服务
你需要先安装并运行 Ollama,然后拉取一个模型。
# 1. 前往 https://ollama.com/ 下载并安装 Ollama # 2. 在终端拉取一个轻量模型,例如 Mistral 7B ollama pull mistral # 3. 运行模型服务(它会一直在后台运行) ollama serve &8.3 构建个人文档 RAG 系统
假设你有一个my_docs文件夹,里面放了几份 PDF 文档。我们写一个脚本让 AI 能“阅读”它们。
# personal_rag.py import os from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.embeddings import OllamaEmbeddings from langchain_community.vectorstores import Chroma from langchain_community.llms import Ollama from langchain.chains import RetrievalQA # 1. 加载文档 documents = [] pdf_folder = "./my_docs" for file in os.listdir(pdf_folder): if file.endswith(".pdf"): loader = PyPDFLoader(os.path.join(pdf_folder, file)) documents.extend(loader.load()) print(f"已加载 {len(documents)} 份文档。") # 2. 分割文本 text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) texts = text_splitter.split_documents(documents) print(f"分割为 {len(texts)} 个文本块。") # 3. 创建向量数据库(使用本地 Ollama 的嵌入模型) embeddings = OllamaEmbeddings(model="nomic-embed-text") # 一个不错的开源嵌入模型 vectorstore = Chroma.from_documents(documents=texts, embedding=embeddings, persist_directory="./chroma_db") vectorstore.persist() print("向量数据库已创建并持久化。") # 4. 创建检索链 llm = Ollama(model="mistral") # 使用我们拉取的 mistral 模型 qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever(search_kwargs={"k": 3}), # 检索最相关的3个片段 return_source_documents=True ) # 5. 开始问答 while True: query = input("\n请输入你的问题(输入 'quit' 退出): ") if query.lower() == 'quit': break result = qa_chain.invoke({"query": query}) print(f"\n答案:{result['result']}") print("\n参考来源:") for doc in result['source_documents']: print(f"- {doc.metadata.get('source', '未知')} 第{doc.metadata.get('page', 'N/A')}页")运行这个脚本:
python personal_rag.py首次运行会处理文档并建立索引,之后就可以直接提问了。例如,如果你的文档是产品手册,你可以问:“我们产品的保修期是多久?” 系统会从你的 PDF 中寻找答案。
8.4 扩展为具有简单 Skill 的 Agent
现在,我们给这个系统加一个“计算器” Skill,让它既能查文档,又能做计算。
# simple_agent.py from langchain.agents import Tool, AgentExecutor, create_react_agent from langchain import hub from personal_rag import qa_chain # 导入上面创建的 RAG 链 # 1. 定义工具(Skill) def calculator_tool(expression: str) -> str: """用于执行数学计算。输入一个数学表达式字符串。""" try: # 安全警告:生产环境请勿使用 eval,此处仅为演示。 # 可使用 ast.literal_eval 或 math 库解析简单表达式。 result = eval(expression) return f"计算结果为:{result}" except Exception as e: return f"计算失败:{e}" # 2. 将 RAG 链和计算器包装成 LangChain Tool tools = [ Tool( name="文档知识库", func=lambda q: qa_chain.invoke({"query": q})["result"], description="当你需要回答关于公司产品、政策、手册等文档内容的问题时使用此工具。" ), Tool( name="计算器", func=calculator_tool, description="当你需要进行数学计算时使用此工具。输入一个数学表达式,如 '2 * (3 + 5)'。" ) ] # 3. 创建 Agent prompt = hub.pull("hwchase17/react-chat") # 使用一个标准的 ReAct 提示模板 llm = Ollama(model="mistral") agent = create_react_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True) # 4. 运行 Agent while True: user_input = input("\n用户: ") if user_input.lower() in ['quit', 'exit']: break response = agent_executor.invoke({"input": user_input, "chat_history": []}) print(f"助手: {response['output']}")现在,你的助手就升级了!你可以问:“我们产品的价格是多少?如果买 10 个,总价打九折是多少钱?” Agent 会先调用“文档知识库”工具查价格,再调用“计算器”工具计算总价。
9. 常见问题与排查思路
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Ollama 服务连接失败 | Ollama 未启动或端口被占用 | 在终端运行ollama serve查看输出;检查http://localhost:11434是否可访问。 | 确保 Ollama 已正确安装并运行。关闭占用 11434 端口的其他进程。 |
| 加载 PDF 文档出错 | PDF 文件损坏或受密码保护;PyPDF 版本不兼容。 | 尝试用其他 PDF 阅读器打开文件;查看错误堆栈信息。 | 使用完好的 PDF 文件;尝试pip install --upgrade pypdf。 |
| RAG 回答“根据资料无法回答” | 检索到的文本块不相关;文档未包含该信息;文本分割不合理。 | 打印出source_documents,看检索到的原文是什么。 | 调整文本分割的chunk_size和chunk_overlap;优化文档内容;尝试不同的嵌入模型。 |
| Agent 不调用正确的工具 | 工具描述不够清晰;大模型对任务理解有偏差。 | 开启verbose=True,查看 Agent 的思考链(Chain of Thought)。 | 修改工具的description,使其更精确;在提示词中更明确地指导 Agent。 |
| 运行速度很慢 | 模型太大;本地硬件(CPU/内存)不足;未使用 GPU。 | 使用htop或任务管理器查看资源占用。 | 换用更小的模型(如llama3.2:3b);确保 Ollama 配置了 GPU 加速(如支持);增加文本块大小减少检索次数。 |
| 向量数据库占用空间大 | 文档太多或chunk_size太小,产生过多向量。 | 检查chroma_db文件夹大小。 | 定期清理无用数据;调整分割策略;对于大型知识库,考虑使用专业向量数据库(如 Qdrant, Weaviate)。 |
10. 最佳实践与工程建议
- 从简单开始,迭代优化:不要一开始就追求复杂的多 Agent 工作流。从一个明确的痛点(如文档问答)开始,用 RAG + 基础提示词实现 MVP,再逐步添加 Skill 和更复杂的逻辑。
- 提示词工程是基础:无论技术栈多复杂,清晰、结构化的提示词永远是性价比最高的优化手段。为关键任务设计专门的提示词模板。
- 重视评估与测试:AI 应用的行为具有不确定性。建立测试集,对关键流程(如检索准确性、工具调用正确率、最终输出质量)进行定期评估。
- 安全与权限是红线:
- 最小权限原则:赋予 Agent 和 Skill 的权限刚好够用即可。例如,一个只读的文档查询 Skill,就不要给它删除权限。
- 用户确认:对于高风险操作(如发送邮件、修改数据),设计用户确认环节。
- 输入输出过滤:对用户输入和模型输出进行必要的清洗和过滤,防止注入攻击或不当内容。
- 拥抱标准化协议:在构建自己的 Skill 时,考虑采用 MCP 这样的开放协议进行封装。这能极大提高工具的可复用性,方便接入不同的 AI 平台。
- 成本与延迟监控:大模型 API 调用和向量检索都可能产生成本和延迟。在应用层面加入监控,对耗时长的操作进行优化(如缓存、异步处理)。
你现在已经拥有了一个从概念到实践的地图。大模型是引擎,提示词是方向盘,RAG 是外接导航,Agent 是司机,Skill 是车辆的功能(空调、雨刷),MCP 是车辆的标准接口(OBD-II),而工作流就是预设的自动驾驶路线。理解每个部件的角色和它们如何连接,你就能设计出真正解决实际问题的智能应用,而不仅仅是和聊天机器人对话。下一步,尝试用这个框架去分析你感兴趣的开源项目(如 AutoGPT、LangChain、Dify),你会发现它们的架构突然变得清晰易懂。
🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度