MindSearch踩坑心得

news/2025/1/12 4:05:45/文章来源:https://www.cnblogs.com/mesopotamiaa/p/18521422

MindSearch允许llm生成类似jupyter notebook的代码片段自主的规划搜索路径,形成搜索图可以自由的控制最大迭代步数,这种灵活的特性使得的MindSearch搜索效果相比写死的代码要效果好很多。

MindSearch代码不多,但是调用很复杂,不行请看这个时序图,请格外关注WebSearchGraphMindSearchAgent两个类,MindSearchAgent是一切代理的总主管,WebSearchGraph是通过llm生成自主规划的搜索路径的小主管,由llm生成的代码就是通过WebSearchGraph规划搜索路径的。

%%{init:{'theme':'forest', 'themeVariables':{'fontSize':'20px'}, "securityLevel": "loose"}}%% sequenceDiagramparticipant Clientparticipant FastAPIparticipant EventSourceResponseparticipant init_agentparticipant MindSearchAgentparticipant SearcherAgentparticipant WebSearchGraphparticipant LLMparticipant ActionExecutorClient->>FastAPI: POST /solve (GenerationParams)activate FastAPIFastAPI->>init_agent: init_agent(lang, model_format, search_engine)activate init_agentinit_agent->>LLM: Create/Get LLM instanceinit_agent->>ActionExecutor: Create BingBrowser executorinit_agent->>MindSearchProtocol: Create protocol with promptsinit_agent->>MindSearchAgent: Create agent(llm, protocol, searcher_cfg)init_agent-->>FastAPI: Return agent instancedeactivate init_agentFastAPI->>MindSearchAgent: stream_chat(inputs)activate MindSearchAgentMindSearchAgent->>MindSearchProtocol: format(inner_step)MindSearchProtocol-->>MindSearchAgent: formatted promptMindSearchAgent->>LLM: stream_chat(prompt)loop For each responseLLM-->>MindSearchAgent: Stream responseMindSearchAgent->>MindSearchProtocol: parse(response)MindSearchProtocol-->>MindSearchAgent: language, actionalt Has code executionMindSearchAgent->>WebSearchGraph: execute_code(command)activate WebSearchGraphWebSearchGraph->>SearcherAgent: Create searcher agentsactivate SearcherAgentSearcherAgent->>MindSearchProtocol: format(question)MindSearchProtocol-->>SearcherAgent: formatted promptSearcherAgent->>LLM: stream_chat(question)LLM-->>SearcherAgent: Stream responsealt Has tool actionSearcherAgent->>ActionExecutor: Execute tool actionactivate ActionExecutornote over ActionExecutor: Handles plugin executionnote over ActionExecutor: - BingBrowser actionsnote over ActionExecutor: - Tool invocationsnote over ActionExecutor: - Action status trackingActionExecutor-->>SearcherAgent: Action resultdeactivate ActionExecutorendSearcherAgent->>WebSearchGraph: Put result in queuedeactivate SearcherAgentloop For each queued resultWebSearchGraph->>WebSearchGraph: Process queueWebSearchGraph-->>MindSearchAgent: Yield (node_name, node, adj)enddeactivate WebSearchGraphMindSearchAgent->>MindSearchAgent: _generate_reference()alt Has plugin actionMindSearchAgent->>ActionExecutor: Execute plugin actionactivate ActionExecutornote over ActionExecutor: Handles plugin executionnote over ActionExecutor: - Plugin invocationsnote over ActionExecutor: - Action status trackingActionExecutor-->>MindSearchAgent: Action resultdeactivate ActionExecutorendendMindSearchAgent->>MindSearchAgent: convert_adjacency_to_tree()MindSearchAgent-->>FastAPI: Yield AgentReturnenddeactivate MindSearchAgentFastAPI->>EventSourceResponse: Create SSE responseEventSourceResponse-->>Client: Stream JSON responsesdeactivate FastAPInote over MindSearchAgent: AgentReturn includes: note over MindSearchAgent: - nodes note over MindSearchAgent: - adjacency_list (tree structure) note over MindSearchAgent: - inner_steps note over MindSearchAgent: - references note over MindSearchAgent: - adj (original adjacency list)

