news 2026/9/24 22:56:27

从零开发能联网搜索的AI Agent:Dify与LangGraph实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零开发能联网搜索的AI Agent:Dify与LangGraph实战指南

先别急着定学习路线。AI Agent 这个关键词,最近两年已经被讲烂了,但真正能把一个智能体从 0 跑到能用的教程,确实不多见。我自己在把第一个智能体项目落地之前,也踩过不少坑:Dify 试过、Coze 试过、LangGraph 也啃过,最后发现很多教程要么停在“你好,我是你的智能助手”这种 Demo,要么一上来就甩出一堆 Agent、LLM、RAG、Function Calling 的抽象名词,直接把新手劝退。

所以这篇内容我按自己实际调试的顺序来写,尽量做到最全、最细。目标不是让你背概念,而是让你看完之后,能用 Dify 或 LangGraph 搭出一个能联网搜索、能调用工具、能记住上下文的专属智能体,并且知道上线部署时那些坑都在哪。至于“学完薪资翻倍”这种话,我不太爱说,但说实话,把智能体开发这条链路完整走一遍之后,你对 AI 大模型应用的理解会跟只调 API 的人完全拉开差距,这会直接体现在你谈薪资的底气上。

几个热搜词我先统一解释:AI Agent 是主体,智能体就是它;AI 大模型是底座;DeepSeek 就是能当底座的大模型之一。下面从概念开始,一路走到部署排错。

1. 别急着敲代码,先搞清楚 AI Agent 到底是什么

1.1 LLM、AI 大模型、智能体到底有什么区别

这三个词被混着用太久了,但搞混的代价很大,因为你可能抱着“学 Agent”的心态,结果学了一周 Prompt,发现自己连 Agent 的门都没摸到。

我打个比方:LLM 就像刚毕业的高材生,知识面很广,能说会道,但你让他“把桌上那本合同找出来,提炼关键条款并发给对接人”,他做不到。AI Agent 就不一样,它像一个给高材生配齐了电脑、通讯录、日历和执行流程的职业助理,遇到任务会先拆解,然后调用搜索、数据库、邮件这些工具,把事真正办完。

所以它们的区别不是量级,而是结构。一张表说清楚:

名词一句话理解典型存在形式
LLM / 大语言模型只负责文本理解与生成的模型DeepSeek、Qwen、GPT、Claude 这类模型本体
AI 大模型泛指大规模预训练模型,含文本、多模态上面这些模型的 API、开源权重、量化文件
AI Agent / 智能体以 LLM 为大脑,配合工具、记忆、流程编排做事的系统Dify 应用、Coze Bot、LangGraph 服务、自研智能体服务

你问“DeepSeek 属于哪个”,答案很明确:它属于 LLM / AI 大模型这一层。你单纯跟 DeepSeek 网页聊天,那只是用大模型;你把 DeepSeek 接口接上搜索、数据库、企业微信机器人,给它配好任务拆解逻辑,那才是在开发智能体。

1.2 一个 Agent 系统到底由哪几块组成

在 2026 年再谈智能体,如果还停留在“Prompt 调优”层面,就太可惜了。一个能上生产的智能体,至少包含五块内容:

  1. 大模型底座:负责推理与决策,决定智能体“聪不聪明”。
  2. 系统提示词:决定角色、边界和做事风格。
  3. 记忆:短期记忆负责当前会话,长期记忆负责跨会话经验。
  4. 技能 / 工具:搜索、代码执行、数据库查询、HTTP 请求,这是 Agent 的“手和脚”。
  5. 编排逻辑:决定什么时候调工具、调哪个工具、怎么处理结果,这是 Agent 的“工作流”。

很多人把重点放在 2 上,以为写个牛逼 Prompt 就是 Agent,但真正决定系统上限的往往是 4 和 5。你给 Agent 的工具越强、编排逻辑越清晰,它就越像一个能干活的员工,而不是聊天机器人。这也是为什么现在招聘岗位里,会写“Agent 应用开发”“AI 大模型应用开发”的薪资普遍高于普通 Prompt 工程师。

2. 选型和准备:工具链没选对,后面全是坑

2.1 主流智能体框架怎么选:Dify、Coze、LangGraph

我见过太多人一上来就啃 LangChain,结果被各种抽象类绕晕。其实先选对工具比先学代码重要得多。

