Agent 开发思考笔记:LLM + Memory + Tool + RAG + MCP + Skills
发布时间:2026/10/7 8:57:13 锦皓数字建站

1. 引言为什么需要 Agent大语言模型LLM本身只是一个「会说话的模型」——它能生成流畅的文本但无法自主行动、无法记住长期对话、无法调用外部系统。要让 LLM 真正「做事」我们需要把它包装成一个Agent智能体。一个完整的 Agent 通常由以下核心组件构成LLM大脑负责推理、规划、生成回复。Memory记忆系统让 Agent 记住历史对话与长期知识。Tool工具调用让 Agent 能操作外部系统数据库、API、文件等。RAG检索增强生成让 Agent 能基于私有知识库回答。MCPModel Context Protocol统一工具接入标准。Skills技能封装把复杂流程沉淀为可复用能力。本文是一篇实战笔记会从零搭建一个具备上述能力的 Agent并给出可运行的代码。2. 核心概念速览在动手写代码之前先理清几个关键概念。2.1 LLM 是推理核心LLM 负责理解用户意图、拆解任务、决定调用哪个工具。现代 Agent 框架如 LangChain、LlamaIndex都提供了统一的 LLM 抽象层方便切换不同模型。2.2 Memory 让 Agent 有「记性」没有 Memory 的 Agent 每次对话都是「失忆」的。Memory 分为短期记忆当前会话内的上下文对话历史。长期记忆跨会话持久化的知识向量数据库、KV 存储。2.3 Tool 是 Agent 的「手脚」Tool 让 Agent 能执行具体动作例如查询数据库调用第三方 API读写文件执行计算Agent 通过「函数调用Function Calling」机制决定调用哪个工具、传什么参数。2.4 RAG 让 Agent 拥有「私有知识」RAGRetrieval-Augmented Generation流程把文档切块Chunking。用 Embedding 模型向量化。存入向量数据库。用户提问时检索最相关的片段。把检索结果拼进 Prompt让 LLM 基于上下文回答。2.5 MCP 统一工具接入MCPModel Context Protocol是 Anthropic 提出的开放协议用于标准化「模型与外部工具/数据源」之间的交互。通过 MCP一个工具服务器可以被任何支持 MCP 的客户端复用避免重复开发。2.6 Skills 沉淀可复用能力Skills 是把「完成某类任务的多步流程」封装成可复用的模块。例如「写周报」「做竞品分析」都可以沉淀为 SkillAgent 遇到同类任务时直接调用。3. 环境准备本文代码基于 Python 3.10使用以下依赖pipinstalllangchain langchain-openai langchain-community chromadb pipinstallmcp fastmcp如果你使用 OpenAI 兼容接口如 DeepSeek、通义千问可以这样配置importosfromlangchain_openaiimportChatOpenAI os.environ[OPENAI_API_KEY]your-api-keyos.environ[OPENAI_API_BASE]https://api.deepseek.com/v1llmChatOpenAI(modeldeepseek-chat,temperature0.7,)4. 从零搭建一个带 Memory 的 Agent我们先实现一个最简 Agent能记住对话历史并调用一个「当前时间」工具。4.1 定义工具fromlangchain_core.toolsimporttoolfromdatetimeimportdatetimetooldefget_current_time()-str:返回当前日期和时间。returndatetime.now().strftime(%Y-%m-%d %H:%M:%S)4.2 构建带记忆的 Agentfromlangchain.agentsimportAgentExecutor,create_tool_calling_agentfromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain.memoryimportConversationBufferMemory# 记忆保存最近 10 轮对话memoryConversationBufferMemory(memory_keychat_history,return_messagesTrue,k10,)promptChatPromptTemplate.from_messages([(system,你是一个乐于助人的 AI 助手可以调用工具回答问题。),MessagesPlaceholder(variable_namechat_history),(human,{input}),MessagesPlaceholder(variable_nameagent_scratchpad),])agentcreate_tool_calling_agent(llm,[get_current_time],prompt)executorAgentExecutor(agentagent,tools[get_current_time],memorymemory)# 测试resultexecutor.invoke({input:现在几点了})print(result[output])运行后Agent 会调用get_current_time工具并返回当前时间。由于配置了 Memory后续对话中 Agent 能记住之前聊过的内容。5. 加入 RAG让 Agent 拥有私有知识库接下来我们把 RAG 集成进 Agent让它能基于本地文档回答问题。5.1 构建向量知识库fromlangchain_community.document_loadersimportTextLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_community.vectorstoresimportChroma# 1. 加载文档loaderTextLoader(knowledge_base.txt)docsloader.load()# 2. 切块splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50,)chunkssplitter.split_documents(docs)# 3. 向量化并存储embeddingsOpenAIEmbeddings()vectorstoreChroma.from_documents(documentschunks,embeddingembeddings,persist_directory./chroma_db,)# 4. 创建检索器retrievervectorstore.as_retriever(search_kwargs{k:3})5.2 把检索器封装成工具tooldefsearch_knowledge_base(query:str)-str:在私有知识库中检索与 query 相关的内容。docsretriever.invoke(query)return\n\n.join(doc.page_contentfordocindocs)5.3 组合进 Agenttools[get_current_time,search_knowledge_base]agentcreate_tool_calling_agent(llm,tools,prompt)executorAgentExecutor(agentagent,toolstools,memorymemory)resultexecutor.invoke({input:根据知识库我们公司的退款政策是什么})print(result[output])当用户问题涉及私有知识时Agent 会自动调用search_knowledge_base检索相关片段再基于检索结果作答。6. 用 MCP 统一接入外部工具MCP 的价值在于「一次开发处处复用」。我们用fastmcp写一个简单的 MCP 服务器暴露一个「天气查询」工具。6.1 定义 MCP 服务器# weather_server.pyfromfastmcpimportFastMCPimportrandom mcpFastMCP(WeatherServer)mcp.tool()defget_weather(city:str)-str:查询指定城市的天气模拟数据。conditions[晴,多云,小雨,阴]returnf{city}{random.choice(conditions)}气温{random.randint(15,30)}°Cif__name____main__:mcp.run()6.2 在 Agent 中连接 MCP 工具fromlangchain_mcp_adapters.toolsimportload_mcp_toolsfrommcpimportClientSession,StdioServerParametersfrommcp.client.stdioimportstdio_client server_paramsStdioServerParameters(commandpython,args[weather_server.py],)asyncwithstdio_client(server_params)as(read,write):asyncwithClientSession(read,write)assession:awaitsession.initialize()mcp_toolsawaitload_mcp_tools(session)# 把 MCP 工具与本地工具合并all_tools[get_current_time,search_knowledge_base]mcp_tools agentcreate_tool_calling_agent(llm,all_tools,prompt)executorAgentExecutor(agentagent,toolsall_tools,memorymemory)resultexecutor.invoke({input:北京今天天气怎么样})print(result[output])这样Agent 就能通过 MCP 协议调用外部天气服务而无需关心服务端实现细节。7. 沉淀 Skills把复杂流程封装成可复用能力Skills 是更高层的抽象。假设我们经常需要「写周报」可以把这一流程封装成一个 Skill。7.1 定义 Skillfromlangchain_core.toolsimporttooltooldefwrite_weekly_report(work_summary:str,next_plan:str)-str:根据工作内容生成周报。reportf ## 本周工作{work_summary}## 下周计划{next_plan}## 风险与问题 - 待补充 returnreport7.2 让 Agent 自动选择 Skill把 Skill 也注册为工具Agent 会根据用户意图自动调用tools[get_current_time,search_knowledge_base,write_weekly_report,]agentcreate_tool_calling_agent(llm,tools,prompt)executorAgentExecutor(agentagent,toolstools,memorymemory)resultexecutor.invoke({input:帮我写周报本周完成了登录模块开发下周计划做支付模块。})print(result[output])Agent 识别到「写周报」意图后会调用write_weekly_report工具把用户输入整理成结构化周报。8. 完整架构图下面用 Mermaid 展示一个完整 Agent 的架构是否用户输入LLM 推理是否需要工具?Tool 调用MCP 服务器RAG 检索Skills 执行外部 API向量数据库本地函数直接生成回复Memory 记忆输出给用户9. 实战踩坑与优化建议9.1 Memory 与 Tool 的冲突当对话历史很长时Prompt 会膨胀导致模型注意力分散。建议用ConversationSummaryBufferMemory自动摘要旧对话。限制k值只保留最近几轮。9.2 RAG 检索质量切块大小要适中500~800 字符太小丢失语义太大检索不精准。用混合检索关键词 向量提升召回率。检索结果要带来源方便 Agent 引用。9.3 MCP 连接稳定性MCP 服务器要处理异常避免崩溃导致 Agent 挂起。生产环境建议用 SSE/HTTP 传输而不是 stdio。9.4 Skills 的粒度Skill 不宜过大否则复用性差。每个 Skill 要有清晰的输入输出定义和描述方便 LLM 理解何时调用。10. 总结与下一步本文从零搭建了一个集成了LLM Memory Tool RAG MCP Skills的完整 Agent并给出了可运行的代码。核心要点LLM是大脑负责推理与决策。Memory让 Agent 有短期与长期记忆。Tool让 Agent 能操作外部世界。RAG让 Agent 拥有私有知识。MCP统一了工具接入标准提升复用性。Skills把复杂流程沉淀为可复用能力。下一步你可以尝试把 Memory 换成 Redis 或向量库实现跨会话持久记忆。接入真实业务 API如订单查询、CRM。用 LangGraph 实现更复杂的多步 Agent 工作流。为 Agent 增加多模态能力图片理解、语音交互。希望这份笔记对你有帮助欢迎在评论区交流你的 Agent 实战经验
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。