Преглед изворни кода

Merge branch 'datawhalechina:main' into main

Chenxu Zhang пре 7 месеци
родитељ
комит
8ced1f5726
31 измењених фајлова са 3426 додато и 117 уклоњено
  1. 9 0
      Co-creation-projects/EXAMPLE-ProjectTemplate/.env.example
  2. 105 0
      Co-creation-projects/EXAMPLE-ProjectTemplate/README.md
  3. 204 0
      Co-creation-projects/EXAMPLE-ProjectTemplate/main.ipynb
  4. 14 0
      Co-creation-projects/EXAMPLE-ProjectTemplate/requirements.txt
  5. 112 0
      Co-creation-projects/README.md
  6. 14 0
      Co-creation-projects/jjyaoao-CodeReviewAgent/.env.example
  7. 145 0
      Co-creation-projects/jjyaoao-CodeReviewAgent/README.md
  8. 44 0
      Co-creation-projects/jjyaoao-CodeReviewAgent/data/sample_code.py
  9. 771 0
      Co-creation-projects/jjyaoao-CodeReviewAgent/main.ipynb
  10. 121 0
      Co-creation-projects/jjyaoao-CodeReviewAgent/outputs/review_report.md
  11. 13 0
      Co-creation-projects/jjyaoao-CodeReviewAgent/requirements.txt
  12. 3 3
      README.md
  13. 616 0
      code/chapter1/FirstAgentTest.ipynb
  14. 2 2
      code/chapter4/Plan_and_solve.py
  15. 1 4
      code/chapter4/Reflection.py
  16. 3 3
      docs/README.md
  17. 36 0
      docs/chapter10/第十章 智能体通信协议.md
  18. 38 0
      docs/chapter11/第十一章 Agentic-RL.md
  19. 36 0
      docs/chapter12/第十二章 智能体性能评估.md
  20. 0 12
      docs/chapter15/第十五章 构建赛博小镇.md
  21. 1010 2
      docs/chapter16/第十六章 毕业设计.md
  22. 3 9
      docs/chapter4/第四章 智能体经典范式构建.md
  23. 45 1
      docs/chapter7/第七章 构建你的Agent框架.md
  24. 36 0
      docs/chapter8/第八章 记忆与检索.md
  25. 45 81
      docs/chapter9/第九章 上下文工程.md
  26. BIN
      docs/images/16-figures/16-1.png
  27. BIN
      docs/images/16-figures/16-2.png
  28. BIN
      docs/images/16-figures/16-3.png
  29. BIN
      docs/images/16-figures/16-4.png
  30. BIN
      docs/images/star-history-20251028.png
  31. BIN
      docs/images/star-history-2025111.png

+ 9 - 0
Co-creation-projects/EXAMPLE-ProjectTemplate/.env.example

@@ -0,0 +1,9 @@
+# LLM API密钥
+OPENAI_API_KEY=your_openai_api_key_here
+# ANTHROPIC_API_KEY=your_anthropic_api_key_here
+# DASHSCOPE_API_KEY=your_dashscope_api_key_here
+
+# 其他API密钥(根据项目需要添加)
+# AMAP_API_KEY=your_amap_api_key_here
+# UNSPLASH_ACCESS_KEY=your_unsplash_access_key_here
+

+ 105 - 0
Co-creation-projects/EXAMPLE-ProjectTemplate/README.md

