首页 > 其他分享 >MindSearch踩坑心得

MindSearch踩坑心得

时间:2024-11-01 22:42:13浏览次数:1  
标签:MindSearchAgent node WebSearchGraph graph MindSearch ActionExecutor 心得 response

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

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

%%{init:{'theme':'forest', 'themeVariables':{'fontSize':'20px'}, "securityLevel": "loose"}}%% sequenceDiagram participant Client participant FastAPI participant EventSourceResponse participant init_agent participant MindSearchAgent participant SearcherAgent participant WebSearchGraph participant LLM participant ActionExecutor Client->>FastAPI: POST /solve (GenerationParams) activate FastAPI FastAPI->>init_agent: init_agent(lang, model_format, search_engine) activate init_agent init_agent->>LLM: Create/Get LLM instance init_agent->>ActionExecutor: Create BingBrowser executor init_agent->>MindSearchProtocol: Create protocol with prompts init_agent->>MindSearchAgent: Create agent(llm, protocol, searcher_cfg) init_agent-->>FastAPI: Return agent instance deactivate init_agent FastAPI->>MindSearchAgent: stream_chat(inputs) activate MindSearchAgent MindSearchAgent->>MindSearchProtocol: format(inner_step) MindSearchProtocol-->>MindSearchAgent: formatted prompt MindSearchAgent->>LLM: stream_chat(prompt) loop For each response LLM-->>MindSearchAgent: Stream response MindSearchAgent->>MindSearchProtocol: parse(response) MindSearchProtocol-->>MindSearchAgent: language, action alt Has code execution MindSearchAgent->>WebSearchGraph: execute_code(command) activate WebSearchGraph WebSearchGraph->>SearcherAgent: Create searcher agents activate SearcherAgent SearcherAgent->>MindSearchProtocol: format(question) MindSearchProtocol-->>SearcherAgent: formatted prompt SearcherAgent->>LLM: stream_chat(question) LLM-->>SearcherAgent: Stream response alt Has tool action SearcherAgent->>ActionExecutor: Execute tool action activate ActionExecutor note over ActionExecutor: Handles plugin execution note over ActionExecutor: - BingBrowser actions note over ActionExecutor: - Tool invocations note over ActionExecutor: - Action status tracking ActionExecutor-->>SearcherAgent: Action result deactivate ActionExecutor end SearcherAgent->>WebSearchGraph: Put result in queue deactivate SearcherAgent loop For each queued result WebSearchGraph->>WebSearchGraph: Process queue WebSearchGraph-->>MindSearchAgent: Yield (node_name, node, adj) end deactivate WebSearchGraph MindSearchAgent->>MindSearchAgent: _generate_reference() alt Has plugin action MindSearchAgent->>ActionExecutor: Execute plugin action activate ActionExecutor note over ActionExecutor: Handles plugin execution note over ActionExecutor: - Plugin invocations note over ActionExecutor: - Action status tracking ActionExecutor-->>MindSearchAgent: Action result deactivate ActionExecutor end end MindSearchAgent->>MindSearchAgent: convert_adjacency_to_tree() MindSearchAgent-->>FastAPI: Yield AgentReturn end deactivate MindSearchAgent FastAPI->>EventSourceResponse: Create SSE response EventSourceResponse-->>Client: Stream JSON responses deactivate FastAPI note 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

标签:MindSearchAgent,node,WebSearchGraph,graph,MindSearch,ActionExecutor,心得,response
From: https://www.cnblogs.com/mesopotamiaa/p/18521422

相关文章

  • 51单片机蓝牙遥控小车中遇到的问题及解决方案&步骤心得
    一、遇到的问题及解决方案Q1:马达与车盘连接不牢固。A:可用橡皮筋缠紧连接处(如图)。Q2:L298N电机驱动模块无法驱动电机。A:若是仅仅连接了一个EN引脚则可能需要对ENA(或B)的两个引脚输入同样的电平。Q3:测试蓝牙时无法将程序烧录到单片机上。A:蓝牙模块的收发口与单片机的收......
  • 分享一下最近清洗CFPS心得,有错误求指正
    目标:得到一个四期面板数据,每期包括家庭库和个人库一、提取变量以2014年为例,2016、2018、2020省略处理过程1.处理个人库keepfid14pidprovcd14urban14cfps2014_agecfps_genderqea0qp201cfps2014eduy_imqz207ku802 替换缺失值forvar_all:replaceX=.ifinl......
  • patchTST代码复现心得
    patchTST代码复现心得NieY,NguyenNH,SinthongP,etal.Atimeseriesisworth64words:Long-termforecastingwithtransformers[J].arXivpreprintarXiv:2211.14730,2022.代码先来预测模块defforecast(self,x_enc,x_mark_enc,x_dec,x_mark_dec):......
  • 《Java 大厂面试基础真题及解析 —— 来自一位程序员的心得分享》
    作为一名Java程序员,在经历了众多面试后,深知Java基础在大厂面试中的重要性。以下是我总结的一些常被问到的Java基础面试题及解析,希望对大家有所帮助。2024Javaoffer收割指南分享一、面向对象的三大特性(一)封装概念封装是将数据和操作数据的方法绑定在一起,形成一个......
  • 从小白到大牛:IT人的日常代码苦练心得
    从小白到大牛:IT人的日常代码苦练心得日常代码苦练名称:一元稀疏多项式计算器一、问题描述:设计一个一元稀疏多项式的简单计算器,要求能进行加减运算,**问题输入:**每组数据有3行构成,第1行为3个正整数n,m,t,n表示第一个多项式的项数,m表示第二个多项式的项数,t表示运算类型,0为......
  • 【开发心得】筑梦上海:项目风云录(8)
    目录开心的日子总是过的快秋天终于来了。感谢欣赏,未完待续。。。不知不觉已经写到第8篇,感谢大家的关注和阅读。这一篇,公交项目已经走向尾声,感觉有很多东西还没有写出来。好在印象深刻的事情都记录了,之前走了很多坑,也算是项目开发的避坑指南吧。开心的日子总是过的快上......
  • (八千字心得笔记)零基础C语言入门第一课——初识C语言
    这一课主要是让大家初步了解C语言,了解我们的开发环境,main函数,库函数,关键字,字符和字符串等内容的介绍,后面会一一讲解文章目录一.C语言是什么1.1C语言的历史二.开发环境编译型语言和解释型语言2.1编译和链接2.2编译器的选择2.2.1VS项目和源文件、头文件介绍2.2.2......
  • 【开发心得】筑梦上海:项目风云录(7)
    目录出租房的放松日子日常的项目生活荣誉员工小海的定检编排算法未完待续。。。不知不觉已经来到第7篇了,还好之前还留了一套当时记录项目工作的文档,否则这么多细节,还真的很难全靠脑子记录。出租房的放松日子租房子大概有半年,除了周末,每天几乎都是两点一线的生活,那时......
  • Issac_GYM对Go2机器人的仿真心得
    override覆盖torques扭矩1args()参数信息等cd/home/yyds/桌面/Gym2/legged_robot_competition-master/legged_gym/legged_gym/utils/helpers.py这里对train等参数的调用情况进行了说明比如:pythonplay.py--task=go2--num_envs=64--checkpoint=50--load_run=/ho......
  • 六个大学生AI写作神器:一键生成实验报告/思想汇报/辩论灵感/课程论文/心得感悟等内容
    面对接踵而至的繁重课程与五花八门的作业任务,笔者为广大学生朋友精心搜罗了6款好用的AI助手。这些工具专为提升学习效率、激发创意灵感、加强学习专注力而设计,旨在帮助每位学子轻松应对作业挑战,显著优化学术成果。让它们成为学习路上的得力伙伴,让学习之旅更加顺畅无阻,课余生活......