96SEO 2026-09-06 10:28 3
如果你也有过差不多体验,那这篇文章就是为你写的。怎么说呢,你是不是每次都得自己维护对话历史、手动装记忆、去查 docs?

高深莫测的东西。其实吧,你把大模型想象成一个很聪明但啥也不会的实习生
Agent 干的事情很简单:给这个实习生配工具、装记忆、补知识。
Agent = 大模型 + 记忆 + 工具 + 知识库
. 它记不住你
大模型是 stateless 的——每次对话都是一张白纸。上周跟它聊了两小时方案,今天它完全不记得。于是你不得不自己维护一个 messages 数组,假装它“记住了”。至于这导致,
. 它干不了活
You say “帮我重构这段代码”。结果它只给出分析,却没有真正执行。LLM 本身只是生成文字,没有执行能力。这让很多人误以为 LLM 就能直接变成脚本跑器。
. 它不知道你的东西
Your company’s private docs,internal APIs。DB schema – all invisible to model unless you explicitly feed it. This knowledge gap forces you to constantly “teach” model what you want.
The execution logic is essentially a loop:
// Simplified flow
LLM thinks: “What do I need to do?不过,”
↓
Do I need to call a tool?├─ Yes → Call tool → Get result → Feed back into messages → Think again
└─ No → Directly reply user → Finish
This is classic ReAct pattern:
Reason ➜ Act ➜ Observe ➜ Reason again.
mkdir hello-langchain && cd hello-langchain
pnpm init -y
pnpm add @langchain/core @langchain/openai dotenv zod
# .env file:
# DEEPSEEK_API_KEY=your_key_here
# Then create index.js...
import { ChatOpenAI } from '@langchain/openai';import 'dotenv/config';怎么说呢,const model = new ChatOpenAI({
modelName: 'deepseek-v4-flash'。apiKey: process.env.DEEPSEEK_API_KEY,configuration: {
baseURL: 'https://api.deepseek.com/v1',},});const response = await model.invoke;console.log,// ✅ 成功输出答案!不过,// No framework changes needed if you switch models – just change `modelName` and key.
import { tool } from '@langchain/core/tools';import { z } from 'zod';import fs from 'node:fs/promises';const readFileTool = tool(
async => {
const content = await fs.readFile;console.log 成功读取 ${content.length} 字节`);return content;},{
再看name,'read_file'。description:
'用此工具来读取文件内容。话说回来,当使用者要求读取文件、查看代码时调用此工具。',schema: z.object({
filePath: z.string.describe。}),}
),
-
Zod schema 做了什么?
-
Description 为什么关键?
:LLM 是怎么“决定”调用工具的?— 不需要硬编码返回值,只需绑定即可。
const modelWithTools = model.bindTools;// bindTools injects tool's JSON Schema into request.
// When LLM decides it needs a tool,it returns a structured `tool_calls` array.
const response = await modelWithTools.invoke;不过,// Example response format:
// {
// tool_calls:
// }
至于第四步。Message 的四种面孔 — 明确每条消息类型,避免混乱。不过,
消息类型
Type
谁说的
Speaker
干什么
Purpose
关键字段
Key Field
SystemMessage
Developer
No special fields – just role definition.
N/A
HumanMessage
User input – raw text.
No special fields.
AIMessage
Llama or GPT response – may contain tagged tool_calls .
`tool_calls` array.
ToolMessage
The result of executing a bound tool.
`content`。`tool_call_id` .
This table explains how each message type participates in an agent conversation. As dialogue progresses,`messages` grow linearly—each iteration adds anor pair of `` and `` until completion.
从第五步来看,ReAct 循环——Agent 的心脏 — 实际代码实现与常见坑点解析。
const tools =;let messages =;while {
// Ask LLM for next step
let response = await modelWithTools.invoke;messages.push;// If no more tool calls,we’re done
if break;// Execute all requested tools in parallel
const results = await Promise.all(
response.tool_calls.map => {
const target = tools.find;if return `错误:找不到工具 ${call.name}`;try {
return await target.invoke;其实,} catch {
return `错误:${err.message}`;}
})
),// Append results back into conversation context
response.tool_calls.forEach => {
messages.push(new ToolMessage({
content: results。tool_call_id: call.id,tool_call_type: call.type,}));不过,console.log}…`),});}
console.log;**常见坑点**
-
给使用者即时反馈 —— 避免程序卡死感和使用者离开的痛点。
-
console.log 成功读取 ${content.length} 字节`);\end{lstlisting}
如Claude Code之所以体验好,就是因为每一步都有清晰可见的反馈。\end{lstlisting}
\end{lstlisting}
\end{lstlisting}
\end{codeline}
\end{lstlisting}
---
至于进阶,Node.js 子进程干 CLI 的活 —— 解锁真正可输入命令功能。
import { spawn } from 'node:child_process';function execCommand{return new Promise=>{const child=spawn;话说回来,let stdout="";let stderr="";child.stdout.on;child.stderr.on;child.onresolve;else reject);}),});}<\/div>
架构是这样的这方面。
↓ spawn 子进程子进程↓ IPC 通信主进程<\/div>
这样 Agent 的主循环不会被 CLI 命令阻塞,可以继续处理其他逻辑。<\/div>
Tip : 如果命令输出太大。可直接将 stdout 写入临时文件,再由 LLM 去读取;避免一次性占满内存,<\/div>
更深一层 : 为什么 Agent 用 ReAct 而不是简单 chain?— 理解动态决策背后的必然选择
-
线性 chain 无法处理失败/修正循环 : - 如创建 React 项目后启动失败,需要
调整配置并重新启动。不过,这种“边做边想”必须通过 while 循环实现。而不是一次性的 prompt→LLM→结果。说起来,
ReAct 循环天然支持动态决策 : - 每轮得到工具结果后即可重新评估局势并决定接下来操作。使流程更加健壮、易
。
作为专业的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