@@ -0,0 +1,105 @@
+# 项目名称
+
+> 一句话描述你的项目
+
+## 📝 项目简介
+
+详细介绍你的项目:
+- 解决什么问题?
+- 有什么特色功能?
+- 适用于什么场景?
+
+## ✨ 核心功能
+
+- [ ] 功能1:描述
+- [ ] 功能2:描述
+- [ ] 功能3:描述
+
+## 🛠️ 技术栈
+
+- HelloAgents框架
+- 使用的智能体范式(如ReAct、Plan-and-Solve等)
+- 使用的工具和API
+- 其他依赖库
+
+## 🚀 快速开始
+
+### 环境要求
+
+- Python 3.10+
+- 其他要求
+
+### 安装依赖
+
+```bash
+pip install -r requirements.txt
+```
+
+### 配置API密钥
+
+```bash
+# 创建.env文件
+cp .env.example .env
+
+# 编辑.env文件,填入你的API密钥
+# OPENAI_API_KEY=your_key_here
+```
+
+### 运行项目
+
+```bash
+# 启动Jupyter Notebook
+jupyter lab
+
+# 打开main.ipynb并运行
+```
+
+## 📖 使用示例
+
+展示如何使用你的项目,最好包含代码示例和运行结果。
+
+```python
+# 示例代码
+from hello_agents import SimpleAgent
+
+agent = SimpleAgent(name="示例智能体")
+result = agent.run("你的输入")
+print(result)
+```
+
+## 🎯 项目亮点
+
+- 亮点1:说明
+- 亮点2:说明
+- 亮点3:说明
+
+## 📊 性能评估
+
+如果有评估结果,展示在这里:
+- 准确率:XX%
+- 响应时间:XX秒
+- 其他指标
+
+## 🔮 未来计划
+
+- [ ] 待实现的功能1
+- [ ] 待实现的功能2
+- [ ] 待优化的部分
+
+## 🤝 贡献指南
+
+欢迎提出Issue和Pull Request!
+
+## 📄 许可证
+
+MIT License
+
+## 👤 作者
+
+- GitHub: [@你的用户名](https://github.com/你的用户名)
+- Email: 你的邮箱(可选)
+
+## 🙏 致谢
+
+感谢Datawhale社区和Hello-Agents项目!
+

+ 204 - 0
Co-creation-projects/EXAMPLE-ProjectTemplate/main.ipynb

@@ -0,0 +1,204 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# 项目名称\n",
+    "\n",
+    "## 项目简介\n",
+    "简要介绍项目的目标和功能\n",
+    "\n",
+    "## 作者信息\n",
+    "- 姓名:XXX\n",
+    "- GitHub:@XXX\n",
+    "- 日期:2025-XX-XX"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第1部分:环境配置"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# 安装依赖(如果需要)\n",
+    "# !pip install -q hello-agents[all]\n",
+    "\n",
+    "# 导入必要的库\n",
+    "from hello_agents import SimpleAgent, HelloAgentsLLM\n",
+    "from hello_agents.tools import BaseTool\n",
+    "import os\n",
+    "from dotenv import load_dotenv\n",
+    "\n",
+    "# 加载环境变量\n",
+    "load_dotenv()\n",
+    "\n",
+    "print(\"✅ 环境配置完成\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第2部分:工具定义"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "class CustomTool(BaseTool):\n",
+    "    \"\"\"自定义工具类\"\"\"\n",
+    "    \n",
+    "    name = \"tool_name\"\n",
+    "    description = \"工具描述\"\n",
+    "    \n",
+    "    def run(self, query: str) -> str:\n",
+    "        \"\"\"工具执行逻辑\"\"\"\n",
+    "        # 实现你的工具逻辑\n",
+    "        return f\"处理结果:{query}\"\n",
+    "\n",
+    "print(\"✅ 工具定义完成\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第3部分:智能体构建"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# 创建LLM\n",
+    "llm = HelloAgentsLLM()\n",
+    "\n",
+    "# 定义系统提示词\n",
+    "system_prompt = \"\"\"你是一个智能助手。\n",
+    "\n",
+    "你的任务是:\n",
+    "1. 理解用户的需求\n",
+    "2. 使用合适的工具\n",
+    "3. 提供有帮助的回答\n",
+    "\"\"\"\n",
+    "\n",
+    "# 创建智能体\n",
+    "agent = SimpleAgent(\n",
+    "    name=\"示例智能体\",\n",
+    "    llm=llm,\n",
+    "    system_prompt=system_prompt\n",
+    ")\n",
+    "\n",
+    "# 添加工具\n",
+    "agent.add_tool(CustomTool())\n",
+    "\n",
+    "print(\"✅ 智能体构建完成\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第4部分:功能演示"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# 示例1:基础功能\n",
+    "print(\"=== 示例1:基础功能 ===\")\n",
+    "result = agent.run(\"你的测试输入\")\n",
+    "print(result)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# 示例2:复杂场景\n",
+    "print(\"\\n=== 示例2:复杂场景 ===\")\n",
+    "result = agent.run(\"更复杂的测试输入\")\n",
+    "print(result)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第5部分:性能评估(可选)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# 评估代码\n",
+    "# 例如:测试准确率、响应时间等\n",
+    "\n",
+    "print(\"✅ 评估完成\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第6部分:总结与展望\n",
+    "\n",
+    "### 项目总结\n",
+    "\n",
+    "#### 实现的功能\n",
+    "- 功能1\n",
+    "- 功能2\n",
+    "\n",
+    "#### 遇到的挑战\n",
+    "- 挑战1及解决方案\n",
+    "- 挑战2及解决方案\n",
+    "\n",
+    "#### 未来改进方向\n",
+    "- 改进1\n",
+    "- 改进2"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.0"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}

+ 14 - 0
Co-creation-projects/EXAMPLE-ProjectTemplate/requirements.txt

@@ -0,0 +1,14 @@
+# 核心依赖
+hello-agents[all]>=0.2.7
+
+# LLM相关
+openai>=1.0.0
+
+# 数据处理
+pandas>=2.0.0
+numpy>=1.24.0
+
+# 其他工具
+python-dotenv>=1.0.0
+requests>=2.31.0
+

+ 112 - 0
Co-creation-projects/README.md

@@ -0,0 +1,112 @@
+# Hello-Agents 共创项目
+
+欢迎来到Hello-Agents共创项目区!这里是学习者展示自己多智能体应用的地方。
+
+## 📚 项目列表
+
+以下是社区成员贡献的优秀项目:
+
+<!-- 项目列表将在这里自动更新 -->
+
+### 示例项目
+
+- **EXAMPLE-ProjectTemplate**:项目模板,展示标准的项目结构和文档规范
+
+## 🚀 如何贡献你的项目
+
+### 1. 项目命名规范
+
+项目文件夹命名格式:`{GitHub用户名}-{项目名称}`
+
+示例:
+- `jjyaoao-CodeReviewAgent`
+- `zhangsan-StudyBuddy`
+- `lisi-DataAnalyst`
+
+### 2. 项目结构要求
+
+每个项目至少应包含:
+
+```
+你的用户名-项目名称/
+├── README.md              # 项目说明文档(必需)
+├── requirements.txt       # Python依赖列表(必需)
+├── main.ipynb            # 主要的Jupyter Notebook(必需)
+└── ...                   # 其他文件(可选)
+```
+
+### 3. README要求
+
+README.md应包含以下内容:
+
+- 项目简介
+- 核心功能
+- 技术栈
+- 快速开始(安装、配置、运行)
+- 使用示例
+- 作者信息
+
+详细的README模板请参考:[项目模板](./EXAMPLE-ProjectTemplate/README.md)
+
+### 4. 提交流程
+
+1. Fork Hello-Agents仓库
+2. 在`Co-creation-projects`目录下创建你的项目文件夹
+3. 完成项目开发和文档编写
+4. 提交Pull Request
+
+详细的提交指南请参考:[第十六章 毕业设计](../docs/chapter16/第十六章%20毕业设计.md)
+
+## 📋 项目分类
+
+### 生产力工具
+
+- 代码审查助手
+- 文档生成器
+- 会议助手
+- 邮件助手
+
+### 学习辅助
+
+- 学习伙伴
+- 论文助手
+- 编程导师
+- 语言学习助手
+
+### 创意娱乐
+
+- 故事生成器
+- 游戏NPC
+- 音乐推荐
+- 菜谱助手
+
+### 数据分析
+
+- 数据分析师
+- 股票分析
+- 舆情监控
+- 竞品分析
+
+### 生活服务
+
+- 健康助手
+- 理财助手
+- 购物助手
+- 家居控制
+
+## 💬 交流与反馈
+
+- 在GitHub Issue中提问
+- 加入Datawhale社区讨论
+- 参与项目Review
+
+## 📄 许可证
+
+所有共创项目遵循CC BY-NC-SA 4.0 License,欢迎学习和共创。
+
+---
+
+<div align="center">
+  <strong>期待看到你的精彩作品!🎉</strong>
+</div>
+

+ 14 - 0
Co-creation-projects/jjyaoao-CodeReviewAgent/.env.example

@@ -0,0 +1,14 @@
+# HelloAgents LLM配置
+
+# 模型名称
+LLM_MODEL_ID=Qwen/Qwen2.5-72B-Instruct
+
+# API密钥
+LLM_API_KEY=your_api_key_here
+
+# 服务地址
+LLM_BASE_URL=https://api-inference.modelscope.cn/v1/
+
+# 超时时间(可选,默认60秒)
+LLM_TIMEOUT=60
+

+ 145 - 0
Co-creation-projects/jjyaoao-CodeReviewAgent/README.md

@@ -0,0 +1,145 @@
+# CodeReviewAgent - 智能代码审查助手
+
+> 基于HelloAgents框架的智能代码审查工具
+
+## 📝 项目简介
+
+CodeReviewAgent是一个智能代码审查助手,能够自动分析Python代码的质量、发现潜在问题并提供优化建议。
+
+### 核心功能
+
+- ✅ 代码结构分析:统计函数、类、代码行数等
+- ✅ 风格检查:检查是否符合PEP 8规范
+- ✅ 智能建议:基于LLM提供深度分析和优化建议
+- ✅ 报告生成:生成Markdown格式的审查报告
+
+## 🛠️ 技术栈
+
+- HelloAgents框架(SimpleAgent)
+- Python AST模块(代码解析)
+- OpenAI API(智能分析)
+
+## 🚀 快速开始
+
+### 安装依赖
+
+```bash
+pip install -r requirements.txt
+```
+
+### 配置LLM参数
+
+**方式1: 使用.env文件(推荐)**
+
+```bash
+# 复制示例文件
+cp .env.example .env
+
+# 编辑.env文件,填入你的配置
+# LLM_MODEL_ID=Qwen/Qwen2.5-72B-Instruct
+# LLM_API_KEY=your_api_key_here
+# LLM_BASE_URL=https://api-inference.modelscope.cn/v1/
+```
+
+**方式2: 直接在Notebook中设置(已配置)**
+
+项目已在`main.ipynb`中预配置了ModelScope的API,可以直接使用。如需修改,编辑第1部分的配置代码:
+
+```python
+os.environ["LLM_MODEL_ID"] = "your_model"
+os.environ["LLM_API_KEY"] = "your_key"
+os.environ["LLM_BASE_URL"] = "your_api_url"
+```
+
+### 运行项目
+
+```bash
+jupyter lab
+# 打开main.ipynb并运行所有单元格
+```
+
+## 📖 使用示例
+
+### 快速体验
+
+打开`main.ipynb`,运行「第0部分:快速演示」,即可快速了解项目功能。
+
+### 完整功能
+
+1. 将待审查的代码放入`data/sample_code.py`
+2. 依次运行`main.ipynb`的第1-7部分
+3. 查看生成的审查报告`outputs/review_report.md`
+
+## 🎯 项目亮点
+
+- **自动化**:无需人工逐行检查,自动发现问题
+- **智能化**:利用LLM理解代码语义,提供深度建议
+- **可扩展**:易于添加新的检查规则和工具
+
+## 📂 项目结构
+
+```
+jjyaoao-CodeReviewAgent/
+├── README.md              # 项目说明文档
+├── requirements.txt       # 依赖列表
+├── .gitignore            # Git忽略文件
+├── .env.example          # 环境变量示例
+├── main.ipynb            # 主程序(包含快速演示和完整功能)
+├── data/
+│   └── sample_code.py    # 示例代码
+└── outputs/
+    └── review_report.md  # 审查报告
+```
+
+## 🔧 技术实现
+
+### 工具系统
+
+1. **CodeAnalysisTool**: 使用Python AST模块解析代码结构
+2. **StyleCheckTool**: 检查PEP 8代码风格规范
+
+### 智能体设计
+
+使用HelloAgents的SimpleAgent,配合自定义工具实现智能代码审查。
+
+## 📊 示例输出
+
+```markdown
+# 代码审查报告
+
+## 代码结构分析
+- 函数数量: 3
+- 类数量: 1
+- 代码行数: 45
+
+## 风格问题
+- 第12行:超过79个字符
+- 第25行:缩进不规范
+
+## 优化建议
+1. 建议将长函数拆分为多个小函数
+2. 添加类型注解提高代码可读性
+3. 补充文档字符串
+```
+
+## 🚧 未来改进
+
+- [ ] 支持更多编程语言(JavaScript、Java等)
+- [ ] 添加安全漏洞检测
+- [ ] 集成更多静态分析工具
+- [ ] 支持批量文件审查
+- [ ] 生成HTML格式报告
+
+## 👤 作者
+
+- GitHub: [@jjyaoao](https://github.com/jjyaoao)
+- 项目链接:[CodeReviewAgent](https://github.com/datawhalechina/Hello-Agents/tree/main/Co-creation-projects/jjyaoao-CodeReviewAgent)
+
+## 🙏 致谢
+
+感谢Datawhale社区和Hello-Agents项目!
+
+## 📄 许可证
+
+本项目采用MIT许可证。
+

+ 44 - 0
Co-creation-projects/jjyaoao-CodeReviewAgent/data/sample_code.py

@@ -0,0 +1,44 @@
+"""
+示例代码:一个简单的用户管理系统
+用于演示代码审查功能
+"""
+
+class UserManager:
+    """用户管理类"""
+    
+    def __init__(self):
+        self.users = []
+    
+    def add_user(self, name, age, email):
+        """添加用户"""
+        user = {"name": name, "age": age, "email": email}
+        self.users.append(user)
+        return True
+    
+    def get_user(self, name):
+        """获取用户信息"""
+        for user in self.users:
+            if user["name"] == name:
+                return user
+        return None
+    
+    def delete_user(self, name):
+        """删除用户"""
+        for i, user in enumerate(self.users):
+            if user["name"] == name:
+                del self.users[i]
+                return True
+        return False
+
+def calculate_average_age(users):
+    """计算平均年龄"""
+    total = 0
+    for user in users:
+        total += user["age"]
+    return total / len(users)
+
+def send_email(email, message):
+    """发送邮件(模拟)"""
+    print(f"发送邮件到 {email}: {message}")
+    return True
+

+ 771 - 0
Co-creation-projects/jjyaoao-CodeReviewAgent/main.ipynb

@@ -0,0 +1,771 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# CodeReviewAgent - 智能代码审查助手\n",
+    "\n",
+    "本项目演示如何使用HelloAgents框架构建一个智能代码审查助手。\n",
+    "\n",
+    "## 📖 使用说明\n",
+    "\n",
+    "- **快速体验**: 运行「第0部分」的快速演示\n",
+    "- **完整功能**: 依次运行第1-7部分,体验完整的代码审查流程"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "---\n",
+    "\n",
+    "## 第0部分:快速演示 ⚡\n",
+    "\n",
+    "如果你想快速了解项目功能,可以运行这个简化版本。"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "✅ 库导入和配置完成\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 快速演示 - 导入库和配置\n",
+    "from hello_agents import SimpleAgent, HelloAgentsLLM\n",
+    "from hello_agents.tools import Tool, ToolParameter\n",
+    "from typing import Dict, Any, List\n",
+    "import ast\n",
+    "import os\n",
+    "\n",
+    "# 配置LLM参数\n",
+    "os.environ[\"LLM_MODEL_ID\"] = \"Qwen/Qwen2.5-72B-Instruct\"\n",
+    "os.environ[\"LLM_API_KEY\"] = \"your_api_key_here\"\n",
+    "os.environ[\"LLM_BASE_URL\"] = \"https://api-inference.modelscope.cn/v1/\"\n",
+    "os.environ[\"LLM_TIMEOUT\"] = \"60\"\n",
+    "\n",
+    "print(\"✅ 库导入和配置完成\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "✅ 工具定义完成\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 快速演示 - 定义简单的代码分析工具\n",
+    "class QuickAnalysisTool(Tool):\n",
+    "    def __init__(self):\n",
+    "        super().__init__(\n",
+    "            name=\"quick_analysis\",\n",
+    "            description=\"快速分析Python代码结构\"\n",
+    "        )\n",
+    "    \n",
+    "    def run(self, parameters: Dict[str, Any]) -> str:\n",
+    "        code = parameters.get(\"code\", \"\")\n",
+    "        if not code:\n",
+    "            return \"错误:代码不能为空\"\n",
+    "        \n",
+    "        try:\n",
+    "            tree = ast.parse(code)\n",
+    "            functions = [n.name for n in ast.walk(tree) if isinstance(n, ast.FunctionDef)]\n",
+    "            classes = [n.name for n in ast.walk(tree) if isinstance(n, ast.ClassDef)]\n",
+    "            return f\"发现{len(classes)}个类、{len(functions)}个函数: {', '.join(functions)}\"\n",
+    "        except Exception as e:\n",
+    "            return f\"代码解析失败: {str(e)}\"\n",
+    "    \n",
+    "    def get_parameters(self) -> List[ToolParameter]:\n",
+    "        return [\n",
+    "            ToolParameter(\n",
+    "                name=\"code\",\n",
+    "                type=\"string\",\n",
+    "                description=\"要分析的Python代码\",\n",
+    "                required=True\n",
+    "            )\n",
+    "        ]\n",
+    "\n",
+    "print(\"✅ 工具定义完成\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "✅ 工具 'quick_analysis' 已注册。\n",
+      "✅ 智能体创建完成\n",
+      "✅ 可用工具: ['quick_analysis']\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 快速演示 - 创建工具注册表和智能体\n",
+    "from hello_agents import ToolRegistry\n",
+    "\n",
+    "# 创建工具注册表\n",
+    "quick_registry = ToolRegistry()\n",
+    "quick_registry.register_tool(QuickAnalysisTool())\n",
+    "\n",
+    "# 创建智能体\n",
+    "quick_agent = SimpleAgent(\n",
+    "    name=\"快速审查助手\",\n",
+    "    llm=HelloAgentsLLM(),\n",
+    "    system_prompt=\"你是代码审查助手,使用工具分析代码并给出简要建议。\",\n",
+    "    tool_registry=quick_registry\n",
+    ")\n",
+    "\n",
+    "print(\"✅ 智能体创建完成\")\n",
+    "print(f\"✅ 可用工具: {list(quick_registry._tools.keys())}\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "=== 快速演示:分析测试代码 ===\n",
+      "看来我们遇到了一些技术问题,导致代码无法通过工具进行分析。不过,我可以直接为你提供一些建议和观察结果。\n",
+      "\n",
+      "### 代码分析\n",
+      "\n",
+      "#### 1. **函数定义**\n",
+      "- `hello()` 和 `world()` 函数都很简单,分别打印 \"Hello\" 和 \"World\"。这部分代码是正确的,没有问题。\n",
+      "\n",
+      "#### 2. **类定义**\n",
+      "- `Greeter` 类包含一个 `greet` 方法,该方法调用了 `hello()` 和 `world()` 函数。这也是正确的。\n",
+      "\n",
+      "### 建议\n",
+      "\n",
+      "1. **代码风格**\n",
+      "   - 代码风格符合 PEP 8 规范,这是 Python 的官方编码风格指南。建议保持这种风格。\n",
+      "   - 你可以考虑添加一些文档字符串(docstrings)来描述每个函数和类的作用。例如:\n",
+      "     ```python\n",
+      "     def hello():\n",
+      "         \"\"\"Prints 'Hello'\"\"\"\n",
+      "         print(\"Hello\")\n",
+      "\n",
+      "     def world():\n",
+      "         \"\"\"Prints 'World'\"\"\"\n",
+      "         print(\"World\")\n",
+      "\n",
+      "     class Greeter:\n",
+      "         \"\"\"A class to greet the world\"\"\"\n",
+      "\n",
+      "         def greet(self):\n",
+      "             \"\"\"Prints 'Hello World'\"\"\"\n",
+      "             hello()\n",
+      "             world()\n",
+      "     ```\n",
+      "\n",
+      "2. **测试**\n",
+      "   - 为了确保代码按预期工作,可以编写一些简单的测试用例。例如:\n",
+      "     ```python\n",
+      "     if __name__ == \"__main__\":\n",
+      "         greeter = Greeter()\n",
+      "         greeter.greet()\n",
+      "     ```\n",
+      "   - 这样可以在运行脚本时调用 `greet` 方法,验证输出是否正确。\n",
+      "\n",
+      "3. **扩展性**\n",
+      "   - 如果未来需要扩展 `Greeter` 类的功能,可以考虑添加更多的方法或属性。例如,可以添加一个 `set_greeting` 方法来动态设置问候语。\n",
+      "\n",
+      "### 总结\n",
+      "你的代码已经很简洁明了,但可以通过添加文档字符串和测试用例来提高可读性和可靠性。希望这些建议对你有帮助!如果还有其他问题或需要进一步的分析,请告诉我。\n",
+      "\n",
+      "✅ 快速演示完成!\n",
+      "\n",
+      "💡 提示:继续运行下面的单元格,体验完整功能\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 快速演示 - 测试代码\n",
+    "test_code = \"\"\"\n",
+    "def hello():\n",
+    "    print(\"Hello\")\n",
+    "\n",
+    "def world():\n",
+    "    print(\"World\")\n",
+    "\n",
+    "class Greeter:\n",
+    "    def greet(self):\n",
+    "        hello()\n",
+    "        world()\n",
+    "\"\"\"\n",
+    "\n",
+    "print(\"=== 快速演示:分析测试代码 ===\")\n",
+    "result = quick_agent.run(f\"请分析这段代码:\\n{test_code}\")\n",
+    "print(result)\n",
+    "print(\"\\n✅ 快速演示完成!\")\n",
+    "print(\"\\n💡 提示:继续运行下面的单元格,体验完整功能\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "---\n",
+    "\n",
+    "# 完整版代码审查系统\n",
+    "\n",
+    "下面是完整的代码审查系统,包含更强大的分析功能。"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第1部分:环境配置"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "✅ 环境配置完成\n",
+      "✅ 使用模型: Qwen/Qwen2.5-72B-Instruct\n",
+      "✅ API地址: https://api-inference.modelscope.cn/v1/\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 导入必要的库\n",
+    "from hello_agents import SimpleAgent, HelloAgentsLLM\n",
+    "from hello_agents.tools import Tool, ToolParameter\n",
+    "from typing import Dict, Any, List\n",
+    "import ast\n",
+    "import os\n",
+    "\n",
+    "# 配置LLM参数\n",
+    "os.environ[\"LLM_MODEL_ID\"] = \"Qwen/Qwen2.5-72B-Instruct\"\n",
+    "os.environ[\"LLM_API_KEY\"] = \"your_api_key_here\"\n",
+    "os.environ[\"LLM_BASE_URL\"] = \"https://api-inference.modelscope.cn/v1/\"\n",
+    "os.environ[\"LLM_TIMEOUT\"] = \"60\"\n",
+    "\n",
+    "print(\"✅ 环境配置完成\")\n",
+    "print(f\"✅ 使用模型: {os.getenv('LLM_MODEL_ID')}\")\n",
+    "print(f\"✅ API地址: {os.getenv('LLM_BASE_URL')}\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第2部分:定义代码分析工具"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "✅ CodeAnalysisTool定义完成\n"
+     ]
+    }
+   ],
+   "source": [
+    "class CodeAnalysisTool(Tool):\n",
+    "    \"\"\"代码静态分析工具\"\"\"\n",
+    "\n",
+    "    def __init__(self):\n",
+    "        super().__init__(\n",
+    "            name=\"code_analysis\",\n",
+    "            description=\"分析Python代码的结构、复杂度和潜在问题\"\n",
+    "        )\n",
+    "\n",
+    "    def run(self, parameters: Dict[str, Any]) -> str:\n",
+    "        \"\"\"分析代码并返回结果\"\"\"\n",
+    "        code = parameters.get(\"code\", \"\")\n",
+    "        if not code:\n",
+    "            return \"错误:代码不能为空\"\n",
+    "        \n",
+    "        try:\n",
+    "            tree = ast.parse(code)\n",
+    "\n",
+    "            # 统计信息\n",
+    "            functions = [node for node in ast.walk(tree) if isinstance(node, ast.FunctionDef)]\n",
+    "            classes = [node for node in ast.walk(tree) if isinstance(node, ast.ClassDef)]\n",
+    "\n",
+    "            result = {\n",
+    "                \"函数数量\": len(functions),\n",
+    "                \"类数量\": len(classes),\n",
+    "                \"代码行数\": len(code.split('\\n')),\n",
+    "                \"函数列表\": [f.name for f in functions],\n",
+    "                \"类列表\": [c.name for c in classes]\n",
+    "            }\n",
+    "\n",
+    "            return str(result)\n",
+    "        except SyntaxError as e:\n",
+    "            return f\"语法错误:{str(e)}\"\n",
+    "    \n",
+    "    def get_parameters(self) -> List[ToolParameter]:\n",
+    "        return [\n",
+    "            ToolParameter(\n",
+    "                name=\"code\",\n",
+    "                type=\"string\",\n",
+    "                description=\"要分析的Python代码\",\n",
+    "                required=True\n",
+    "            )\n",
+    "        ]\n",
+    "\n",
+    "print(\"✅ CodeAnalysisTool定义完成\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "✅ StyleCheckTool定义完成\n"
+     ]
+    }
+   ],
+   "source": [
+    "class StyleCheckTool(Tool):\n",
+    "    \"\"\"代码风格检查工具\"\"\"\n",
+    "\n",
+    "    def __init__(self):\n",
+    "        super().__init__(\n",
+    "            name=\"style_check\",\n",
+    "            description=\"检查代码是否符合PEP 8规范\"\n",
+    "        )\n",
+    "\n",
+    "    def run(self, parameters: Dict[str, Any]) -> str:\n",
+    "        \"\"\"检查代码风格\"\"\"\n",
+    "        code = parameters.get(\"code\", \"\")\n",
+    "        if not code:\n",
+    "            return \"错误:代码不能为空\"\n",
+    "        \n",
+    "        issues = []\n",
+    "\n",
+    "        lines = code.split('\\n')\n",
+    "        for i, line in enumerate(lines, 1):\n",
+    "            # 检查行长度\n",
+    "            if len(line) > 79:\n",
+    "                issues.append(f\"第{i}行:超过79个字符\")\n",
+    "\n",
+    "            # 检查缩进\n",
+    "            if line.startswith(' ') and not line.startswith('    '):\n",
+    "                if len(line) - len(line.lstrip()) not in [0, 4, 8, 12]:\n",
+    "                    issues.append(f\"第{i}行:缩进不规范\")\n",
+    "\n",
+    "        if not issues:\n",
+    "            return \"代码风格良好,符合PEP 8规范\"\n",
+    "        return \"发现以下问题:\\n\" + \"\\n\".join(issues)\n",
+    "    \n",
+    "    def get_parameters(self) -> List[ToolParameter]:\n",
+    "        return [\n",
+    "            ToolParameter(\n",
+    "                name=\"code\",\n",
+    "                type=\"string\",\n",
+    "                description=\"要检查的Python代码\",\n",
+    "                required=True\n",
+    "            )\n",
+    "        ]\n",
+    "\n",
+    "print(\"✅ StyleCheckTool定义完成\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第3部分:创建智能体"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "✅ 工具 'code_analysis' 已注册。\n",
+      "✅ 工具 'style_check' 已注册。\n",
+      "✅ 智能体创建完成\n",
+      "智能体名称: 代码审查助手\n",
+      "可用工具: ['code_analysis', 'style_check']\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 导入工具注册表\n",
+    "from hello_agents import ToolRegistry\n",
+    "\n",
+    "# 创建工具注册表\n",
+    "tool_registry = ToolRegistry()\n",
+    "tool_registry.register_tool(CodeAnalysisTool())\n",
+    "tool_registry.register_tool(StyleCheckTool())\n",
+    "\n",
+    "# 初始化LLM\n",
+    "llm = HelloAgentsLLM()\n",
+    "\n",
+    "# 定义系统提示词\n",
+    "system_prompt = \"\"\"你是一位经验丰富的代码审查专家。你的任务是:\n",
+    "\n",
+    "1. 使用code_analysis工具分析代码结构\n",
+    "2. 使用style_check工具检查代码风格\n",
+    "3. 基于分析结果,提供详细的审查报告\n",
+    "\n",
+    "审查报告应包括:\n",
+    "- 代码结构分析\n",
+    "- 风格问题\n",
+    "- 潜在bug\n",
+    "- 性能优化建议\n",
+    "- 最佳实践建议\n",
+    "\n",
+    "请以Markdown格式输出报告。\"\"\"\n",
+    "\n",
+    "# 创建智能体\n",
+    "agent = SimpleAgent(\n",
+    "    name=\"代码审查助手\",\n",
+    "    llm=llm,\n",
+    "    system_prompt=system_prompt,\n",
+    "    tool_registry=tool_registry\n",
+    ")\n",
+    "\n",
+    "print(\"✅ 智能体创建完成\")\n",
+    "print(f\"智能体名称: {agent.name}\")\n",
+    "print(f\"可用工具: {list(tool_registry._tools.keys())}\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第4部分:读取示例代码"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "=== 待审查的代码 ===\n",
+      "\"\"\"\n",
+      "示例代码:一个简单的用户管理系统\n",
+      "用于演示代码审查功能\n",
+      "\"\"\"\n",
+      "\n",
+      "class UserManager:\n",
+      "    \"\"\"用户管理类\"\"\"\n",
+      "    \n",
+      "    def __init__(self):\n",
+      "        self.users = []\n",
+      "    \n",
+      "    def add_user(self, name, age, email):\n",
+      "        \"\"\"添加用户\"\"\"\n",
+      "        user = {\"name\": name, \"age\": age, \"email\": email}\n",
+      "        self.users.append(user)\n",
+      "        return True\n",
+      "    \n",
+      "    def get_user(self, name):\n",
+      "        \"\"\"获取用户信息\"\"\"\n",
+      "        for user in self.users:\n",
+      "            if user[\"name\"] == name:\n",
+      "                return user\n",
+      "        return None\n",
+      "    \n",
+      "    def delete_user(self, name):\n",
+      "        \"\"\"删除用户\"\"\"\n",
+      "        for i, user in enumerate(self.users):\n",
+      "            if user[\"name\"] == name:\n",
+      "                del self.users[i]\n",
+      "                return True\n",
+      "        return False\n",
+      "\n",
+      "def calculate_average_age(users):\n",
+      "    \"\"\"计算平均年龄\"\"\"\n",
+      "    total = 0\n",
+      "    for user in users:\n",
+      "        total += user[\"age\"]\n",
+      "    return total / len(users)\n",
+      "\n",
+      "def send_email(email, message):\n",
+      "    \"\"\"发送邮件(模拟)\"\"\"\n",
+      "    print(f\"发送邮件到 {email}: {message}\")\n",
+      "    return True\n",
+      "\n",
+      "\n",
+      "\n",
+      "==================================================\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 读取示例代码\n",
+    "with open(\"data/sample_code.py\", \"r\", encoding=\"utf-8\") as f:\n",
+    "    sample_code = f.read()\n",
+    "\n",
+    "print(\"=== 待审查的代码 ===\")\n",
+    "print(sample_code)\n",
+    "print(\"\\n\" + \"=\"*50 + \"\\n\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第5部分:执行代码审查"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "=== 开始代码审查 ===\n",
+      "## 代码审查报告\n",
+      "\n",
+      "### 代码结构分析\n",
+      "\n",
+      "根据`code_analysis`工具的结果,代码中没有语法错误。以下是代码结构的详细分析:\n",
+      "\n",
+      "1. **类定义**:\n",
+      "   - `UserManager` 类负责用户管理,包含三个方法:`add_user`, `get_user`, 和 `delete_user`。\n",
+      "   - 类的初始化方法 `__init__` 创建了一个空的用户列表 `self.users`。\n",
+      "\n",
+      "2. **方法分析**:\n",
+      "   - `add_user(name, age, email)`:将用户信息添加到用户列表中。返回 `True` 表示操作成功。\n",
+      "   - `get_user(name)`:根据用户名查找并返回用户信息。如果找不到用户,返回 `None`。\n",
+      "   - `delete_user(name)`:根据用户名从用户列表中删除用户。如果删除成功,返回 `True`,否则返回 `False`。\n",
+      "\n",
+      "3. **辅助函数**:\n",
+      "   - `calculate_average_age(users)`:计算给定用户列表的平均年龄。\n",
+      "   - `send_email(email, message)`:模拟发送邮件的功能,实际只是打印一条消息。\n",
+      "\n",
+      "### 风格问题\n",
+      "\n",
+      "根据`style_check`工具的结果,代码存在以下风格问题:\n",
+      "\n",
+      "1. **行长度**:\n",
+      "   - 第1行超过了79个字符。建议将长行拆分成多行或减少注释的长度。\n",
+      "\n",
+      "### 潜在Bug\n",
+      "\n",
+      "1. **删除用户时的索引问题**:\n",
+      "   - 在 `delete_user` 方法中,删除用户后,列表的索引会发生变化。虽然当前实现可以正常工作,但为了避免潜在的索引问题,建议使用列表推导或其他更安全的方法来删除元素。\n",
+      "\n",
+      "### 性能优化建议\n",
+      "\n",
+      "1. **查找用户**:\n",
+      "   - `get_user` 方法在最坏情况下需要遍历整个用户列表。如果用户数量较多,可以考虑使用字典来存储用户信息,以提高查找效率。\n",
+      "\n",
+      "2. **计算平均年龄**:\n",
+      "   - `calculate_average_age` 方法在每次调用时都需要遍历整个用户列表。如果用户列表非常大,可以考虑缓存计算结果或使用其他数据结构来优化性能。\n",
+      "\n",
+      "### 最佳实践建议\n",
+      "\n",
+      "1. **异常处理**:\n",
+      "   - 在 `add_user` 和 `delete_user` 方法中,可以添加异常处理机制,以应对可能的输入错误或意外情况。\n",
+      "\n",
+      "2. **日志记录**:\n",
+      "   - 使用日志记录库(如 `logging`)替代 `print` 函数,以便更好地管理和调试代码。\n",
+      "\n",
+      "3. **单元测试**:\n",
+      "   - 编写单元测试来验证每个方法的正确性,确保代码的稳定性和可靠性。\n",
+      "\n",
+      "4. **文档字符串**:\n",
+      "   - 虽然代码已经包含了文档字符串,但可以进一步细化和扩展,特别是对于复杂的逻辑和边缘情况。\n",
+      "\n",
+      "### 代码改进示例\n",
+      "\n",
+      "以下是改进后的代码示例:\n",
+      "\n",
+      "```python\n",
+      "\"\"\"\n",
+      "示例代码:一个简单的用户管理系统\n",
+      "用于演示代码审查功能\n",
+      "\"\"\"\n",
+      "\n",
+      "import logging\n",
+      "\n",
+      "# 配置日志记录\n",
+      "logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')\n",
+      "\n",
+      "class UserManager:\n",
+      "    \"\"\"用户管理类\"\"\"\n",
+      "    \n",
+      "    def __init__(self):\n",
+      "        self.users = {}\n",
+      "    \n",
+      "    def add_user(self, name, age, email):\n",
+      "        \"\"\"添加用户\"\"\"\n",
+      "        if name in self.users:\n",
+      "            logging.warning(f\"用户 {name} 已经存在\")\n",
+      "            return False\n",
+      "        self.users[name] = {\"name\": name, \"age\": age, \"email\": email}\n",
+      "        return True\n",
+      "    \n",
+      "    def get_user(self, name):\n",
+      "        \"\"\"获取用户信息\"\"\"\n",
+      "        return self.users.get(name)\n",
+      "    \n",
+      "    def delete_user(self, name):\n",
+      "        \"\"\"删除用户\"\"\"\n",
+      "        if name in self.users:\n",
+      "            del self.users[name]\n",
+      "            return True\n",
+      "        return False\n",
+      "\n",
+      "def calculate_average_age(users):\n",
+      "    \"\"\"计算平均年龄\"\"\"\n",
+      "    if not users:\n",
+      "        return 0\n",
+      "    total = sum(user[\"age\"] for user in users.values())\n",
+      "    return total / len(users)\n",
+      "\n",
+      "def send_email(email, message):\n",
+      "    \"\"\"发送邮件(模拟)\"\"\"\n",
+      "    logging.info(f\"发送邮件到 {email}: {message}\")\n",
+      "    return True\n",
+      "\n",
+      "# 示例用法\n",
+      "if __name__ == \"__main__\":\n",
+      "    user_manager = UserManager()\n",
+      "    user_manager.add_user(\"Alice\", 30, \"alice@example.com\")\n",
+      "    user_manager.add_user(\"Bob\", 25, \"bob@example.com\")\n",
+      "    print(user_manager.get_user(\"Alice\"))\n",
+      "    user_manager.delete_user(\"Alice\")\n",
+      "    print(user_manager.get_user(\"Alice\"))\n",
+      "    average_age = calculate_average_age(user_manager.users)\n",
+      "    print(f\"平均年龄: {average_age}\")\n",
+      "    send_email(\"admin@example.com\", \"用户管理系统的平均年龄已更新\")\n",
+      "```\n",
+      "\n",
+      "### 总结\n",
+      "\n",
+      "通过这次代码审查,我们发现了几个风格问题和潜在的性能优化点。改进后的代码更加健壮、高效,并且易于维护。希望这些建议对您有所帮助。\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 执行代码审查\n",
+    "print(\"=== 开始代码审查 ===\")\n",
+    "review_result = agent.run(f\"请审查以下Python代码:\\n\\n```python\\n{sample_code}\\n```\")\n",
+    "\n",
+    "print(review_result)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第6部分:保存审查报告"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "✅ 审查报告已保存到 outputs/review_report.md\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 保存审查报告\n",
+    "with open(\"outputs/review_report.md\", \"w\", encoding=\"utf-8\") as f:\n",
+    "    f.write(review_result)\n",
+    "\n",
+    "print(\"\\n✅ 审查报告已保存到 outputs/review_report.md\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 第7部分:总结与展望\n",
+    "\n",
+    "### 实现的功能\n",
+    "- ✅ 代码结构分析\n",
+    "- ✅ PEP 8风格检查\n",
+    "- ✅ 智能审查报告生成\n",
+    "\n",
+    "### 遇到的挑战\n",
+    "- 如何准确解析Python代码结构\n",
+    "- 如何设计合理的提示词让LLM生成高质量报告\n",
+    "\n",
+    "### 未来改进方向\n",
+    "- 支持更多编程语言\n",
+    "- 添加安全漏洞检测\n",
+    "- 集成更多静态分析工具\n",
+    "- 支持批量文件审查"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "base",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.13.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}

+ 121 - 0
Co-creation-projects/jjyaoao-CodeReviewAgent/outputs/review_report.md

@@ -0,0 +1,121 @@
+## 代码审查报告
+
+### 代码结构分析
+
+根据`code_analysis`工具的结果,代码中没有语法错误。以下是代码结构的详细分析:
+
+1. **类定义**:
+   - `UserManager` 类负责用户管理,包含三个方法:`add_user`, `get_user`, 和 `delete_user`。
+   - 类的初始化方法 `__init__` 创建了一个空的用户列表 `self.users`。
+
+2. **方法分析**:
+   - `add_user(name, age, email)`:将用户信息添加到用户列表中。返回 `True` 表示操作成功。
+   - `get_user(name)`:根据用户名查找并返回用户信息。如果找不到用户,返回 `None`。
+   - `delete_user(name)`:根据用户名从用户列表中删除用户。如果删除成功,返回 `True`,否则返回 `False`。
+
+3. **辅助函数**:
+   - `calculate_average_age(users)`:计算给定用户列表的平均年龄。
+   - `send_email(email, message)`:模拟发送邮件的功能,实际只是打印一条消息。
+
+### 风格问题
+
+根据`style_check`工具的结果,代码存在以下风格问题:
+
+1. **行长度**:
+   - 第1行超过了79个字符。建议将长行拆分成多行或减少注释的长度。
+
+### 潜在Bug
+
+1. **删除用户时的索引问题**:
+   - 在 `delete_user` 方法中,删除用户后,列表的索引会发生变化。虽然当前实现可以正常工作,但为了避免潜在的索引问题,建议使用列表推导或其他更安全的方法来删除元素。
+
+### 性能优化建议
+
+1. **查找用户**:
+   - `get_user` 方法在最坏情况下需要遍历整个用户列表。如果用户数量较多,可以考虑使用字典来存储用户信息,以提高查找效率。
+
+2. **计算平均年龄**:
+   - `calculate_average_age` 方法在每次调用时都需要遍历整个用户列表。如果用户列表非常大,可以考虑缓存计算结果或使用其他数据结构来优化性能。
+
+### 最佳实践建议
+
+1. **异常处理**:
+   - 在 `add_user` 和 `delete_user` 方法中,可以添加异常处理机制,以应对可能的输入错误或意外情况。
+
+2. **日志记录**:
+   - 使用日志记录库(如 `logging`)替代 `print` 函数,以便更好地管理和调试代码。
+
+3. **单元测试**:
+   - 编写单元测试来验证每个方法的正确性,确保代码的稳定性和可靠性。
+
+4. **文档字符串**:
+   - 虽然代码已经包含了文档字符串,但可以进一步细化和扩展,特别是对于复杂的逻辑和边缘情况。
+
+### 代码改进示例
+
+以下是改进后的代码示例:
+
+```python
+"""
+示例代码:一个简单的用户管理系统
+用于演示代码审查功能
+"""
+
+import logging
+
+# 配置日志记录
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
+
+class UserManager:
+    """用户管理类"""
+    
+    def __init__(self):
+        self.users = {}
+    
+    def add_user(self, name, age, email):
+        """添加用户"""
+        if name in self.users:
+            logging.warning(f"用户 {name} 已经存在")
+            return False
+        self.users[name] = {"name": name, "age": age, "email": email}
+        return True
+    
+    def get_user(self, name):
+        """获取用户信息"""
+        return self.users.get(name)
+    
+    def delete_user(self, name):
+        """删除用户"""
+        if name in self.users:
+            del self.users[name]
+            return True
+        return False
+
+def calculate_average_age(users):
+    """计算平均年龄"""
+    if not users:
+        return 0
+    total = sum(user["age"] for user in users.values())
+    return total / len(users)
+
+def send_email(email, message):
+    """发送邮件(模拟)"""
+    logging.info(f"发送邮件到 {email}: {message}")
+    return True
+
+# 示例用法
+if __name__ == "__main__":
+    user_manager = UserManager()
+    user_manager.add_user("Alice", 30, "alice@example.com")
+    user_manager.add_user("Bob", 25, "bob@example.com")
+    print(user_manager.get_user("Alice"))
+    user_manager.delete_user("Alice")
+    print(user_manager.get_user("Alice"))
+    average_age = calculate_average_age(user_manager.users)
+    print(f"平均年龄: {average_age}")
+    send_email("admin@example.com", "用户管理系统的平均年龄已更新")
+```
+
+### 总结
+
+通过这次代码审查,我们发现了几个风格问题和潜在的性能优化点。改进后的代码更加健壮、高效,并且易于维护。希望这些建议对您有所帮助。

+ 13 - 0
Co-creation-projects/jjyaoao-CodeReviewAgent/requirements.txt

@@ -0,0 +1,13 @@
+# HelloAgents框架
+hello-agents[all]>=0.1.0
+
+# Jupyter环境
+jupyter>=1.0.0
+notebook>=7.0.0
+
+# 环境变量管理
+python-dotenv>=1.0.0
+
+# 代码分析工具
+ast-comments>=1.0.0
+

+ 3 - 3
README.md

@@ -64,7 +64,7 @@
 | [第十四章 自动化深度研究智能体](./docs/chapter14/第十四章%20自动化深度研究智能体.md) | DeepResearch Agent 复现与解析 | ✅ |
 | [第十五章 构建赛博小镇](./docs/chapter15/第十五章%20构建赛博小镇.md) | Agent 与游戏的结合,模拟社会动态 | ✅ |
 | <strong>第五部分:毕业设计及未来展望</strong> |  |  |
-| [第十六章 毕业设计](./docs/chapter17/第十六章%20毕业设计.md) | 构建属于你的完整多智能体应用 | 🚧 |
+| [第十六章 毕业设计](./docs/chapter16/第十六章%20毕业设计.md) | 构建属于你的完整多智能体应用 | ✅ |
 
 ### 社区贡献精选 (Community Blog)
 
