
说实话早几年做Chatbot最怕遇到两类问题一类是用户问“今天上海下雨吗”你没法答另一类是用户问“你们公司最新的退款政策”你更没法答因为模型的训练数据里根本没有这些事。模型不是不想答是它真不知道于是只能硬着头皮编也就是我们常说的“幻觉”。后来大家想了个最朴素的办法给Chatbot塞一个搜索框用户问一句系统就用关键词去搜索引擎捞一把把结果拼到上下文里再让模型回答。这就是Chatbot联网搜索最早的粗糙形态。但这条路走到今天已经变了很多。搜索框不再只是搜索框它正在变成Agent的“眼睛”和“手”——模型自己决定要不要搜、搜什么、搜几次甚至直接操作网页去完成任务。从“用户输入关键词触发一次搜索”到“Agent自主规划信息获取路径”这个演进背后其实是架构思想的一次彻底重构。这篇文章我就按自己的实践经历把这条技术演进路线完整捋一遍每一阶段长什么样、卡在哪、为什么最后一定会走向Agent化以及现在真正落地一个带联网搜索的Agent你需要解决哪些问题。1. 为什么聊天机器人必须联网知识边界和“胡说八道”的根源1.1 知识截止日期背后的“过时答案”所有语言模型都有一个天然缺陷它的知识来自训练那一刻的快照。你问它“2024年世界乒乓球锦标赛冠军是谁”如果训练数据截止在2024年初答案大概率是错的甚至它会把上一届的冠军硬套过来。这在业内叫“知识截止日期”knowledge cutoff是所有做Chatbot的人绕不过去的第一堵墙。更麻烦的是模型自己并不知道自己不知道。你问一个它没学过的问题它不会说“对不起我不懂”而是会调动所有语言能力编一个听上去逻辑通顺的答案。我调试早期对话机器人时经常看到这种案例用户问“XX手机最新型号的屏幕参数是什么”模型一本正经地回答了某个型号但那个型号两年前就停产了。这不是模型笨是它根本没有“实时数据”这个概念。1.2 给模型开一扇“实时数据的窗户”联网搜索解决的就是这件事既然模型没有实时数据那就把实时数据的窗口打开一个缝让它在回答前先去外面看一眼。早期实现方式很简单——系统先调用一次搜索接口把搜索结果片段和用户的原始问题拼在一起作为完整的prompt发给模型模型基于新上下文重新生成答案。那时候大家管这个叫“搜索增强问答”核心就三步用户问题→关键词提取→调用搜索API→把Top结果摘要塞进prompt→模型生成答案。这套逻辑看上去简单但做起来问题很多。最明显的一个是搜索结果摘要的质量跟关键词提取的质量强相关而关键词提取又是模型自己做的等于你把搜索任务的成败押在了模型的语文能力上。我见过太多因为关键词提取翻车的案例——用户问的是“推荐一下适合女生用的轻薄本”提取出的关键词竟是“女生 适合 轻薄 本”丢给搜索引擎后返回的全是电商导购文章质量一言难尽。2. 搜索框时代的联网Query拼装、API直连与脆弱的结果质量2.1 最原始的做法内置一个搜索功能最早期的Chatbot联网搜索在交互上非常简单用户先在对话框里输入问题然后手动点一下“联网搜索”按钮或者输入类似“/search 关键词”这样的指令系统才执行一次搜索并把结果贴回来。这个阶段的产品定位更像是“浏览器聊天框”而不是“会搜索的聊天助手”。搜索行为完全由用户触发Chatbot本身没有判断力。用户搜什么就是什么结果回来之后模型也只是机械地把网页摘要复述一遍。我印象很深当时我们测试时问“今天杭州限行吗”Chatbot把搜索到的前三条新闻标题拼接成一段话其中一条是两年前的旧闻用户差点投诉。2.2 关键词提取与查询改写第一道坎为了改善搜索质量大家开始做“查询改写”Query Rewriting。原理是用户的自然语言问题不能直接搜索需要把它改写成搜索引擎能听得懂的“检索语句”。比如“今天杭州限行吗”会被改写成“杭州 今天 限行 规定”“帮我推荐一款预算五千以内的拍照手机”会被改写成“5000元 拍照手机 推荐”。这一步看着简单但坑极多。第一改写后的query丢失了原问题的时态和意图“今天”这种时间词在检索里作用很小第二搜索引擎的算法更匹配“标题党”文章改写后的query经常把用户带到营销软文堆里第三多轮对话场景下query里没有上下文信息例如用户先问“杭州好玩吗”再问“那南京呢”第二次搜索如果只提取关键词“南京”完全丢失了“跟杭州比哪个好玩”的对比意图。2.3 为什么这种方式注定走不远搜索框时代的Chatbot联网本质上是一个“伪集成”搜索是搜索对话是对话两者之间只有一层字符串拼接。模型拿到一堆未经过滤的网页摘要之后根本分不清哪些是广告、哪些是用户生成内容、哪些是权威信源。结果就是搜索确实加上了但体验反而更差——因为以前模型答错了用户还能理解“模型不知道”现在它搜了一堆东西还答错用户就会觉得“这产品是傻的吗”。所以搜索框时代只能算一个“验证需求”的过渡方案——它证明了联网搜索是刚需但同时也证明了单纯“搜了就给模型”是不行的。真正的转机是RAG和Function Calling这两件事的出现。3. 搜索增强中间态RAG管道与工具调用的“半自动”进化3.1 RAG不是搜索的替代品而是搜索的“精加工”很多人把RAG检索增强生成理解成“联网搜索的学术版”其实不太准确。RAG解决的是“怎么把检索到的零散信息变成模型的优质上下文”核心在“增强生成”四个字而不只是“检索”。我后来接RAG管道时最大的感受是检索只是前半场后半场的重排序Rerank和上下文压缩才是真正决定问答质量的关键。搜索API一次返回的往往是10到20条结果摘要里面真正能回答用户的只有1-2条。如果不做重排序把20条摘要全部塞进prompt不仅浪费token还会引入大量噪声模型很容易被不相关的信息带偏。所以RAG管道的正统做法是第一步检索召回Top 20甚至Top 50第二步重排序用专门的Rerank模型按相关度打分第三步截断只保留得分最高的Top 3-5条片段第四步把剪裁后的片段和用户问题拼在一起交给生成模型。3.2 Function Calling出现之后搜索变成了“模型主动调用的工具”如果说RAG是把“搜索结果喂给模型”那Function Calling函数调用就是第一次让“模型自己决定去调用搜索”。这是从“搜索框”到“Agent”最关键的一步转折点。Function Calling的原理很直白开发者预先给模型声明一个工具列表比如search_web(query: str)、get_page_content(url: str)模型在生成回复时如果判断需要外部信息就会先输出一个结构化的工具调用请求系统执行完后把结果回传给模型再让模型继续生成。这一步最大的变化是搜索动作的触发权从“用户”移交到了“模型”。用户不再需要输入“搜索一下”而是只要问“今天杭州天气怎么样”模型自己就会调用search_web去查。这个体验上的变化是革命性的。我做一个简单的类比搜索框时代相当于你雇了个实习生每次都要明确交代“你去网上查一下某某资料”Function Calling相当于你招了个能听懂指令的专员你说“帮我看看明天杭州天气”他自己就知道要打开天气网站查一下。前者是你控制流程后者是模型接管了流程控制权。3.3 半自动化的两个致命软肋Function Calling让每个单次搜索看起来都挺智能但真的把它接进多轮对话后问题很快暴露第一个软肋是“不知道自己要查几次”。用户问“帮我做一份杭州两日游攻略”模型调用一次搜索拿到几张网页摘要生成的攻略往往又空又泛。真正靠谱的助手应该连续搜索好几次——先查天气、再查景点、再查酒店价格、再查交通。但Function Calling本身没有“循环执行”的概念除非你自己写循环代码让模型每轮输出都可以是工具调用。第二个软肋是“没有反思能力”。模型搜了一次发现结果不理想它不会主动换一个query再搜一次而是会“将就着用”那堆不理想的结果硬着头皮回答用户。这就像一个实习生查资料查不到也不说随便拿几篇不相干的文章开始写报告。这种“半自动”状态离真正的Agent还有一段距离。4. Agent化联网搜索的本质变化从“执行一次搜索”到“决定搜不搜、怎么搜”4.1 传统Chatbot是“按需搜索”Agent是“按目标搜索”我从2024年开始上手做Agent项目一个很深的感触是Agent跟传统Chatbot的根本差距不是“能不能调用工具”而是“有没有自己的目标和计划”。传统Chatbot的联网搜索是单点触发用户问题→模型→搜一次→回答完事。Agent不是这样的Agent接收的是一个“目标”比如“帮我找一款5000元以内、适合宿舍用的迷你冰箱”它不会搜一次就直接回答而是会自己拆解我需不需要先搜索“5000元以内 迷你冰箱 推荐”搜索结果里提到了几个品牌我需要进一步搜索其中两三个品牌的用户评价。有人提到“宿舍限功率”我可能需要搜索“宿舍 冰箱 功率 限制”。综合这些信息汇总成一个带价格和口碑对比的最终回答。这个过程中搜索不是一次性的动作而是工具循环里的一个环节。模型在每一轮迭代中都可以选择继续搜索、调用其他工具、还是整理已有信息做最终回复。这就是Agent的核心特征——它拥有循环和决策权。4.2 搜索变成了Agent的技能面板之一而不是唯一依赖早期联网搜索Chatbot有个隐含假设所有的答案都应从搜索引擎来。但Agent的思路更开放搜索只是众多工具之一跟它并列的还有代码解释器、网页抓取器、数据库查询器、企业知识库检索器等等。比如用户问“用最近三年的销售数据帮我分析一下趋势”Agent完全不需要去搜索引擎查什么它直接调代码解释器去读数据库就行。而如果用户问“帮我看看这个店最近有什么差评”Agent可能先搜索店铺名再逐个抓取评价页面的内容而不是只看搜索引擎给的摘要。所以Agent里的联网搜索更像是一个“信息获取入口”它负责打开局面后续细节依赖其他工具的协同。这也是我后来在做Agent选型时的一个判断标准不要只看一个框架支持不支持搜索要看它支不支持“搜索之后把结果交给另一个工具继续加工”。一个孤零零的搜索API在Agent里的价值远小于“一条能跟网页抓取、内容理解、重排序串起来的信息流水线”。4.3 多Agent架构里的搜索角色再往上一层的想象力是“多Agent协作”。在某些框架里主Agent拆解任务后会分给几个子Agent分别负责一个负责查价格、一个负责查评价、一个负责查库存。每个子Agent各自调用搜索工具最后把结果汇总给主Agent做决策。我在一个选品项目里试过这种架构选品主Agent把“找出10款价格合理的无线耳机”拆成三个子任务分别交给“价格搜索Agent”“口碑搜索Agent”“参数搜索Agent”三个子Agent用不同的query并行搜索主Agent拿到三份结果再做交叉验证。效果比单Agent连续搜索好很多代价是token消耗和延迟都会翻倍所以实际落地时我会建议优先做单Agent优化确有必要再切多Agent。5. 实操落地给Agent接一个可靠的联网搜索工具附最小示例5.1 架构选型自建搜索管线、现成Agent框架还是AI搜索开放平台落到工程层面第一步永远是选型。市面上主流方案大概分三类方案优点缺点直接在代码里调搜索API灵活、依赖少、可完全控制需要自己写Agent循环工作量大用LangChain/Dify/CrewAI等Agent框架工具调用、上下文管理开箱即用框架绑架排错困难学习成本用AI搜索开放平台的Web Search能力返回结构化结果接口标准化受平台能力边界约束定制性弱我自己目前的习惯是快速验证用框架正式项目用框架自研工具结合但搜索能力本身尽量走“够稳定、够简单”的路线。搜索这块水很深如果你自己刨一个搜索引擎出来光是去重、反作弊、排序就能耗掉一个月的开发周期完全不值。所以搜索能力直接调用成熟服务是最理性的选择。5.2 从搜索框到Agent一个最小可用的联网搜索Agent示例下面这个示例是简化版的Agent循环用伪代码风格写核心逻辑可以被任何框架或纯代码复现import json # 模拟一个搜索API调用返回标准化结果 def search_web(query: str) - list[dict]: # 实际项目里这里会调用搜索服务API # 得到一个包含 title / url / snippet 的列表 return [ {title: 杭州两日游攻略, url: https://example.com/1, snippet: 第一天西湖第二天灵隐寺...}, {title: 杭州旅游指南2025, url: https://example.com/2, snippet: 推荐春季去交通便利...}, ] def agent_loop(user_query: str, max_iterations: int 3): messages [{role: user, content: user_query}] for _ in range(max_iterations): # 第一阶段让模型决定下一步动作回复 / 调用工具 # 实际项目中这一步是调用LLM并给它声明tool schema model_decision call_llm(messages, tools[search_web]) if model_decision.action reply: # 模型认为信息够了直接生成最终回答 return generate_final_answer(messages, model_decision) if model_decision.action search: query model_decision.query results search_web(query) # 第二阶段把搜索结果作为新的上下文追加到消息里 messages.append({ role: tool, content: json.dumps(results, ensure_asciiFalse) }) # 然后继续循环让模型基于搜索结果再次决策 return 达到最大迭代次数强制结束。 # 使用示例 final_answer agent_loop(帮我推荐一个杭州两日游的行程预算1500) print(final_answer)核心逻辑就两点一是“模型每轮都有两种选择——回答还是搜索”二是“搜索结果会回传给模型让它基于新信息继续思考”。这段代码完全可以扩展成真正的Agent你只需要把call_llm换成真实模型把工具列表里加入其他能力。5.3 提示词与工具描述的设计细节决定搜索质量的那20%代码跑通不难难的是把Agent的“搜索直觉”调出来。我带项目时有几个经验第一工具描述一定要写清楚“什么时候用”。不要只写“搜索互联网”要写成“当用户的问题涉及实时信息、最新事件、价格、政策、天气时使用此工具获取最新数据”。模型很吃这套明确的场景说明能显著减少“该搜不搜、不该搜乱搜”的毛病。第二query的生成要引导模型做改写。在提示词里显式要求“将用户的问题改写为适合搜索引擎检索的关键词组合保留时间和地点实体”比让模型直接拿用户原话去搜靠谱得多。我甚至会让模型同时输出“直查query”和“改写query”两种再分别搜索最后合并结果。第三给搜索结果标注可信度提示。如果搜索API返回的结果带了域名、发布时间、来源类型这些字段建议在交给模型之前做一层简单的元信息标注比如在山寨新闻网站的结果前加一个[低可信度]标记在权威域名前加[高可信度]。这一步不需要训练模型只是对上下文做结构化提示但对消除幻觉的效果立竿见影。6. 真实场景下的坑并发、幻觉、超时与成本账单6.1 搜索结果质量参差幻觉反而被“放大”这是反直觉的一件事很多人以为加了联网搜索幻觉就会减少实际上如果处理不好联网搜索会把幻觉从“模型瞎编”升级成“模型拿真链接编假信息”。原因很简单——模型对搜索结果摘要的采信度非常高。搜索片段里如果有一句“根据网友反馈这款手机续航一般”模型很可能把“网友反馈”直接等同于“普遍评价”进而生成一个夸大的结论。我的对策是在提示词里明确限定“回答时优先依赖搜索片段中的具体数据如果片段之间存在冲突请标注冲突并分别说明不要自行消解矛盾”。这个约束一加模型的“自行脑补”频率确实下降了不少。6.2 并发和超时Agent的无限循环是隐形杀手Agent化联网搜索最容易被低估的工程问题是循环失控。你给Agent设置了最大3次迭代看起来够了但每次迭代都可能触发一次搜索每次搜索又可能要并发3个query单个query可能耗时2秒串行下来就是十几秒。用户等得起吗等不起。实测中我的处理方式是给Agent循环设置“时间预算”不只是迭代次数而是总耗时超过15秒就强制降级为普通回复搜索调用尽量并行发起不要一个query一个query地等对搜索时间合理设短超时比如5秒还没返回就直接跳过宁可少一条信息也不要卡住整个链路限制一次循环内最多同时发起2到3个搜索query避免并发过猛触发搜索服务限流。6.3 Token成本和缓存联网搜索最隐蔽的账单搜索结果塞进上下文是有代价的。20条摘要塞进去每条200-300 token一轮就是4000-6000 token一个Agent跑3轮搜索光“吃信息”就吃掉两三万token。这还没算模型自己生成的分析内容。很多项目做POC时没感觉一上真实流量账单直接炸。破解办法只有一个字省。省的具体做法搜索结果进入上下文之前做硬截断只保留得分最高的Top 3片段别贪多对query做缓存同一用户同一问题在10分钟内重复搜索直接复用上一次的检索结果用便宜的模型做检索和改写用贵的模型做最终答案合成两段拆分成本能省三分之一以上。我把常见问题和对应策略整理在下面方便你对照检查自己的链路问题表现对策幻觉不降反升模型编造搜索结果中不存在的结论增加可信度标记要求冲突时标注不消解延迟过高单轮回答超15秒并行搜索、缩短超时、限制最大迭代Token成本爆掉一个月API账单翻倍硬截断Top3、结果缓存、大小模型分工被搜索结果带偏抓到营销软文或标题党结合域名白名单强制过滤垃圾信源7. 演进方向从“搜索”到“行动”Agent正在把搜索变成眼睛7.1 Web Search开放化搜索能力正在变成标准接口现在很多AI搜索开放平台会把Web Search能力直接封装成标准接口提供给开发者首页上明晃晃写着“Web Search联网搜索”。这种变化说明一件事搜索正在从Chatbot的“可选外挂”变成Agent的“基础设施”。就像你不会自己搭数据库一样以后大概率也不会自己接搜索API再调参数而是直接用开放平台的联网搜索能力把精力用在更上层的Agent逻辑上。这种标准化的好处是Agent框架的API会更稳定生态发展也会有更多人参与贡献。可以看到的主要特点是返回结果更结构化不只是标题链接摘要还可能带结构化字段、相关性评分、甚至“可以直接填入回答的合成答案”。这省掉了我们自己做的很多活。7.2 从Web Search到Web ActionAgent开始直接“动手”搜索的下一步演进是Agent不满足于“看到页面”而是“动手操作页面”。现在已经有Agent能给定一个任务目标自动打开浏览器、点击按钮、填写表单、翻页查看结果、再汇总回答也就是我们说的浏览器智能体或操作型Agent。这种情况下联网搜索的角色从“信息源”变成了“入口路由”Agent先通过搜索找到目标网页然后不满足于网页摘要而是直接跳进页面里抓取表格、阅读评论区、查看页面代码。搜索负责“找到门”Agent负责“进门干活”。这才是真正的“从搜索框到Agent”的完整闭环。我在自己的实验项目里看到的趋势是搜索正在从关键词索引变成“Agent的任务起点”。未来你问一个Agent“帮我抢一张周五晚的话剧票”它可能先搜索票务平台找到余票页面然后自己点进去完成选座下单。那个搜索框已经彻底跟对话框融为一体用户感知不到了。最后说一点我个人的实操体会。做Chatbot联网搜索这几年最大的认知变化是搜索从来不是目的而是手段。早期我们为了“让模型有实时信息”去接搜索走了不少弯路后来切换成Agent思维把搜索放进一个更大的决策循环里一切才顺了起来。如果你想动手试试不要一上来就搭多复杂的东西最简单的路径就是先跑通一个带search_web工具的单循环Agent让它连续搜三次再观察模型每一次搜索前后的决策变化。这个实验做完你对“搜索框到Agent”的演进会有非常直观的感受。