jjyaoao 9 месяцев назад
Родитель
Сommit
c52b2376ba

+ 7 - 7
Additional-Chapter/n8n配置.md

@@ -4,11 +4,11 @@
 
 选择你的终端设备进行下载,这里以Windows作为演示。
 
-![image-20250912025341155](.\n8n配置\image-20250912025341272.png)
+![image-20250912025341155](./n8n配置/image-20250912025341272.png)
 
 下载好以后可以切换磁盘存放路径,因为镜像一般很大,尽量不要存在C盘。
 
-![image-20250912032540657](.\n8n配置\image-20250912032540657.png)
+![image-20250912032540657](./n8n配置/image-20250912032540657.png)
 
 后打开你的命令行,输入以下指令拉取n8n
 
@@ -19,19 +19,19 @@ docker run -d --restart unless-stopped --name n8n -p 5678:5678 -v n8n_data:/home
 
 现在我们就能在docker里面看到n8n运行啦
 
-![image-20250912033251997](.\n8n配置\image-20250912033251997.png)
+![image-20250912033251997](./n8n配置/image-20250912033251997.png)
 
 点击5678:5678可以进入n8n的启动界面。
 
-![image-20250912033341666](.\n8n配置\image-20250912033341666.png)
+![image-20250912033341666](./n8n配置/image-20250912033341666.png)
 
 进入页面后,可以看到打开新项目的按钮
 
-![image-20250912034040656](.\n8n配置\image-20250912034040656.png)
+![image-20250912034040656](./n8n配置/image-20250912034040656.png)
 
 主要用到的功能有三个
-![image-20250912234709064](.\n8n配置\image-20250912234709064.png)
+![image-20250912234709064](./n8n配置/image-20250912234709064.png)
 
 添加新节点按钮打开之后可以搜索节点或选择自己有需要的节点添加即可~
 
-![image-20250912234748845](.\n8n配置\image-20250912234748845.png)
+![image-20250912234748845](./n8n配置/image-20250912234748845.png)

+ 58 - 58
docs/chapter5/第五章 基于低代码平台的智能体搭建.md

@@ -13,9 +13,9 @@
 其核心价值主要体现在以下几个方面:
 
 1. <strong>降低技术门槛</strong>:低代码平台将复杂的技术细节(如 API 调用、状态管理、并发控制)封装成一个个易于理解的“节点”或“模块”。用户无需精通编程,只需通过拖拽、连接这些节点,就能构建出功能强大的工作流。这使得产品经理、设计师、业务专家等非技术人员也能参与到智能体的设计与创造中来,极大地拓宽了创新的边界。
-2. <strong>提升开发效率:对于专业开发者而言,平台同样能带来巨大的效率提升。在项目初期,当需要快速验证一个想法或搭建一个原型 (Prototype) 时,使用低代码平台可以在数小时甚至数分钟内完成原本需要数天编码的工作。开发者可以将精力更多地投入到业务逻辑梳理和提示工程优化上,而非底层的工程实现。
-3. </strong>提供更优的可视化与可观测性<strong>:相比于在终端中打印日志,图形化的平台天然提供了对智能体运行轨迹的端到端可视化。你可以清晰地看到数据在每一个节点之间如何流动,哪一个环节耗时最长,哪一个工具调用失败。这种直观的调试体验,是纯代码开发难以比拟的。
-4. </strong>标准化与最佳实践沉淀<strong>:优秀的低代码平台通常会内置许多行业内的最佳实践。例如,它会提供预设的 ReAct 模板、优化的知识库检索引擎、标准化的工具接入规范等。这不仅避免了开发者“踩坑”,也使得团队协作更加顺畅,因为所有人都基于同一套标准和组件进行开发。
+2. <strong>提升开发效率</strong>:对于专业开发者而言,平台同样能带来巨大的效率提升。在项目初期,当需要快速验证一个想法或搭建一个原型 (Prototype) 时,使用低代码平台可以在数小时甚至数分钟内完成原本需要数天编码的工作。开发者可以将精力更多地投入到业务逻辑梳理和提示工程优化上,而非底层的工程实现。
+3. <strong>提供更优的可视化与可观测性</strong>:相比于在终端中打印日志,图形化的平台天然提供了对智能体运行轨迹的端到端可视化。你可以清晰地看到数据在每一个节点之间如何流动,哪一个环节耗时最长,哪一个工具调用失败。这种直观的调试体验,是纯代码开发难以比拟的。
+4. <strong>标准化与最佳实践沉淀</strong>:优秀的低代码平台通常会内置许多行业内的最佳实践。例如,它会提供预设的 ReAct 模板、优化的知识库检索引擎、标准化的工具接入规范等。这不仅避免了开发者“踩坑”,也使得团队协作更加顺畅,因为所有人都基于同一套标准和组件进行开发。
 
 简而言之,低代码平台并非要取代代码,而是提供了一种更高层次的抽象。它让我们可以从繁琐的底层实现中解放出来,更专注于智能体“思考”与“行动”的逻辑本身,从而更快、更好地将创意变为现实。
 