@@ -119,7 +119,7 @@
 
 ### 核心贡献者
 - [陈思州-项目负责人](https://github.com/jjyaoao) (Datawhale成员, 全文写作和校对)
-- [孙韬-项目负责人](https://github.com/fengju0213) (Datawhale成员, 第九\十六章内容和全文校对)  
+- [孙韬-项目负责人](https://github.com/fengju0213) (Datawhale成员, 第九章内容和校对)  
 - [姜舒凡-项目负责人](https://github.com/Tsumugii24)(Datawhale成员, 章节习题设计和校对)
 - [黄佩林-Datawhale意向成员](https://github.com/HeteroCat) (Agent开发工程师, 第五章内容贡献者)
 - [曾鑫民-Agent工程师](https://github.com/fancyboi999) (牛客科技, 第十四章案例开发)
@@ -141,7 +141,7 @@
 ## Star History
 
 <div align='center'>
-    <img src="./docs/images/star-history-20251028.png" alt="Datawhale" width="90%">
+    <img src="./docs/images/star-history-2025111.png" alt="Datawhale" width="90%">
 </div>
 
 <div align="center">

+ 616 - 0
code/chapter1/FirstAgentTest.ipynb

@@ -0,0 +1,616 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "938b2e36-f95c-4b0f-8770-335c6bb5bc0e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import requests\n",
+    "import json\n",
+    "import os\n",
+    "import re\n",
+    "from openai import OpenAI\n",
+    "from tavily import TavilyClient\n",
+    "from dotenv import load_dotenv\n",
+    "\n",
+    "# 加载环境变量\n",
+    "load_dotenv()\n",
+    "\n",
+    "# 配置API密钥\n",
+    "API_KEY = os.getenv(\"API_KEY\")\n",
+    "BASE_URL = os.getenv(\"BASE_URL\")\n",
+    "MODEL_ID = os.getenv(\"MODEL_ID\")\n",
+    "TAVILY_API_KEY = os.getenv(\"TAVILY_API_KEY\")\n",
+    "\n",
+    "os.environ['TAVILY_API_KEY'] = TAVILY_API_KEY\n",
+    "\n",
+    "# 系统提示词\n",
+    "AGENT_SYSTEM_PROMPT = \"\"\"\n",
+    "你是一个智能旅行助手。你的任务是分析用户的请求,并使用可用工具一步步地解决问题。\n",
+    "\n",
+    "# 可用工具:\n",
+    "- `get_weather(city: str)`: 查询指定城市的实时天气。\n",
+    "- `get_attraction(city: str, weather: str)`: 根据城市和天气搜索推荐的旅游景点。\n",
+    "\n",
+    "# 行动格式:\n",
+    "你的回答必须严格遵循以下格式。首先是你的思考过程,然后是你要执行的具体行动。\n",
+    "Thought: [这里是你的思考过程和下一步计划]\n",
+    "Action: [这里是你要调用的工具,格式为 function_name(arg_name=\"arg_value\")]\n",
+    "\n",
+    "# 任务完成:\n",
+    "当你收集到足够的信息,能够回答用户的最终问题时,你必须使用 `finish(answer=\"...\")` 来输出最终答案。\n",
+    "\n",
+    "请开始吧!\n",
+    "\"\"\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "66d9d404-3c95-42f2-8975-436769b3cb87",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "✅ 工具函数定义完成!\n"
+     ]
+    }
+   ],
+   "source": [
+    "def get_weather(city: str) -> str:\n",
+    "    \"\"\"\n",
+    "    通过调用 wttr.in API 查询真实的天气信息。\n",
+    "    \"\"\"\n",
+    "    # API端点,我们请求JSON格式的数据\n",
+    "    url = f\"https://wttr.in/{city}?format=j1\"\n",
+    "    \n",
+    "    try:\n",
+    "        # 发起网络请求\n",
+    "        response = requests.get(url)\n",
+    "        # 检查响应状态码是否为200 (成功)\n",
+    "        response.raise_for_status() \n",
+    "        # 解析返回的JSON数据\n",
+    "        data = response.json()\n",
+    "        \n",
+    "        # 提取当前天气状况\n",
+    "        current_condition = data['current_condition'][0]\n",
+    "        weather_desc = current_condition['weatherDesc'][0]['value']\n",
+    "        temp_c = current_condition['temp_C']\n",
+    "        \n",
+    "        # 格式化成自然语言返回\n",
+    "        return f\"{city}当前天气:{weather_desc},气温{temp_c}摄氏度\"\n",
+    "        \n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        # 处理网络错误\n",
+    "        return f\"错误:查询天气时遇到网络问题 - {e}\"\n",
+    "    except (KeyError, IndexError) as e:\n",
+    "        # 处理数据解析错误\n",
+    "        return f\"错误:解析天气数据失败,可能是城市名称无效 - {e}\"\n",
+    "\n",
+    "def get_attraction(city: str, weather: str) -> str:\n",
+    "    \"\"\"\n",
+    "    根据城市和天气,使用Tavily Search API搜索并返回优化后的景点推荐。\n",
+    "    \"\"\"\n",
+    "    api_key = os.environ.get(\"TAVILY_API_KEY\")\n",
+    "\n",
+    "    if not api_key:\n",
+    "        return \"错误:未配置TAVILY_API_KEY。\"\n",
+    "\n",
+    "    # 初始化Tavily客户端\n",
+    "    tavily = TavilyClient(api_key=api_key)\n",
+    "    \n",
+    "    # 构造一个精确的查询\n",
+    "    query = f\"'{city}' 在'{weather}'天气下最值得去的旅游景点推荐及理由\"\n",
+    "    \n",
+    "    try:\n",
+    "        # 调用API,include_answer=True会返回一个综合性的回答\n",
+    "        response = tavily.search(query=query, search_depth=\"basic\", include_answer=True)\n",
+    "        \n",
+    "        # Tavily返回的结果已经非常干净,可以直接使用\n",
+    "        if response.get(\"answer\"):\n",
+    "            return response[\"answer\"]\n",
+    "        \n",
+    "        # 如果没有综合性回答,则格式化原始结果\n",
+    "        formatted_results = []\n",
+    "        for result in response.get(\"results\", []):\n",
+    "            formatted_results.append(f\"- {result['title']}: {result['content']}\")\n",
+    "        \n",
+    "        if not formatted_results:\n",
+    "             return \"抱歉,没有找到相关的旅游景点推荐。\"\n",
+    "\n",
+    "        return \"根据搜索,为您找到以下信息:\\n\" + \"\\n\".join(formatted_results)\n",
+    "\n",
+    "    except Exception as e:\n",
+    "        return f\"错误:执行Tavily搜索时出现问题 - {e}\"\n",
+    "\n",
+    "# 将所有工具函数放入一个字典,方便后续调用\n",
+    "available_tools = {\n",
+    "    \"get_weather\": get_weather,\n",
+    "    \"get_attraction\": get_attraction,\n",
+    "}\n",
+    "print(\"✅ 工具函数定义完成!\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "e953fee4-9e3c-4e34-bf48-4ea002c3bb92",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "✅ 智能助手类定义完成!\n"
+     ]
+    }
+   ],
+   "source": [
+    "class OpenAICompatibleClient:\n",
+    "    \"\"\"\n",
+    "    一个用于调用任何兼容OpenAI接口的LLM服务的客户端。\n",
+    "    \"\"\"\n",
+    "    def __init__(self, model: str, api_key: str, base_url: str):\n",
+    "        self.model = model\n",
+    "        self.client = OpenAI(api_key=api_key, base_url=base_url)\n",
+    "\n",
+    "    def generate(self, prompt: str, system_prompt: str) -> str:\n",
+    "        \"\"\"调用LLM API来生成回应。\"\"\"\n",
+    "        print(\"正在调用大语言模型...\")\n",
+    "        try:\n",
+    "            messages = [\n",
+    "                {'role': 'system', 'content': system_prompt},\n",
+    "                {'role': 'user', 'content': prompt}\n",
+    "            ]\n",
+    "            response = self.client.chat.completions.create(\n",
+    "                model=self.model,\n",
+    "                messages=messages,\n",
+    "                stream=False\n",
+    "            )\n",
+    "            answer = response.choices[0].message.content\n",
+    "            print(\"大语言模型响应成功。\")\n",
+    "            return answer\n",
+    "        except Exception as e:\n",
+    "            print(f\"调用LLM API时发生错误: {e}\")\n",
+    "            return \"错误:调用语言模型服务时出错。\"\n",
+    "\n",
+    "class TravelAssistant:\n",
+    "    \"\"\"\n",
+    "    智能旅行助手类\n",
+    "    \"\"\"\n",
+    "    def __init__(self):\n",
+    "        self.llm = OpenAICompatibleClient(\n",
+    "            model=MODEL_ID,\n",
+    "            api_key=API_KEY,\n",
+    "            base_url=BASE_URL\n",
+    "        )\n",
+    "        self.prompt_history = []\n",
+    "    \n",
+    "    def reset(self):\n",
+    "        \"\"\"重置对话历史\"\"\"\n",
+    "        self.prompt_history = []\n",
+    "    \n",
+    "    def add_user_message(self, message: str):\n",
+    "        \"\"\"添加用户消息到历史\"\"\"\n",
+    "        self.prompt_history.append(f\"用户请求: {message}\")\n",
+    "    \n",
+    "    def add_assistant_message(self, message: str):\n",
+    "        \"\"\"添加助手消息到历史\"\"\"\n",
+    "        self.prompt_history.append(message)\n",
+    "    \n",
+    "    def add_observation(self, observation: str):\n",
+    "        \"\"\"添加观察结果到历史\"\"\"\n",
+    "        self.prompt_history.append(f\"Observation: {observation}\")\n",
+    "print(\"✅ 智能助手类定义完成!\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "ab5d3142-c119-46ad-a7a1-ec1aa2e79435",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "✅ 显示函数定义完成!\n"
+     ]
+    }
+   ],
+   "source": [
+    "def display_conversation(history):\n",
+    "    \"\"\"美观地显示对话历史\"\"\"\n",
+    "    print(\"\\n\" + \"=\"*60)\n",
+    "    print(\"📝 对话历史\")\n",
+    "    print(\"=\"*60)\n",
+    "    \n",
+    "    for i, message in enumerate(history, 1):\n",
+    "        if message.startswith(\"用户请求:\"):\n",
+    "            print(f\"\\n👤 用户 [{i}]: {message[5:]}\")\n",
+    "        elif message.startswith(\"Thought:\"):\n",
+    "            print(f\"\\n🤔 思考 [{i}]: {message[8:].strip()}\")\n",
+    "        elif message.startswith(\"Action:\"):\n",
+    "            print(f\"🛠️  行动 [{i}]: {message[7:].strip()}\")\n",
+    "        elif message.startswith(\"Observation:\"):\n",
+    "            print(f\"📊 观察 [{i}]: {message[12:].strip()}\")\n",
+    "        else:\n",
+    "            print(f\"💬 消息 [{i}]: {message}\")\n",
+    "    \n",
+    "    print(\"=\"*60 + \"\\n\")\n",
+    "\n",
+    "def parse_action(action_str):\n",
+    "    \"\"\"解析行动字符串\"\"\"\n",
+    "    if action_str.startswith(\"finish\"):\n",
+    "        match = re.search(r'finish\\(answer=\"(.*)\"\\)', action_str)\n",
+    "        if match:\n",
+    "            return \"finish\", {\"answer\": match.group(1)}\n",
+    "        return \"finish\", {\"answer\": \"任务完成\"}\n",
+    "    \n",
+    "    tool_name_match = re.search(r\"(\\w+)\\(\", action_str)\n",
+    "    if not tool_name_match:\n",
+    "        return None, {}\n",
+    "    \n",
+    "    tool_name = tool_name_match.group(1)\n",
+    "    args_match = re.search(r\"\\((.*)\\)\", action_str)\n",
+    "    if args_match:\n",
+    "        args_str = args_match.group(1)\n",
+    "        kwargs = dict(re.findall(r'(\\w+)=\"([^\"]*)\"', args_str))\n",
+    "    else:\n",
+    "        kwargs = {}\n",
+    "    \n",
+    "    return tool_name, kwargs\n",
+    "print(\"✅ 显示函数定义完成!\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "cc543309-fe16-44a9-9735-bce828b9c7ad",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def run_assistant(user_input, max_iterations=5, display=True):\n",
+    "    \"\"\"\n",
+    "    运行旅行助手的主函数\n",
+    "    \n",
+    "    Args:\n",
+    "        user_input: 用户输入的问题\n",
+    "        max_iterations: 最大循环次数\n",
+    "        display: 是否显示对话历史\n",
+    "    \n",
+    "    Returns:\n",
+    "        tuple: (最终答案, 完整的对话历史)\n",
+    "    \"\"\"\n",
+    "    assistant = TravelAssistant()\n",
+    "    assistant.add_user_message(user_input)\n",
+    "    \n",
+    "    if display:\n",
+    "        print(f\"👤 用户输入: {user_input}\")\n",
+    "        print(\"=\"*50)\n",
+    "    \n",
+    "    for i in range(max_iterations):\n",
+    "        if display:\n",
+    "            print(f\"\\n🔄 循环 {i+1}/{max_iterations}\")\n",
+    "        \n",
+    "        # 构建完整prompt并调用LLM\n",
+    "        full_prompt = \"\\n\".join(assistant.prompt_history)\n",
+    "        llm_output = assistant.llm.generate(full_prompt, AGENT_SYSTEM_PROMPT)\n",
+    "        \n",
+    "        assistant.add_assistant_message(llm_output)\n",
+    "        \n",
+    "        if display:\n",
+    "            print(f\"🤖 模型输出:\\n{llm_output}\")\n",
+    "        \n",
+    "        # 解析行动\n",
+    "        action_match = re.search(r\"Action: (.*)\", llm_output, re.DOTALL)\n",
+    "        if not action_match:\n",
+    "            print(\"❌ 解析错误:模型输出中未找到 Action。\")\n",
+    "            break\n",
+    "            \n",
+    "        action_str = action_match.group(1).strip()\n",
+    "        tool_name, kwargs = parse_action(action_str)\n",
+    "        \n",
+    "        # 处理完成行动\n",
+    "        if tool_name == \"finish\":\n",
+    "            final_answer = kwargs.get(\"answer\", \"任务完成\")\n",
+    "            if display:\n",
+    "                print(f\"🎉 任务完成!\")\n",
+    "                print(f\"📋 最终答案: {final_answer}\")\n",
+    "            return final_answer, assistant.prompt_history\n",
+    "        \n",
+    "        # 处理工具调用\n",
+    "        if tool_name in available_tools:\n",
+    "            if display:\n",
+    "                print(f\"🛠️  调用工具: {tool_name}({kwargs})\")\n",
+    "            observation = available_tools[tool_name](**kwargs)\n",
+    "        else:\n",
+    "            observation = f\"错误:未定义的工具 '{tool_name}'\"\n",
+    "        \n",
+    "        # 记录观察结果\n",
+    "        if display:\n",
+    "            print(f\"📊 观察结果: {observation}\")\n",
+    "            print(\"=\"*50)\n",
+    "        \n",
+    "        assistant.add_observation(observation)\n",
+    "    \n",
+    "    # 如果达到最大循环次数仍未完成\n",
+    "    timeout_answer = \"抱歉,经过多次尝试仍未完成您的请求。请尝试简化您的问题或稍后重试。\"\n",
+    "    if display:\n",
+    "        print(f\"⏰ 达到最大循环次数: {timeout_answer}\")\n",
+    "    \n",
+    "    return timeout_answer, assistant.prompt_history"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "3f6e44eb-ff3d-4060-b4c2-ea3e139bf307",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "🚀 开始测试北京天气+景点推荐示例\n",
+      "👤 用户输入: 你好,请帮我查询一下今天北京的天气,然后根据天气推荐一个合适的旅游景点。\n",
+      "==================================================\n",
+      "\n",
+      "🔄 循环 1/5\n",
+      "正在调用大语言模型...\n",
+      "大语言模型响应成功。\n",
+      "🤖 模型输出:\n",
+      "Thought: 用户希望查询今天北京的天气情况,然后基于该天气推荐一个合适的旅游景点。我的第一步是获取北京的实时天气信息,以便了解当前的天气状况。执行查询天气的操作。\n",
+      "\n",
+      "Action: get_weather(city=\"北京\")\n",
+      "🛠️  调用工具: get_weather({'city': '北京'})\n",
+      "📊 观察结果: 北京当前天气:Clear,气温9摄氏度\n",
+      "==================================================\n",
+      "\n",
+      "🔄 循环 2/5\n",
+      "正在调用大语言模型...\n",
+      "大语言模型响应成功。\n",
+      "🤖 模型输出:\n",
+      "Thought: 我已经获得了北京当前的天气信息:晴天,气温9摄氏度。接下来的步骤是根据这个天气条件推荐一个合适的旅游景点。晴天通常适合户外活动,这将影响我的选择。接下来,我将调用工具获取推荐的旅游景点。 \n",
+      "\n",
+      "Action: get_attraction(city=\"北京\", weather=\"Clear\")\n",
+      "🛠️  调用工具: get_attraction({'city': '北京', 'weather': 'Clear'})\n",
+      "📊 观察结果: 在晴天,北京的长城(如八达岭)和故宫是最值得去的景点。晴天下,这些地方的景色最美,游览最舒适。\n",
+      "==================================================\n",
+      "\n",
+      "🔄 循环 3/5\n",
+      "正在调用大语言模型...\n",
+      "大语言模型响应成功。\n",
+      "🤖 模型输出:\n",
+      "Thought: 我已经获得了关于北京当前天气的信息,并找到了两个适合在晴天游览的旅游景点。长城和故宫都是著名的地标性景点,特别在晴天时更是吸引游客。接下来,我准备输出最终的推荐答案。\n",
+      "\n",
+      "Action: finish(answer=\"今天北京的天气晴,气温9摄氏度。推荐您去长城(如八达岭)或故宫游览,这两个景点在这样的天气下非常适合。\")\n",
+      "🎉 任务完成!\n",
+      "📋 最终答案: 今天北京的天气晴,气温9摄氏度。推荐您去长城(如八达岭)或故宫游览,这两个景点在这样的天气下非常适合。\n",
+      "\n",
+      "============================================================\n",
+      "📊 测试完成!\n",
+      "============================================================\n",
+      "最终答案: 今天北京的天气晴,气温9摄氏度。推荐您去长城(如八达岭)或故宫游览,这两个景点在这样的天气下非常适合。\n",
+      "\n",
+      "============================================================\n",
+      "📝 对话历史\n",
+      "============================================================\n",
+      "\n",
+      "👤 用户 [1]:  你好,请帮我查询一下今天北京的天气,然后根据天气推荐一个合适的旅游景点。\n",
+      "\n",
+      "🤔 思考 [2]: 用户希望查询今天北京的天气情况,然后基于该天气推荐一个合适的旅游景点。我的第一步是获取北京的实时天气信息,以便了解当前的天气状况。执行查询天气的操作。\n",
+      "\n",
+      "Action: get_weather(city=\"北京\")\n",
+      "📊 观察 [3]: 北京当前天气:Clear,气温9摄氏度\n",
+      "\n",
+      "🤔 思考 [4]: 我已经获得了北京当前的天气信息:晴天,气温9摄氏度。接下来的步骤是根据这个天气条件推荐一个合适的旅游景点。晴天通常适合户外活动,这将影响我的选择。接下来,我将调用工具获取推荐的旅游景点。 \n",
+      "\n",
+      "Action: get_attraction(city=\"北京\", weather=\"Clear\")\n",
+      "📊 观察 [5]: 在晴天,北京的长城(如八达岭)和故宫是最值得去的景点。晴天下,这些地方的景色最美,游览最舒适。\n",
+      "\n",
+      "🤔 思考 [6]: 我已经获得了关于北京当前天气的信息,并找到了两个适合在晴天游览的旅游景点。长城和故宫都是著名的地标性景点,特别在晴天时更是吸引游客。接下来,我准备输出最终的推荐答案。\n",
+      "\n",
+      "Action: finish(answer=\"今天北京的天气晴,气温9摄氏度。推荐您去长城(如八达岭)或故宫游览,这两个景点在这样的天气下非常适合。\")\n",
+      "============================================================\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 测试示例\n",
+    "def test_basic_example():\n",
+    "    \"\"\"测试北京天气+景点推荐的示例\"\"\"\n",
+    "    print(\"🚀 开始测试北京天气+景点推荐示例\")\n",
+    "    user_input = \"你好,请帮我查询一下今天北京的天气,然后根据天气推荐一个合适的旅游景点。\"\n",
+    "    \n",
+    "    final_answer, history = run_assistant(user_input, display=True)\n",
+    "    \n",
+    "    print(\"\\n\" + \"=\"*60)\n",
+    "    print(\"📊 测试完成!\")\n",
+    "    print(\"=\"*60)\n",
+    "    print(f\"最终答案: {final_answer}\")\n",
+    "    \n",
+    "    # 显示完整对话历史\n",
+    "    display_conversation(history)\n",
+    "    \n",
+    "    return final_answer, history\n",
+    "\n",
+    "# 运行测试示例\n",
+    "final_answer, history = test_basic_example()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "68c735c1-eb3e-40e7-8b70-2be941798187",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def interactive_travel_assistant():\n",
+    "    \"\"\"\n",
+    "    交互式旅行助手\n",
+    "    \"\"\"\n",
+    "    print(\"🌍 欢迎使用智能旅行助手!\")\n",
+    "    print(\"💡 您可以询问任何城市的天气和旅游景点推荐\")\n",
+    "    print(\"❌ 输入 'quit' 或 '退出' 来结束对话\\n\")\n",
+    "    \n",
+    "    while True:\n",
+    "        user_input = input(\"👤 请输入您的问题: \").strip()\n",
+    "        \n",
+    "        if user_input.lower() in ['quit', '退出', 'exit']:\n",
+    "            print(\"👋 感谢使用智能旅行助手,再见!\")\n",
+    "            break\n",
+    "        \n",
+    "        if not user_input:\n",
+    "            print(\"⚠️  请输入有效的问题\")\n",
+    "            continue\n",
+    "        \n",
+    "        print(\"\\n\" + \"=\"*50)\n",
+    "        print(\"🔄 正在处理您的请求...\")\n",
+    "        \n",
+    "        final_answer, history = run_assistant(user_input, display=True)\n",
+    "        \n",
+    "        print(\"\\n🎯 最终回答:\")\n",
+    "        print(\"=\"*30)\n",
+    "        print(final_answer)\n",
+    "        print(\"=\"*30)\n",
+    "        \n",
+    "        # 询问是否显示完整对话历史\n",
+    "        show_history = input(\"\\n📖 是否显示完整对话历史? (y/n): \").strip().lower()\n",
+    "        if show_history in ['y', 'yes', '是']:\n",
+    "            display_conversation(history)\n",
+    "        \n",
+    "        print(\"\\n\" + \"=\"*60)\n",
+    "        print(\"🔄 准备接受下一个问题...\\n\")\n",
+    "\n",
+    "# 快速测试函数\n",
+    "def quick_test(city=\"上海\"):\n",
+    "    \"\"\"快速测试指定城市的天气和景点\"\"\"\n",
+    "    user_input = f\"请帮我查询{city}的天气,并推荐适合的旅游景点\"\n",
+    "    print(f\"🚀 快速测试: {user_input}\")\n",
+    "    final_answer, _ = run_assistant(user_input, display=True)\n",
+    "    return final_answer"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "bc58c911-8502-4cf5-aa3f-a9f57a94b679",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "选择运行模式:\n",
+      "1. 运行测试示例 (北京)\n",
+      "2. 交互模式\n",
+      "3. 快速测试其他城市\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "请输入选择 (1/2/3):  3\n",
+      "请输入要测试的城市:  伦敦\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "🚀 快速测试: 请帮我查询伦敦的天气,并推荐适合的旅游景点\n",
+      "👤 用户输入: 请帮我查询伦敦的天气,并推荐适合的旅游景点\n",
+      "==================================================\n",
+      "\n",
+      "🔄 循环 1/5\n",
+      "正在调用大语言模型...\n",
+      "大语言模型响应成功。\n",
+      "🤖 模型输出:\n",
+      "Thought: 我需要先查询伦敦的实时天气,这样才能根据天气情况推荐合适的旅游景点。接下来,我将调用天气查询工具获取伦敦的天气信息。 \n",
+      "Action: get_weather(city=\"伦敦\")\n",
+      "🛠️  调用工具: get_weather({'city': '伦敦'})\n",
+      "📊 观察结果: 伦敦当前天气:Partly cloudy,气温16摄氏度\n",
+      "==================================================\n",
+      "\n",
+      "🔄 循环 2/5\n",
+      "正在调用大语言模型...\n",
+      "大语言模型响应成功。\n",
+      "🤖 模型输出:\n",
+      "Thought: 现在我已经查询到了伦敦的实时天气情况:部分多云,气温为16摄氏度。接下来,我将根据这个天气情况推荐适合在伦敦游玩的旅游景点。 \n",
+      "Action: get_attraction(city=\"伦敦\", weather=\"Partly cloudy\")\n",
+      "🛠️  调用工具: get_attraction({'city': '伦敦', 'weather': 'Partly cloudy'})\n",
+      "📊 观察结果: 在伦敦多云天气下,伦敦眼是最值得去的景点。它提供了伟大的城市景观。此外,博物馆和画廊也适合参观。\n",
+      "==================================================\n",
+      "\n",
+      "🔄 循环 3/5\n",
+      "正在调用大语言模型...\n",
+      "大语言模型响应成功。\n",
+      "🤖 模型输出:\n",
+      "Thought: 我已经获取了伦敦的天气情况和适合的旅游景点推荐。当前天气为部分多云,推荐旅游景点为伦敦眼,同时博物馆和画廊也非常适合在这种天气下参观。最终我将整合这些信息并给出用户的建议。 \n",
+      "Action: finish(answer=\"伦敦当前天气为部分多云,气温16摄氏度。根据天气情况,推荐您去伦敦眼欣赏城市景观,此外博物馆和画廊也是很好的选择。\")\n",
+      "🎉 任务完成!\n",
+      "📋 最终答案: 伦敦当前天气为部分多云,气温16摄氏度。根据天气情况,推荐您去伦敦眼欣赏城市景观,此外博物馆和画廊也是很好的选择。\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 主启动入口\n",
+    "if __name__ == \"__main__\":\n",
+    "    # 可以选择直接运行测试示例\n",
+    "    print(\"选择运行模式:\")\n",
+    "    print(\"1. 运行测试示例 (北京)\")\n",
+    "    print(\"2. 交互模式\")\n",
+    "    print(\"3. 快速测试其他城市\")\n",
+    "    \n",
+    "    choice = input(\"请输入选择 (1/2/3): \").strip()\n",
+    "    \n",
+    "    if choice == \"1\":\n",
+    "        test_basic_example()\n",
+    "    elif choice == \"2\":\n",
+    "        interactive_travel_assistant()\n",
+    "    elif choice == \"3\":\n",
+    "        city = input(\"请输入要测试的城市: \").strip() or \"上海\"\n",
+    "        quick_test(city)\n",
+    "    else:\n",
+    "        print(\"无效选择,运行测试示例...\")\n",
+    "        test_basic_example()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b84ad2cf-d240-4322-9e91-5da2af51f53f",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3.11 (hello_agents Environment)",
+   "language": "python",
+   "name": "hello_agents"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.11.14"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}

+ 2 - 2
code/chapter4/Plan_and_solve.py

@@ -38,7 +38,7 @@ class Planner:
         messages = [{"role": "user", "content": prompt}]
         
         print("--- 正在生成计划 ---")
-        response_text = "".join(self.llm_client.think(messages=messages))
+        response_text = self.llm_client.think(messages=messages) or ""
         print(f"✅ 计划已生成:\n{response_text}")
         
         try:
@@ -90,7 +90,7 @@ class Executor:
             )
             messages = [{"role": "user", "content": prompt}]
             
-            response_text = "".join(self.llm_client.think(messages=messages))
+            response_text = self.llm_client.think(messages=messages) or ""
             
             history += f"步骤 {i}: {step}\n结果: {response_text}\n\n"
             final_answer = response_text

+ 1 - 4
code/chapter4/Reflection.py

