Files
ai-agent-dev/28_课程总结.ipynb
2026-07-08 10:09:42 +08:00

558 lines
21 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 28_课程总结从入门到实践的 AI 智能体学习路线\n",
"\n",
"## 学习目标\n",
"1. 回顾课程核心知识点,形成完整的知识体系\n",
"2. 了解 AI 智能体领域的前沿发展趋势和拓展方向\n",
"3. 规划后续自主学习路径和实践建议\n",
"\n",
"本节课不是学习一个全新的技术点而是把前面学过的内容串起来帮助大家形成一张完整的“AI 智能体知识地图”。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. 这门课到底学了什么\n",
"\n",
"如果用一句话总结这门课:\n",
"\n",
"> 我们学习了如何把大模型从“聊天机器人”升级为“能够使用工具、执行流程、完成任务的智能体”。\n",
"\n",
"普通大模型更像一个会回答问题的人,而智能体更像一个会办事的助手。它不只是生成文字,还可以:\n",
"\n",
"- 理解用户目标\n",
"- 拆解任务步骤\n",
"- 调用外部工具\n",
"- 读取和检索资料\n",
"- 根据中间结果继续决策\n",
"- 最终交付完整结果\n",
"\n",
"所以,智能体的核心不是“模型有多聪明”,而是“模型能否被组织进一个可靠的工作流程中”。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. AI 智能体的核心知识地图\n",
"\n",
"可以把整个课程内容分成 6 个层次:\n",
"\n",
"| 层次 | 核心内容 | 通俗理解 |\n",
"| --- | --- | --- |\n",
"| 大模型基础 | Prompt、模型调用、消息格式 | 让模型听懂我们的问题 |\n",
"| LangChain | 链、提示词、工具、RAG | 把模型能力组件化 |\n",
"| 工具调用 | 搜索、计算、文件读取、API | 让模型能使用外部能力 |\n",
"| RAG 知识库 | 文档切分、向量检索、基于资料回答 | 让模型先查资料再回答 |\n",
"| LangGraph | State、Node、Edge、条件分支 | 把智能体流程画成流程图 |\n",
"| 项目实战 | 知识库助手、多工具智能体 | 把知识点组合成完整应用 |\n",
"\n",
"学习时不要只记住某个库的 API更重要的是理解这些模块分别解决什么问题。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. 回顾一Prompt 是智能体的起点\n",
"\n",
"Prompt 可以理解为我们给大模型的任务说明书。\n",
"\n",
"一个好的 Prompt 通常会说明:\n",
"\n",
"1. 你是谁:模型要扮演什么角色\n",
"2. 你要做什么:具体任务是什么\n",
"3. 你依据什么:是否需要参考资料\n",
"4. 你怎么输出:输出格式有什么要求\n",
"\n",
"下面用一个简单函数模拟 Prompt 拼接。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def build_prompt(role, task, context, output_format):\n",
" prompt = f\"角色:{role}\\n\"\n",
" prompt += f\"任务:{task}\\n\"\n",
" prompt += f\"参考资料:{context}\\n\"\n",
" prompt += f\"输出格式:{output_format}\"\n",
" return prompt\n",
"\n",
"\n",
"prompt = build_prompt(\n",
" role=\"AI 智能体课程助教\",\n",
" task=\"解释什么是工具调用\",\n",
" context=\"工具调用是指模型根据任务选择并使用外部函数或 API。\",\n",
" output_format=\"用三句话通俗解释\",\n",
")\n",
"\n",
"print(prompt)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 代码解释\n",
"\n",
"这段代码用于复习 Prompt 的基本组成:\n",
"\n",
"1. `build_prompt` 是一个提示词构造函数。\n",
"2. `role` 表示模型扮演的角色,例如课程助教、数据分析师、代码助手。\n",
"3. `task` 表示模型要完成的具体任务。\n",
"4. `context` 表示参考资料,能够减少模型凭空发挥。\n",
"5. `output_format` 表示输出格式要求,可以让答案更稳定。\n",
"6. 函数内部通过字符串拼接生成完整 Prompt。\n",
"\n",
"真实项目中Prompt 往往不是随便写一句话,而是要像写任务说明书一样清晰。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. 回顾二:工具调用让智能体拥有外部能力\n",
"\n",
"大模型擅长理解和生成语言,但不擅长所有事情。\n",
"\n",
"例如数学计算、实时搜索、文件读取、数据库查询等任务,更适合交给工具完成。\n",
"\n",
"工具调用的基本流程是:\n",
"\n",
"```text\n",
"用户问题 -> 判断是否需要工具 -> 选择工具 -> 执行工具 -> 整理结果\n",
"```\n",
"\n",
"下面用一个简化例子复习工具选择和调用。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def calculate(expression):\n",
" return eval(expression)\n",
"\n",
"\n",
"def search_knowledge(keyword):\n",
" knowledge = {\n",
" \"LangChain\": \"LangChain 用于构建大模型应用。\",\n",
" \"LangGraph\": \"LangGraph 用于编排多步骤智能体流程。\",\n",
" }\n",
" return knowledge.get(keyword, \"没有找到相关知识。\")\n",
"\n",
"\n",
"def simple_tool_agent(question):\n",
" if \"计算\" in question:\n",
" expression = question.replace(\"计算\", \"\").strip()\n",
" result = calculate(expression)\n",
" return f\"我使用了计算工具,结果是:{result}\"\n",
"\n",
" if \"LangGraph\" in question:\n",
" result = search_knowledge(\"LangGraph\")\n",
" return f\"我使用了知识查询工具,结果是:{result}\"\n",
"\n",
" return \"这个问题暂时不需要调用工具。\"\n",
"\n",
"\n",
"print(simple_tool_agent(\"计算 25 * 4 + 8\"))\n",
"print(simple_tool_agent(\"LangGraph 是什么?\"))\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 代码解释\n",
"\n",
"这段代码复习了工具调用的基本思想:\n",
"\n",
"1. `calculate(expression)` 是计算工具,负责执行数学表达式。\n",
"2. `search_knowledge(keyword)` 是知识查询工具,负责从字典中查找资料。\n",
"3. `simple_tool_agent(question)` 是一个简单智能体入口。\n",
"4. 如果问题中包含“计算”,就提取表达式并调用计算工具。\n",
"5. 如果问题中包含 `LangGraph`,就调用知识查询工具。\n",
"6. 最终返回时,会说明使用了哪个工具以及工具结果。\n",
"\n",
"这里为了复习写得很简单。真实项目中,不建议直接对用户输入使用 `eval`,应使用更安全的计算库或严格校验。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5. 回顾三RAG 让模型基于资料回答\n",
"\n",
"RAG 是构建知识库问答系统时非常重要的技术。\n",
"\n",
"它解决的问题是:大模型不知道你的私有资料,也可能记错公开知识。\n",
"\n",
"RAG 的思路很简单:\n",
"\n",
"1. 先把资料放入知识库\n",
"2. 用户提问时先检索相关资料\n",
"3. 再让模型基于检索资料回答\n",
"\n",
"下面用纯 Python 复习一个最小 RAG 流程。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"documents = [\n",
" \"RAG 的核心是先检索资料,再基于资料生成答案。\",\n",
" \"LangChain 提供文档加载、文本切分、检索器和链等能力。\",\n",
" \"LangGraph 适合构建有状态、多步骤、可分支的智能体流程。\",\n",
"]\n",
"\n",
"\n",
"def retrieve_by_keyword(question, documents):\n",
" scored_docs = []\n",
" for doc in documents:\n",
" score = len(set(question) & set(doc))\n",
" scored_docs.append((score, doc))\n",
"\n",
" scored_docs.sort(reverse=True, key=lambda item: item[0])\n",
" return scored_docs[0][1]\n",
"\n",
"\n",
"def rag_answer(question):\n",
" context = retrieve_by_keyword(question, documents)\n",
" return f\"问题:{question}\\n参考资料{context}\\n回答请优先根据参考资料作答。\"\n",
"\n",
"\n",
"print(rag_answer(\"RAG 的核心流程是什么?\"))\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 代码解释\n",
"\n",
"这段代码复习了 RAG 的最小流程:\n",
"\n",
"1. `documents` 模拟知识库中的资料。\n",
"2. `retrieve_by_keyword` 是简化检索器,会给每条资料计算相关度分数。\n",
"3. `set(question) & set(doc)` 表示问题和文档中共同出现的字符。\n",
"4. `scored_docs.sort(...)` 按分数从高到低排序。\n",
"5. `rag_answer(question)` 先检索最相关资料,再把资料作为参考内容组织成回答。\n",
"\n",
"真实 RAG 项目通常会把关键词检索换成向量检索,把简单回答拼接换成大模型生成。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 6. 回顾四LangGraph 让流程更清晰\n",
"\n",
"当智能体只有一步时,普通函数就够了。\n",
"\n",
"但当智能体需要多步骤执行、条件判断、循环反思、工具协作时,就需要更清晰的流程编排。\n",
"\n",
"LangGraph 的核心概念可以简单理解为:\n",
"\n",
"| 概念 | 作用 | 通俗理解 |\n",
"| --- | --- | --- |\n",
"| State | 保存流程中的数据 | 任务档案袋 |\n",
"| Node | 一个处理步骤 | 流程图里的方框 |\n",
"| Edge | 节点之间的连接 | 流程图里的箭头 |\n",
"| Conditional Edge | 条件分支 | 根据情况走不同路线 |\n",
"\n",
"下面不用依赖 LangGraph先用普通 Python 模拟这种状态流转思想。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def plan_node(state):\n",
" goal = state[\"goal\"]\n",
" state[\"plan\"] = [f\"理解目标:{goal}\", \"执行任务\", \"汇总结果\"]\n",
" return state\n",
"\n",
"\n",
"def execute_node(state):\n",
" state[\"result\"] = [f\"已完成:{step}\" for step in state[\"plan\"]]\n",
" return state\n",
"\n",
"\n",
"def summary_node(state):\n",
" state[\"answer\"] = \"\\n\".join(state[\"result\"])\n",
" return state\n",
"\n",
"\n",
"state = {\"goal\": \"复习 AI 智能体课程\"}\n",
"state = plan_node(state)\n",
"state = execute_node(state)\n",
"state = summary_node(state)\n",
"\n",
"print(state[\"answer\"])\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 代码解释\n",
"\n",
"这段代码用普通 Python 模拟 LangGraph 的状态流转:\n",
"\n",
"1. `state` 是一个字典,相当于工作流中的共享状态。\n",
"2. `plan_node(state)` 模拟规划节点,会根据目标生成计划。\n",
"3. `execute_node(state)` 模拟执行节点,会执行计划中的每个步骤。\n",
"4. `summary_node(state)` 模拟汇总节点,会把结果整理成最终答案。\n",
"5. 每个节点都接收 `state`,修改后再返回 `state`。\n",
"\n",
"LangGraph 做的事情更规范、更强大,但底层思想就是让数据沿着流程图一步步流动。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 7. 一个智能体项目的标准开发流程\n",
"\n",
"开发智能体项目时,可以按照下面的步骤推进:\n",
"\n",
"1. 明确用户需求:用户到底要解决什么问题\n",
"2. 设计输入输出:用户输入什么,系统输出什么\n",
"3. 拆分功能模块:需要模型、工具、检索还是工作流\n",
"4. 先做最小版本:用简单规则和模拟数据跑通流程\n",
"5. 替换真实能力:接入真实模型、数据库、搜索 API 等\n",
"6. 增加调试日志:观察每一步中间结果\n",
"7. 优化稳定性:处理异常、补充测试、改进提示词\n",
"\n",
"初学者最容易犯的错误是:一上来就想做完整系统。更推荐先做 MVP再逐步升级。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 8. 智能体常见项目类型\n",
"\n",
"学完本课程后,可以尝试这些项目方向:\n",
"\n",
"| 项目类型 | 能力重点 | 示例 |\n",
"| --- | --- | --- |\n",
"| 知识库问答助手 | RAG、文档检索 | 课程资料问答、企业制度问答 |\n",
"| 多工具助手 | 工具选择、工具调用 | 搜索 + 计算 + 文件读取助手 |\n",
"| 自动报告生成器 | 任务分解、结果汇总 | 周报生成、调研报告生成 |\n",
"| 数据分析智能体 | 代码执行、图表生成 | 自动分析表格并输出结论 |\n",
"| 工作流智能体 | LangGraph、条件分支 | 审核流程、客服分流、任务调度 |\n",
"| 多智能体协作 | 角色分工、结果协同 | 产品经理 + 开发 + 测试协作 |\n",
"\n",
"建议从知识库问答和多工具助手开始,因为它们最容易理解,也最接近真实应用。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 9. AI 智能体的发展趋势\n",
"\n",
"AI 智能体还在快速发展,值得关注的方向包括:\n",
"\n",
"1. **更强的工具调用能力**:模型会更准确地选择工具、填写参数、处理工具错误。\n",
"2. **更可靠的工作流编排**:复杂任务会越来越依赖 LangGraph 这类流程框架。\n",
"3. **多模态智能体**:智能体不仅处理文字,还能理解图片、语音、视频和表格。\n",
"4. **企业级知识库**RAG 会和权限控制、审计、数据治理结合得更紧密。\n",
"5. **多智能体协作**:多个角色智能体分工合作,完成更复杂的任务。\n",
"6. **本地化和私有化部署**:越来越多企业会关注数据安全和私有模型部署。\n",
"\n",
"但无论技术怎么变,底层能力仍然离不开:需求分析、任务拆解、工具设计、流程控制和结果验证。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 10. 后续学习路线建议\n",
"\n",
"可以按照下面路线继续学习:\n",
"\n",
"### 第一阶段:打牢基础\n",
"- 熟悉 Python 函数、类、字典、列表\n",
"- 掌握 API 调用和 JSON 数据格式\n",
"- 熟悉 Prompt 编写和调试\n",
"\n",
"### 第二阶段:掌握框架\n",
"- 学习 LangChain 的 Prompt、Chain、Tool、Retriever\n",
"- 学习 LangGraph 的 State、Node、Edge、条件分支\n",
"- 理解 RAG 的文档加载、切分、向量化、检索、生成\n",
"\n",
"### 第三阶段:完成项目\n",
"- 做一个个人知识库问答助手\n",
"- 做一个多工具协作助手\n",
"- 做一个带 LangGraph 工作流的任务调度智能体\n",
"\n",
"### 第四阶段:工程化\n",
"- 增加日志、测试和异常处理\n",
"- 接入数据库、缓存和权限控制\n",
"- 部署为 Web 服务或内部工具\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 11. 自我检查清单\n",
"\n",
"学完课程后,可以用下面的问题检查自己是否真正掌握:\n",
"\n",
"1. 我能否解释普通大模型应用和智能体应用的区别?\n",
"2. 我能否写出一个清晰的 Prompt 模板?\n",
"3. 我能否封装一个简单工具并让智能体调用?\n",
"4. 我能否说明 RAG 的完整流程?\n",
"5. 我能否用 State、Node、Edge 解释 LangGraph\n",
"6. 我能否把一个复杂任务拆成多个节点?\n",
"7. 我能否通过日志定位智能体执行错误?\n",
"8. 我能否独立完成一个小型智能体项目?\n",
"\n",
"如果这些问题大部分都能回答清楚,说明你已经具备继续做项目的基础。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 12. 最后一个综合复习示例\n",
"\n",
"下面用一个小例子把 Prompt、工具调用、RAG 和流程编排思想合在一起。\n",
"\n",
"这个示例仍然是教学版,目标是帮助大家看清完整结构。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"course_docs = [\n",
" \"智能体可以调用工具完成搜索、计算、文件读取等任务。\",\n",
" \"RAG 可以让智能体基于知识库资料回答问题。\",\n",
" \"LangGraph 可以把智能体任务拆成多个节点并按流程执行。\",\n",
"]\n",
"\n",
"\n",
"def course_retriever(question):\n",
" best_doc = max(course_docs, key=lambda doc: len(set(question) & set(doc)))\n",
" return best_doc\n",
"\n",
"\n",
"def course_calculator(expression):\n",
" return eval(expression)\n",
"\n",
"\n",
"def final_review_agent(question):\n",
" if \"计算\" in question:\n",
" expression = question.replace(\"计算\", \"\").strip()\n",
" result = course_calculator(expression)\n",
" return f\"我判断这是计算任务,调用计算工具后得到:{result}\"\n",
"\n",
" context = course_retriever(question)\n",
" prompt = build_prompt(\n",
" role=\"AI 智能体课程总结助手\",\n",
" task=f\"回答问题:{question}\",\n",
" context=context,\n",
" output_format=\"先给结论,再给一句解释\",\n",
" )\n",
" return prompt\n",
"\n",
"\n",
"print(final_review_agent(\"RAG 有什么作用?\"))\n",
"print(\"-\" * 40)\n",
"print(final_review_agent(\"计算 18 * 6 + 2\"))\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 代码解释\n",
"\n",
"这个综合示例把多个知识点串联起来:\n",
"\n",
"1. `course_docs` 是一个小型课程知识库。\n",
"2. `course_retriever(question)` 根据问题从知识库中找最相关的资料。\n",
"3. `course_calculator(expression)` 是计算工具。\n",
"4. `final_review_agent(question)` 是综合复习智能体入口。\n",
"5. 如果问题中包含“计算”,智能体会调用计算工具。\n",
"6. 如果不是计算任务,智能体会先检索课程资料,再调用前面写过的 `build_prompt` 生成提示词。\n",
"7. 这个流程体现了智能体的基本思想:先判断任务类型,再选择合适能力,最后组织输出。\n",
"\n",
"真实项目中,可以把这里的 `return prompt` 换成真实大模型调用,让模型基于 Prompt 生成最终回答。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 13. 课程总结\n",
"\n",
"这门课的重点不是让大家记住所有 API而是建立一套解决智能体问题的思维方式\n",
"\n",
"1. 先理解用户目标,再决定系统流程。\n",
"2. 能用普通函数解决的,先用普通函数跑通。\n",
"3. 需要模型生成时,再接入大模型。\n",
"4. 需要外部能力时,封装成工具。\n",
"5. 需要资料依据时,使用 RAG。\n",
"6. 需要多步骤流程时,使用 LangGraph。\n",
"7. 需要稳定上线时,补充日志、测试、异常处理和监控。\n",
"\n",
"真正的智能体开发,不是把所有新技术堆在一起,而是根据问题选择最合适、最简单、最可靠的方案。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 14. 课后实践建议\n",
"\n",
"建议完成以下实践:\n",
"\n",
"1. 整理自己的学习笔记,做一个个人知识库问答助手。\n",
"2. 给知识库助手增加“显示参考来源”的功能。\n",
"3. 做一个多工具助手,至少支持搜索、计算和文件读取。\n",
"4. 用 LangGraph 重构多工具助手,把每一步拆成节点。\n",
"5. 给项目增加调试日志,记录每次工具选择和工具结果。\n",
"6. 尝试把项目封装成一个简单 Web 应用或命令行工具。\n",
"\n",
"完成这些练习后,你就不只是理解了 AI 智能体,而是已经具备了独立构建智能体应用的基础能力。\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.10.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}