@@ -23,33 +23,33 @@
 
 当前,智能体与 LLM 应用的低代码平台市场呈现出百花齐放的态势,每个平台都有其独特的定位和优势。选择哪个平台,往往取决于你的核心需求、技术背景以及项目的最终目标。在本章的后续内容中,我们将重点介绍并实操四个各具代表性的平台:Coze、Dify、FastGPT 和 n8n。在此之前,我们先对它们进行一个概要性的介绍。
 
-</strong>Coze<strong>
+<strong>Coze</strong>
 
-- </strong>核心定位<strong>:由字节跳动推出的 Coze,主打零代码/低代码的 Agent 的构建体验,让不具备编程背景的用户也能轻松创造。
-- </strong>特点分析<strong>:Coze 拥有极其友好的可视化界面,用户可以像搭建乐高积木一样,通过拖拽插件、配置知识库和设定工作流来创建智能体。其内置了极为丰富的插件库,并支持一键发布到抖音、飞书、微信公众号等多个主流平台,极大地简化了分发流程。
-- </strong>适用人群<strong>:AI 应用的入门用户、产品经理、运营人员,以及希望快速将创意变为可交互产品的个人创作者。
+- <strong>核心定位</strong>:由字节跳动推出的 Coze,主打零代码/低代码的 Agent 的构建体验,让不具备编程背景的用户也能轻松创造。
+- <strong>特点分析</strong>:Coze 拥有极其友好的可视化界面,用户可以像搭建乐高积木一样,通过拖拽插件、配置知识库和设定工作流来创建智能体。其内置了极为丰富的插件库,并支持一键发布到抖音、飞书、微信公众号等多个主流平台,极大地简化了分发流程。
+- <strong>适用人群</strong>:AI 应用的入门用户、产品经理、运营人员,以及希望快速将创意变为可交互产品的个人创作者。
 
-</strong>Dify<strong>
+<strong>Dify</strong>
 
-- </strong>核心定位<strong>:Dify 是一个开源的、功能全面的 LLM 应用开发与运营平台,旨在为开发者提供从原型构建到生产部署的一站式解决方案。
-- </strong>特点分析<strong>:它融合了后端服务和模型运营的理念,支持 Agent 工作流、RAG Pipeline、数据标注与微调等多种能力。对于追求专业、稳定、可扩展的企业级应用而言,Dify 提供了坚实的基础。
-- </strong>适用人群<strong>:有一定技术背景的开发者、需要构建可扩展的企业级 AI 应用的团队。
+- <strong>核心定位</strong>:Dify 是一个开源的、功能全面的 LLM 应用开发与运营平台,旨在为开发者提供从原型构建到生产部署的一站式解决方案。
+- <strong>特点分析</strong>:它融合了后端服务和模型运营的理念,支持 Agent 工作流、RAG Pipeline、数据标注与微调等多种能力。对于追求专业、稳定、可扩展的企业级应用而言,Dify 提供了坚实的基础。
+- <strong>适用人群</strong>:有一定技术背景的开发者、需要构建可扩展的企业级 AI 应用的团队。
 