@@ -144,11 +144,8 @@ class ReflectionAgent:
     def _get_llm_response(self, prompt: str) -> str:
         """一个辅助方法,用于调用LLM并获取完整的流式响应。"""
         messages = [{"role": "user", "content": prompt}]
-        response_text = ""
         # 确保能处理生成器可能返回None的情况
-        for chunk in self.llm_client.think(messages=messages):
-            if chunk:
-                response_text += chunk
+        response_text = self.llm_client.think(messages=messages) or ""
         return response_text
 
 if __name__ == '__main__':

+ 3 - 3
docs/README.md

@@ -60,7 +60,7 @@
 | [第十四章 自动化深度研究智能体](./chapter14/第十四章%20自动化深度研究智能体.md) | DeepResearch Agent 复现与解析 | ✅ |
 | [第十五章 构建赛博小镇](./chapter15/第十五章%20构建赛博小镇.md) | Agent 与游戏的结合,模拟社会动态 | ✅ |
 | <strong>第五部分:毕业设计及未来展望</strong> |  |  |
-| [第十六章 毕业设计](./chapter17/第十六章%20毕业设计.md) | 构建属于你的完整多智能体应用 | 🚧 |
+| [第十六章 毕业设计](./chapter16/第十六章%20毕业设计.md) | 构建属于你的完整多智能体应用 | ✅ |
 
 ### 社区贡献精选 (Community Blog)
 