MindSearch的llm调用库lagent是他们团队手搓原创的,连siliconflow调用qwen模型都不支持,为了调通只能魔改lagent,这里就不赘述。文档里支持的四个搜索API:GoogleSearchDuckDuckGoSearchBraveSearchBingSearch,推荐用GoogleSearchDuckDuckGoSearchDuckDuckGoSearch免费需要设置proxy,GoogleSearch是通过serper.dev绑卡赠送一次性额度,BraveSearch绑卡有免费月额度但是并发1,BingSearch要开通azure绑定Visa卡。
如果单纯调用LLM的API,不需要本地推理,可以把requirements.txt里面的lmdeploytransformers注释掉不用安装。
用原版的提示词效果最好的是GPT4o和internlm2.5,为了让qwen和deepseek也能跑通,需要修改提示词文件mindsearch_prompt.py,修改GRAPH_PROMPT_CN给llm增加一个示例,下面是我改的:

## 注意事项1. 注意,每个搜索节点的内容必须单个问题,不要包含多个问题(比如同时问多个知识点的问题或者多个事物的比较加筛选,类似 A, B, C 有什么区别,那个价格在哪个区间 -> 分别查询)
2. 不要杜撰搜索结果,要等待代码返回结果
3. 同样的问题不要重复提问,可以在已有问题的基础上继续提问
4. 一次输出中,不要包含多个代码块,每次只能有一个代码块
5. 每个代码块应该放置在一个代码块标记中,同时生成完代码后添加一个<|action_end|>标志,如下所示:<|action_start|><|interpreter|>```python# 你的代码块```<|action_end|>
6. 一个代码块中,一个节点必须和一条边相连,并最后调用node方法获取结果。
7. 整个图构建最后一次回复应该是添加node_name为'response'的 response 节点,必须添加 response 节点,不要添加其他节点。 添加 response 节点的时候,要单独添加,不要和其他节点一起添加,不能同时添加 response 节点和其他节点
示例(注意这是多次的回答而不是单次的):
<|action_start|><|interpreter|>```python
graph = WebSearchGraph()
# 添加根节点
graph.add_root_node(node_content="人工智能的最新进展有哪些?\", node_name="root")
# 添加搜索节点
graph.add_node(node_name="key_areas", node_content="人工智能研究的关键领域有哪些?")
# 添加边,表示搜索节点之间的关系
graph.add_edge(start_node="key_areas", end_node="trends")
# 读取节点的查询结果并打印出来
graph.node("key_areas")
```<|action_end|>
<|action_start|><|interpreter|>```python
# 添加根节点
graph.add_node(node_name="trends", node_content="机器学习的最新趋势是什么?")
graph.add_edge(start_node="key_areas", end_node="trends")
graph.node("trends")
```<|action_end|>
<|action_start|><|interpreter|>```python
graph.add_response_node(node_name="response")
graph.add_edge(start_node="trends", end_node="response")
```<|action_end|>

从这个例子可以看出,graph.node()方法必须调用,否则llm就获取不到搜索代理返回的信息,导致结果瞎编乱造。顺带一提,internlm2.5竟然把from ilagent.agents.python_web import WebSearchGraph炼在模型里,光靠提示词大模型是不可能写出这行代码的,怪不得配合MindSearch效果好。
我还碰到一个奇怪的问题,有的时候只会执行一次搜索就结束了,但是代码明显没跑完,因为他没有走到最后一个response节点,我怀疑是mindsearch_agent.py代码导致的,这里修改确保graph已经创建成功在执行后续操作。

@@ -373,6 +402,20 @@ class MindSearchAgent(BaseAgent):args=(command, ))producer_thread.start()+        # 等待确保 graph 对象被创建
+        max_retries = 10
+        retry_count = 0
+        while retry_count < max_retries:
+            graph = self.local_dict.get('graph')
+            if graph is not None:
+                break
+            time.sleep(0.1)  # 短暂等待
+            retry_count += 1
+            logger.info(f"Waiting for graph object, attempt {retry_count}")
+        
+        if self.local_dict.get('graph') is None:
+            raise RuntimeError("Failed to initialize graph object")
+responses = defaultdict(list)ordered_nodes = []active_node = None

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/825477.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某小型CMS漏洞复现审计

根据数据包在IDEA全局搜索,定位到delete代码段。该方法接收三个参数:path、name 和 data,这些参数通过 \@RequestParam注解从请求中提取,并进行简单拼接,赋值给file对象,此时file对象代表实际的文件名称。SQL注入 漏洞复现:登陆后台,点击页面删除按钮,抓包:rid参数存…

