我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

从RAG到智能体:构建具备规划与工具调用能力的AI应用实践

从RAG到智能体:构建具备规划与工具调用能力的AI应用实践 如果你在2024年还在用“AI就是聊天机器人”的视角看问题那你可能已经落后了整整一个技术代际。真正的变革正发生在那些能够自主规划、调用工具、并完成复杂任务的“智能体”身上。吴恩达教授最新的《Agentic AI》课程之所以被圈内公认为“最好的Agent教程”正是因为它精准地捕捉到了这一转变的核心从被动响应的聊天机器人到主动解决问题的智能代理。这门课程的价值远不止于介绍几个新概念。它系统性地拆解了构建一个实用AI智能体所需的四大支柱Agent框架、知识图谱、Skills技能和Vibe Coding氛围编码。这四者共同构成了现代AI应用从“玩具”走向“生产力工具”的工程化路径。对于开发者而言这意味着你不再需要从零开始摸索如何让大模型稳定地调用API、如何管理复杂的上下文、如何让AI理解你业务中的实体关系。本文将带你深入解读这门课程的精髓并提供一个可落地的实践框架。你将不仅理解这些概念“是什么”更能掌握“如何用”。我们会从最基础的智能体工作流开始逐步构建一个具备知识推理和工具调用能力的智能体原型并探讨Vibe Coding这一新兴开发范式如何改变我们与代码的交互方式。无论你是想将AI集成到现有产品中还是探索下一代人机协作模式这篇文章都将提供清晰的路线图和可直接运行的代码。1. 为什么说“Agentic AI”是下一个必须掌握的技能在传统的RAG检索增强生成架构中AI的角色更像是一个“知识复读机”用户提问系统检索相关文档片段AI基于这些片段生成回答。这个过程是被动的、线性的严重受限于检索的质量。而Agentic AI的核心思想是赋予AI“主动性”和“规划能力”。一个真正的智能体应该能做到理解意图并拆解任务将用户模糊的请求如“帮我分析一下上季度的销售数据”分解为一系列可执行的具体步骤连接数据库、查询数据、执行统计分析、生成可视化图表。自主选择并调用工具它内置或可以访问一个“技能库”Skills知道在什么情况下该使用Python计算、调用哪个API、查询哪个数据库。进行多轮迭代与反思如果一次执行的结果不理想它能分析错误原因调整策略后重新尝试。例如第一次API调用返回了错误格式它能捕获异常调整参数后再次调用。管理长期记忆与上下文通过知识图谱等技术它能记住对话历史、用户偏好、领域实体及其复杂关系实现连贯的、个性化的交互。吴恩达的课程之所以重要是因为它将学术界的前沿理念与工业界的最佳实践相结合指出了实现上述能力的标准化路径。对于开发者来说学习Agentic AI不再是研究一个炫酷的Demo而是掌握一套构建可靠、可维护、可扩展的AI驱动应用的系统方法。2. 核心概念拆解Agent, 知识图谱, Skills, Vibe Coding在深入实践之前我们需要清晰地定义这四个核心概念以及它们如何协同工作。2.1 Agent智能体从“执行者”到“规划者”智能体是一个能够感知环境、做出决策并执行行动以实现目标的软件实体。在AI语境下它通常由一个大型语言模型作为“大脑”负责推理和规划并辅以一系列工具和记忆模块。核心组件规划器将目标分解为子任务序列。工具调用器根据子任务选择并执行合适的工具Skills。状态记忆器维护当前任务的状态、历史动作和结果。反思器评估行动结果决定是继续、重试还是调整计划。2.2 知识图谱为智能体注入“结构化记忆”知识图谱是一种用图结构来建模和存储知识的技术。节点代表实体如“产品A”、“客户张三”边代表实体间的关系如“购买”、“属于”。对智能体的价值超越向量检索向量数据库擅长语义相似性搜索但无法回答“客户张三购买过的所有产品中哪些是由供应商李四提供的”这类需要多跳推理的问题。知识图谱可以。维护复杂关系清晰地表征一对多、多对多关系帮助智能体理解业务逻辑。动态更新与推理新的关系可以被添加并能基于现有图谱进行逻辑推理。2.3 Skills技能智能体的“手脚”Skills是智能体可以调用的具体功能单元。一个技能可以是一个Python函数、一个HTTP API接口、一个数据库查询甚至是对另一个智能体的调用。关键特性标准化描述每个Skill都需要有清晰的名称、功能描述、输入参数格式和输出格式。这通常通过OpenAI的Function Calling或新兴的Model Context Protocol标准来实现以便LLM能理解何时以及如何调用它。可组合性简单的Skills可以组合成复杂的业务流程。安全性Skill的执行需要受到权限和资源管控。2.4 Vibe Coding氛围编码一种新的开发范式Vibe Coding指的是一种高度依赖自然语言提示、AI代码生成和交互式反馈的编程方式。开发者通过描述“想要什么感觉Vibe”或“达到什么效果”来指导AI生成或修改代码而不是逐行手写。实践体现使用GitHub Copilot、Cursor、Claude Code等AI编程助手进行代码补全和文件级生成。用自然语言编写测试用例让AI生成对应代码。通过对话迭代式地重构和优化代码逻辑。与Agent开发的关系Vibe Coding极大地加速了Agent和Skill的开发过程。你可以快速原型化一个Skill的功能或者通过对话让AI帮你调试智能体的规划逻辑。3. 环境准备构建你的第一个智能体工作台我们将使用目前最流行、生态最成熟的LangChain框架来构建智能体。同时为了演示知识图谱我们会引入Neo4j图数据库。前置条件Python 3.10 或更高版本OpenAI API 密钥或其他兼容OpenAI API的LLM服务密钥可选Docker用于运行Neo4j安装核心依赖 创建一个新的Python虚拟环境然后安装以下包# 创建并激活虚拟环境以conda为例 conda create -n agentic-ai python3.10 conda activate agentic-ai # 安装核心库 pip install langchain langchain-openai langchain-experimental # 安装Neo4j驱动和工具 pip install neo4j langchain-community # 安装用于Vibe Coding的Jupyter环境可选但推荐 pip install jupyter环境变量配置 创建一个名为.env的文件用于安全存储你的密钥# .env OPENAI_API_KEYyour_openai_api_key_here # 如果你使用Neo4j AuraDB云服务或本地Docker实例 NEO4J_URIbolt://localhost:7687 NEO4J_USERNAMEneo4j NEO4J_PASSWORDyour_password_here在代码中使用python-dotenv加载它们# config.py from dotenv import load_dotenv import os load_dotenv() OPENAI_API_KEY os.getenv(OPENAI_API_KEY) NEO4J_URI os.getenv(NEO4J_URI) NEO4J_USERNAME os.getenv(NEO4J_USERNAME) NEO4J_PASSWORD os.getenv(NEO4J_PASSWORD)4. 核心流程拆解四步构建一个功能型智能体一个基础智能体的构建流程可以抽象为以下四个步骤我们将逐步实现。4.1 第一步定义并封装Skills工具智能体需要工具才能工作。我们首先创建几个简单的Skills。# skills/calculator_skills.py def add(a: float, b: float) - float: 将两个数字相加。 return a b def multiply(a: float, b: float) - float: 将两个数字相乘。 return a * b # skills/web_search_skills.py import requests from typing import Optional def search_web(query: str, max_results: int 3) - Optional[str]: 使用DuckDuckGo即时答案API进行网络搜索模拟。 在实际项目中你可能需要使用SerperAPI、Google Custom Search等。 # 这是一个简化的模拟函数 print(f[模拟搜索] 搜索查询: {query}) # 模拟返回一些结果 mock_results [ f关于{query}的搜索结果1: ..., f关于{query}的搜索结果2: ..., f关于{query}的搜索结果3: ..., ] return \n.join(mock_results[:max_results])接下来我们需要将这些Python函数转换成LangChain智能体能够识别的Tool对象。# agent_tools.py from langchain.tools import Tool from skills.calculator_skills import add, multiply from skills.web_search_skills import search_web # 创建Tool对象需要提供名称、函数、描述 calculator_tool Tool( nameCalculator, funclambda query: eval(query), # 注意实际生产中应使用更安全的表达式求值库如numexpr description用于执行数学计算。输入应该是一个有效的数学表达式例如 3 5 或 2 * 10。 ) add_tool Tool( nameAdder, funcadd, description专门用于将两个数字相加。输入应该是两个用逗号分隔的数字例如 5, 3。 ) search_tool Tool( nameWebSearch, funcsearch_web, description用于搜索网络信息。输入是一个搜索查询字符串。 ) # 将所有工具放入一个列表 tools [calculator_tool, add_tool, search_tool]关键点description字段至关重要LLM完全依赖这个描述来决定是否以及如何调用该工具。描述必须清晰、准确并说明输入格式。4.2 第二步初始化智能体使用ReAct模式LangChain提供了多种智能体类型。我们使用经典的“ReAct”模式它要求LLM为每一步输出“Thought思考”、“Action行动”、“Observation观察”从而形成推理链。# initialize_agent.py from langchain.agents import initialize_agent, AgentType from langchain_openai import ChatOpenAI from agent_tools import tools from config import OPENAI_API_KEY # 1. 初始化LLM llm ChatOpenAI( modelgpt-3.5-turbo, # 或 gpt-4 temperature0, # 对于确定性任务温度设为0 openai_api_keyOPENAI_API_KEY ) # 2. 初始化智能体 agent initialize_agent( toolstools, llmllm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, # 使用ReAct范式 verboseTrue, # 设置为True以查看智能体的思考过程调试时非常有用 handle_parsing_errorsTrue # 优雅地处理解析错误 ) print(智能体初始化完成)4.3 第三步运行智能体并观察其推理过程现在让我们向智能体提出一个需要多步推理和工具调用的复杂问题。# run_agent.py from initialize_agent import agent if __name__ __main__: # 一个需要规划的问题 complex_query 首先请计算 (12 乘以 5) 的结果。 然后将这个结果加上 18。 最后基于最终的数字去搜索一下这个数字在数学中有什么特别的含义。 print(f用户提问: {complex_query}) print(- * 50) try: response agent.run(complex_query) print(\n *50) print(f智能体最终回答: {response}) except Exception as e: print(f执行过程中出现错误: {e})当你运行这段代码并将verboseTrue时你将在控制台看到类似以下的输出这正是ReAct模式的精髓 Entering new AgentExecutor chain... 我需要按步骤解决这个问题。首先计算12乘以5。 Thought: 我应该使用计算器工具来计算12乘以5。 Action: Calculator Action Input: 12 * 5 Observation: 60 Thought: 现在我需要将60加上18。 Action: Adder Action Input: 60, 18 Observation: 78 Thought: 现在我有了最终数字78。我需要搜索78在数学中有什么特别含义。 Action: WebSearch Action Input: 数字78在数学中的特殊含义 Observation: [模拟搜索] 搜索查询: 数字78在数学中的特殊含义... 关于数字78在数学中的特殊含义的搜索结果1: 78是第12个三角形数... Thought: 我已经完成了所有步骤。我可以给出最终答案了。 Final Answer: 首先12乘以5等于60。然后60加18等于78。数字78是第12个三角形数也是一个半完全数等等。4.4 第四步集成知识图谱使用Neo4j现在我们为智能体增加“记忆”和“推理”能力。假设我们有一个简单的电影知识图谱。1. 启动并初始化Neo4j数据库如果你有Docker可以快速启动一个Neo4j实例docker run -d \ --name neo4j-agent \ -p 7474:7474 -p 7687:7687 \ -e NEO4J_AUTHneo4j/your_password_here \ neo4j:latest访问http://localhost:7474使用浏览器登录用户名neo4j密码your_password_here。然后运行以下Cypher语句创建一些示例数据// 创建电影和人物节点 CREATE (m1:Movie {title: The Matrix, released: 1999, tagline: Welcome to the Real World}) CREATE (m2:Movie {title: Inception, released: 2010, tagline: Your mind is the scene of the crime}) CREATE (p1:Person {name: Keanu Reeves, born: 1964}) CREATE (p2:Person {name: Carrie-Anne Moss, born: 1967}) CREATE (p3:Person {name: Leonardo DiCaprio, born: 1974}) CREATE (p4:Person {name: Christopher Nolan, born: 1970}) // 创建关系 MATCH (m:Movie {title:The Matrix}), (p:Person {name:Keanu Reeves}) CREATE (p)-[:ACTED_IN {roles:[Neo]}]-(m) MATCH (m:Movie {title:The Matrix}), (p:Person {name:Carrie-Anne Moss}) CREATE (p)-[:ACTED_IN {roles:[Trinity]}]-(m) MATCH (m:Movie {title:Inception}), (p:Person {name:Leonardo DiCaprio}) CREATE (p)-[:ACTED_IN {roles:[Cobb]}]-(m) MATCH (m:Movie {title:Inception}), (p:Person {name:Christopher Nolan}) CREATE (p)-[:DIRECTED]-(m)2. 创建知识图谱查询Skill我们将创建一个新的Skill允许智能体查询这个电影图谱。# skills/kg_query_skills.py from neo4j import GraphDatabase from config import NEO4J_URI, NEO4J_USERNAME, NEO4J_PASSWORD class Neo4jQueryTool: def __init__(self): self.driver GraphDatabase.driver(NEO4J_URI, auth(NEO4J_USERNAME, NEO4J_PASSWORD)) def query(self, cypher_query: str) - str: 执行一个Cypher查询并返回结果。 try: with self.driver.session() as session: result session.run(cypher_query) # 将结果转换为易读的字符串 records list(result) if not records: return 查询未返回任何结果。 output [] for record in records: output.append(str(record)) return \n.join(output[:5]) # 限制返回数量 except Exception as e: return f查询执行出错: {e} finally: self.driver.close() def __call__(self, input_text: str) - str: # 这里可以添加一个简单的逻辑将自然语言转换为Cypher查询。 # 为了简化我们假设输入已经是Cypher语句。在实际应用中你需要一个LLM来转换。 return self.query(input_text) # 创建工具实例 kg_tool Neo4jQueryTool()3. 将知识图谱工具加入智能体更新你的agent_tools.py# agent_tools.py (更新版) from langchain.tools import Tool from skills.calculator_skills import add, multiply from skills.web_search_skills import search_web from skills.kg_query_skills import kg_tool # ... 其他工具 ... neo4j_tool Tool( nameNeo4jMovieGraph, funckg_tool, # 直接使用可调用对象 description用于查询电影知识图谱。输入必须是一个有效的Cypher查询语句例如 MATCH (m:Movie) RETURN m.title LIMIT 5。 ) # 更新工具列表 tools [calculator_tool, add_tool, search_tool, neo4j_tool]现在你的智能体就具备了查询知识图谱的能力。你可以问它“使用Neo4jMovieGraph工具找出Christopher Nolan导演的电影。” 智能体需要生成正确的Cypher语句并调用该工具。5. 完整示例一个集成了多种能力的电影信息助手让我们将所有组件组合起来创建一个更实用的示例。这个智能体可以回答关于电影的复杂问题结合计算、搜索和图谱查询。# movie_agent_demo.py from langchain.agents import initialize_agent, AgentType from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from agent_tools import tools # 导入包含neo4j_tool的tools列表 from config import OPENAI_API_KEY # 1. 使用更强大的模型和记忆 llm ChatOpenAI(modelgpt-4, temperature0, openai_api_keyOPENAI_API_KEY) memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 2. 初始化带记忆的智能体 agent_executor initialize_agent( tools, llm, agentAgentType.CONVERSATIONAL_REACT_DESCRIPTION, # 支持对话的ReAct verboseTrue, memorymemory, handle_parsing_errorsTrue ) # 3. 模拟对话 queries [ Keanu Reeves演过哪些电影用知识图谱查一下。, 这些电影里哪部上映得更早计算一下它和现在的年份差。, 帮我搜索一下这部电影最近的新闻。 ] print(开始与电影信息助手对话...\n) for query in queries: print(f用户: {query}) response agent_executor.run(inputquery) print(f助手: {response}\n{-*60}\n)在这个示例中智能体需要理解第一个问题需要调用Neo4jMovieGraph工具并生成类似MATCH (p:Person {name:Keanu Reeves})-[:ACTED_IN]-(m:Movie) RETURN m.title的Cypher。从结果中提取电影名和上映年份进行逻辑比较可能需要调用计算工具。根据选出的电影调用WebSearch工具去获取最新信息。6. Vibe Coding实战用自然语言驱动开发Vibe Coding不是某个具体工具而是一种工作流。我们以开发上面那个Neo4jQueryTool为例展示如何用AI编程助手如Cursor加速开发。传统开发流程打开IDE新建文件kg_query_skills.py。回忆neo4jPython驱动语法手写GraphDatabase.driver连接代码。编写query方法手动处理会话、结果迭代和异常捕获。反复运行测试调试语法和逻辑错误。Vibe Coding流程在Cursor中新建文件然后直接输入自然语言描述// 请帮我创建一个Python类 Neo4jQueryTool用于连接Neo4j图数据库并执行查询。 // 它应该从环境变量中读取连接信息NEO4J_URI, USERNAME, PASSWORD。 // 它有一个query方法接收一个Cypher查询字符串执行它并将结果记录转换为一个可读的字符串返回。请包含适当的错误处理。 // 最后创建一个该类的实例kg_tool。Cursor基于GPT-4几乎会瞬间生成我们之前在skills/kg_query_skills.py中展示的完整代码。你可能会发现它没有关闭driver连接。于是你继续用自然语言对话“请在查询完成后安全地关闭driver连接。”AI会修改代码在__call__方法或一个新的上下文管理器中添加driver.close()。整个过程你的核心工作是“描述需求”和“审查代码”而不是逐行敲击键盘。Vibe Coding的核心技巧精准描述像给一个资深程序员布置任务一样描述需求包括输入、输出、边界条件和异常处理。小步迭代不要指望一句话生成一个完美系统。先搭建框架再逐个功能细化。利用上下文AI编程助手能记住当前文件甚至整个项目的上下文在修改代码时可以引用之前的代码片段。人做架构AI做实现你负责设计模块划分、接口定义和核心算法思路让AI去填充具体的实现代码。7. 常见问题与排查思路在开发和使用智能体时你会遇到一些典型问题。下表列出了常见问题及其解决方法问题现象可能原因排查方式解决方案智能体无法正确选择工具1. Tool的描述不够清晰。2. LLM温度temperature设置过高导致输出不稳定。3. 用户指令过于模糊。1. 查看verboseTrue时的Thought日志看LLM是否理解了工具用途。2. 检查Tool的description字段是否准确描述了功能和输入格式。1. 重写Tool的描述使其更精确、无歧义。2. 将temperature设为0或一个较低的值如0.1。3. 在系统提示词System Prompt中明确智能体的角色和可用工具范围。工具调用参数格式错误LLM生成的Action Input不符合工具函数定义的参数格式。查看错误日志对比Action Input和工具函数期望的参数。1. 在Tool描述中严格定义输入格式如“两个用逗号分隔的数字”。2. 使用LangChain的StructuredTool来定义具有严格Pydantic参数模式的工具。智能体陷入循环或无法结束1. 任务规划逻辑出现死循环。2. 达到最大迭代次数限制。观察verbose日志看智能体是否在重复相同的Thought/Action而无进展。1. 在initialize_agent中设置max_iterations如10和early_stopping_method。2. 优化系统提示词指导智能体在任务完成后明确输出“Final Answer”。知识图谱查询返回空或错误1. Cypher查询语句生成错误。2. 图谱中不存在匹配的数据。3. 数据库连接失败。1. 打印出智能体生成的原始Cypher语句。2. 在Neo4j Browser中手动执行该语句验证。3. 检查Neo4j服务状态和连接参数。1. 实现一个“文本到Cypher”的转换层使用一个专门的LLM调用将自然语言问题转换为Cypher而不是让主智能体直接生成。2. 确保图谱数据已正确导入。3. 验证环境变量和网络连接。运行速度慢1. 每次工具调用都涉及LLM推理耗时。2. 网络搜索或数据库查询本身慢。使用性能分析工具确定耗时主要发生在哪个环节。1. 考虑使用更小、更快的LLM如GPT-3.5 Turbo作为智能体的“大脑”。2. 对工具调用结果进行缓存。3. 优化知识图谱的查询和索引。8. 最佳实践与工程建议要将智能体从实验原型推进到生产系统需要遵循以下工程最佳实践1. 工具设计的原子性与安全性原子性每个Skill应只完成一件明确、独立的事情。避免创建“瑞士军刀”式的大工具。这有利于复用、测试和LLM理解。安全性对工具调用进行沙箱隔离和权限控制。特别是执行代码如eval、访问文件系统或调用外部API的工具必须进行严格的输入验证和资源限制。2. 提示词工程与系统角色设定明确的系统提示在初始化智能体时通过agent_kwargs传入一个强大的系统提示明确其角色、职责、输出格式和约束。例如“你是一个专业的电影数据分析助手。你必须使用提供的工具来获取信息不能编造。在最终回答前请确保你的答案有工具调用结果作为依据。”少样本学习在提示词中提供一两个工具调用和回答的示例能显著提升智能体行为的稳定性。3. 可观测性与日志记录全链路日志记录每一次用户输入、LLM的完整思考链Thought/Action/Observation、工具调用的输入输出、最终回答。这对于调试和优化至关重要。监控与告警监控智能体的平均响应时间、工具调用失败率、LLM令牌消耗等关键指标。4. 知识图谱的构建与维护并非所有数据都适合图谱知识图谱适用于关系密集型、需要多跳推理的领域如社交网络、供应链、风控。对于简单的文档检索向量数据库可能更合适。通常采用“向量图谱”的混合检索架构。持续更新建立流程将业务系统中产生的新实体和关系同步到知识图谱中确保智能体的“记忆”不过时。5. 拥抱Vibe Coding但保持主导权AI是副驾驶你是机长使用AI生成代码时你必须完全理解生成的逻辑。对关键业务逻辑、安全相关代码、性能敏感部分要进行严格的人工审查和测试。建立团队规范在团队中推广Vibe Coding时应约定代码风格、注释标准、测试覆盖率要求确保AI生成的代码符合项目规范。9. 总结与后续学习方向通过本文的实践你已经走完了构建一个基础Agentic AI系统的核心路径从定义Skills、初始化智能体、集成知识图谱到运用Vibe Coding提升开发效率。吴恩达课程的精髓在于这种系统化的工程思维——将前沿的AI能力封装成可管理、可组合、可观测的软件组件。下一步你可以从以下几个方向深入探索更强大的Agent框架LangChain是优秀的起点但生产级项目可以关注LangGraph用于构建有状态、多智能体工作流、AutoGen微软推出的多智能体对话框架、CrewAI专注于角色扮演和协作的智能体框架。深入多智能体协作让多个具有不同专长如查询、分析、写作的智能体协同工作解决更复杂的问题。实现更复杂的工具调用集成企业内部API、数据库、云服务让智能体真正成为业务工作流的一部分。研究智能体评估如何定量评估一个智能体的可靠性、准确性和效率这是一个尚未完全解决的挑战。AI智能体的时代已经到来它正在从概念迅速转化为生产力。掌握Agentic AI意味着你不仅是在使用AI更是在设计和构建新一代的、具备自主解决问题能力的软件系统。现在就从运行文中的第一个示例代码开始亲手点燃这个智能引擎。
返回列表