@@ -115,7 +115,7 @@
 
 ### 核心贡献者
 - [陈思州-项目负责人](https://github.com/jjyaoao) (Datawhale成员, 全文写作和校对)
-- [孙韬-项目负责人](https://github.com/fengju0213) (Datawhale成员, 第九\十六章内容和全文校对)  
+- [孙韬-项目负责人](https://github.com/fengju0213) (Datawhale成员, 第九章内容和校对)  
 - [姜舒凡-项目负责人](https://github.com/Tsumugii24)(Datawhale成员, 章节习题设计和校对)
 - [黄佩林-Datawhale意向成员](https://github.com/HeteroCat) (Agent开发工程师, 第五章内容贡献者)
 - [曾鑫民-Agent工程师](https://github.com/fancyboi999) (牛客科技, 第十四章案例开发)
@@ -137,7 +137,7 @@
 ## Star History
 
 <div align='center'>
-    <img src="./images/star-history-20251028.png" alt="Datawhale" width="90%">
+    <img src="./images/star-history-2025111.png" alt="Datawhale" width="90%">
 </div>
 
 <div align="center">

+ 36 - 0
docs/chapter10/第十章 智能体通信协议.md

@@ -2392,7 +2392,43 @@ agent.add_tool(ANPTool(...))
 
 你现在已经掌握了智能体通信协议的核心知识。继续加油!🚀
 
+## 习题
 
+> <strong>提示</strong>:部分习题没有标准答案,重点在于培养学习者对智能体通信协议的综合理解和实践能力。
+
+1. 本章介绍了三种智能体通信协议:MCP、A2A和ANP。请分析:
+
+   - 在10.1.2节中对比了三种协议的设计理念。请深入分析:为什么MCP强调"上下文共享",A2A强调"对话式协作",而ANP强调"网络拓扑"?这些设计理念分别解决了什么核心问题?
+   - 假设你要构建一个"智能客服系统",需要以下功能:(1)访问客户数据库和订单系统;(2)多个专业客服智能体协作处理复杂问题;(3)支持大规模并发用户请求。请为每个功能选择最合适的协议,并说明理由。
+   - 三种协议是否可以组合使用?请设计一个实际应用场景,展示如何同时使用MCP、A2A和ANP来构建一个完整的智能体系统。画出系统架构图并说明各协议的职责。
+
+2. MCP(Model Context Protocol)是智能体与工具通信的标准协议。基于10.2节的内容,请深入思考:
+
+   > <strong>提示</strong>:这是一道动手实践题,建议实际操作
+
+   - 在10.2.3节的MCP服务器实现中,我们定义了`list_tools`、`call_tool`等核心方法。请扩展这个实现,添加一个新的MCP服务器,提供以下工具:(1)数据库查询工具;(2)数据可视化工具;(3)报表生成工具。要求工具之间能够协作完成复杂的数据分析任务。
+   - MCP协议支持"资源"(Resources)和"提示"(Prompts)两个重要概念,但本章主要聚焦于"工具"(Tools)。请查阅MCP官方文档,了解Resources和Prompts的设计目的,并设计一个应用场景,展示如何利用这三个核心概念构建更强大的智能体系统。
+   - MCP使用JSON-RPC 2.0作为底层通信协议,通过stdio进行进程间通信。请分析:这种设计有什么优势和局限性?如果需要支持远程MCP服务器(通过HTTP/WebSocket访问),应该如何扩展当前的实现?
+
+3. A2A(Agent-to-Agent Protocol)支持智能体间的对话式协作。基于10.3节的内容,请完成以下扩展实践:
+
+   > <strong>提示</strong>:这是一道动手实践题,建议实际操作
+
+   - 在10.3.4节的"研究团队"案例中,研究员和撰写员通过A2A协议协作完成论文写作。请扩展这个案例,添加第三个智能体"审稿人"(Reviewer),它能够评审论文质量并提出修改建议。设计三个智能体之间的协作流程,并实现完整的代码。
+   - A2A协议定义了`task`、`task_result`等消息类型。请分析:如果协作过程中出现冲突(如两个智能体对同一问题有不同意见),应该如何设计冲突解决机制?请扩展A2A协议,添加"协商"(negotiation)和"投票"(voting)等消息类型。
+   - 对比A2A协议与第六章介绍的AutoGen、CAMEL等多智能体框架:A2A作为标准协议,与这些框架的关系是什么?它们能否互相替代?请设计一个方案,让基于A2A协议的智能体能够与AutoGen框架中的智能体进行通信。
+
+4. ANP(Agent Network Protocol)支持大规模智能体网络。基于10.4节的内容,请深入分析:
+
+   - 在10.4.2节中介绍了ANP的网络拓扑设计,包括星型、网状、分层等结构。请分析:在什么场景下应该选择哪种拓扑结构?如果网络规模从10个智能体扩展到1000个智能体,拓扑结构应该如何演进?
+   - ANP协议支持"路由"(routing)和"发现"(discovery)机制,让智能体能够动态找到合适的协作伙伴。请设计一个"智能路由算法":根据任务类型、智能体能力、网络负载等因素,自动选择最优的消息路由路径。
+   - 在10.4.4节的"智能城市"案例中,多个智能体协作管理城市系统。请思考:如果某个关键智能体(如交通管理智能体)出现故障,整个系统应该如何应对?请设计一个"容错机制",包括故障检测、备份切换、状态恢复等功能。
+
+5. 智能体通信协议的安全性和隐私保护是实际应用中的关键问题。请思考:
+
+   - 在10.2.4节的MCP客户端实现中,智能体可以调用MCP服务器提供的任何工具。请分析:这种设计存在什么安全风险?如果MCP服务器提供了危险操作(如删除文件、执行系统命令),应该如何设计权限控制机制?
+   - A2A和ANP协议涉及多个智能体之间的通信,可能包含敏感信息(如用户隐私数据、商业机密)。请设计一个"端到端加密"方案:确保消息在传输过程中不被窃听或篡改,同时支持智能体身份认证和访问控制。
+   - 在大规模智能体网络中,恶意智能体可能会发送虚假信息、发起拒绝服务攻击或窃取其他智能体的数据。请设计一个"信任评估系统":根据智能体的历史行为、协作质量、社区评价等因素,动态评估每个智能体的可信度,并据此调整通信策略。
 
 ## 参考文献
 

+ 38 - 0
docs/chapter11/第十一章 Agentic-RL.md

@@ -2647,3 +2647,41 @@ Agentic RL旨在提升智能体的六大核心能力:
 
 [15] Ziegler, D. M., Stiennon, N., Wu, J., Brown, T. B., Radford, A., Amodei, D., ... & Irving, G. (2019). Fine-Tuning Language Models from Human Preferences. *arXiv preprint arXiv:1909.08593*.
 
+## 习题
+
+> <strong>提示</strong>:部分习题没有标准答案,重点在于培养学习者对Agentic RL和智能体训练的综合理解和实践能力。
+
+1. 本章介绍了从LLM训练到Agentic RL的演进过程。请分析:
+
+   - 在11.1.3节的表11.1中,对比了PBRFT(基于偏好的强化微调)和Agentic RL在MDP框架下的差异。请深入解释:为什么Agentic RL的状态空间 $s_t = (\text{prompt}, o_1, o_2, ..., o_t)$ 包含历史观察,而PBRFT的状态 $s_0 = \text{prompt}$ 只包含初始提示?这种差异对训练过程和最终效果有什么影响?
+   - 假设你要训练一个"智能代码调试助手",它需要:(1)分析代码找出bug;(2)查阅文档了解API用法;(3)修改代码;(4)运行测试验证修复效果。请将这个任务映射到强化学习框架,明确定义状态空间、行动空间、奖励函数和状态转移函数。
+   - 在11.1.1节中提到,传统监督学习存在"难以优化长期目标"的局限。请设计一个具体的多步推理任务(如数学证明、复杂问题求解),展示为什么监督学习难以优化中间步骤,而强化学习可以通过延迟奖励来解决这个问题。
+
+2. SFT(监督微调)和GRPO(群组相对策略优化)是本章的两个核心训练方法。基于11.2节和11.3节的内容,请深入思考:
+
+   > <strong>提示</strong>:这是一道动手实践题,建议实际操作
+
+   - 在11.2.4节的SFT训练代码中,我们使用了LoRA(低秩适配)技术来减少训练参数。请分析:LoRA的核心思想是什么?为什么它能够用少量参数(如0.16%)实现接近全参数微调的效果?在什么情况下应该选择LoRA而不是全参数微调?
+   - GRPO算法(11.3节)相比传统的PPO算法有什么优势?请对比两者的训练流程,分析GRPO如何通过"群组相对奖励"来简化训练过程并提升稳定性。如果要将GRPO应用到其他任务(如代码生成、对话优化),需要做哪些调整?
+   - 请基于11.2.5节的代码,扩展SFT训练流程,添加以下功能:(1)支持多轮对话数据的训练;(2)添加数据增强策略(如同义改写、难度调整);(3)实现训练过程的可视化监控(如loss曲线、样本质量评估)。
+
+3. 奖励函数设计是Agentic RL的核心挑战。基于11.3.3节的内容,请完成以下扩展实践:
+
+   > <strong>提示</strong>:这是一道动手实践题,建议实际操作
+
+   - 在11.3.3节中,我们为GSM8K数学问题设计了简单的二元奖励(正确+1,错误0)。请设计一个更精细的奖励函数,能够:(1)对部分正确的答案给予部分奖励;(2)对推理过程的合理性进行评分;(3)惩罚过于冗长或低效的解题路径。这个奖励函数应该如何实现?
+   - 奖励函数的设计往往需要领域知识。请为以下三个不同的智能体任务设计奖励函数:(1)代码生成助手(需要考虑代码正确性、可读性、效率);(2)客服对话智能体(需要考虑问题解决率、用户满意度、响应时间);(3)游戏AI(需要考虑胜率、策略多样性、对抗鲁棒性)。
+   - 在实际应用中,奖励函数可能存在"奖励黑客"(reward hacking)问题:智能体找到了获得高奖励的捷径,但并没有真正完成任务。请举例说明这种现象,并设计防御机制来避免奖励黑客。
+
+4. 在11.4节的"数学推理智能体训练"案例中,我们看到了完整的训练流程。请深入分析:
+
+   - 案例中使用了GSM8K数据集进行训练和评估。请分析:这个数据集的特点是什么?它适合训练什么类型的推理能力?如果要训练一个能够处理更复杂数学问题(如高等数学、数学证明)的智能体,应该如何扩展数据集和训练方法?
+   - 在11.4.3节的训练结果中,我们观察到模型在训练集上的准确率提升,但可能存在过拟合风险。请设计一个"泛化能力评估"方案:如何测试模型是否真正学会了数学推理,而不是记住了训练数据?如何通过正则化、数据增强等技术提升泛化能力?
+   - 案例中的训练是离线的(使用预先收集的数据集)。请设计一个"在线学习"方案:智能体在实际使用过程中持续收集用户反馈,并自动更新模型。这个方案需要考虑哪些技术挑战(如数据质量控制、灾难性遗忘、安全性保障)?
+
+5. Agentic RL的一个重要应用是让智能体学会使用工具。请思考:
+
+   - 在11.1.3节中提到,Agentic RL适合优化"需要多步推理、工具使用、长期规划"的任务。请设计一个"工具学习"训练方案:给定一组工具(如搜索引擎、计算器、代码执行器),如何训练智能体学会在合适的时机选择合适的工具?奖励函数应该如何设计?
+   - 工具使用往往涉及复杂的依赖关系(如"必须先调用工具A获取信息,才能调用工具B")。请设计一个"分层强化学习"方案:高层策略负责任务规划,低层策略负责工具调用。这种分层结构如何训练?如何协调高层和低层的优化目标?
+   - 在实际应用中,工具的数量可能非常多(如50+个API),直接训练可能面临"探索效率低"的问题。请设计一个"课程学习"(curriculum learning)方案:从简单任务(使用少量工具)开始训练,逐步增加任务难度和工具数量。这个方案应该如何设计课程顺序?如何评估智能体是否准备好进入下一阶段?
+

+ 36 - 0
docs/chapter12/第十二章 智能体性能评估.md

@@ -2683,7 +2683,43 @@ python data_generation/run_complete_evaluation.py 30 3.0
 
 <strong>继续加油!</strong> 💪
 
+## 习题
 
+> <strong>提示</strong>:部分习题没有标准答案,重点在于培养学习者对智能体性能评估的综合理解和实践能力。
+
+1. 本章介绍了多个智能体评估基准。请分析:
+
+   - 在12.1.2节中介绍了BFCL、GAIA、AgentBench等评估基准。请对比BFCL和GAIA:它们分别评估智能体的哪些核心能力?为什么BFCL使用AST匹配算法,而GAIA使用准精确匹配(Quasi Exact Match)?这两种评估方法各有什么优缺点?
+   - 假设你要构建一个"智能客服系统",需要评估以下能力:(1)理解用户意图的准确性;(2)调用后台API的正确性;(3)回答的友好性和专业性;(4)处理异常情况的鲁棒性。请为每个能力选择或设计合适的评估指标和方法。
+   - 在12.1.1节中提到,智能体评估面临"输出不确定性"、"评估标准多样性"、"评估成本高昂"三大挑战。请针对每个挑战提出具体的解决方案,并分析方案的可行性和局限性。
+
+2. BFCL(Berkeley Function Calling Leaderboard)是评估工具调用能力的重要基准。基于12.2节的内容,请深入思考:
+
+   > <strong>提示</strong>:这是一道动手实践题,建议实际操作
+
+   - 在12.2.3节的AST匹配算法中,我们通过比较抽象语法树来判断函数调用是否正确。请分析:为什么AST匹配比简单的字符串匹配更合适?在什么情况下AST匹配可能会产生误判(假阳性或假阴性)?如何改进AST匹配算法来提高准确性?
+   - BFCL数据集包含simple、multiple、parallel、irrelevance四个类别。请为每个类别设计2-3个新的测试样本,要求能够测试智能体在该类别下的边界情况或容易出错的场景。
+   - 请基于12.2.4节的代码,扩展BFCL评估器,添加以下功能:(1)支持评估工具调用的执行顺序(对于有依赖关系的多个工具调用);(2)评估工具调用的效率(如是否使用了最少的调用次数);(3)生成详细的错误分析报告(如哪些类型的错误最常见)。
+
+3. GAIA(General AI Assistants)评估智能体的综合能力。基于12.3节的内容,请完成以下扩展实践:
+
+   > <strong>提示</strong>:这是一道动手实践题,建议实际操作
+
+   - 在12.3.2节中介绍了GAIA的三个难度级别(Level 1/2/3)。请分析:这三个级别在任务复杂度、所需能力、评估标准等方面有什么差异?如果要设计Level 4(超高难度),应该包含什么类型的任务?
+   - GAIA使用"准精确匹配"算法来评估答案的正确性。请分析:这种方法如何处理答案的多样性(如"42"、"四十二"、"42.0"都应该被认为是正确的)?在什么情况下准精确匹配可能不够用?请设计一个更智能的答案匹配算法,能够处理语义等价的答案。
+   - 请基于12.3.4节的代码,实现一个"自定义GAIA评估集":选择一个特定领域(如医疗、法律、金融),设计10个真实世界问题,并实现完整的评估流程。要求问题涵盖不同难度级别,并提供标准答案和评分标准。
+
+4. LLM Judge是使用大语言模型进行评估的新兴方法。基于12.4节的内容,请深入分析:
+
+   - 在12.4.2节中,我们使用GPT-4作为评判者来评估智能体的回答质量。请分析:LLM Judge相比传统的规则匹配或指标计算有什么优势?它存在哪些潜在的偏见或局限性(如对某些回答风格的偏好、对长度的敏感性)?
+   - LLM Judge的评分标准设计至关重要。请为以下三个不同的评估场景设计详细的评分标准(包括评分维度、权重、示例):(1)代码生成质量评估;(2)创意写作质量评估;(3)技术文档质量评估。
+   - 在12.4.3节中提到,可以使用多个LLM Judge进行"评审团"式评估。请设计一个"多评委评估系统":使用3-5个不同的LLM(如GPT-4、Claude、Qwen)作为评委,如何聚合它们的评分?如何处理评委之间的分歧?如何检测和过滤异常评分?
+
+5. 智能体评估的实践应用需要考虑多个方面。请思考:
+
+   - 在实际项目中,评估往往需要在"评估成本"和"评估质量"之间权衡。请设计一个"分层评估策略":(1)快速评估(低成本,用于日常开发迭代);(2)标准评估(中等成本,用于版本发布前);(3)全面评估(高成本,用于重大更新或对外发布)。每层应该包含哪些评估项目?如何设计评估流程?
+   - 智能体的性能可能随时间变化(如依赖的外部API变化、用户需求变化)。请设计一个"持续评估系统":能够定期自动运行评估,监控智能体性能的变化趋势,并在性能下降时及时告警。这个系统应该包含哪些组件?如何设计告警规则?
+   - 评估结果需要以清晰的方式呈现给不同的受众(如开发者、产品经理、用户)。请设计一个"评估报告生成系统":能够根据受众类型自动生成不同详细程度的报告。开发者报告应该包含哪些技术细节?产品经理报告应该突出哪些业务指标?用户报告应该如何简化和可视化?
 
 ## 参考文献
 

+ 0 - 12
docs/chapter15/第十五章 构建赛博小镇.md

@@ -1896,16 +1896,4 @@ NPC可以学习每个玩家的偏好和习惯。比如如果玩家经常和张
 
 尽管有这些挑战,AI NPC的未来仍然充满希望。随着LLM技术的发展,推理速度会越来越快,成本会越来越低。本地化的小型LLM也在快速发展,未来可能可以在玩家的设备上直接运行,完全不需要网络请求。AI技术与游戏的结合,将为玩家带来前所未有的体验。
 
-在本项目中,我们从零开始构建了HelloAgents框架,并用它实现了多个实用的应用。这些项目展示了智能体技术的强大能力和广阔前景。希望通过这本教程,你不仅学会了如何使用现有的智能体框架,更重要的是理解了智能体的核心原理,能够根据自己的需求设计和实现智能体系统。
-
-智能体技术正在快速发展,新的模型、新的框架、新的应用不断涌现。但无论技术如何变化,核心的思想是不变的:让AI能够感知环境、做出决策、执行任务,并从经验中学习。掌握了这些核心思想,你就能够跟上技术的发展,创造出更加智能和有用的应用。
-
-最后,感谢你完整阅读了本项目。希望你在学习的过程中有所收获,也希望你能够将所学应用到实际项目中,创造出令人惊叹的智能体应用。AI的未来充满无限可能,让我们一起探索和创造!
-
 在第五部分的毕业设计章节,我们将会学习如何用单智能体和多智能体构造通用智能体,这将是你的创作时间,敬请期待!
-
----
-
-<div align="center">
-  <strong>第十五章 完</strong>
-</div>

+ 1010 - 2
docs/chapter16/第十六章 毕业设计.md

@@ -1,3 +1,1011 @@
-# 第十六章 毕业设计
+# 第十六章 毕业设计:构建属于你的多智能体应用
 
-本章内容待补充...
+恭喜你来到Hello-Agents教程的最后一章!在前面的15章中,我们从零开始构建了HelloAgents框架,学习了智能体的核心概念、多种范式、工具系统、记忆机制、通信协议、强化学习训练和性能评估等知识。在第13-15章中,我们还通过三个完整的实战项目(智能旅行助手、自动化深度研究智能体、赛博小镇)展示了如何将所学知识融会贯通。
+
+现在,是时候让你成为真正的智能体系统构建者了!本章将指导你<strong>构建属于你自己的多智能体应用</strong>,并通过开源协作的方式与社区分享你的成果。
+
+## 16.1 毕业设计的意义
+
+### 16.1.1 为什么要做毕业设计
+
+学习技术最好的方式不是看教程,而是<strong>动手实践</strong>。通过前面章节的学习,你已经掌握了构建智能体系统的理论知识和技术工具。但是,真正的挑战在于:<strong>如何将这些知识应用到实际问题中?如何设计一个完整的系统?如何处理各种边界情况和异常?</strong>
+
+毕业设计的核心价值在于培养你的综合应用能力,将前面学到的所有知识(智能体范式、工具系统、记忆机制、通信协议等)选择性的整合到一个完整的项目中。
+
+通过本章的学习和实践,希望你能够独立设计并实现一个完整的智能体应用,熟练使用HelloAgents框架的各种功能,掌握Git和GitHub的基本操作,学会编写清晰的项目文档,参与开源社区的协作开发,最终获得一个可以展示的技术作品。
+
+### 16.1.2 毕业设计的形式
+
+你的毕业设计将以<strong>开源项目</strong>的形式提交到Hello-Agents的共创项目仓库(`Co-creation-projects`目录)。具体要求如下:
+
+1. <strong>项目命名</strong>:使用`{你的GitHub用户名}-{项目名称}`的格式,例如`jjyaoao-CodeReviewAgent`
+
+2. <strong>项目内容</strong>:
+   - 一个可运行的Jupyter Notebook(`.ipynb`文件)或Python脚本
+   - 完整的依赖列表(`requirements.txt`)
+   - 清晰的README文档(`README.md`)
+   - 可选:演示视频、截图、数据集等
+
+3. <strong>提交方式</strong>:通过GitHub的Pull Request(PR)提交
+
+4. <strong>评审流程</strong>:社区成员会review你的代码,提出改进建议,通过后合并到主仓库
+
+## 16.2 项目选题指南
+
+### 16.2.1 选题原则
+
+一个好的毕业设计项目应该具有实用性,解决真实的问题而不是为了技术而技术,我们需要追求在有限的时间和资源内可以完成,并且能够清晰地展示你的技术能力。
+
+### 16.2.2 推荐选题方向
+
+以下是一些推荐的项目方向,你可以选择其中一个,也可以自己提出新的想法:
+
+<strong>(1)生产力工具类</strong>
+
+- <strong>智能代码审查助手</strong>:自动分析代码质量、发现潜在bug、提出优化建议
+- <strong>智能文档生成器</strong>:根据代码自动生成API文档、用户手册
+- <strong>智能会议助手</strong>:记录会议内容、生成会议纪要、提取行动项
+- <strong>智能邮件助手</strong>:自动分类邮件、生成回复草稿、提醒重要事项
+
+<strong>(2)学习辅助类</strong>
+
+- <strong>智能学习伙伴</strong>:根据学习进度推荐学习资源、生成练习题、答疑解惑
+- <strong>智能论文助手</strong>:帮助查找文献、总结论文、生成引用
+- <strong>智能编程导师</strong>:提供编程练习、代码review、学习路径规划
+- <strong>智能语言学习助手</strong>:提供对话练习、语法纠错、词汇扩展
+
+<strong>(3)创意娱乐类</strong>
+
+- <strong>智能故事生成器</strong>:根据用户输入生成小说、剧本、诗歌
+- <strong>智能游戏NPC</strong>:创建有个性的游戏角色,能够与玩家自然对话
+- <strong>智能音乐推荐</strong>:根据心情、场景推荐音乐,生成播放列表
+- <strong>智能菜谱助手</strong>:根据食材、口味推荐菜谱,生成购物清单
+
+<strong>(4)数据分析类</strong>
+
+- <strong>智能数据分析师</strong>:自动分析数据、生成可视化图表、撰写分析报告
+- <strong>智能股票分析</strong>:分析股票数据、新闻舆情,提供投资建议
+- <strong>智能舆情监控</strong>:监控社交媒体、新闻网站,分析舆情趋势
+- <strong>智能竞品分析</strong>:收集竞品信息、对比分析、生成报告
+
+<strong>(5)生活服务类</strong>
+
+- <strong>智能健康助手</strong>:记录健康数据、提供健康建议、制定运动计划
+- <strong>智能理财助手</strong>:记录收支、分析消费习惯、提供理财建议
+- <strong>智能购物助手</strong>:比价、推荐商品、生成购物清单
+- <strong>智能家居控制</strong>:通过自然语言控制智能家居设备
+
+### 16.2.3 选题示例
+
+让我们通过一个具体的例子来说明如何选题和设计项目。
+
+<strong>项目名称</strong>:智能代码审查助手(CodeReviewAgent)
+
+<strong>问题分析</strong>:代码审查是软件开发中的重要环节,但人工审查耗时且容易遗漏问题。现有的静态分析工具只能发现语法错误,无法理解代码逻辑,因此需要一个能够理解代码语义、提供深度分析的智能助手。
+
+<strong>核心功能</strong>:该项目将实现代码质量分析(检查代码风格、命名规范、注释完整性)、潜在bug检测(发现逻辑错误、边界条件问题、资源泄漏)、性能优化建议(识别性能瓶颈、提出优化方案)、安全漏洞扫描(检测SQL注入、XSS等安全问题)以及最佳实践推荐(根据语言特性和设计模式提出改进建议)。
+
+<strong>预期成果</strong>:最终将交付一个可运行的Jupyter Notebook展示完整的审查流程,支持Python、JavaScript等主流语言,能够生成结构化的Markdown格式审查报告,并提供具体的代码示例和改进建议。
+
+## 16.3 开发环境准备
+
+### 16.3.1 安装必要工具
+
+在开始开发之前,请确保你的开发环境已经安装了以下工具:
+
+<strong>(1)Python环境</strong>
+
+```bash
+# 安装HelloAgents
+pip install "hello-agents[all]"
+```
+
+<strong>(2)Git和GitHub</strong>
+
+```bash
+# 检查Git版本
+git --version
+
+# 配置Git用户信息
+git config --global user.name "你的名字"
+git config --global user.email "你的邮箱"
+
+# 配置GitHub SSH密钥(推荐)
+# 1. 生成SSH密钥
+ssh-keygen -t ed25519 -C "你的邮箱"
+
+# 2. 将公钥添加到GitHub
+# 复制 ~/.ssh/id_ed25519.pub 的内容
+# 在GitHub Settings > SSH and GPG keys 中添加
+
+# 3. 测试连接
+ssh -T git@github.com
+```
+
+<strong>(3)Jupyter Notebook</strong>
+
+```bash
+# 安装Jupyter
+pip install jupyter notebook
+
+# 或者使用JupyterLab(推荐)
+pip install jupyterlab
+
+# 启动Jupyter
+jupyter lab
+```
+
+### 16.3.2 Fork项目仓库
+
+<strong>步骤1:Fork仓库</strong>
+
+1. 访问Hello-Agents仓库:https://github.com/datawhalechina/Hello-Agents
+2. 点击右上角的"Fork"按钮,如图16.1红色方框位置
+3. 选择你的GitHub账号,创建Fork
+
+<div align="center">
+  <img src="https://raw.githubusercontent.com/datawhalechina/Hello-Agents/main/docs/images/16-figures/16-1.png" alt="" width="85%"/>
+  <p>图 16.1 Fork仓库步骤</p>
+</div>
+
+<strong>步骤2:克隆到本地</strong>
+
+```bash
+# 如图16.2所示,克隆你Fork的仓库
+git clone git@github.com:你的用户名/Hello-Agents.git
+
+# 进入项目目录
+cd Hello-Agents
+
+# 添加上游仓库(用于同步更新)
+git remote add upstream https://github.com/datawhalechina/Hello-Agents.git
+
+# 查看远程仓库
+git remote -v
+```
+
+<div align="center">
+  <img src="https://raw.githubusercontent.com/datawhalechina/Hello-Agents/main/docs/images/16-figures/16-2.png" alt="" width="85%"/>
+  <p>图 16.2 克隆仓库到本地</p>
+</div>
+
+<strong>步骤3:创建开发分支</strong>
+
+```bash
+# 创建并切换到新分支
+git checkout -b feature/你的项目名称
+
+# 例如:
+git checkout -b feature/code-review-agent
+```
+
+
+### 16.3.3 项目目录结构
+
+在`Co-creation-projects`目录下创建你的项目文件夹:
+
+```bash
+# 进入共创项目目录
+cd Co-creation-projects
+
+# 创建项目文件夹(格式:GitHub用户名-项目名称)
+mkdir 你的用户名-项目名称
+
+# 例如:
+mkdir jjyaoao-CodeReviewAgent
+
+# 进入项目目录
+cd jjyaoao-CodeReviewAgent
+```
+
+推荐的项目结构:
+
+```
+jjyaoao-CodeReviewAgent/
+├── README.md              # 项目说明文档
+├── requirements.txt       # Python依赖列表
+├── main.ipynb            # 主要的Jupyter Notebook
+├── data/                 # 数据文件(可选)
+│   ├── sample_code.py
+│   └── test_cases.json
+├── outputs/              # 输出结果(可选)
+│   ├── review_report.md
+│   └── screenshots/
+├── src/                  # 源代码(可选,如果代码较多)
+│   ├── agents/
+│   ├── tools/
+│   └── utils/
+└──
+```
+
+## 16.4 项目开发指南
+
+### 16.4.1 编写README文档
+
+README是项目的门面,一个好的README应该包含以下内容:
+
+```markdown
+# 项目名称
+
+> 一句话描述你的项目
+
+## 📝 项目简介
+
+详细介绍你的项目:
+- 解决什么问题?
+- 有什么特色功能?
+- 适用于什么场景?
+
+## ✨ 核心功能
+
+- [ ] 功能1:描述
+- [ ] 功能2:描述
+- [ ] 功能3:描述
+
+## 🛠️ 技术栈
+
+- HelloAgents框架
+- 使用的智能体范式(如ReAct、Plan-and-Solve等)
+- 使用的工具和API
+- 其他依赖库
+
+## 🚀 快速开始
+
+### 环境要求
+
+- Python 3.10+
+- 其他要求
+
+### 安装依赖
+
+\`\`\`bash
+pip install -r requirements.txt
+\`\`\`
+
+### 配置API密钥
+
+\`\`\`bash
+# 创建.env文件
+cp .env.example .env
+
+# 编辑.env文件,填入你的API密钥
+\`\`\`
+
+### 运行项目
+
+\`\`\`bash
+# 启动Jupyter Notebook
+jupyter lab
+
+# 打开main.ipynb并运行
+\`\`\`
+
+## 📖 使用示例
+
+展示如何使用你的项目,最好包含代码示例和运行结果。
+
+## 🎯 项目亮点
+
+- 亮点1:说明
+- 亮点2:说明
+- 亮点3:说明
+
+## 📊 性能评估
+
+如果有评估结果,展示在这里:
+- 准确率:XX%
+- 响应时间:XX秒
+- 其他指标
+
+## 🔮 未来计划
+
+- [ ] 待实现的功能1
+- [ ] 待实现的功能2
+- [ ] 待优化的部分
+
+## 🤝 贡献指南
+
+欢迎提出Issue和Pull Request!
+
+## 📄 许可证
+
+MIT License
+
+## 👤 作者
+
+- GitHub: [@你的用户名](https://github.com/你的用户名)
+- Email: 你的邮箱(可选)
+
+## 🙏 致谢
+
+感谢Datawhale社区和Hello-Agents项目!
+```
+
+### 16.4.2 编写requirements.txt
+
+列出项目所需的所有Python依赖:
+
+```txt
+# 核心依赖
+hello-agents[all]>=0.2.7
+
+# 可视化(如果需要)
+matplotlib>=3.7.0
+plotly>=5.14.0
+
+# Web框架(如果需要)
+fastapi>=0.109.0
+uvicorn>=0.27.0
+```
+
+### 16.4.3 开发Jupyter Notebook
+
+<strong>(1)Notebook结构建议</strong>
+
+一个好的Jupyter Notebook应该包含以下部分:
+
+```python
+# ========================================
+# 第1部分:项目介绍
+# ========================================
+
+"""
+# 项目名称
+
+## 项目简介
+简要介绍项目的目标和功能
+
+## 作者信息
+- 姓名:XXX
+- GitHub:@XXX
+- 日期:2025-XX-XX
+"""
+
+# ========================================
+# 第2部分:环境配置
+# ========================================
+
+# 安装依赖
+!pip install -q hello-agents[all]
+
+# 导入必要的库
+from hello_agents import SimpleAgent, HelloAgentsLLM
+from hello_agents.tools import BaseTool
+import os
+from dotenv import load_dotenv
+
+# 加载环境变量
+load_dotenv()
+
+# ========================================
+# 第3部分:工具定义
+# ========================================
+
+class CustomTool(BaseTool):
+    """自定义工具类"""
+
+    name = "tool_name"
+    description = "工具描述"
+
+    def run(self, query: str) -> str:
+        """工具执行逻辑"""
+        # 实现你的工具逻辑
+        return "结果"
+
+# ========================================
+# 第4部分:智能体构建
+# ========================================
+
+# 创建LLM
+llm = HelloAgentsLLM()
+
+# 创建智能体
+agent = SimpleAgent(
+    name="智能体名称",
+    llm=llm,
+    system_prompt="系统提示词"
+)
+
+# 添加工具
+agent.add_tool(CustomTool())
+
+# ========================================
+# 第5部分:功能演示
+# ========================================
+
+# 示例1:基础功能
+print("=== 示例1:基础功能 ===")
+result = agent.run("用户输入")
+print(result)
+
+# 示例2:复杂场景
+print("\n=== 示例2:复杂场景 ===")
+result = agent.run("复杂的用户输入")
+print(result)
+
+# ========================================
+# 第6部分:性能评估(可选)
+# ========================================
+
+# 评估代码
+# ...
+
+# ========================================
+# 第7部分:总结与展望
+# ========================================
+
+"""
+## 项目总结
+
+### 实现的功能
+- 功能1
+- 功能2
+
+### 遇到的挑战
+- 挑战1及解决方案
+- 挑战2及解决方案
+
+### 未来改进方向
+- 改进1
+- 改进2
+"""
+```
+
+### 16.4.4 测试你的项目
+
+在提交之前,可以使用测试清单来判断自己的项目是否满足提交要求:
+
+```markdown
+- [ ] 代码能够正常运行,没有报错
+- [ ] README文档完整,说明清晰
+- [ ] requirements.txt包含所有依赖
+- [ ] 有清晰的使用示例
+- [ ] 代码有适当的注释
+- [ ] 输出结果符合预期
+- [ ] 处理了常见的异常情况
+- [ ] 项目结构清晰,文件命名规范
+- [ ] 大文件已妥善处理(见下节)
+```
+
+### 16.4.5 大文件处理指南
+
+<strong>⚠️ 重要:避免主仓库过大</strong>
+
+为了保持Hello-Agents主仓库的轻量化,请遵循以下大文件处理规范:
+
+<strong>(1)文件大小限制</strong>
+
+- **项目总大小**: 不超过5MB
+- **禁止直接提交**: 视频文件、大型数据集、模型文件
+
+<strong>(2)大文件处理方案</strong>
+
+如果你的项目包含大文件(数据集、视频、模型等),请使用以下方案:
+
+**方案1:使用外部链接(推荐)**
+
+将大文件上传到外部平台,在README中提供下载链接:
+
+```markdown
+## 数据集
+
+本项目使用的数据集较大,请从以下链接下载:
+
+- 数据集1: [百度网盘](链接) 提取码: xxxx
+- 数据集2: [Google Drive](链接)
+- 演示视频: [B站](链接) / [YouTube](链接)
+```
+
+推荐的外部平台:
+- **数据集**: 百度网盘、Google Drive、Kaggle、HuggingFace Datasets
+- **视频**: B站、YouTube、腾讯视频
+- **模型**: HuggingFace Models、ModelScope
+- **图片**: GitHub Issues、图床服务
+
+**方案2:创建独立仓库**
+
+如果项目资源较多,建议创建独立的数据仓库:
+
+```markdown
+## 项目资源
+
+由于项目包含大量数据和演示资源,已单独创建资源仓库:
+
+- 资源仓库: https://github.com/你的用户名/项目名称-resources
+- 包含内容: 数据集、演示视频、模型文件、测试数据等
+
+### 使用方法
+
+\`\`\`bash
+# 克隆资源仓库
+git clone https://github.com/你的用户名/项目名称-resources.git
+
+# 将数据放到项目目录
+cp -r 项目名称-resources/data ./data
+\`\`\`
+```
+
+**方案3:使用示例数据**
+
+在主仓库中只提供小规模的示例数据:
+
+```python
+# 在README中说明
+## 数据说明
+
+- `data/sample.csv`: 示例数据(100条记录)
+- 完整数据集(10万条记录)请从[这里](链接)下载
+```
+
+<strong>(3)最佳实践示例</strong>
+
+```
+你的用户名-项目名称/
+├── README.md              # 包含外部资源链接
+├── requirements.txt
+├── main.ipynb
+├── .gitignore            # 忽略大文件
+├── data/
+│   └── sample.csv        # 仅示例数据(<1MB)
+└── outputs/
+    └── demo_result.png   # 仅演示结果(<1MB)
+```
+
+README中的说明:
+
+```markdown
+## 数据和资源
+
+### 示例数据
+项目包含小规模示例数据用于快速测试(位于`data/sample.csv`)
+
+### 完整数据集
+完整数据集(500MB)请从以下链接下载:
+- 百度网盘: [链接] 提取码: xxxx
+- 下载后解压到`data/`目录
+
+### 演示视频
+- B站: [项目演示视频](链接)
+- YouTube: [Demo Video](链接)
+```
+
+## 16.5 提交Pull Request
+
+### 16.5.1 提交代码到GitHub
+
+<strong>步骤1:检查修改</strong>
+
+```bash
+# 查看修改的文件
+git status
+```
+
+<strong>步骤2:添加文件</strong>
+
+```bash
+# 添加所有修改的文件
+git add .
+
+# 或者添加特定文件
+git add Co-creation-projects/你的用户名-项目名称/
+```
+
+<strong>步骤3:提交修改</strong>
+
+提交信息应遵循以下格式:
+
+```bash
+# 格式:类型: 简短描述
+git commit -m "feat: 添加XXX毕业设计项目"
+```
+
+<strong>提交类型规范:</strong>
+
+- `feat`: 新增功能或项目(毕业设计项目使用此类型)
+- `fix`: 修复bug
+- `docs`: 文档更新
+- `style`: 代码格式调整(不影响功能)
+- `refactor`: 代码重构
+- `test`: 测试相关
+- `chore`: 其他修改(如依赖更新)
+
+<strong>步骤4:推送到GitHub</strong>
+
+```bash
+# 推送到你的Fork仓库
+git push origin feature/你的项目名称
+```
+
+### 16.5.2 创建Pull Request
+
+<strong>步骤1:访问GitHub</strong>
+
+1. 访问你Fork的仓库:`https://github.com/你的用户名/Hello-Agents`
+2. 点击"Pull requests"标签,如图16.3所示
+3. 点击"New pull request"按钮
+
+<div align="center">
+  <img src="https://raw.githubusercontent.com/datawhalechina/Hello-Agents/main/docs/images/16-figures/16-3.png" alt="" width="85%"/>
+  <p>图 16.3 创建Pull Request</p>
+</div>
+
+
+<strong>步骤2:选择分支</strong>
+
+- Base repository: `datawhalechina/Hello-Agents`
+- Base branch: `main`
+- Head repository: `你的用户名/Hello-Agents`
+- Compare branch: `feature/你的项目名称`
+
+<strong>步骤3:填写PR信息</strong>
+
+<strong>⚠️ 重要:PR标题统一格式</strong>
+
+为了便于管理和检索,所有毕业设计项目的PR标题必须遵循以下格式:
+
+```
+[毕业设计] 项目名称 - 简短描述
+```
+
+示例:
+- `[毕业设计] CodeReviewAgent - 智能代码审查助手`
+- `[毕业设计] StudyBuddy - AI学习伙伴`
+- `[毕业设计] DataAnalyst - 智能数据分析师`
+
+<strong>PR描述模板:</strong>
+
+```markdown
+## 项目信息
+
+- **项目名称**:XXX
+- **作者**:@你的用户名
+- **项目类型**:生产力工具/学习辅助/创意娱乐/数据分析/生活服务
+
+## 项目简介
+
+简要描述你的项目(2-3句话)
+
+## 核心功能
+
+- [ ] 功能1
+- [ ] 功能2
+- [ ] 功能3
+
+## 技术亮点
+
+- 使用了XXX范式
+- 实现了XXX功能
+- 优化了XXX性能
+
+## 演示效果
+
+(可选)添加截图或GIF展示项目效果
+
+## 自检清单
+
+- [ ] 代码能够正常运行
+- [ ] README文档完整
+- [ ] requirements.txt完整
+- [ ] 有清晰的使用示例
+- [ ] 代码有适当的注释
+
+## 其他说明
+
+(可选)其他需要说明的内容
+```
+
+<strong>步骤4:提交PR</strong>
+
+如图16.4所示,点击"Create pull request"按钮提交。
+
+<div align="center">
+  <img src="https://raw.githubusercontent.com/datawhalechina/Hello-Agents/main/docs/images/16-figures/16-4.png" alt="" width="85%"/>
+  <p>图 16.4 提交Pull Request</p>
+</div>
+
+
+
+### 16.5.3 响应Review意见
+
+提交PR后,社区成员会review你的代码并提出建议。请及时响应:
+
+1. <strong>查看评论</strong>:在PR页面查看reviewer的评论
+2. <strong>修改代码</strong>:根据建议修改代码
+3. <strong>提交更新</strong>:
+   ```bash
+   git add .
+   git commit -m "fix: 根据review意见修改XXX"
+   git push origin feature/你的项目名称
+   ```
+4. <strong>回复评论</strong>:在GitHub上回复reviewer,说明你的修改
+
+## 16.6 示例项目展示
+
+为了帮助你更好地理解毕业设计的要求,这里展示一个完整的示例项目,请别担心,小的创意同样可以被收录,只要是自己动手的作品都是值得珍惜的。
+
+<strong>项目信息</strong>
+
+- **项目名称**:CodeReviewAgent
+- **作者**:@jjyaoao
+- **项目路径**:`Co-creation-projects/jjyaoao-CodeReviewAgent/`
+
+<strong>项目结构</strong>
+
+```
+jjyaoao-CodeReviewAgent/
+├── README.md              # 项目文档
+├── requirements.txt       # 依赖列表
+├── main.ipynb            # 主程序(含快速演示和完整功能)
+├── .env.example          # 环境变量示例
+├── .gitignore            # Git忽略规则
+├── data/
+│   └── sample_code.py    # 示例代码
+└── outputs/
+    └── review_report.md  # 示例报告
+```
+
+<strong>核心代码片段(main.ipynb)</strong>
+
+```python
+# ========================================
+# 智能代码审查助手
+# ========================================
+
+from hello_agents import SimpleAgent, HelloAgentsLLM, ToolRegistry
+from hello_agents.tools import Tool, ToolParameter
+from typing import Dict, Any, List
+import ast
+import os
+
+# ========================================
+# 0. 配置LLM参数
+# ========================================
+
+os.environ["LLM_MODEL_ID"] = "Qwen/Qwen2.5-72B-Instruct"
+os.environ["LLM_API_KEY"] = "your_api_key_here"
+os.environ["LLM_BASE_URL"] = "https://api-inference.modelscope.cn/v1/"
+os.environ["LLM_TIMEOUT"] = "60"
+
+# ========================================
+# 1. 定义代码分析工具
+# ========================================
+
+class CodeAnalysisTool(Tool):
+    """代码静态分析工具"""
+
+    def __init__(self):
+        super().__init__(
+            name="code_analysis",
+            description="分析Python代码的结构、复杂度和潜在问题"
+        )
+
+    def run(self, parameters: Dict[str, Any]) -> str:
+        """分析代码并返回结果"""
+        code = parameters.get("code", "")
+        if not code:
+            return "错误:代码不能为空"
+
+        try:
+            tree = ast.parse(code)
+            functions = [node for node in ast.walk(tree)
+                        if isinstance(node, ast.FunctionDef)]
+            classes = [node for node in ast.walk(tree)
+                      if isinstance(node, ast.ClassDef)]
+
+            result = {
+                "函数数量": len(functions),
+                "类数量": len(classes),
+                "代码行数": len(code.split('\n')),
+                "函数列表": [f.name for f in functions],
+                "类列表": [c.name for c in classes]
+            }
+            return str(result)
+        except SyntaxError as e:
+            return f"语法错误:{str(e)}"
+
+    def get_parameters(self) -> List[ToolParameter]:
+        return [
+            ToolParameter(
+                name="code",
+                type="string",
+                description="要分析的Python代码",
+                required=True
+            )
+        ]
+
+class StyleCheckTool(Tool):
+    """代码风格检查工具"""
+
+    def __init__(self):
+        super().__init__(
+            name="style_check",
+            description="检查代码是否符合PEP 8规范"
+        )
+
+    def run(self, parameters: Dict[str, Any]) -> str:
+        """检查代码风格"""
+        code = parameters.get("code", "")
+        if not code:
+            return "错误:代码不能为空"
+
+        issues = []
+        lines = code.split('\n')
+        for i, line in enumerate(lines, 1):
+            if len(line) > 79:
+                issues.append(f"第{i}行:超过79个字符")
+            if line.startswith(' ') and not line.startswith('    '):
+                if len(line) - len(line.lstrip()) not in [0, 4, 8, 12]:
+                    issues.append(f"第{i}行:缩进不规范")
+
+        if not issues:
+            return "代码风格良好,符合PEP 8规范"
+        return "发现以下问题:\n" + "\n".join(issues)
+
+    def get_parameters(self) -> List[ToolParameter]:
+        return [
+            ToolParameter(
+                name="code",
+                type="string",
+                description="要检查的Python代码",
+                required=True
+            )
+        ]
+
+# ========================================
+# 2. 创建工具注册表和智能体
+# ========================================
+
+# 创建工具注册表
+tool_registry = ToolRegistry()
+tool_registry.register_tool(CodeAnalysisTool())
+tool_registry.register_tool(StyleCheckTool())
+
+# 初始化LLM
+llm = HelloAgentsLLM()
+
+# 定义系统提示词
+system_prompt = """你是一位经验丰富的代码审查专家。你的任务是:
+
+1. 使用code_analysis工具分析代码结构
+2. 使用style_check工具检查代码风格
+3. 基于分析结果,提供详细的审查报告
+
+审查报告应包括:
+- 代码结构分析
+- 风格问题
+- 潜在bug
+- 性能优化建议
+- 最佳实践建议
+
+请以Markdown格式输出报告。"""
+
+# 创建智能体
+agent = SimpleAgent(
+    name="代码审查助手",
+    llm=llm,
+    system_prompt=system_prompt,
+    tool_registry=tool_registry
+)
+
+# ========================================
+# 3. 运行示例
+# ========================================
+
+# 读取示例代码
+with open("data/sample_code.py", "r", encoding="utf-8") as f:
+    sample_code = f.read()
+
+print("=== 待审查的代码 ===")
+print(sample_code)
+print("\n" + "="*50 + "\n")
+
+# 执行代码审查
+print("=== 开始代码审查 ===")
+review_result = agent.run(f"请审查以下Python代码:\n\n```python\n{sample_code}\n```")
+
+print(review_result)
+
+# 保存审查报告
+with open("outputs/review_report.md", "w", encoding="utf-8") as f:
+    f.write(review_result)
+
+print("\n审查报告已保存到 outputs/review_report.md")
+```
+
+<strong>README.md示例</strong>
+
+```markdown
+# CodeReviewAgent - 智能代码审查助手
+
+> 基于HelloAgents框架的智能代码审查工具
+
+## 📝 项目简介
+
+CodeReviewAgent是一个智能代码审查助手,能够自动分析Python代码的质量、发现潜在问题并提供优化建议。
+
+### 核心功能
+
+- ✅ 代码结构分析:统计函数、类、代码行数等
+- ✅ 风格检查:检查是否符合PEP 8规范
+- ✅ 智能建议:基于LLM提供深度分析和优化建议
+- ✅ 报告生成:生成Markdown格式的审查报告
+
+## 🛠️ 技术栈
+
+- HelloAgents框架(SimpleAgent + ToolRegistry)
+- Python AST模块(代码解析)
+- ModelScope API(Qwen2.5-72B模型)
+
+## 🚀 快速开始
+
+### 安装依赖
+
+\`\`\`bash
+pip install -r requirements.txt
+\`\`\`
+
+### 配置LLM参数
+
+**方式1: 使用.env文件**
+
+\`\`\`bash
+cp .env.example .env
+# 编辑.env文件,填入你的API密钥
+\`\`\`
+
+**方式2: 直接在Notebook中设置**
+
+项目已预配置ModelScope API,可直接运行。如需修改,编辑main.ipynb第1部分的配置代码。
+
+### 运行项目
+
+\`\`\`bash
+jupyter lab
+# 打开main.ipynb并运行所有单元格
+\`\`\`
+
+## 📖 使用示例
+
+1. 将待审查的代码放入`data/sample_code.py`
+2. 运行`main.ipynb`
+3. 查看生成的审查报告`outputs/review_report.md`
+
+## 🎯 项目亮点
+
+- **自动化**:无需人工逐行检查,自动发现问题
+- **智能化**:利用LLM理解代码语义,提供深度建议
+- **可扩展**:易于添加新的检查规则和工具
+
+## 👤 作者
+
+- GitHub: [@jjyaoao](https://github.com/jjyaoao)
+- 项目链接:[CodeReviewAgent](https://github.com/datawhalechina/Hello-Agents/tree/main/Co-creation-projects/jjyaoao-CodeReviewAgent)
+
+## 🙏 致谢
+
+感谢Datawhale社区和Hello-Agents项目!
+```
+
+
+
+## 16.7 总结与展望
+
+通过完成毕业设计,你应该已经掌握了智能体系统设计的完整流程。从需求出发设计系统架构,熟练使用HelloAgents框架的各种功能和组件,开发自定义工具扩展智能体能力,完成从需求分析到代码实现的完整项目开发,学会使用Git和GitHub进行开源协作,以及编写清晰的技术文档。
+
+在本项目中,我们从零开始构建了HelloAgents框架,并用它实现了多个实用的应用。完成毕业设计只是开始,你可以继续深入学习更多智能体范式和算法、提示工程和上下文工程、多智能体协作机制等理论知识;也可以扩展技术栈,学习Web开发构建完整的应用、学习数据库实现数据持久化、学习部署将应用上线;还可以持续优化你的项目,添加更多功能、优化性能和用户体验、完善测试和文档;更重要的是,积极参与社区贡献,帮助其他学习者、参与Hello-Agents框架开发、分享你的经验和心得。
+
+从第一章的简单智能体,到现在能够独立构建完整的多智能体应用,你已经走过了一段精彩的学习旅程。但这不是终点,而是新的起点。
+
+AI技术日新月异,智能体领域更是充满无限可能。希望你能够保持好奇心持续学习新技术,勇于用AI技术解决实际问题创造价值,乐于将你的经验和成果分享给社区,不断打磨你的作品追求卓越。
+
+最后,感谢你完整阅读了本项目。希望你在学习的过程中有所收获,也希望你能够将所学应用到实际项目中,创造出令人惊叹的智能体应用。AI的未来充满无限可能,让我们一起探索和创造!
+
+<strong>记住:最好的学习方式就是动手实践!</strong>
+
+现在,开始构建属于你的智能体应用吧!我们期待在Co-creation-projects目录中看到你的精彩作品!
+
+如果你觉得Hello-Agents项目对你有帮助,请给我们一个⭐Star!
+
+---
+<div align="center">
+  <strong>🎓 恭喜你完成了Hello-Agents教程的学习!🎉</strong>

+ 3 - 9
docs/chapter4/第四章 智能体经典范式构建.md

@@ -673,10 +673,8 @@ class Planner:
         messages = [{"role": "user", "content": prompt}]
         
         print("--- 正在生成计划 ---")
-        response_text = ""
         # 使用流式输出来获取完整的计划
-        for chunk in self.llm_client.think(messages=messages):
-            response_text += chunk
+        response_text = self.llm_client.think(messages=messages) or ""
         
         print(f"✅ 计划已生成:\n{response_text}")
         
@@ -756,9 +754,7 @@ class Executor:
             
             messages = [{"role": "user", "content": prompt}]
             
-            response_text = ""
-            for chunk in self.llm_client.think(messages=messages):
-                response_text += chunk
+            response_text = self.llm_client.think(messages=messages) or ""
             
             # 更新历史记录,为下一步做准备
             history += f"步骤 {i+1}: {step}\n结果: {response_text}\n\n"
@@ -1094,9 +1090,7 @@ class ReflectionAgent:
     def _get_llm_response(self, prompt: str) -> str:
         """一个辅助方法,用于调用LLM并获取完整的流式响应。"""
         messages = [{"role": "user", "content": prompt}]
-        response_text = ""
-        for chunk in self.llm_client.think(messages=messages):
-            response_text += chunk
+        rresponse_text = self.llm_client.think(messages=messages) or ""
         return response_text
 
 ```

+ 45 - 1
docs/chapter7/第七章 构建你的Agent框架.md

@@ -137,7 +137,8 @@ print(response)
 # 添加工具功能(可选)
 from hello_agents.tools import CalculatorTool
 calculator = CalculatorTool()
-agent.add_tool(calculator)
+# 需要实现7.4.1的MySimpleAgent进行调用,后续章节会支持此类调用方式
+# agent.add_tool(calculator)
 
 # 现在可以使用工具了
 response = agent.run("请帮我计算 2 + 3 * 4")
@@ -2032,3 +2033,46 @@ async def test_parallel_execution():
 更重要的是,第七章的构建并非终点,而是为后续更深入学习提供了必要的技术基础。我们在设计之初便充分考虑了后续内容的延展性,为高级功能的实现预留了必要的接口和扩展点。我们所建立的统一LLM接口、标准化消息系统、工具注册机制,共同构成了一个完备的技术底座。这使得我们在后续章节中,可以更加从容地去学习更高级的主题:第八章的记忆与RAG系统将基于此扩展Agent的能力边界;第九章的上下文工程将深入我们已经建立的消息处理机制;第十章的智能体协议则需要扩展新的工具。
 
 接下来,我们将一起探索如何往框架中加入RAG系统与Memory机制,敬请期待第八章!
+
+
+## 习题
+
+1. 本章构建了 `HelloAgents` 框架,并阐述了"为何需要自建Agent框架"。请分析:
+
+   - 在7.1.1节中提到了当前主流框架的四个主要局限性。结合你在[第六章习题](../chapter6/第六章%20框架开发实践.md#习题)或实际项目中使用过的某个框架的实际经验,说明这些问题是如何影响开发效率的。
+   - `HelloAgents` 提出了"万物皆为工具"的设计理念,将 `Memory`、`RAG`、`MCP` 等模块都抽象为工具。这种设计有什么优势?是否存在局限性?请举例说明。
+   - 对比第四章从零实现的智能体代码和本章的框架化实现,框架化带来了哪些具体的改进?如果让你设计一个框架,你会优先考虑哪些设计原则?
+
+2. 在7.2节中,我们扩展了 `HelloAgentsLLM` 以支持多模型供应商和本地模型调用。
+
+   > <strong>提示</strong>:这是一道实践题,建议实际操作
+
+   - 参考7.2.1节的示例,尝试为 `HelloAgentsLLM` 添加一个新模型供应商的支持(如`Gemini`、`Anthropic`、`Kim`)。要求通过继承方式实现,并能够自动检测该提供商的环境变量。
+   - 在7.2.3节中介绍了自动检测机制的三个优先级。请分析:如果同时设置了 `OPENAI_API_KEY` 和 `LLM_BASE_URL="http://localhost:11434/v1"`,框架最后会选择哪个提供商?这种优先级设计是否合理?
+   - 除了本章介绍的 `VLLM` 和 `Ollama`,还有 `SGLang` 等其他本地模型部署方案。请先搜索并了解 `SGLang` 的基本信息和特点,然后对比 `VLLM`、`SGLang` 和 `Ollama` 这三者在易用性、资源占用、推理速度、推理精度等方面的优劣。
+
+3. 在7.3节中,我们实现了 `Message` 类、`Config` 类和 `Agent` 基类。请分析:
+
+   - `Message` 类使用了 `Pydantic` 的 `BaseModel` 进行数据验证。这种设计在实际应用中有哪些优势?
+   - `Agent` 基类定义了 `run` 和 `_execute` 两个方法,其中 `run` 是公开接口,`_execute` 是抽象方法。这种设计模式叫什么?有什么好处?
+   - 在 `Config` 类中,我们使用了单例模式。请解释什么是单例模式,为什么配置管理需要使用单例模式?如果不使用单例会导致什么问题?
+
+4. 在7.4节中,我们动手进行了四种 `Agent` 范式的框架化实现。
+
+   > <strong>提示</strong>:这是一道实践题,建议实际操作
+
+   - 对比第四章从零实现的 `ReActAgent` 和本章框架化的 `ReActAgent`,列举3个具体的改进点,并说明这些改进如何提升了代码的可维护性和可扩展性。
+   - `ReflectionAgent` 实现了"执行-反思-优化"循环。请扩展这个实现,添加一个"质量评分"机制:在每次反思后,让 `LLM` 对当前版本的输出打分,只有分数低于阈值时才继续优化,否则提前终止。
+   - 请设计并实现一个新的 `Agent` 范式 `Tree-of-Thought Agent`,要求继承 `Agent` 基类,它能够在每一步生成多个可能的思考路径,然后选择最优路径继续。
+
+5. 在7.5节中,我们构建了工具系统。请思考以下问题:
+
+   - `BaseTool` 类定义了 `execute` 抽象方法,所有工具都必须实现这个方法。请解释为什么要强制所有工具实现统一的接口?如果某个工具需要返回多个值(如搜索工具返回标题、摘要、链接),应该如何设计?
+   - 在7.5.3节中实现了工具链(`ToolChain`)。请设计一个实际的应用场景,需要串联至少3个工具,并画出工具链的执行流程图。
+   - 异步工具执行器(`AsyncToolExecutor`)使用了线程池来并行执行工具。请分析:在什么情况下并行执行工具能带来性能提升?
+
+6. 框架的可扩展性是设计的重要考量因素之一。你现在要扩展 `HelloAgents` 框架,为其实现一些有趣的新功能和特性。
+
+   - 首先为 `HelloAgents` 添加一个"流式输出"功能,使得 `Agent` 在生成响应时能够实时返回中间结果(类似 `ChatGPT` 用户界面的打字效果)。请设计这个功能的实现方案,说明需要修改哪些类和方法。
+   - 然后为框架添加"多轮对话管理"功能,能够自动管理对话历史、支持对话分支和回溯,你会如何设计?需要新增哪些类?如何与现有的 `Message` 系统集成?
+   - 最后请为 `HelloAgents` 设计一个"插件系统",允许第三方开发者通过插件的方式扩展框架功能(如添加新的 `Agent` 类型、新的工具类型等),而无需修改框架核心代码。要求画出插件系统的架构图并说明关键接口。

+ 36 - 0
docs/chapter8/第八章 记忆与检索.md

@@ -2034,7 +2034,43 @@ def generate_report(self, save_to_file: bool = True) -> Dict[str, Any]:
 
 在下一章中,我们将继续探索如何通过上下文工程进一步提升智能体的对话质量和用户体验,敬请期待!
 
+## 习题
 
+> <strong>提示</strong>:部分习题没有标准答案,重点在于培养学习者对记忆系统和RAG技术的综合理解和实践能力。
+
+1. 本章介绍了四种记忆类型:工作记忆、情景记忆、语义记忆和感知记忆。请分析:
+
+   - 在8.2.5节中,每种记忆类型都有独特的评分公式。请对比情景记忆和语义记忆的评分机制,解释为什么情景记忆更强调"时间近因性"(权重0.2),而语义记忆更强调"图检索"(权重0.3)?
+   - 如果要设计一个"个人健康管理助手"(需要记录用户的饮食、运动、睡眠数据,并提供健康建议),你会如何组合使用这四种记忆类型?请为每种记忆类型设计具体的应用场景。
+   - 工作记忆采用TTL(Time To Live)机制自动清理过期数据。请思考:在什么情况下,重要的工作记忆应该被"整合"(consolidate)为长期记忆?如何设计一个自动整合的触发条件?
+
+2. 在8.3节的RAG系统中,我们使用MarkItDown将各种格式文档统一转换为Markdown。请深入思考:
+
+   > <strong>提示</strong>:这是一道动手实践题,建议实际操作
+
+   - 当前的智能分块策略基于Markdown的标题层次(#、##、###)进行分割。如果处理的是没有明确标题结构的文档(如小说、法律条文),应该如何优化分块策略?请尝试实现一个基于"语义边界"的分块算法。
+   - 在8.3.5节中介绍了MQE(多查询扩展)和HyDE(假设文档嵌入)两种高级检索策略。请选择一个实际场景(如技术文档问答、医疗知识检索),对比基础检索、MQE和HyDE三种方法的效果差异,并分析各自的适用场景。
+   - RAG系统的检索质量很大程度上取决于嵌入模型的选择。请对比本章提到的三种嵌入方案(百炼API、本地Transformer、TF-IDF),从准确性、速度、成本、离线部署等维度进行评估,并给出选型建议。
+
+3. 记忆系统的"遗忘"机制是模拟人类认知的重要设计。基于8.2.3节的MemoryTool,请完成以下扩展实践:
+
+   > <strong>提示</strong>:这是一道动手实践题,建议实际操作
+
+   - 当前提供了三种遗忘策略:基于重要性、基于时间、基于容量。请设计并实现一个"智能遗忘"策略,综合考虑重要性、访问频率、时间衰减等多个因素,使用加权评分来决定哪些记忆应该被遗忘。
+   - 在长期运行的智能体系统中,记忆数据库可能会积累大量数据。请设计一个"记忆归档"机制:将长期不用但可能有价值的记忆转移到冷存储,需要时再恢复。这个机制应该如何与现有的四种记忆类型集成?
+   - 思考:如果智能体需要"忘记"某些敏感信息(如用户隐私数据),仅仅从数据库删除是否足够?在使用向量数据库和图数据库的情况下,如何确保数据被彻底清除?
+
+4. 在8.4节的"智能学习助手"案例中,我们结合了MemoryTool和RAGTool。请深入分析:
+
+   - 案例中的`ask_question()`方法同时使用了RAG检索和记忆检索。请分析:在什么情况下应该优先使用RAG?在什么情况下应该优先使用Memory?如何设计一个"智能路由"机制来自动选择最合适的检索方式?
+   - 当前的学习报告(`generate_report()`)只包含统计信息。请扩展这个功能,设计一个更智能的学习报告生成器:能够分析用户的学习轨迹、识别知识盲点、推荐下一步学习内容。这需要用到哪些记忆类型和检索策略?
+   - 假设你要将这个学习助手部署为多用户的Web服务,每个用户都有独立的记忆和知识库。请设计数据隔离方案:如何在Qdrant和Neo4j中实现用户级别的数据隔离?如何优化多用户场景下的检索性能?
+
+5. 语义记忆使用了Neo4j图数据库来存储知识图谱。请思考:
+
+   - 在8.2.5节的语义记忆实现中,系统会自动提取实体和关系构建知识图谱。请分析:这种自动提取的准确性如何?在什么情况下可能会提取出错误的实体或关系?如何设计一个"知识图谱质量评估"机制?
+   - 知识图谱的一个重要优势是支持复杂的关系推理。请设计一个查询场景,充分利用Neo4j的图查询能力(如多跳关系、路径查找),实现纯向量检索无法完成的任务。
+   - 对比语义记忆的"向量检索+图检索"混合策略与纯向量检索:在什么类型的查询中,图检索能够带来显著的性能提升?请用具体例子说明。
 
 ## 参考文献
 

+ 45 - 81
docs/chapter9/第九章 上下文工程.md

@@ -2038,43 +2038,13 @@ context = context_builder.build(
 
 ### 9.6.1 场景设定与需求分析
 
-(1)业务场景
+<strong>业务场景</strong>
 
-假设我们正在维护一个中型 Python Web 应用,代码库包含:
+假设我们正在维护一个中型 Python Web 应用,这个代码库包含约 50 个 Python 文件,使用 Flask 框架构建,涵盖数据模型、业务逻辑、API 接口等多个模块,同时存在一些技术债务需要逐步清理。在这样的场景下,我们需要一个智能助手来帮助我们探索代码库,理解项目结构、依赖关系和代码风格;识别代码中的问题,比如代码重复、复杂度过高、缺少测试等;追踪任务进度,记录待办事项、已完成工作和遇到的阻塞;并基于历史上下文提供连贯的重构建议。
 
-- 约 50 个 Python 文件
-- 使用 Flask 框架
-- 包含数据模型、业务逻辑、API 接口等模块
-- 存在一些技术债务需要逐步清理
+<strong>挑战与解决方案</strong>
 
-我们需要一个智能助手来:
-
-- <strong>探索代码库</strong>:理解项目结构、依赖关系、代码风格
-- <strong>识别问题</strong>:发现代码重复、复杂度高、缺少测试等问题
-- <strong>追踪任务</strong>:记录待办事项、已完成工作、遇到的阻塞
-- <strong>提供建议</strong>:基于历史上下文,提供连贯的重构建议
-
-(2)挑战与解决方案
-
-这个场景面临几个典型的长程任务挑战:
-
-<strong>挑战1:信息量超出上下文窗口</strong>
-
-整个代码库可能包含数万行代码,无法一次性放入上下文窗口。
-
-<strong>解决方案</strong>:使用 TerminalTool 进行即时、按需的代码探索,只在需要时查看具体文件。
-
-<strong>挑战2:跨会话的状态管理</strong>
-
-重构任务可能持续数天,需要跨多个会话保持进度。
-
-<strong>解决方案</strong>:使用 NoteTool 记录阶段性进展、待办事项和关键决策。
-
-<strong>挑战3:上下文质量与相关性</strong>
-
-每次对话需要回顾相关的历史信息,但不能被无关信息淹没。
-
-<strong>解决方案</strong>:使用 ContextBuilder 智能筛选和组织上下文,确保高信号密度。
+这个场景面临几个典型的长程任务挑战。首先是信息量超出上下文窗口的问题,整个代码库可能包含数万行代码,无法一次性放入上下文窗口,我们通过使用 TerminalTool 进行即时、按需的代码探索来解决这个问题,只在需要时查看具体文件。其次是跨会话的状态管理挑战,重构任务可能持续数天,需要跨多个会话保持进度,我们使用 NoteTool 记录阶段性进展、待办事项和关键决策来应对。最后是上下文质量与相关性的问题,每次对话需要回顾相关的历史信息,但不能被无关信息淹没,我们通过 ContextBuilder 智能筛选和组织上下文,确保高信号密度。
 
 ### 9.6.2 系统架构设计
 
@@ -2769,55 +2739,11 @@ print(json.dumps(report, indent=2, ensure_ascii=False))
 
 ### 9.6.5 运行效果分析
 
-通过这个完整的案例,我们可以看到长程智能体的几个关键特性:
-
-(1)跨会话的连贯性
-
-智能体通过 NoteTool 保持了跨多天、多个会话的任务连贯性:
-
-- 第一天探索的问题,在第二天分析时被自动考虑
-- 第三天规划时,能够综合前两天的所有发现
-- 一周后检查时,完整的历史都被保留
-
-(2)智能的上下文管理
-
-ContextBuilder 确保每次对话都有高质量的上下文:
-
-- 自动汇集相关笔记(特别是 blocker 类型)
-- 根据对话模式动态调整预处理策略
-- 在 token 预算内选择最相关的信息
-
-(3)即时的文件系统访问
-
-TerminalTool 支持灵活的代码探索:
-
-- 无需预先索引整个代码库
-- 可以即时查看具体文件内容
-- 支持复杂的文本处理(grep, awk等)
+通过这个完整的案例,我们可以看到长程智能体的几个关键特性。首先是跨会话的连贯性,智能体通过 NoteTool 保持了跨多天、多个会话的任务连贯性,第一天探索的问题在第二天分析时被自动考虑,第三天规划时能够综合前两天的所有发现,一周后检查时完整的历史都被保留。其次是智能的上下文管理,ContextBuilder 确保每次对话都有高质量的上下文,自动汇集相关笔记(特别是 blocker 类型),根据对话模式动态调整预处理策略,在 token 预算内选择最相关的信息。
 
-(4)自动化的知识管理
+第三个特性是即时的文件系统访问,TerminalTool 支持灵活的代码探索,无需预先索引整个代码库,可以即时查看具体文件内容,支持复杂的文本处理(grep、awk等)。第四是自动化的知识管理,系统自动化地管理发现的知识,发现问题时自动创建 blocker 笔记,讨论计划时自动创建 action 笔记,关键信息自动存储到记忆系统。最后是人机协作,这个系统支持灵活的人机协作模式,智能体可以自动化地完成探索和分析,人类可以通过笔记系统进行干预和指导,支持手动创建详细的计划笔记。
 
-系统自动化地管理发现的知识:
-
-- 发现问题时自动创建 blocker 笔记
-- 讨论计划时自动创建 action 笔记
-- 关键信息自动存储到记忆系统
-
-(5)人机协作
-
-这个系统支持灵活的人机协作模式:
-
-- 智能体可以自动化地完成探索和分析
-- 人类可以通过笔记系统进行干预和指导
-- 支持手动创建详细的计划笔记
-
-这个基础框架可以进一步扩展:
-
-- <strong>集成 RAGTool</strong>:为代码库建立向量索引,结合语义检索
-- <strong>多智能体协作</strong>:拆分为专门的探索者、分析者、规划者
-- <strong>自动化测试</strong>:集成测试工具,自动验证重构结果
-- <strong>版本控制集成</strong>:通过 TerminalTool 执行 git 命令,追踪代码变更
-- <strong>可视化界面</strong>:使用 Gradio/Streamlit 构建 Web 界面
+这个基础框架可以进一步扩展,比如集成 RAGTool 为代码库建立向量索引结合语义检索,拆分为专门的探索者、分析者、规划者实现多智能体协作,集成测试工具自动验证重构结果,通过 TerminalTool 执行 git 命令追踪代码变更,或者使用 Gradio/Streamlit 构建可视化界面。
 
 ## 9.7 本章总结
 
@@ -2847,6 +2773,44 @@ TerminalTool 支持灵活的代码探索:
 
 在下一章中,我们将探讨智能体通信协议,学习如何让智能体与外部世界进行更广泛的交互。
 
+## 习题
+
+> <strong>提示</strong>:部分习题没有标准答案,重点在于培养学习者对上下文工程和长时程任务管理的综合理解和实践能力。
+
+1. 本章介绍了上下文工程与提示工程的区别。请分析:
+
+   - 在9.1节中提到"上下文必须被视作一种有限资源,且具有边际收益递减"。请解释什么是"上下文腐蚀"(context rot)现象?为什么即使模型支持100K甚至200K的上下文窗口,我们仍然需要谨慎管理上下文?
+   - 假设你要构建一个"代码审查助手",需要分析一个包含50个文件的代码库。请对比两种策略:(1)一次性将所有文件内容加载到上下文中;(2)使用JIT(Just-in-time)上下文,通过工具按需检索文件。分析各自的优缺点和适用场景。
+   - 在9.2.1节中提到系统提示的两个极端误区:"过度硬编码"和"过于空泛"。请各举一个实际例子,并说明如何找到合适的平衡点。
+
+2. GSSC(Gather-Select-Structure-Compress)流水线是本章的核心技术。请深入思考:
+
+   > <strong>提示</strong>:这是一道动手实践题,建议实际操作
+
+   - 在9.3节的ContextBuilder实现中,四个阶段各有不同的职责。请分析:如果某个阶段失效(如Select阶段选择了不相关的信息,或Compress阶段过度压缩导致信息丢失),会对最终的智能体表现产生什么影响?
+   - 请基于9.3.4节的代码,为ContextBuilder添加一个"上下文质量评估"功能:在每次构建上下文后,自动评估上下文的信息密度、相关性和完整性,并给出优化建议。
+   - GSSC流水线中的"压缩"阶段使用了LLM进行智能摘要。请思考:在什么情况下,简单的截断(truncation)或滑动窗口(sliding window)策略可能比LLM摘要更合适?设计一个混合压缩策略,结合多种压缩方法的优势。
+
+3. NoteTool和TerminalTool是支持长时程任务的关键工具。基于9.4节和9.5节的内容,请完成以下扩展实践:
+
+   > <strong>提示</strong>:这是一道动手实践题,建议实际操作
+
+   - NoteTool使用了分层笔记系统(项目笔记、任务笔记、临时笔记)。请设计一个"笔记自动整理"机制:当临时笔记积累到一定数量时,智能体能够自动分析这些笔记,将重要信息提升为任务笔记或项目笔记,并清理冗余内容。
+   - TerminalTool提供了文件系统操作能力,但在9.5.2节中强调了安全性设计。请分析:当前的安全机制(路径验证、命令白名单、权限检查)是否足够?如果智能体需要访问敏感文件或执行危险操作,应该如何设计一个"人机协作审批"流程?
+   - 结合NoteTool和TerminalTool,设计一个"智能代码重构助手":能够分析代码库结构、记录重构计划、逐步执行重构操作,并在笔记中追踪进度和遇到的问题。请画出完整的工作流程图。
+
+4. 在9.6节的"长时程任务管理"案例中,我们看到了上下文工程在实际应用中的价值。请深入分析:
+
+   - 案例中使用了"分层上下文管理"策略:即时访问(TerminalTool)+ 会话记忆(MemoryTool)+ 持久笔记(NoteTool)。请分析:这三层之间应该如何协调?什么信息应该放在哪一层?如何避免信息冗余和不一致?
+   - 假设任务执行过程中发生了中断(如系统崩溃、网络断开),智能体需要从笔记中恢复状态并继续执行。请设计一个"断点续传"机制:如何在笔记中记录足够的状态信息?如何验证恢复后的状态是否正确?
+   - 长时程任务往往涉及多个子任务的并行或串行执行。请设计一个"任务依赖管理"系统:能够表达任务之间的依赖关系(如"任务B必须在任务A完成后执行"),并自动调度任务执行顺序。这个系统应该如何与NoteTool集成?
+
+5. 本章多次提到"渐进式披露"(progressive disclosure)的概念。请思考:
+
+   - 在9.2.2节中,渐进式披露被描述为"每一步交互都会产生新的上下文,反过来指导下一步决策"。请设计一个具体的应用场景(如学术论文写作、复杂问题调试),展示渐进式披露如何帮助智能体更高效地完成任务。
+   - 渐进式披露的一个潜在风险是"探索效率低下":智能体可能会在不重要的细节上浪费时间,或者错过关键信息。请设计一个"探索引导"机制:通过启发式规则或元认知策略,帮助智能体更聪明地决定"下一步应该探索什么"。
+   - 对比"渐进式披露"与传统的"一次性加载所有上下文":在什么类型的任务中,前者有明显优势?在什么类型的任务中,后者可能更合适?请给出至少3个不同类型的任务示例。
+
 ## 参考文献
 
 [1] Anthropic. Effective Context Engineering for AI Agents. `https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents`

BIN
docs/images/16-figures/16-1.png


BIN
docs/images/16-figures/16-2.png


BIN
docs/images/16-figures/16-3.png


BIN
docs/images/16-figures/16-4.png


BIN
docs/images/star-history-20251028.png


BIN
docs/images/star-history-2025111.png