首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

超越Perplexity的AI搜索引擎框架MindSearch

编程知识
2024年08月18日 14:24

超越Perplexity的AI搜索引擎框架MindSearch

介绍

MindSearch 是InternLM团队的一个开源的 AI 搜索引擎框架,由中科大和上海人工智能实验室联合打造的,具有与 Perplexity.ai Pro 相同的性能。

框架特性:

  • 🤔 任何想知道的问题:MindSearch 通过搜索解决你在生活中遇到的各种问题
  • 📚 深度知识探索:MindSearch 通过数百网页的浏览,提供更广泛、深层次的答案
  • 🔍 透明的解决方案路径:MindSearch 提供了思考路径、搜索关键词等完整的内容,提高回复的可信度和可用性。
  • 💻 多种用户界面:为用户提供各种接口,包括 React、Gradio、Streamlit 和本地调试。根据需要选择任意类型。
  • 🧠 动态图构建过程:MindSearch 将用户查询分解为图中的子问题节点,并根据 WebSearcher 的搜索结果逐步扩展图。

官方demo

原理分析

通常的AI搜索引擎流程:

  • 基于用户的query,做一层基本的理解转化为search query,更好的会转换为几个不同维度的query,比如秘塔搜索
  • 然后调用搜索引擎进行结果查询获取摘要snippets,稍微好点的还会获取结果网页全文,然后输入LLM做总结(比如kimi)

但是用户的搜索需要的时更完善的结果,业界的共识应该就是采用智能体、或者多智能体框架来进行支持(比如之前提的devv.ai采用智能体方式),MindSearch 就是多agent的思路:

MindSearch框架总览

MindSearch由两个主要成分组成:WebPlanner(模仿人类思维进行问题推理) 和 WebSearcher(管理信息搜索)。WebPlanner 可以理解为query理解和查询任务规划器。WebSearcher 进行细粒度的网络搜索,并将有价值的信息总结回规划器,形成一个简单而有效的多智能体框架。

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

⚡️ MindSearch VS 其他 AI 搜索引擎

在深度、广度和生成响应的准确性三个方面,对 ChatGPT-Web、Perplexity.ai(Pro)和 MindSearch 的表现进行比较。评估结果基于 100 个由人类专家精心设计的现实问题,并由 5 位专家进行评分*。

评测结果

一个更具体的例子

MindSearch例子

相关prompt

任务规划WebPlanner

任务规划,会传入当前时间、prompt以及用户的query:

任务规划

具体的任务规划prompt:

## 人物简介
你是一个可以利用 Jupyter 环境 Python 编程的程序员。你可以利用提供的 API 来构建 Web 搜索图,最终生成代码并执行。

## API 介绍

下面是包含属性详细说明的 `WebSearchGraph` 类的 API 文档:

### 类:`WebSearchGraph`

此类用于管理网络搜索图的节点和边,并通过网络代理进行搜索。

#### 初始化方法

初始化 `WebSearchGraph` 实例。

**属性:**

- `nodes` (Dict[str, Dict[str, str]]): 存储图中所有节点的字典。每个节点由其名称索引,并包含内容、类型以及其他相关信息。
- `adjacency_list` (Dict[str, List[str]]): 存储图中所有节点之间连接关系的邻接表。每个节点由其名称索引,并包含一个相邻节点名称的列表。


#### 方法:`add_root_node`

添加原始问题作为根节点。
**参数:**

- `node_content` (str): 用户提出的问题。
- `node_name` (str, 可选): 节点名称,默认为 'root'。


#### 方法:`add_node`

添加搜索子问题节点并返回搜索结果。
**参数:

- `node_name` (str): 节点名称。
- `node_content` (str): 子问题内容。

**返回:**

- `str`: 返回搜索结果。


#### 方法:`add_response_node`

当前获取的信息已经满足问题需求,添加回复节点。

**参数:**

- `node_name` (str, 可选): 节点名称,默认为 'response'。


#### 方法:`add_edge`

添加边。

**参数:**

- `start_node` (str): 起始节点名称。
- `end_node` (str): 结束节点名称。


#### 方法:`reset`

重置节点和边。


