ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

从 0 搭一个 AI Agent:用 LangChain + MCP 让大模型自己调用工具完成任务

从 0 搭一个 AI Agent:用 LangChain + MCP 让大模型自己调用工具完成任务 平时用大模型我们是一问一答它只动嘴不动手。但有些活其实可以让它自己去找资料、调接口、跑命令比如查一下杭州明后天的天气再帮我订个提醒。这种能自己动手干活的模型就叫 Agent智能体。这篇我就从零搭一个最小可用的 Agent让大模型自己去调用工具代码不多都能跑。先搞明白 Agent 到底在干嘛Agent 和普通聊天最大的区别是它多了个循环。普通对话你问 → 它答 → 结束。Agent你给个任务 → 大模型决定我要用哪个工具 → 工具执行 → 结果反馈给大模型 → 大模型再看下一步 → 直到任务完成。所以 Agent 的核心就三样一个能思考的大模型它负责决定下一步干啥一堆工具实际上是函数比如查天气、算个东西、读文件一个循环机制让它能反复思考→行动→看结果我们这里用 LangChain 的 Agent 框架把这些串起来工具用 MCP 来接入。为什么提 MCP以前接工具很麻烦每个工具都要自己写一套调用的代码。MCPModel Context Protocol是个统一标准工具按这个协议暴露出来大模型就能通用地调用不用每家写一套。现在很多现成的工具服务都支持 MCP接起来省事很多。装环境pipinstalllangchain langchain-openai langchain-community mcp openai代码1. 接大模型importosfromlangchain_openaiimportChatOpenAI os.environ[DEEPSEEK_API_KEY]sk-你的keyllmChatOpenAI(modeldeepseek-chat,api_keyos.environ[DEEPSEEK_API_KEY],base_urlhttps://api.deepseek.com/v1,temperature0.2,)2. 定义两个工具工具其实就是普通函数加个装饰器把它描述给大模型就行。fromlangchain.toolsimporttoolfromdatetimeimportdatetimetooldefget_current_time()-str:返回当前的日期和时间。returndatetime.now().strftime(%Y-%m-%d %H:%M:%S)tooldefadd_numbers(a:float,b:float)-float:把两个数字加起来。returnab tools[get_current_time,add_numbers]大模型就靠函数名和 docstring 来理解这个工具能干啥、怎么用所以 docstring 写得清楚点很重要别惜字。3. 创建 Agentfromlangchain.agentsimportcreate_tool_calling_agent,AgentExecutorfromlangchain_core.promptsimportChatPromptTemplate promptChatPromptTemplate.from_messages([(system,你是一个乐于助人的助手会调用工具来完成任务。),(placeholder,{chat_history}),(human,{input}),(placeholder,{agent_scratchpad}),])agentcreate_tool_calling_agent(llm,tools,prompt)executorAgentExecutor(agentagent,toolstools,verboseTrue)4. 跑起来# 问一个需要工具的问题responseexecutor.invoke({input:现在几点了顺便帮我算一下 123 456 等于多少。})print(response[output])verboseTrue 会打印出 Agent 的思考过程你能看到它先调了 get_current_time又调了 add_numbers最后才组织答案。这个过程看着还挺有意思。踩过的坑坑现象怎么解函数没写 docstring大模型根本不知道有这个工具每个工具都写清楚干啥 参数是啥工具返回格式不统一大模型解析结果出错尽量统一返回字符串别混着返回 dict循环不设上限复杂任务卡死、一直转给 AgentExecutor 加 max_iterations温度太高Agent 决策忽左忽右决策任务温度压到 0.2 以下循环上限这个我专门提一句不加的话遇到那种绕弯子的任务Agent 可能陷入死循环一直调工具很费 token。加个限制executorAgentExecutor(agentagent,toolstools,verboseTrue,max_iterations5)再进一步用 MCP 接现成工具如果不想自己写工具想直接用社区现成的可以这样接一个 MCP 服务器示例是接一个文件系统工具fromlangchain_mcp_adaptersimportload_mcp_server# 假设本地跑了个 MCP 服务地址如下mcp_toolsload_mcp_server(https://example.com/mcp,my-tool)tools[get_current_time,add_numbers]mcp_tools这样就能把别的团队已经做好的工具直接接进来不用重复造轮子。收个尾最小 Agent 其实就这么点东西一个会思考的模型 几个工具 一个循环。难的是把工具描述写清楚、把循环控制好。先把上面这个跑通再慢慢加复杂工具方向就不会错。你打算用 Agent 干点什么活评论区聊聊说不定能一起想些有意思的用法。
返回列表