-</strong>FastGPT<strong>
+<strong>FastGPT</strong>
 
-- </strong>核心定位<strong>:FastGPT 是一个专注于知识库问答场景的开源 AI 平台。
+- <strong>核心定位</strong>:FastGPT 是一个专注于知识库问答场景的开源 AI 平台。
 
-- </strong>特点分析<strong>:它的核心优势在于强大的</strong>检索增强生成(Retrieval-augmented generation, RAG)<strong>能力。用户可以轻松导入多种格式的私有文档,快速构建一个高质量、高精度的企业知识库或智能客服。相比于 Dify,FastGPT 更轻量、在 RAG 效果上打磨得更深,并提供了与 OpenAI 兼容的 API,便于集成。
+- <strong>特点分析</strong>:它的核心优势在于强大的<strong>检索增强生成(Retrieval-augmented generation, RAG)</strong>能力。用户可以轻松导入多种格式的私有文档,快速构建一个高质量、高精度的企业知识库或智能客服。相比于 Dify,FastGPT 更轻量、在 RAG 效果上打磨得更深,并提供了与 OpenAI 兼容的 API,便于集成。
 
-- </strong>适用人群<strong>:需要构建企业内部知识库、AI 客服、领域知识问答系统的开发者或中小企业。
+- <strong>适用人群</strong>:需要构建企业内部知识库、AI 客服、领域知识问答系统的开发者或中小企业。
 
-</strong>n8n<strong>
+<strong>n8n</strong>
 
-- </strong>核心定位<strong>:n8n 本质上是一个开源工作流自动化工具,而非纯粹的 LLM 平台。近年来,它积极集成了 AI 能力。
+- <strong>核心定位</strong>:n8n 本质上是一个开源工作流自动化工具,而非纯粹的 LLM 平台。近年来,它积极集成了 AI 能力。
 
-- </strong>特点分析<strong>:n8n 的强项在于“连接”。它拥有数百个预置的节点,可以轻松地将各类 SaaS 服务、数据库、API 连接成复杂的自动化业务流程。你可以在这个流程中嵌入 LLM 节点,使其成为整个自动化链路中的一环。虽然在 LLM 功能的专一度上不如前三者,但其通用自动化能力是独一无二的。不过,其学习曲线也相对陡峭。
+- <strong>特点分析</strong>:n8n 的强项在于“连接”。它拥有数百个预置的节点,可以轻松地将各类 SaaS 服务、数据库、API 连接成复杂的自动化业务流程。你可以在这个流程中嵌入 LLM 节点,使其成为整个自动化链路中的一环。虽然在 LLM 功能的专一度上不如前三者,但其通用自动化能力是独一无二的。不过,其学习曲线也相对陡峭。
 
-- </strong>适用人群<strong>:需要将 AI 能力深度整合进现有业务流程、实现高度定制化自动化的开发者和企业。
+- <strong>适用人群</strong>:需要将 AI 能力深度整合进现有业务流程、实现高度定制化自动化的开发者和企业。
 
 在接下来的小节中,我们将逐一上手体验这些平台,通过实际操作来更直观地感受它们各自的魅力。
 
@@ -102,19 +102,19 @@
 
 ### 5.5.1 n8n 的节点与工作流
 
-n8n 的世界由两个最基本的概念构成:</strong>节点 (Node)<strong> 和 </strong>工作流 (Workflow)<strong>。
+n8n 的世界由两个最基本的概念构成:<strong>节点 (Node)</strong> 和 <strong>工作流 (Workflow)</strong>。
 
