96SEO 2026-07-23 07:22 1
本章涵盖
在第 章中,我们探讨了 agentic workflows与 agents之间的区别。你已经了解到,agentic workflows 本质上是确定性的:它们的逻辑建立在带有条件分支的流程之上。而这些分支取决于应用当前的状态。这类工作流可以在 LangGraph 中优雅地建模为基于节点的图,你也已经看到了一个完整的、可动手实践的程序示例。

而智能体的运作方式则不同。它们并不是沿着预先确定好的流程前进,而是依赖策略,而一步步展开。
在本章中。你将把这些理念付诸实践,建立一个多工具旅行信息智能体。你会从一个简单版本开始:先实现一个只使用单个工具、用于提供目的地信息的智能体。接下来你会将它 为一个真正的多工具智能体。使其既能回答旅行目的地相关问题,也能回答这些地点的当前天气情况。
在这一节中。我们将通过建立一个简单的旅行信息智能体,为后续的智能体应用打下基础。这个初始智能体只会使用一个工具:一个向量存储检索器。用来回答关于康沃尔各个目的地和度假地的问题,其知识来源是 Wikivoyage上的内容。这些内容会被切分为若干文本块,并存入向量存储,以便高效检索。
如果你已经跟着本书前面关于高级 Retrieval-Augmented Generation的章节学习过那么你应该已经熟悉如何获取内容源并填充向量存储。在这里我们会在这一基础之上继续推进,但主要将放在智能体机制本身。不过,
让我们使用 Visual Studio Code来创建一个新的 Python 项目。这个流程一样也可以非常顺畅地在 Cursor 中使用。
创建 Python 虚拟环境,并安装所有必需的依赖。你可以在本书的 Manning 网站配套资源中找到 requirements.txt 文件,也可以在与第 章对应的 GitHub 仓库中找到它。
在 VS Code 中打开一个新的 PowerShell 终端,进入 ch11 项目目录。接下来创建并激活一个新的虚拟环境:
PS C:\Github\building-llm-applications\ch11> python -m venv env_ch11PS C:\Github\building-llm-applications\ch11> .\env_ch11\Scripts\activate PS C:\Github\building-llm-applications\ch11>
虚拟环境激活后安装所需依赖:
PS C:\Github\building-llm-applications\ch11> pip install -r .\requirements.txt
至此,你的项目开发环境就已经准备好了。
在项目根目录下创建一个 .env 文件,并加入你的 OpenAI API Key:
OPENAI_API_KEY=
为了方便调试。在 .vscode 目录中加入如下 launch.json
{ "version": ".","configurations": }
建议你使用 Main_x_y.py 这种命名规则来组织实现文件。这里 x 表示功能模块,而 "y" 表示该功能 的迭代版本。这样做可以让你更容易对比不同版本,也更方便跟踪实现过程 的演进。
话说回来,
注意:本章中的代码示例有意进行了简化。目的是突出主要功能,为了便于理解与学习,示例中省略了错误处理和防御式编程这些内容。
当你的 .env 文件准备好之后创建一个名为 Main_01_01.py 的代码文件。在脚本顶部、导入语句之后按照下面 的方式加载 API Key。
代码清单 怎么说呢,"加载环境变量"
load_dotenv;## 从 .env 文件中加载环境变量
代码清单 "准备旅行信息向量存储"
。UK_DESTINATIONS = # ""Cornwall"。" # ""North_Cornwall"," # ""South_Cornwall"," # ""West_Cornwall"," ]async def build_vectorstore -> Chroma: # """Download Wikivoyage pages and create a Chroma vector store.""" urls = # loader = AsyncHtmlLoader # print # docs = await loader.aload # splitter = RecursiveCharacterTextSplitter( chunk_size=?,chunk_overlap=?) # chunks = sum for d in docs],) # print} chunks ...") # vectordb_client = Chroma.from_documents( chunks。embedding=OpenAIEmbeddings) # print # return vectordb_client _ti_vectorstore_client: Chroma | None = None def get_travel_info_vectorstore -> Chroma: global _ti_vectorstore_client if _ti_vectorstore_client is None: if not os.environ.get: raise RuntimeError( """Set OPENAI_API_KEY env variable and re-run.""") _ti_vectorstore_client = asyncio.run( build_vectorstore) return _ti_vectorstore_client ti_vectorstore_client=get_travel_info_vectorstore ti_retriever = ti_vectorstore_client.as_retriever 这段配置 定义了 一个 与 康沃尔相关 的目的 地 列表,它 将作为 后续 信息检索 基础。其实,异步函数 build_vectorstore 会 为每个 目的 地 构造 URL 并 使用异步 加载器 抓取 对应 Wikivoyage 页面。页面 下载完成 后 文 本 会被 切分 成 带 有 重叠 的 文 本 块,以 确保 每 个 文 本 块 在 上下文 上 保持 足够 语义 完整性。话说回来,随后这些 文 本 块 会 和 下载。这里 用 单例 模式 管理 向量 存 储 客户端 .get_travel_info_vectorstore 函数 会 确保 向量 存 储只 构 建 一次,后续 所有 检 索 都复 用 此 实例。最终 我们 实例 化 向量 存 储 客户端 并 从 中 创建 一个 retriever 对象——这个 retriever 将 成为 智能机访问 康沃尔 旅 游 信息 接口。借助 此 基础设施,智能机 就 能 高效 回答 关于 目的 地 问题。且 知识 来源 是 来自 Wikivoyage 最新 内容。 让智能机 能够 调用 工具
现在我们 已经 准备 好了 向量 存 储 检 索 器,下 一 步 就 是 把 此 检 索 能 力 暴露 为 一个 智能机 可 调 用 工具。这 正是 “ 工具 调用 ” 概念 的 切 入 点 —— 它 是 当代 智能机 框架 中的关键进展。
. 从函数调用 到 工具调用
像 OpenAI 那样 LLM 最初 引入的是 函 数 调用 机制 :模型 可以 不仅 可以 调 用 自 定义 函 数。还 可以 调 用 内 建 或 外 部 “ 工具 ”,从代码执行 到 外部 API 查询 都 可以 纳 入 支 持 范 围。定义 :工具 是 指 LLM 可以 通过 工具 调用 协议 调 用 任意 外 部 函 数、服务 或 能 力 . 工具让 模 型 超 越 純 文 本 生 成,例如 执 行 编 程 、 查询 数据 库 或 呼 请 API — 模 型 通 道 输 入 并 接 收 输出。
您或许 想问 为什么 工具 呼叫 如 此 重 要?为什么 不直 接 给 智 能 带 来 REST API 端 点 接 入 功 能?关键 原因 在 于 灵 活 性…,等等 …,
LLM 正 是 围绕 此 能 力 被 专 门 学 翻 出 来 嘅 …,
ReAct (Reasoning And Acting 推 理 与 行 动 )设计模式 ..
图 ReAct 模式 ...
图 ReAct
...
注意 :
OpenAI Responses API ...
. 工具调用 是 如何 与 LLM 协同 工作 ...
**代码清单 ** ... python @tool def search_travel_info -> str: docs = ti_retriever.invoke ... ... **代码清单** python TOOLS= llm_model=ChatOpenAI( model=&ldquogpt--mini”,use_responses_api=True) llm_with_tools=llm_model.bind_tools ...
kotlin class AgentState: messages: Annotated。operator.add]
- 状态检查
ini class ToolsExecutionNode: ... ...
- ToolsExecutionNode
ini tools_execution_node=ToolNode ... **LLM 节点** python def llm_node: current_messages = state response_message = llm_with_tools.invoke return {"messages":} ...
- 内置 ToolNode 类
图形化
执行一次请求
多工具
实现模拟天气服务
创建天气预报工具
更新多工具支持
执行多工具
初始行为
--
System Message 改进
使用预建立组件实现快速开发
小结
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback