MindSearch:开源AI搜索引擎框架

306 阅读8分钟

MindSearch的核心理念是模仿人类大脑的思维方式,不断的扩展和深化对问题的理解。同时他会根据Web搜索的结果,不断地在知识图谱中添加新的节点和链接,从而逐步构建出一个全面而深入的解决方案。--- 陈泽辉博士

放在前面,看下官方的演示视频,MindSearch如何边思考边搜索。


一起看下技术报告

信息查找和整合是一项复杂的认知任务,需要消耗大量的时间和精力。 搜索引擎重塑了寻找信息的方式,但往往无法符合复杂的人类意图。 受大语言模型(大语言模型)显着进展的启发,最近的工作尝试通过结合大语言模型和搜索引擎来解决信息查找和集成任务。 由于三个挑战,这些方法仍然无法获得令人满意的性能:

(1)复杂的请求往往无法被搜索引擎一次性准确完整地检索到;

(2)相应的待整合信息分散在多个网页上,并且存在大量噪声;

(3)大量内容较长的网页可能很快就会超过大语言模型的最大上下文长度。

受人类解决这些问题时的认知过程的启发,我们引入MindSearch来模仿人类在网络信息搜索和整合中的思维,它可以通过一个简单而有效的基于LLM的多代理框架来实例化,该框架包括:WebPlanner 和 WebSearcher

(1)WebPlanner 将人类多步骤信息搜索的思维建模为动态图构建过程:它将用户查询分解为原子子问题作为图中的节点,并根据 WebSearcher 的搜索结果逐步扩展图。

(2)WebSearcher 负责处理每个子问题,通过搜索引擎执行分层信息检索,并为 WebPlanner 收集有价值的信息。

MindSearch 的多智能体设计使整个框架能够在3分钟内从更大规模(例如)的网页中并行查找和集成信息,这是值得3小时的人力。 基于GPT-4o或 InternLM2.5-7B模型,MindSearch在封闭集和开放集 QA 问题上显示出响应质量在深度和广度方面的显着改进。此外,基于 InternLM2.5-7B 的 MindSearch 的响应比 ChatGPT-Web(由GPT-4o)和 Perplexity.ai 应用程序更受人类欢迎,这意味着具有开源模型的 MindSearch 已经可以为专有模型提供有竞争力的解决方案。人工智能搜索引擎。

它由WebPlanner(模仿人类思维进行问题推理)和多个WebSearcher(管理信息查找过程)。给定用户查询,WebPlanner 首先将查询分解为多个可以并行解决的原子子问题,并将它们分派到相应的 WebSearcher。

为了进一步增强推理能力,WebPlanner将复杂的问题解决过程建模为迭代图构造:通过预先定义与拓扑思维图构造相关的标准代码接口列表,WebPlanner能够逐步将问题分解为顺序/通过 Python 代码生成在图中添加节点/边来并行子问题。同时,WebSearcher针对每个子问题,采用分层检索流程提取大语言模型有价值的数据,显着提高了面向海量搜索页面的信息聚合效率。通过将推理和检索过程的不同方面分配给专门的代理,MindSearch 有效地减少了每个代理的负载,从而有助于更稳健地处理长上下文。它无缝地弥合了搜索引擎的原始数据检索能力和大语言模型的上下文理解能力之间的差距。

WebPlanner

WebPlanner 充当高级规划器,编排推理步骤并协调其他代理。 为了增强大语言模型解决复杂问题的能力,我们将问题解决过程建模为有**向无环图(DAG) **。

给定一个用户问题Q,解决方案轨迹表示为G⁢(Q)=⟨V,E⟩,每个节点代表一个独立的网络搜索,包括辅助START节点(初始问题)和END节点(最终答案)。E表示有向边,表示节点(搜索内容)之间的推理拓扑关系。这种 DAG 形式抓住了寻找最佳执行路径的复杂性,为大语言模型提供了更正式和直观的表示。

利用当前大语言模型在代码任务上的优越性能,我们通过代码编写明确提示模型与图进行交互。为了实现这一点,预定义了原子代码函数来向图中添加节点或边。

大语言模型首先读取整个对话,包括之前生成的代码和网络搜索结果,然后在思维图上输出想法和新的推理代码,并由Python解释器执行。在执行过程中,一旦将节点添加到推理图中,它就会调用 WebSearcher 来执行搜索过程并汇总信息。由于新添加的节点仅依赖于前面步骤中生成的节点,因此我们可以将它们并行化以实现更快的信息聚合速度。当收集到所有信息后,规划器通过添加结束节点来生成最终响应。

通过与Python解释器集成,WebPlanner通过统一的代码动作与图进行交互,动态构建推理路径。这种“代码即规划”的流程使得大语言模型能够充分发挥其卓越的代码生成能力,有利于长上下文场景下的控制和数据流,并在解决复杂问题时获得更好的性能。

WebSearcher

WebSearcher 充当可访问互联网的复杂 RAG代理,根据搜索结果总结有价值的响应。由于网络上存在海量内容,大语言模型在有限的上下文长度内处理所有相关页面具有挑战性。

为了解决这个问题,我们采用了一种简单的从粗到细的选择策略。最初,大语言模型根据WebPlanner分配的问题生成几个相似的查询,以扩大搜索内容,从而提高对相关信息的回忆。然后,这些查询通过各种搜索 API(例如 Google、Bing 和 DuckDuckGo)执行,它们返回关键内容,包括 Web URL、标题和摘要。搜索结果根据网址自动合并,并提示大语言模型选择最有价值的页面进行详细阅读。然后,将所选网址的完整内容添加到大语言模型的输入中。读取这些结果后,大语言模型会根据搜索结果生成一个响应来回答原始问题。

这种分层检索方法显着降低了浏览大量网页的难度,并允许有效地提取具有深入细节的高度相关信息。

Agent中的上下文管理

MindSearch 为复杂的信息查找和与搜索引擎的集成提供了一个简单的多代理解决方案。这样的范式也自然地实现了不同代理之间的长上下文管理,这提高了框架的整体效率。

由于WebPlanner将搜索任务分配到单独的搜索代理中并且仅依赖于WebSearcher的搜索结果,因此WebPlanner可以纯粹专注于用户问题的分解和分析,而不会被过长的Web搜索结果分散注意力。

同时,每个WebSearcher只需要搜索其任务子查询的内容,而不会干扰其他内容。得益于显式的角色分配,MindSearch极大地减少了整个过程中的上下文计算,为大语言模型的长上下文任务提供了高效的上下文管理解决方案。这样的多智能体框架还为训练单个大语言模型提供了直接且简单的长上下文任务构建管道。

最终,MindSearch 在不到 3 分钟的时间内收集并整合了 300 多个页面的相关信息,这可能需要人类专家大约 3 个小时才能完成类似的认知工作量。

由于跨多个代理的显式上下文状态传输,我们需要在整个工作流程中仔细处理上下文。我们凭经验发现,由于搜索代理内部的局部感受野,简单地集中来自规划器的分解查询可能会在信息收集阶段丢失有用的信息。如何有效地处理多个代理之间的上下文并非易事。

我们发现通过有向图边构建的拓扑关系可以帮助我们轻松处理不同主体之间的上下文。更具体地说,只是在执行每个搜索代理时为其父节点以及根节点的响应添加前缀。因此,每个 WebSearcher 都可以有效地专注于其子任务,而不会丢失先前的相关上下文以及最终目标。

附录

  1. 论文链接:arxiv.org/abs/2407.20…
  2. 项目主页:mindsearch.netlify.app/
  3. Github地址:github.com/InternLM/Mi…

欢迎关注 <叨叨叨的成长记录>