框架适合谁最大优点容易踩的坑
Dify想做应用原型、企业内部工具、知识库问答可视化编排,开源可私有部署,RAG 和插件生态齐全深度定制需要写 Python 或插件
Coze想快速做 Bot、内容类助手免部署,插件市场丰富,适合非技术自定义自由度有限,复杂流程受限
LangGraph开发团队、复杂多智能体场景状态机编排,可测试、可控性强学习曲线陡,前期开发成本高
自研有特殊协议、强数据隔离要求完全可控模型、记忆、工具、监控全都要自己搭

我自己的建议非常直接:第一个智能体项目用 Dify 起步,把对话、知识库、工具调用跑通,看看智能体到底是怎么“思考”的;等项目复杂到需要在多个智能体之间做状态流转和权限控制时,再迁到 LangGraph。

顺带说一下 LangChain 和 LangGraph 的关系。LangChain 是工具库,负责把大模型、Embedding、向量库这些东西包成好用的接口;LangGraph 是编排引擎,负责把各个节点串成一张有状态的图。两者经常搭配出现,业内叫 Harness 架构,本质上就是把“模型的能力”和“流程的控制权”分开管理。你只要理解“LangChain 给零件,LangGraph 上流水线”就够了。

2.2 模型选型和本地部署配置,别只看参数大小

模型选型是很多人纠结的地方。我的原则是:先看场景,再选模型。

  • 如果做中文客服、知识库问答,DeepSeek、通义千问、智谱 GLM 都是很稳的选择,接口国内直接能调,成本也低。
  • 如果做代码生成、复杂逻辑推理,可以选参数更大或擅长工具调用的模型。
  • 如果业务有数据隐私要求,那就考虑本地部署开源模型,比如 Qwen2.5 系列、DeepSeek 开源版本,或者 Llama 系列。

本地部署配置很多人会卡住。这里我直接给一套基于常见实践的参考值:如果你的显卡是 24GB 显存,跑 14B 模型做 Demo 很舒服;如果只有 8GB 显存,建议跑 7B 模型的 Q4 量化版本;32B 以上模型,建议至少有 24GB 到 48GB 显存。量化格式认准 GGUF,Ollama 和 llama.cpp 都直接支持,省内存效果明显。

还要提醒一句:本地部署不是越大的模型越好。显存只够 7B,硬跑 14B 只会换来极慢的速度和频繁的显存溢出。先跑通流程,再考虑升级模型参数量,这个顺序很重要。

3. 从零搭一个能联网搜索的专属智能体:Dify 实战

3.1 第一步:创建应用和接入模型

如果你不想管服务器,直接用 Dify 的在线版或云服务,注册之后进控制台就能创建应用。如果你想私有化部署,也有 Docker Compose 方案,一条命令拉起全部组件,这里不展开,因为不同版本命令有差异,网上太多,照着官方的来就行。

进入 Dify 后,我的建议是不要一上来就用“空白应用”,而是先看一遍模板。模板里通常已经接好了模型、提示词和基础工具,你只需要把它改造成自己的业务即可。

然后在“设置-模型供应商”里填 API Key。以 DeepSeek 为例,你现在拿到 Key 后填入,选好模型名称(比如 deepseek-chat),测试连通。这里有个小技巧:把“温度”调到 0.3 到 0.5 之间,做客服或知识库问答时输出更稳;做创意文案可以调到 0.7 以上。别什么都用默认 1.0,那会让知识库回答变得太飘。

3.2 写系统提示词的实战模板

系统提示词是智能体的“人设和行为准则”,不能只写“你是一个助手”。我给你一套我用的模板:

你是「XX团队」的智能助理。 职责: 1. 回答用户关于业务、产品、技术文档的问题。 2. 当用户需要查询实时信息(新闻、天气、股票、物流等)时,先调用联网工具,不要凭记忆编造。 3. 回答必须基于知识库或搜索结果,并给出引用来源。 行为规则: 1. 如果信息不完整,明确告诉用户“我无法确认”。 2. 回答尽量用分点或表格,控制在500字以内。 3. 用户问题不明确时,最多追问一次,不要反复啰嗦。

这套写法的重点不是“角色扮演”,而是把决策规则写清楚:什么时候调工具、什么时候拒绝回答、输出格式怎么控制。大模型很强,但它不知道怎么做事,全靠提示词给它划边界。

3.3 配置联网搜索和知识库,让 Agent 真的“知道”

光有模型,Agent 只能靠训练时的知识回答,没法知道最新信息。所以我们要做两件事:接工具、建知识库。