-- </strong>节点 (Node)<strong>:节点是工作流中执行具体操作的最小单元。你可以把它想象成一个具有特定功能的“积木块”。n8n 提供了数百种预置节点,涵盖了从发送邮件、读写数据库、调用 API 到处理文件等各种常见操作。每个节点都有输入和输出,并提供图形化的配置界面。节点大致可以分为两类:
-  - </strong>触发节点 (Trigger Node)<strong>:它是整个工作流的起点,负责启动流程。例如,“当收到一封新的 Gmail 邮件时”、“每小时定时触发一次”或“当接收到一个 Webhook 请求时”。一个工作流必须有且仅有一个触发节点。
-  - </strong>常规节点 (Regular Node)<strong>:负责处理具体的数据和逻辑。例如,“读取 Google Sheets 表格”、“调用 OpenAI 模型”或“在数据库中插入一条记录”。
-- </strong>工作流 (Workflow)<strong>:工作流是由多个节点连接而成的自动化流程图。它定义了数据从触发节点开始,如何一步步地在不同节点之间传递、被处理,并最终完成预设任务的完整路径。数据在节点之间以结构化的 JSON 格式进行传递,这使得我们可以精确地控制每一个环节的输入和输出。
+- <strong>节点 (Node)</strong>:节点是工作流中执行具体操作的最小单元。你可以把它想象成一个具有特定功能的“积木块”。n8n 提供了数百种预置节点,涵盖了从发送邮件、读写数据库、调用 API 到处理文件等各种常见操作。每个节点都有输入和输出,并提供图形化的配置界面。节点大致可以分为两类:
+  - <strong>触发节点 (Trigger Node)</strong>:它是整个工作流的起点,负责启动流程。例如,“当收到一封新的 Gmail 邮件时”、“每小时定时触发一次”或“当接收到一个 Webhook 请求时”。一个工作流必须有且仅有一个触发节点。
+  - <strong>常规节点 (Regular Node)</strong>:负责处理具体的数据和逻辑。例如,“读取 Google Sheets 表格”、“调用 OpenAI 模型”或“在数据库中插入一条记录”。
+- <strong>工作流 (Workflow)</strong>:工作流是由多个节点连接而成的自动化流程图。它定义了数据从触发节点开始,如何一步步地在不同节点之间传递、被处理,并最终完成预设任务的完整路径。数据在节点之间以结构化的 JSON 格式进行传递,这使得我们可以精确地控制每一个环节的输入和输出。
 
 
 n8n 的真正威力在于其强大的“连接”能力。它可以将原本孤立的应用程序和服务(如企业内部的 CRM、外部的社交媒体平台、你的数据库以及大语言模型)串联起来,实现过去需要复杂编码才能完成的端到端业务流程自动化。在接下来的实战中,我们将亲手体验如何利用这套节点和工作流系统,构建一个集成了 AI 能力的自动化应用。
 
 ### 5.5.2 搭建智能邮件助手
 
-关于n8n的环境配置和最基础的使用,在项目的`Additional-Chapter`文件夹下制作了文档,这里就不过多介绍。在上一节中,我们了解了 n8n 的基本概念。这个案例将清晰地展示现代 AI Agent 与传统自动化工作流的核心区别。传统流程是线性的,而我们即将构建的 Agent 将能够接收用户邮件,通过一个核心的 </strong>AI Agent 节点<strong> 进行“思考”,自主理解用户意图,并在多个可用“工具”中进行决策和选择,最终自动生成并发送高度相关的回复。
+关于n8n的环境配置和最基础的使用,在项目的`Additional-Chapter`文件夹下制作了文档,这里就不过多介绍。在上一节中,我们了解了 n8n 的基本概念。这个案例将清晰地展示现代 AI Agent 与传统自动化工作流的核心区别。传统流程是线性的,而我们即将构建的 Agent 将能够接收用户邮件,通过一个核心的 <strong>AI Agent 节点</strong> 进行“思考”,自主理解用户意图,并在多个可用“工具”中进行决策和选择,最终自动生成并发送高度相关的回复。
 
 整个过程模拟了一个更高级的决策逻辑:`接收 -> AI Agent (思考 -> 决策 -> 工具调用) -> 回复`。
 
@@ -127,8 +127,8 @@ n8n 的真正威力在于其强大的“连接”能力。它可以将原本孤
 
 整个搭建过程分为两个核心步骤:
 
-1. </strong>准备 Agent 的“记忆”<strong>:创建一个独立的流程,为 Agent 加载私有知识库。
-2. </strong>构建 Agent 主体<strong>:创建接收邮件、思考并回复的主工作流。
+1. <strong>准备 Agent 的“记忆”</strong>:创建一个独立的流程,为 Agent 加载私有知识库。
+2. <strong>构建 Agent 主体</strong>:创建接收邮件、思考并回复的主工作流。
 
 ### 5.5.3 构建 Agent 的私有知识库
 
@@ -136,12 +136,12 @@ n8n 的真正威力在于其强大的“连接”能力。它可以将原本孤
 
 在 n8n 中,我们可以使用 `Simple Vector Store` 节点在内存中快速构建一个知识库。这个准备流程通常只需要在更新知识时运行一次。
 
-</strong>(1) 定义知识源<strong>
+<strong>(1) 定义知识源</strong>
 
 首先,我们使用 `Code` 节点来存放我们的原始知识文本。这是一个简单快捷的方式,实际项目中数据也可以来自文件、数据库等。
 
-- </strong>节点<strong>:`Code`
-- </strong>内容<strong>:将您的知识以 JSON 格式写入。
+- <strong>节点</strong>:`Code`
+- <strong>内容</strong>:将您的知识以 JSON 格式写入。
 
 <div align="center">
   <img src="https://raw.githubusercontent.com/datawhalechina/Hello-Agents/main/docs/images/5-figures/n8n-02.png" alt="Code 节点中填写了知识库 JSON 文本的截图" width="90%"/>