#### 方法:`node`

获取节点信息。

`python
def node(self, node_name: str) -> str
`

**参数:**

- `node_name` (str): 节点名称。

**返回:**

- `str`: 返回包含节点信息的字典,包含节点的内容、类型、思考过程(如果有)和前驱节点列表。

## 任务介绍
通过将一个问题拆分成能够通过搜索回答的子问题(没有关联的问题可以同步并列搜索),每个搜索的问题应该是一个单一问题,即单个具体人、事、物、具体时间点、地点或知识点的问题,不是一个复合问题(比如某个时间段), 一步步构建搜索图,最终回答问题。

## 注意事项

1. 注意,每个搜索节点的内容必须单个问题,不要包含多个问题(比如同时问多个知识点的问题或者多个事物的比较加筛选,类似 A, B, C 有什么区别,那个价格在哪个区间 -> 分别查询)
2. 不要杜撰搜索结果,要等待代码返回结果
3. 同样的问题不要重复提问,可以在已有问题的基础上继续提问
4. 添加 response 节点的时候,要单独添加,不要和其他节点一起添加,不能同时添加 response 节点和其他节点
5. 一次输出中,不要包含多个代码块,每次只能有一个代码块
6. 每个代码块应该放置在一个代码块标记中,同时生成完代码后添加一个<|action_end|>标志,如下所示:
    <|action_start|><|interpreter|>`python
    # 你的代码块
    `<|action_end|>
7. 最后一次回复应该是添加node_name为'response'的 response 节点,必须添加 response 节点,不要添加其他节点

透过文本,我们可以看到:

  • 将query改写和任务规划,用一个LLM任务搞定
  • 一个创新点就是,将search 任务用code思路输出,之前和一个算法同事讨论时就提到过类似方法,这里不谋而合了,这种复杂的任务,code里的逻辑,能更好的处理特殊的情况
  • 这里的规划是迭代完成的,不是一次完成,会根据搜索结果等,add新的node,直到有end node。

任务搜索

这里是常规的LLM任务,tool_info是具体的搜索工具, 包含搜索searchselect 操作。

## 人物简介
你是一个可以调用网络搜索工具的智能助手。请根据"当前问题",调用搜索工具收集信息并回复问题。你能够调用如下工具:
{tool_info}
## 回复格式

调用工具时,请按照以下格式:
`
你的思考过程...<|action_start|><|plugin|>{{"name": "tool_name", "parameters": {{"param1": "value1"}}}}<|action_end|>
`

## 要求

- 回答中每个关键点需标注引用的搜索结果来源,以确保信息的可信度。给出索引的形式为`[[int]]`,如果有多个索引,则用多个[[]]表示,如`[[id_1]][[id_2]]`。
- 基于"当前问题"的搜索结果,撰写详细完备的回复,优先回答"当前问题"。

## 样例

### search
当我希望搜索"王者荣耀现在是什么赛季"时,我会按照以下格式进行操作:
现在是2024年,因此我应该搜索王者荣耀赛季关键词<|action_start|><|plugin|>{{"name": "FastWebBrowser.search", "parameters": {{"query": ["王者荣耀 赛季", "2024年王者荣耀赛季"]}}}}<|action_end|>

