ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从搜索框到Agent:Chatbot联网搜索技术演进与实战

从搜索框到Agent:Chatbot联网搜索技术演进与实战 做联网搜索驱动的聊天机器人我有过一段从“土办法”到“Agent 化”的完整折腾经历。最早做 Chatbot 的时候大家提起“联网搜索”这四个字脑子里浮现的画面特别朴素用户在对话框里输入问题系统拿这句话去搜索引擎跑一遍把排名靠前的网页标题和摘要糊进提示词再让大模型读上一遍输出一段“看起来像回事”的回答。这套思路放在一两年前确实能跑但放到真实环境里坚持不过两周——关键词不准、结果太脏、回答一本正经地胡说八道这些毛病全都会冒出来。于是就有了后来的一路演进从搜索框、到 RAG、再到 Agent 工具调用。这篇文章我想把这条技术演进路线完整拆一遍讲清楚每一阶段为什么出现、核心机制是什么、踩过哪些坑以及现在把联网搜索真正接入 Agent 时哪些细节直接决定结果质量。如果你正在做 Chatbot 应用、想给大模型补上时效性短板或者刚接触 Agent 开发想搞清楚联网搜索在里面到底扮演什么角色这篇可以当作一条参考路径来看。1. 这波演进到底在演进什么搜索姿态的变化很多人聊“Chatbot 联网搜索”以为拼的是搜索结果质量其实不是。搜索 API 大家都能调结果来源也都差不多真正拉开差距的是搜索在应用里的姿态——它是被动等着用户触发的一个固定步骤还是 Agent 可以自主决策、反复调用的一个能力。1.1 搜索框时代把用户问题原封不动扔给搜索引擎最早的实现方式简单到让人不好意思复盘用户说什么系统就搜什么。用户问“帮我看看最近有什么适合程序员的 AI 工具”代码就直接拿这句话去调搜索 API返回前几名结果拼到 Prompt 里让模型总结。它有几个很明显的硬伤。第一搜索引擎的核心能力是关键词匹配不是长句理解。用户口语化的问题一旦带上了“帮我看看”“有没有什么”这类修饰检索质量就明显下滑搜出来的结果跟用户真正想找的东西经常对不上。第二搜索结果一多Prompt 就被撑得很长模型注意力被大量无关内容分散回答质量不升反降。第三也是最常见的模型会把不同来源、甚至互相矛盾的信息混在一起然后自信地编出一个答案你还没来得及去核对来源用户已经被误导了。这个阶段的本质问题在于搜索被当成一个“输入到输出”的直通管道没有人对搜索词负责也没有人对搜索结果负责。1.2 RAG 时代从“搜一次”到“检索-增强-生成”RAGRetrieval-Augmented Generation检索增强生成出现之后联网搜索的逻辑开始有了层次。它不再拿用户的原话直接搜而是把过程拆成了标准的“检索-增强-生成”三段式先根据用户问题构造检索表达式从知识库或网页里召回相关内容再把这些内容作为上下文交给大模型生成答案。这个阶段里有几个细节非常关键。第一个是查询重写Query Rewriting系统会把口语化的问题改写成适合检索的关键词组合。第二个是混合检索向量召回和关键词召回双路并行再用重排模型把两路结果合并排序。第三个是引用来源Citation回答开始带上链接用户在技术上有了核查信息的可能。RAG 的意义是让搜索从“碰运气”变成了“有方法”但它的局限也很明显整个检索过程是单轮的、一次性的系统搜到什么就用什么。它不会因为第一轮结果不理想而调整搜索词也不会为了完成一个复杂目标连续执行多次检索。换句话说RAG 阶段搜索仍然是一个预先编排好的函数而不是一个可以临场发挥的能力。1.3 Agent 时代搜索从“功能”升级为“能力”Agent 带来的变化用一句话讲就是搜索不再是流水线上的固定工位而是 Agent 手里可以被随时调用的工具。从底层技术来看这依赖的是 Function Calling / Tool Use 机制——大模型根据用户意图生成一个结构化的工具调用请求系统执行请求并把结果返回给模型模型再决定下一步动作。搜索在 Agent 里呈现出了几个全新的特征。一是多轮搜索。Agent 可以先搜一轮建立基本认知发现信息不够再换一个角度补搜直到覆盖用户要的那个答案。二是自主判断。Agent 能判断一个问题是否需要联网——私域知识、常识、计算题、情感陪伴这些场景它可以决定不搜。三是综合决策。Agent 会把搜索结果和用户的历史偏好、对话上下文放在一起做综合判断而不是孤立地看待每条结果。四是宣称“搜不到”。搜索没结果时Agent 可以坦白地告诉用户“我查了多个来源目前没找到可靠信息”而不是硬编一个。这个演进过程的本质是搜索从一个“功能”Feature变成了“能力”Capability。功能是写死的能力是长出来的。文章后面我会重点讲实现这种“能力”到底需要做哪些技术动作。2. 三种形态背后的技术实现细节每一阶段的技术路线看起来都是“接入一个搜索 API 再塞给大模型”但实际操作里的差别非常大。这节从最朴素的结果拼接入手一路做到混合检索和工具调用把每一层的实现细节和取舍逻辑讲清楚。2.1 最朴素的做法结果拼接与上下文注入搜索框时代的标准实现核心就两件事调搜索接口把结果序列化成文本塞进上下文。伪代码长这样def search_and_answer(llm, question): # 1. 拿用户问题直接搜索 results search_api.search(question) # 2. 把搜索结果拼成结构化文本 context for i, r in enumerate(results, 1): context f[{i}] 标题: {r.title}\n来源: {r.url}\n摘要: {r.snippet}\n\n # 3. 塞进 Prompt 让模型总结 prompt f 你是一个联网搜索助手。请基于以下搜索结果回答用户问题。 如果搜索结果没有相关信息请直接说明。 {context} 用户问题: {question} return llm.generate(prompt)这段代码能跑但每一步都有坑。搜索结果拼接成文本时如果没做任何筛选前五页的标题摘要都很长Token 消耗会直接失控。如果只取排名靠前的结果又可能错过真正相关的内容。我建议的做法是保留前 5 到 8 条结果每条摘要截断在 150 字以内把“结果数量”和“单条长度”当成一对可调参数来做实验。还有一个经常被忽略的点搜索结果的字段顺序会影响模型判断。标题在前、来源 URL 次之、摘要最后模型倾向于相信排在最前面的信息。所以每次搜索完最好按“相关度从高到低”排好序再注入而不是直接取 API 的原始返回。2.2 中间态混合检索与查询重写做 RAG 阶段的联网搜索时最典型的升级动作有两个查询重写和混合检索。我当年在这上面吃过不少亏写出来供参考。查询重写解决的是“用户口语化问题直接拿去搜效果差”这个老问题。具体做法是先用一个轻量级模型或者干脆用规则把用户的自然语言问题改写成适合搜索引擎的查询词。用户问“最近 ChatGPT 有没有什么新功能我听说好像出了个新模型”重写后的查询可以拆成两条“ChatGPT 新功能 2025”和“OpenAI ChatGPT 新模型”。多拆几条并行搜索比一条长句效果稳定得多。混合检索是向量检索和关键词检索的结合。向量检索擅长“语义理解”但关键词检索能保证词的精确命中。我的经验是让两路并行召回后再用一个重排模型Reranker把结果合流排序信息质量比任何单一路都要高一截。这个方法做内部知识库、文档问答特别常用。但如果你接的是公网搜索要注意一点大部分搜索 API 本身就是搜索引擎的封装索引已经在云端你再做一层混合检索反而多余。2.3 Agent 形态工具调用与搜索 API 的选型到了 Agent 形态技术重点完全变了。搜索 API 仍然要接但核心是怎么把它包装成一个模型能“看懂”的工具以及怎么让模型在对话过程中自己决定“搜不搜、什么时候搜、搜什么”。这里有三个关键点。第一工具描述tool description决定模型的决策质量。给模型一个“联网搜索工具”它不知道这个工具什么时候该用、能拿到什么信息。但如果描述里写清楚“在用户询问实时动态、最新事件、具体数据或你的知识截止日期之后的信息时使用”模型的决策就会精准很多。第二参数设计决定工具的能力边界。除了必要的 query 参数还可以加一个 days 或 freshness 参数让模型按需限制结果的时间范围。第三搜索结果的返回格式要尽量结构化这样模型才能顺利把多轮结果综合成最终答案。关于搜索 API 的选型目前市面上几家主流的方案各有侧重。下面这个表格是我实际对比后的主观结论供参考API特点适合场景计费特点Tavily专门为 AI/LangChain/Agent 设计返回内容经过清理可直接作为上下文Agent 开发首选省去大量清洗工作有免费额度按次计费Brave Search API独立索引不依赖 Google/Bing隐私友好需要独立数据源的场景免费额度较大适合起步测试Serper.devGoogle 搜索结果的 JSON 化封装结果质量高对结果来源质量要求高的场景按次计费价格偏高Bing Web Search API传统老牌生态成熟支持 freshness 参数企业级应用已有微软生态的场景有免费额度超出按量计费API 现在多到挑花眼。做实际选型时我建议不要只看价格而是找一个真实业务问题连着测一周重点看能不能稳定搜到真实相关的信息、返回字段是否有正文不只是标题摘要、接口故障率怎么样、响应延迟是否在可接受范围内。这些细节都会直接影响 Agent 的整体体验。3. 实操把联网搜索接进 Agent 的完整链路这块内容是在过去几个项目里边踩坑边验证出来的一套完整链路。从选 API、写工具描述到结果清洗和引用标注再到多轮搜索的策略设计每一步都直接影响 Agent 的“聪明程度”。3.1 先选好搜索数据源几个主流 API 的对比与试用开发 Agent 的第一件事不是写代码而是选搜索源。如果只是随便挑一个能返回 JSON 的接口后面每个环节都会被拖累。我个人的偏好是在原型阶段直接上 Tavily它简直是给 LLM 应用量身定做的不需要自己提取网页正文接口直接返回清理后的内容字段还内置了时间过滤参数。Brave Search API 我也非常喜欢它的优势是索引独立不依赖 Google 和 Bing搭配 Agent 使用时数据多样性会好一些而且免费额度相对大方适合前期测试。Serper 是把 Google 搜索的接口做成了 JSON 格式返回结果质量很高但按次计费对成本敏感的团队要谨慎。企业发展级项目Bing Web Search API 比较稳妥它有 freshness 参数控制时效性生态成熟、文档齐全适合长期维护。说一个具体的测速参数供参考单次搜索请求的 95 分位响应时间建议控制在 800ms 以内。如果 API 平均都要花 2 秒以上Agent 多轮搜索时用户的等待会非常难熬。想提速可以加一层本地缓存相同的 query 直接命中缓存通常能把平均响应时间压到 300ms 以内。3.2 工具描述怎么写才能让模型正确调用Function Calling 的核心是模型的工具选择是否正确。而这个正确率很大程度上取决于工具描述写得是否“到位”。写得不好Agent 就是个乱捶键盘的实习生写好了它就变成一个知道什么活儿该自己干、什么活儿该去查资料的靠谱员工。下面这个示例是一个我调过很多遍的搜索工具定义直接给你参考{ type: function, function: { name: web_search, description: 在互联网上搜索最新信息。当用户询问实时新闻、最新数据、事件进展、名人动态、新产品发布或你知识截止日期之后的信息时必须使用此工具。对于常识问题、创造性问题、情绪问题和无需实时信息的场景不需要使用。, parameters: { type: object, properties: { query: { type: string, description: 搜索查询词。应使用简洁明确的关键词组合避免口语化长句。例如ChatGPT 新功能 2025而不是帮我查一下最近 ChatGPT 有啥新功能 }, days: { type: integer, description: 时间范围天。当用户需要最近特定时间段的信息时使用例如 最近一周 对应 7。非时间敏感问题可省略。 } }, required: [query], additionalProperties: false } } }description 里有几个关键文字不能只写“联网搜索”四个字。要明确告诉模型“什么时候必须用”“什么时候不需要用”这两个信息分别解决“该搜不搜”和“不该搜乱搜”两个问题。还有一个细节是参数描述里的示例怎么写。query 的 description 里放一个反例和一个正例模型对查询词的困惑会大幅减少。我在实际项目中还发现模型有时会把 query 写成“帮我查一下 X 的最新消息”这种带着口语废料的话可以多加一行 instruction“确保查询词精简、无多余形容词优先使用关键实体 时间/地点/类别修饰词”。3.3 搜索结果的清洗、过滤与引用标注搜索结果拿到了绝不能直接一股脑儿塞给模型。原始搜索结果里有大量噪声广告、SEO 垃圾内容、标题党、重复链接、无关图片站。不清理直接喂给 Agent模型会像在垃圾堆里找金块一样找得到是运气找不到是常态。我的标准清洗流程分四步去重按 URL 去重同一域名的多条结果只保留最相关的一条。过滤对域名做黑白名单过滤掉广告站和重定向站内容里明显带“推广”“广告”标记的直接删掉。截断每条结果只保留标题、URL、摘要摘要超过 200 个字符就截断防止上下文爆炸。序列化把结果格式化为统一的文本块保持结构一致不要一会儿是列表一会儿是段落。格式化之后我通常会在 Prompt 里加一条引用要求回答时如果引用了搜索结果中的信息需要在对应内容后面标注来源编号比如[1]、[2]并在末尾附上来源链接列表。这既给了模型明确的引用指令也让用户能自己点开链接验证。有没有人告诉我模型在引用来源上经常翻车它会把搜索结果里的信息和它自己的训练知识混在一起然后给一段看似有出处、实际是编造的回答。想要杜绝这一点一种方法是把搜索结果注入 Prompt 时在格式上做一个明显区分比如加上“以下内容来自联网搜索结果不是你的预训练知识”再让模型在回答里明确标注“根据网络来源”。另一种更严格的做法是要求模型只能基于搜索结果输出没有搜索结果支撑的信息一律不回答。这是处理 Agent 网络搜索“引用幻觉”最有效的两条手段后文会在排查部分再展开。3.4 多轮搜索与自主纠错Agent 的高级玩法把上一个环节都打通之后联网搜索 Agent 才真正进入“高级阶段”多轮搜索和自主纠错。这也是与搜索框时代拉开最大分水岭的地方。好的多轮策略通常有三步走宽搜建立认知先搜一个宽泛的查询词了解整体信息结构。比如用户问“2025 年新能源车销量”第一步先搜“2025 新能源车销量 行业”。定向补齐缺口根据第一轮结果判断是否有具体品牌、时间区间、地域划分的信息缺口再生成第二轮定向查询。比如“比亚迪 2025 销量 出口”。判断终止条件信息覆盖完整了就停止搜索直接综合回答连续两轮都搜不到有效信息就要明确告诉用户“查不到”而不是开第三轮盲搜。这里最关键的技术点是怎么保证“每一步严格按策略走”。我建议给 Agent 设一个最大搜索轮次比如 3 轮超过就直接进入总结环节。没有这个上限Agent 是有可能在检索上打转的——我在一个项目里曾见过它连续搜了 6 次始终在第一层信息里兜圈。多轮搜索还有一个特别重要的细节当用户给的是一个开放性任务时搜索前优先反问用户一两个澄清性问题比直接搜效果更好。比如用户问“帮我调研一下 Agent 框架写个对比报告”直接搜出来的是通用内容而先问一句“你更关注 LangChain 这类编排框架还是 Dify 这类低代码平台”再按方向去搜结果质量和用户满意度完全不在一个档次。4. 联网搜索 Agent 的故障排查与避坑实录这一节把我在实际开发运维中遇到的典型问题整理成实录。每一个问题都真实地让项目返过工所以我尽量把“为什么发生”和“怎么做能避掉”都写清楚。4.1 结果时效性差让搜索参数带上时间约束做联网搜索最常被用户吐槽的就是“你搜的是去年的事吧”。原因一般是搜索时没有约束时间范围搜索引擎默认按综合权重排序老文章凭借高权重也能排在前面。解决这个问题要同时做两件事第一在 Agent 调工具时启用 API 的时间过滤参数Tavily 里有daysBing 有freshness把它接到工具参数上第二在用户问题里有明显的时间意图时Agent 要主动把时间词转换成参数值比如“最近一周的新闻”就对应days7。有一个反常规的经验不要把所有搜索都限定在最近时间范围内。像“ChatGPT 的发展历程”这类问题用户要的是整体脉络你设个days30反而把阶段性总结类的好文章全过滤掉了。正确的做法是只有明确需要“最新”“最近”“本月”的信息时才启用时间约束其余时候关闭。4.2 Token 爆炸与成本失控这个问题几乎每个项目都会遇到。搜索返回的网页内容实在太大了80KB 的 HTML 提取出来也有 8KB 的正文如果返回 10 条一次搜索就能吃掉小一万 Token。用户连续问几个需要搜索的问题一次对话的成本比纯文本问答高出 5 到 10 倍。控制手段其实不少我按优先级列一下限制单次搜索返回的条目数5 到 8 条是体验与成本比较平衡的区间。单条摘要强制截断在 200 字符以内不够的信息让模型自己判断。加缓存同一个 query 30 分钟内命中缓存不重复扣费。设定 Agent 每轮对话的最大调用次数超过 3 次直接进入回答阶段。如果业务允许可以做一个“搜索模式开关”简单问答走纯 LLM遇到复杂问题再开启联网搜索。成本优化的核心不在于哪一个技巧而在于你敢不敢在“Token 消耗”和“回答质量”之间做折中实验。每次改动一个参数记录指标对比一般能省 40% 到 60% 的成本而不损失体验。4.3 模型“乱搜”与“假引用”的处理“乱搜”指的是用户问一个简单常识问题Agent 也要去搜一下。原因通常是用户问话里带了“看看”“查查”之类的动词触发了模型的搜索判断。解决方法是把系统指令里的“不该搜”场景写得更加具体比如“如果用户只是表达想法、求安慰、问常识即使话里带查一查也不要使用搜索工具”。“假引用”比“乱搜”更头疼。模型会在回答里编一个像模像样的[1]引用但那个 URL 是它自己生成的压根儿不存在。我试过几个策略最有效的组合有三个一是要求模型只能引用它接收到的那几条搜索结果中的 URL不能额外捏造二是在回复前增加一个校验步骤用代码检查引用的 URL 是否都出现在本次搜索结果集里没有的直接拦截或替换三是在 Prompt 里明确写一句“如果没有搜索结果能支撑请直接说没有查到禁止虚构来源”。这些手段合在一起基本可以把假引用率压到很低但也没有办法做到绝对清零。所以如果做的是医疗、法务、财务这种高风险领域人工审核环节不能省——Agent 最多只能帮你把大部分错误拦截掉最后把关还是得靠人。4.4 现场问题速查表把前面提到的问题整理成一张速查表方便你排查时快速定位现象可能原因处理方式搜索出来全是旧闻未启用时间过滤参数根据问题时间意图设置 days/freshness模型回答没依据搜索结果被模型当“背景知识”混用在 Prompt 中注明“网络来源”强制引用回答 URL 不存在模型自行捏造引用增加代码校验引用 URL 必须存在于搜索结果集Token 消耗过高搜索结果条数多、摘要长限条数到 5 到 8摘要截断到 200 字符以内Agent 反复搜索无进展缺少最大搜索次数下限设置单次对话最多 3 轮搜索超限强制总结API 响应过慢搜索链路无缓存增加相同 query 的缓存层用户口语问题搜索质量差未做查询重写让模型先改写为关键词再发起搜索多条结果互相矛盾搜索词过宽混入多主题拆分查询意图改为多轮定向搜索这张表不是一次性写死的。不同业务、不同领域的搜索问题差异很大建议你一边踩坑一边补充自己的“问题库”它是排查效率提升最快的资产。5. 一点真实体会做了这么多轮的搜索演进我最大的体会是不要一上来就堆 Agent 框架。很多人听到 Agent 联网搜索第一反应是去集成 LangChain、Dify 或者 CrewAI但框架只是编排手段如果你的搜索查询词质量低、结果清洗不干净、引用校验缺失再强的框架也救不了底层的“脏数据”。先把搜索数据源、工具描述、结果处理这些基本功打牢框架自然就能发挥出它该有的作用。第二点是关于“什么时候该搜”的决策力。Agent 联网搜索和搜索框时代最本质的分水岭不是模型会不会调 API而是它能不能判断“这个信息我需要去网上找”并知道“该用什么样的表达去找”。这个决策力的核心是工具描述、系统指令、模型能力和上下文共同努力的结果。我给项目调优时最常看的指标不是单次搜索的准确率而是每轮对话的平均搜索调用次数与最终回答满意度的关系——搜索调用次数应当和服务体验正相关如果出现反复搜索又反复无果的情况优先检查查询词生成策略而不是换模型。最后想提一句联网搜索这个能力以后一定会越来越像 Agent 的基础配置它不会有“做完”的那一天。今天的工具调用、查询重写、结果校验未来可能都会被新的协议和范式重写。但这条链路上的核心问题——如何让 Agent 在正确的时间、用正确的表达、找到正确的内容——本质上不会变。把这些问题想清楚不管技术怎么换做出来的应用都会有底气。
返回列表