遥感图像Trento原始数据集下载

遥感图像Trento数据集提供下载遥感图像Trento原始数据集下载偶然间在某个项目里发现了Trento的完整数据集,不过那个数据集有些奇怪的小改动 虽然我已经不做遥感方向了,不过当初我找这个数据集也是花了很长时间 于是重新整理了一下,就当是方便后来的研究者使用吧 github:htt…

hadoop-3.1.2分布式搭建

一、准备工作 三台虚拟机:master、node1、node2时间同步 关闭防火墙:systemctl stop firewalld查看防火墙状态:systemctl status firewalld取消防火墙自启:systemctl disable firewalld修改主机名三台分别执行 vim /etc/hostname 并将内容指定为对应的主机 名静态IP配置vim…

#2024-2025-1学号20241309《计算机基础与程序设计》第六周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第六周作业这个作业的目标作业正文 2024-2025-1学号20241309《计算机基础与程序设计》第六周学习总结教材学习内容总结 《计算机科学概论》第七章: 1. Poly…

目标管理中目标制定的原则是什么

目标管理中目标制定的基本原则可以用SMART准则(具体、可衡量、可达成、相关性、时间限制)来概括。文章将主要探讨五个方面:1、具体性(Specific);2、可衡量性(Measurable);3、可达成性(Achievable);4、相关性(Relevant);5、时间限制(Time-bound),目标需有明确…

猿人学web端爬虫攻防大赛赛题第15题——备周则意怠-常见则不疑

题目网址:https://match.yuanrenxue.cn/match/15 解题步骤看触发的数据包。有个m参数,一看就是经过处理的,我们得知道m是如何组成的。看Initiator模块。还是看request函数,往上一看就看到了m的赋值操作。打断点,触发。看下window.m()的定义。比较好理解的,t1和t2就是对时…

ChatOps是什么

ChatOps是一种运维和开发团队在沟通、协作和自动化方面的实践方法。它的核心思想是将运维和开发操作集成到团队常用的聊天工具中,通过命令行或简单的自然语言指令来执行各种操作和任务,从而提高团队的效率和透明度。一、ChatOps的概念 ChatOps是一种运维和开发团队在沟通、协…

编程 和 数学 的关系是什么

编程 和 数学 的关系有:1. 共同的逻辑思维基础;2. 共享抽象建模的特性;3. 算法与数学之间的紧密联系;4. 数据结构和数学对象的对应关系;5. 计算机科学中的数学理论;6. 创新和问题解决的共同性。编程和数学都建立在严密的逻辑思维基础上。数学是一种形式化的语言,通过推理…

独显直连是啥意思

独显直连(Direct GPU Access,DGA)是一种涉及计算机图形卡和显示系统交互的技术。这种配置方式允许操作系统或应用程序直接与图形卡硬件进行通信,绕过传统的操作系统驱动和API层。独显直连在提高图形性能、降低延迟、并为高性能计算带来优势方面有其独到之处。本文将深入探讨…

Diffuision Policy + RL -------个人博客_ZSY_20241101

Diffusion Policy: Visuomotor Policy Learning via Action DiffusionCheng Chi, Zhenjia Xu, Siyuan Feng, Eric Cousineau, Yilun Du, Benjamin Burchfiel, Russ Tedrake, Shuran Song 原论文链接 投在了IJRR上 点击:原作者论文思路讲解 1. PPO背景引入 这里简要交代PPO的算…

抖音蓝V信息采集器快手蓝V商家联系方式批量提取工具

抖音蓝V信息采集器快手蓝V商家联系方式批量提取工具 作者V♥553813195 关于抖音蓝V信息采集器和快手蓝V商家联系方式批量提取工具,以下是详细的分析:一、抖音蓝V信息采集器 定义与功能 抖音蓝V信息采集器是一款专为抖音平台设计的工具,旨在帮助用户快速、准确地采集具有蓝V认…

halo配置踩坑过程小记

halo配置过程详解写在最前:​ 终于搞定了最后的一步域名解析配置,其实动态博客的折腾程度也不低于当时的hexo吧,也可能当时的痛苦过程已经忘了。。整理一下思路,记录一下配置过程走过的坑。 ​ 我是从hexo用了半年想折腾点新玩意儿的,其实hexo配置自动化部署之后也挺方便的…