@@ -165,33 +165,33 @@ return [
 ];
 ```
 
-</strong>(2) 文本向量化 (Embeddings)<strong>
+<strong>(2) 文本向量化 (Embeddings)</strong>
 
 计算机无法直接理解文本,需要将其转换为向量。我们使用 `Embeddings` 节点来完成这个“翻译”工作。
 
-- </strong>节点<strong>:`Embeddings Google Gemini`,选择模型为`gemini-embedding-exp-03-07`。这里使用Google API来演示,如果不知道如何获取Google API可以参考5.5.3小节。
-- </strong>配置<strong>:将其连接到 `Code` 节点之后,它会自动将上游传入的文本转换为向量数据。
+- <strong>节点</strong>:`Embeddings Google Gemini`,选择模型为`gemini-embedding-exp-03-07`。这里使用Google API来演示,如果不知道如何获取Google API可以参考5.5.3小节。
+- <strong>配置</strong>:将其连接到 `Code` 节点之后,它会自动将上游传入的文本转换为向量数据。
 
 <div align="center">
   <img src="https://raw.githubusercontent.com/datawhalechina/Hello-Agents/main/docs/images/5-figures/n8n-03.png" alt="" width="90%"/>
   <p>图 5.X 对 Code 中数据进行向量化</p>
 </div>
 
-</strong>(3) 存入向量存储<strong>
+<strong>(3) 存入向量存储</strong>
 
 最后,我们将向量化的知识存入内存数据库中。
 
-- </strong>节点<strong>:`Simple Vector Store`
-- </strong>配置<strong>:
-  - </strong>Operation Mode<strong>: `Insert Documents` (写入模式)。
-  - </strong>Memory Key<strong>: 为这个知识库起一个唯一的名字,例如 `my-dailytime`。这个 Key 相当于数据库的“表名”,后续 Agent 将通过它来查找信息。
+- <strong>节点</strong>:`Simple Vector Store`
+- <strong>配置</strong>:
+  - <strong>Operation Mode</strong>: `Insert Documents` (写入模式)。
+  - <strong>Memory Key</strong>: 为这个知识库起一个唯一的名字,例如 `my-dailytime`。这个 Key 相当于数据库的“表名”,后续 Agent 将通过它来查找信息。
 
 <div align="center">
   <img src="https://raw.githubusercontent.com/datawhalechina/Hello-Agents/main/docs/images/5-figures/n8n-04.png" alt="" width="90%"/>
   <p>图 5.X 对 Code 中数据存入向量存储</p>
 </div>
 
-完成配置后,</strong>手动执行一次<strong>这个流程。成功后,您的私有知识就加载到 n8n 的内存中了。
+完成配置后,<strong>手动执行一次</strong>这个流程。成功后,您的私有知识就加载到 n8n 的内存中了。
 
 <div align="center">
   <img src="https://raw.githubusercontent.com/datawhalechina/Hello-Agents/main/docs/images/5-figures/n8n-05.png" alt="" width="90%"/>
@@ -204,7 +204,7 @@ return [
 
 (1)配置 Gmail 触发器
 
-新建一个工作流,命名为 `Agent: Customer Support`。使用 `Gmail` 节点作为触发器,将其 </strong>Event<strong> 设置为 `Message Received`,并配置好你的邮箱账号。这样,每当有新邮件进入收件箱时,该工作流就会被自动触发。
+新建一个工作流,命名为 `Agent: Customer Support`。使用 `Gmail` 节点作为触发器,将其 <strong>Event</strong> 设置为 `Message Received`,并配置好你的邮箱账号。这样,每当有新邮件进入收件箱时,该工作流就会被自动触发。
 
 <div align="center">
   <img src="https://raw.githubusercontent.com/datawhalechina/Hello-Agents/main/docs/images/5-figures/n8n-06.png" alt="" width="90%"/>
@@ -229,9 +229,9 @@ return [
 
 这是整个工作流的大脑。从节点菜单中拖出一个 `AI Agent` 节点,并进行如下配置:
 
-- </strong>Chat Model<strong>: 连接您选择的大语言模型,例如 `Google Gemini Chat Model`。这是 Agent 的“思考核心”。
-- </strong>Memory<strong>: 连接一个 `Simple Memory` 节点。这能让 Agent 在处理同一邮件线索下的多封往来邮件时,记住之前的对话历史。
-- </strong>Tools<strong>: 我们可以将多个工具连接到这里。在我们的案例中,我们连接两个工具:
+- <strong>Chat Model</strong>: 连接您选择的大语言模型,例如 `Google Gemini Chat Model`。这是 Agent 的“思考核心”。
+- <strong>Memory</strong>: 连接一个 `Simple Memory` 节点。这能让 Agent 在处理同一邮件线索下的多封往来邮件时,记住之前的对话历史。
+- <strong>Tools</strong>: 我们可以将多个工具连接到这里。在我们的案例中,我们连接两个工具:
   1. `SerpAPI`: 这是我们之前第四章案例中使用过的API,让 Agent 拥有上网搜索公开信息的能力。
   2. `Simple Vector Store`: 让 Agent 拥有查询我们第一部分中创建的私有知识库的能力。
 
@@ -269,37 +269,37 @@ return [
 
 # 可用工具
 - Simple Vector Store2: 用来查询我准确的工作时间(例如:周一至周五,上午9点到下午5点)。
-- SerpAPI: </strong>[主要信息来源]<strong> 优先使用此工具在互联网上搜索,以回答邮件中的具体问题。
+- SerpAPI: **[主要信息来源]** 优先使用此工具在互联网上搜索,以回答邮件中的具体问题。
 
 # 执行步骤
-1.  </strong>分析问题<strong>: 首先,仔细阅读邮件内容,提炼出发件人的核心问题。
+1.  **分析问题**: 首先,仔细阅读邮件内容,提炼出发件人的核心问题。
 
-2.  </strong>并行信息搜集<strong>: 同时执行以下两个操作来收集信息:
+2.  **并行信息搜集**: 同时执行以下两个操作来收集信息:
     a. 使用 `SerpAPI` 工具,上网搜索出发件人问题的答案。
     b. 使用 `Simple Vector Store2` 工具,获取我设定的准确工作时间。
 
-3.  </strong>草拟核心回复<strong>: 根据 `SerpAPI` 搜集到的信息,清晰、直接地回答发件人的问题,这部分将作为邮件回复的主体。
+3.  **草拟核心回复**: 根据 `SerpAPI` 搜集到的信息,清晰、直接地回答发件人的问题,这部分将作为邮件回复的主体。
 
-4.  </strong>添加状态前缀并整合<strong>:
+4.  **添加状态前缀并整合**:
     a. 对比“当前时间”和我从工具中获取的工作时间。
-    b. </strong>如果当前是“非工作时间”<strong>: 创建一段状态提醒前缀。这段前缀</strong>必须包含**从 `Simple Vector Store2` 获取到的具体工作时间。
-        * <strong>前缀示例</strong>: "您好,感谢您的来信。您已在我的非工作时间联系我(我的工作时间为:[此处插入查询到的工作时间])。我会在下一个工作日亲自审阅此邮件。与此同时,这是根据公开信息为您找到的初步答复:<strong><br><br>---<br><br></strong>"
-    c. <strong>如果当前是“工作时间”</strong>: 只需使用简单的问候语即可。
-        * <strong>前缀示例</strong>: "您好,关于您提出的问题,答复如下:<strong><br><br>---<br><br></strong>"
+    b. **如果当前是“非工作时间”**: 创建一段状态提醒前缀。这段前缀**必须包含**从 `Simple Vector Store2` 获取到的具体工作时间。
+        * **前缀示例**: "您好,感谢您的来信。您已在我的非工作时间联系我(我的工作时间为:[此处插入查询到的工作时间])。我会在下一个工作日亲自审阅此邮件。与此同时,这是根据公开信息为您找到的初步答复:**<br><br>---<br><br>**"
+    c. **如果当前是“工作时间”**: 只需使用简单的问候语即可。
+        * **前缀示例**: "您好,关于您提出的问题,答复如下:**<br><br>---<br><br>**"
     d. 将生成的前缀和你草拟的核心回复(第3步的结果)拼接在一起,形成最终的邮件正文。
 
-5.  <strong>格式化输出</strong>: 你必须将最终生成的邮件内容以一个严格的 JSON 格式输出。格式如下,不要添加任何额外的解释或文字:
+5.  **格式化输出**: 你必须将最终生成的邮件内容以一个严格的 JSON 格式输出。格式如下,不要添加任何额外的解释或文字:
     {
       "shouldReply": true,
       "subject": "Re: [原始邮件主题]",
-      "body": "[这里是拼接好的、完整的邮件回复正文,<strong>所有换行必须使用HTML的<br>标签</strong>]"
+      "body": "[这里是拼接好的、完整的邮件回复正文,**所有换行必须使用HTML的<br>标签**]"
     }
 
 # 规则和限制
-- <strong>永远优先尝试回答</strong>: 无论何时,你的首要任务是使用 `SerpAPI` 为用户提供有价值的回复。
-- <strong>必须声明状态</strong>: 如果在非工作时间回复,必须在邮件开头明确声明,并附上我准确的工作时间。
-- <strong>信息来源要准确</strong>: 工作时间必须严格以 `Simple Vector Store2` 的结果为准;问题答案主要来源于 `SerpAPI`,不要编造信息。
-- <strong>输出格式</strong>: <strong>在最终输出的JSON中,`body`字段内的所有换行都必须使用 `<br>` 标签,而不是 `\n`。</strong>
+- **永远优先尝试回答**: 无论何时,你的首要任务是使用 `SerpAPI` 为用户提供有价值的回复。
+- **必须声明状态**: 如果在非工作时间回复,必须在邮件开头明确声明,并附上我准确的工作时间。
+- **信息来源要准确**: 工作时间必须严格以 `Simple Vector Store2` 的结果为准;问题答案主要来源于 `SerpAPI`,不要编造信息。
+- **输出格式**: **在最终输出的JSON中,`body`字段内的所有换行都必须使用 `<br>` 标签,而不是 `\n`。**
 ```
 
 (3) 配置 Agent 的工具

+ 1 - 1
fix_bold_format.py

@@ -40,7 +40,7 @@ def fix_bold_format_in_file(file_path):
 def main():
     """主函数"""
     # 查找所有Markdown文件
-    docs_dir = ""
+    docs_dir = "xxx/xxx"
     
     # 递归查找所有.md文件
     md_files = []