Dify 里接入联网搜索很简单,选一个搜索引擎工具,填上对应的 API Key,然后在 Agent 或 Chatflow 里打开这个工具。关键点在于工具的描述要写清楚,例如“当用户询问最新新闻、天气、实时价格、物流状态时,调用该工具获取最新数据”。工具描述越具体,模型越容易在正确的场景调用它。

知识库则用来沉淀业务私有知识。上传文档后,Dify 会做切片和向量化。参数层面,我建议先用 500 到 800 字的切片大小,重叠 50 到 100 字。这不是玄学,太短会丢失上下文,太长会导致召回不精准。检索参数上,Top K 先设 3 到 5,召回分数阈值大概 0.4 到 0.5,准确率不够就提高阈值,召回不够就降低阈值。

3.4 用 Chatflow 把搜索、知识库、LLM 串成一条流水线

Dify 里有两种应用类型:普通 Chat 和 Chatflow / Workflow。普通 Chat 适合快速验证,但生产级智能体我更推荐 Chatflow,因为它能把“问题分类→工具调用→知识库检索→模型回答”做成清晰的节点。

我在实际项目里常用的一条链路是:

  1. 开始节点:接收用户问题。
  2. 问题分类节点:用 LLM 判断是“实时信息类”还是“内部知识类”。
  3. 工具节点:如果分类是实时信息,调用联网搜索。
  4. 知识库检索节点:如果分类是内部知识,检索向量库。
  5. LLM 节点:把搜索结果或知识库片段和用户问题一起交给模型。
  6. 结束节点:输出最终答案。

这套结构的最大好处是可控。你想换搜索源、换知识库、改回答规则,都只需要改对应节点,而不是在一大段 Prompt 里反复试。核心心法一句话:把决策写进 LLM 节点,把脏活交给工具节点,不要在提示词里塞大段逻辑。

4. 进阶:记忆、技能、MCP,以及流式输出

4.1 记忆和上下文管理:别让 Agent 变成金鱼

很多人在 Demo 阶段没感觉,一旦做真实业务就会发现:用户多问几轮,Agent 就忘了前面说了什么。这是记忆没做好。

短期记忆最简单,就是给每次对话分配一个 Thread ID。你只需要把会话 ID 传入服务端,Dify 或 LangGraph 都会自动把历史消息拼到大模型上下文里。但这里有成本问题:历史消息越多,Token 费用越高,响应越慢。所以要做摘要压缩,常见做法是当历史消息超过 N 轮,先让模型把之前内容提炼成摘要,再继续对话。

长期记忆则要配合向量库使用。比如一个销售智能体,它应该记住用户偏好、上次沟通进展、客户所在行业。做法是把这些信息结构化后写入向量库,下次对话时根据用户 ID 召回相关内容,再注入到提示词里。这样才叫“智能体”,不然只是一个有记忆接口的聊天框。

4.2 技能和 Function Calling:Agent 是怎么调用工具的

Agent 调用工具的核心机制叫 Function Calling,也叫工具调用。你可以把它理解成:模型本身不动手,只负责“说我要用什么工具、传什么参数”,真正执行 API 的是你的后端代码。

比如你给智能体提供一个 get_weather 工具,工具描述是:

{ "type": "function", "function": { "name": "get_weather", "description": "获取指定城市的实时天气", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名" } }, "required": ["city"] } } }

当你问“北京明天冷吗”,模型不会直接回答,而是输出类似于“调用 get_weather,参数 city=北京”的结构化结果。你的代码收到这个结果后去请求天气 API,再把结果返回给模型,模型才能组织成自然语言回答。

这里踩坑最多的就是工具描述写得不清楚。记住:工具描述是给模型看的,不是给人看的。写得越具体,模型越知道什么时候用它。

4.3 MCP 协议:2026 年接入工具的标准答案

以前每接一个工具,都要单独写一套调用逻辑,非常痛苦。后来大家发现,不如把工具统一成一种协议:Model Context Protocol,也就是 MCP。

MCP 的核心思路是,让工具提供方写一个 MCP Server,把自己的能力按 tools、resources、prompts 三种形式暴露出来;Agent 客户端发现这些能力后,动态加载并调用。你接入一个新工具时,不再需要改主流程,只需要多挂一个 MCP Server。

目前在智能体开发里,文件系统、数据库、网页抓取、办公软件、定期任务这类常用能力都有现成的 MCP Server 实现。你说“Agent skill memory mcp 开发”,本质上就是:把技能做成 MCP 工具,把记忆做成可检索资源,再通过 MCP 协议对外统一暴露。这套组合在 2026 年已经是比较主流的工程范式了。

4.4 SSE 流式输出与大模型回答实时渲染

大模型生成答案需要时间,如果等全部生成完再返回,用户体感就是“卡了十来秒”。所以线上智能体几乎都是流式输出。前端最常用的手段是 SSE,配合 AbortController 可以实现“停止生成”按钮。

前端关键代码大致是这样的:

const controller = new AbortController(); const resp = await fetch('/api/agent/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: '你好,介绍一下你们的产品' }), signal: controller.signal }); const reader = resp.body.getReader(); const decoder = new TextDecoder('utf-8'); let buffer = ''; while (true) { const { value, done } = await reader.read(); if (done) break; buffer += decoder.decode(value, { stream: true }); const lines = buffer.split('\n'); buffer = lines.pop() || ''; for (const line of lines) { if (line.startsWith('data: ')) { const payload = JSON.parse(line.slice(6)); renderChunk(payload.answer); } } } cancelBtn.onclick = () => controller.abort();

对应的服务端,在 Node.js 里只需要设置响应头为 text/event-stream,然后不断写入数据:

app.post('/api/agent/chat', async (req, res) => { res.setHeader('Content-Type', 'text/event-stream; charset=utf-8'); res.setHeader('Cache-Control', 'no-cache'); const stream = await agent.stream({ messages: req.body.messages }); for await (const chunk of stream) { res.write(`data: ${JSON.stringify({ answer: chunk })}\n\n`); } res.end(); });

这里我要特别强调一下 Abort 的正确姿势:前端点击“停止生成”后,不只是停掉页面加载,最好把取消信号传到后端,后端再去取消上游大模型的请求。否则模型还在后台默默把答案生成完,Token 照扣,费用照花。用 OpenAI SDK 或 DeepSeek SDK 时,一般都可以传 signal 或使用底层的 AbortController 来取消请求。

5. 部署、上线和常见问题排错

5.1 本地部署大模型 vs 云端 API,成本差多少

本地部署和云端 API 不是二选一的关系,而是两个场景。我列一张实际对比表:

对比项本地私有化部署云端 API
单次问答成本固定硬件成本,边际成本低按 Token 计费,量大了成本明显
数据隐私数据不出内网需要评估数据脱敏和合规要求
延迟取决于 GPU 性能取决于网络和供应商
运维复杂度自己管升级、监控、容灾供应商负责
模型迭代要自己更新权重平台更新较及时

比较常见的折中方案是:敏感业务放本地小模型,通用对话和需要更强推理的场景走云端大模型。比如企业内部合同问答用本地 Qwen,而面向客户的营销文案生成用云端 DeepSeek。不要追求所有场景都用同一个模型,那样又贵又慢。

5.2 移动端和边缘设备接入 AI 大模型的思路

现在不少需求是把 AI 大模型接入 Android App,尤其是离线场景。做法通常有两种:一种是让手机 App 请求你的服务端,由服务端转发到本地或云端大模型;另一种是在设备端直接跑小模型。

设备端跑模型主要依赖 GGUF 这类量化权重格式,配合 llama.cpp、Ollama 或 Google 的 LiteRT-LM 框架。如果我只是在手机上做个 Demo,1B 到 3B 的小模型体验还能接受;7B 以上在中高端手机上勉强能跑,但发热和耗电很明显。生产级 App 建议把主流程放服务端,只在断网兜底或隐私计算场景用设备端小模型。

5.3 常见问题排查与避坑技巧实录

我把自己开发过程中遇到的典型问题整理成一张速查表,每一个都花过真金白银的教训:

问题现象常见原因解决方法
Agent 不调用工具,总是自己编答案工具描述太模糊,或没有在提示词里强调“先搜索再回答”把工具描述的触发条件写具体,并在系统提示词中加入“不知道就查”的规则
知识库回答完全不相关切片太大或检索 Top K 太高调整切片大小为 500~800,Top K 设为 3~5,提高分数阈值
上下文一长,回答开始混乱没有做历史摘要或窗口滚动为长期会话加摘要记忆,或限制最大历史轮数
SSE 流式输出前端收到乱码服务端被网关缓冲或 GZip 压缩关闭该路径的缓冲与压缩,或使用分块编码
点击停止但后台仍在计费Abort 信号没有传到上游模型请求前端 AbortController 信号穿透到后端,后端取消模型请求
本地模型显存溢出模型参数量超过 GPU 显存换成 Q4 量化的 GGUF,或减小上下文长度
模型不遵守输出格式温度过高或 Prompt 约束不够降低温度,并在提示词里给出输出示例

另外我还想补充一个经验:很多问题不是模型不行,而是链路中某个环节悄悄失败了。比如联网搜索工具返回超时,Dify 日志里可能直接告警,但普通用户看到的只是“模型没有调用搜索”,你可能会误以为提示词写得不对。所以上线前一定要看链路日志。Dify 里可以开追踪,把每个节点的输入输出都打出来;自研服务就必须在中间件层加日志,不然排查问题会非常痛苦。

6. 最后想说的几句大实话

我实际操作下来最大的体会是:智能体开发没那么玄,本质上是把过去人肉完成的“查资料、填表格、调接口、发通知”这些动作,变成配置和代码。你不需要先把所有概念学完再动手,完全可以先跑通一个最小闭环:模型 + 一个工具 + 一段记忆 + 流式输出。

先别想着搭建一个能处理所有任务的超级智能体,那是大公司团队的事。你要做的,是从一个具体问题开始,比如“帮我写销售日报”“帮我查行业新闻”,把一个场景做透。场景越具体,你越能在边界条件、工具调用、错误处理这些地方积累真正的经验。

关于学完能不能薪资翻倍,我的看法是:会调 API 的人很多,能把一个智能体从设计、开发、部署到排错完整跑通的人,确实少得多。你花两周时间把一个真实项目跑上线,远比收藏一百个教程更有说服力。面试时,对方问你“你做过什么”,你直接讲一遍你是如何通过工具调用、记忆、流式输出去解决一个具体问题的,就已经赢了大多数人。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 22:56:13

VOC转YOLO+ByteTrack实战:摄像头实时多目标跟踪全链路

简介:本资源面向计算机视觉方向的研究者与开发者,尤其是希望从零掌握ByteTrack多目标跟踪算法、并落地到自有数据集的进阶学习者。教程围绕VOC格式数据集展开,覆盖标注图像、组织目录结构、生成标注文件等准备环节,并延伸至模型训…

作者头像 李华
网站建设 2026/9/24 22:54:40

PG 比对 index 比oracle方便好多

方法一:使用 pg_dump 仅导出目标索引结构如果你需要把源库的索引结构复制到另一个库,可以使用 pg_dump 工具提取 DDL:导出源库中某个表或整个库的索引定义:bashpg_dump -h 源主机 -U 用户名 -d 源数据库 -t 表名 --schema-only | …

作者头像 李华
网站建设 2026/9/24 22:54:36

RK3588S硬件设计避坑指南:电源时序、信号完整性与热仿真实战要点

简介:本资源是瑞芯微官方发布的RK3588S高性能多媒体应用处理器硬件设计权威指南,面向硬件开发、PCB Layout、热设计及EMI/ESD防护等方向的中高级工程师,旨在系统解决电源时序控制、高速接口(DDR/eMMC/USB/HDMI/MIPI)电…

作者头像 李华
网站建设 2026/9/24 22:54:36

OpenLayers点击查询:forEachFeatureAtPixel与getFeatureInfoUrl选型全解析

做WebGIS开发的朋友,一定绕不开OpenLayers这块老牌地图库。拿到一个图层点击查询需求时,新手最容易卡住的地方就是:到底该用forEachFeatureAtPixel,还是用getFeatureInfoUrl?这两个API在中文社区里经常被并排提到&…

作者头像 李华
网站建设 2026/9/24 22:54:33

Java反序列化CC7利用链原理与实战指南

1. 项目概述:CC7不是“漏洞编号”,而是Java反序列化链中一个关键的、可稳定触发的利用路径“CC7”这个代号在Java安全研究圈里,几乎等同于“能绕过commons-collections 3.1黑名单检测的可靠利用链”。它不是CVE编号,也不是某个厂商…

作者头像 李华
网站建设 2026/9/24 22:54:31

OpenLayers要素查询:forEachFeatureAtPixel与getFeatureInfoUrl选型指南

做 WebGIS 的人应该都遇到过这个困惑:地图上点击要素查属性,明明有forEachFeatureAtPixel这么个方法,为什么 WMS 图层却用不了?后来查资料又看到getFeatureInfoUrl,一看名字也是“查要素信息”,这两个到底什…

作者头像 李华