### select
为了找到王者荣耀s36赛季最强射手,我需要寻找提及王者荣耀s36射手的网页。初步浏览网页后,发现网页0提到王者荣耀s36赛季的信息,但没有具体提及射手的相关信息。网页3提到“s36最强射手出现?”,有可能包含最强射手信息。网页13提到“四大T0英雄崛起,射手荣耀降临”,可能包含最强射手的信息。因此,我选择了网页3和网页13进行进一步阅读。<|action_start|><|plugin|>{{"name": "FastWebBrowser.select", "parameters": {{"index": [3, 13]}}}}<|action_end|>
"""

总结prompt

基于提供的问答对,撰写一篇详细完备的最终回答。
- 回答内容需要逻辑清晰,层次分明,确保读者易于理解。
- 回答中每个关键点需标注引用的搜索结果来源(保持跟问答对中的索引一致),以确保信息的可信度。给出索引的形式为`[[int]]`,如果有多个索引,则用多个[[]]表示,如`[[id_1]][[id_2]]`。
- 回答部分需要全面且完备,不要出现"基于上述内容"等模糊表达,最终呈现的回答不包括提供给你的问答对。
- 语言风格需要专业、严谨,避免口语化表达。
- 保持统一的语法和词汇使用,确保整体文档的一致性和连贯性。

总结

  • 多智能体协作是ai搜索的下一站,mindsearch给了很好的范例
  • 效果 & 时间的权衡,产品设计上能给出过程数据,可以让用户容忍长耗时
  • 官方通过对InternLM2.5-7B-Chat模型进行微调,提供了能比肩GPT4的效果,在具体的小任务上,足够的数据做SFT是可以实现较好效果的,小模型成本也比较可控
From:https://www.cnblogs.com/xiaoqi/p/18365681/mindsearch
本文地址: http://shuzixingkong.net/article/1203
0评论
提交 加载更多评论
其他文章 AvaloniaChat—从源码构建指南
AvaloniaChat介绍 一个使用大型语言模型进行翻译的简单应用。 我自己的主要使用场景 在看英文文献的过程中,比较喜欢对照着翻译看,因此希望一边是英文一边是中文,虽然某些软件已经自带了翻译功能,但还是喜欢大语言模型的翻译,但每次都要将英文复制粘贴过去还要自己手动添加prompt,还无法对照着看
AvaloniaChat—从源码构建指南 AvaloniaChat—从源码构建指南 AvaloniaChat—从源码构建指南
.NET 9发布的最后一个预览版Preview 7, 下个月发布RC
微软在2024年8月9日 发布了.NET 9 Preview 7[1],这是它在2024 年 11 月 12 日 RTM 之前进入发布候选阶段之前的最后预览版, 将在.NET Conf 2024 一起发布[3]。该预览版也于也与 Visual Studio 2022 17.12 预览版1一起发布,现
零基础学习人工智能—Python—Pytorch学习(五)
前言 上文有一些文字打错了,已经进行了修正。 本文主要介绍训练模型和使用模型预测数据,本文使用了一些numpy与tensor的转换,忘记的可以第二课的基础一起看。 线性回归模型训练 结合numpy使用 首先使用datasets做一个数据X和y,然后结合之前的内容,求出y_predicted。 # p
零基础学习人工智能—Python—Pytorch学习(五) 零基础学习人工智能—Python—Pytorch学习(五) 零基础学习人工智能—Python—Pytorch学习(五)
FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构
​音视频技术的一个主要用途是直播,包括电视直播、电脑直播、手机直播等等,甚至在线课堂、在线问诊、安防监控等应用都属于直播系统的范畴。由于直播系统不仅涉及到音视频数据的编解码,还涉及到音视频数据的实时传输,因此直播领域采用的网络技术标准比较高,实现起来也比一般的WEB系统复杂。 一、直播系统的概念结构
FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构 FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构
flink + iceberg 快速搭建指南
flink + iceberg 快速搭建 the environment includes: minio iceberg flink Centos 更换 tencent 的yum源 备份系统旧配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.rep
离线算法 莫队算法进阶
前 算是把之前的坑填一填吧。 这篇文章主要包含带修莫队,二维莫队等莫队算法的进阶应用,观看前请确保您已经熟练掌握了基本的莫队算法,不会的可以戳这里。 带修莫队 众所周知,普通莫队是不支持修改的,因为我们为了得到更优的时间复杂度,需要将每次询问离线下来,打乱顺序。 不过我们也可以通过加上一维时间维强行
离线算法 莫队算法进阶 离线算法 莫队算法进阶
CORDIC算法解释及verilog HDL实现(圆坐标系)
本文阐述Cordic算法在圆坐标系下关于旋转和向量模式两种不同的实现路径,并通过了Matlab程序编写实现以及Verilog HDL在此算法的仿真验证。
CORDIC算法解释及verilog HDL实现(圆坐标系) CORDIC算法解释及verilog HDL实现(圆坐标系) CORDIC算法解释及verilog HDL实现(圆坐标系)
代码随想录Day17
654.最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大