分享
「圆桌」在 MindSearch 中支持新的搜索 API
输入“/”快速插入内容
「圆桌」在 MindSearch 中支持新的搜索 API
用户1672
用户76
用户3969
用户6994
2025年2月21日修改
📌
请注意,本文中展示的代码片段是精心挑选的重要部分,旨在简明扼要地阐述关键逻辑或功能。由于篇幅限制,这些代码并不构成完整的实现。为了全面理解和应用这些概念,强烈建议您参考相应的完整源代码。
兴趣小组
加入门槛:
将MindSearch部署到Hugging Face
上后联系浦语小助手入群。
定义
•
SeacherAgent
指的是
MindSearch
里的两大智能体之一。
•
搜索API
指的是由第三方服务提供商提供的网络搜索
接口,如 Google Serper API、Bing Web Search API等。
•
如果是在
lagent
/actions/bing_browser.py
支持新的搜索API,
searcher
指的是实现新的
搜索API
所对应的类。
•
搜索 API Action
指的是支持新的
搜索API
所需要定义的
Action
,如果是直接在
lagent/actions/bing_browser.py
支持新的搜索API,那这个 Action 指的就是
BingBrowser(B
aseAction)
这个类。
前置
本文将介绍如何在 MindSearch 里支持的
搜索 API
,在开始之前,有以下几点需要注意:
•
根据 MindSearch 里的
SearcherAgent
提示词中的
few shot 例子
,对于每个节点(由 MindSearchAgent 生成的子问题),SearcherAgent 会生成
多个 Query
用于搜索API来检索内容,所以其
搜索 API Action
中的
search函数
需要有处理多个 Query 的能力,而不是只处理一个单个的 Query。
代码块
JSON
### search
当我希望搜索"王者荣耀现在是什么赛季"时,我会按照以下格式进行操作:
现在是2024年,因此我应该搜索王者荣耀赛季关键词
<|action_start|><|plugin|>{{"name": "FastWebBrowser.search", "parameters":
{{"query": ["王者荣耀 赛季", "2024年王者荣耀赛季"]}}}}<|action_end|>
•
根据 MindSearch 里的
SearcherAgent
提示词中的
few shot 例子
,可以看出其实现的
搜索 API Action
需要有个可以进一步检索网站内容的函数(网页内容的抓取),也就是
select函数
。这是因为多数
搜索API
返回的内容都是网站内容里的
片段
,并不会包含太多有用的信息。
代码块
JSON
### select
为了找到王者荣耀s36赛季最强射手,我需要寻找提及王者荣耀s36射手的网页。初步浏览网页后,
发现网页0提到王者荣耀s36赛季的信息,但没有具体提及射手的相关信息。网页3提到“s36最强射手出现?”,
有可能包含最强射手信息。网页13提到“四大T0英雄崛起,射手荣耀降临”,可能包含最强射手的信息。
因此,我选择了网页3和网页13进行进一步阅读。
<|action_start|><|plugin|>{{"name": "FastWebBrowser.select",
"parameters": {{"index": [3, 13]}}}}<|action_end|>
"""
•
搜索 API Action
中的
search函数
返回的最终内容最好符合以下所期望的格式,否则在 MindSearch 内部代码解析内容时有可能会报错,MindSearch 里的 SeacherAgent 会根据此结果来调用
select函数
:
代码块
JSON
[{'type': 'text', 'content': '{"0": {"url": "https:", "summ": "...", "title": "..."},]
目前实现
搜索 API Action
的方法有2种:
•
方法一:在
lagent/actions/
文件夹下新建一个文件,并且从零实现
搜索 API Action
。
•
方法二:直接在
lagent/actions/bing_browser.py
里支持新的
搜索 API
。
bing_broswer.py 预览
•
由于
bing_browser.py
里已经内置了
search 函数
和
select 函数
等功能,并且妥善处理了
前置
章节中提及的关键注意事项。避免重复造轮子,本文将聚焦于在
方法二
的基础上,引入一个新的
搜索API
,以此扩展现有功能。
•
SearcherAgent 调用 BingBrowser 类的代码流程如下:
def search()
->
self.searcher.search() -> self.searcher._call_serper_api() -> self.searcher._parse_response()
->
def select() -> self.fetcher.fetch()
接下来将简单介绍 bing_broswer.py 里重要的几个类和函数 :
class BingBrowser(BaseAction) 类
•
此类是被设计为
SearcherAgent
中的
Action
组件。此类含有两个重要的函数,分别是
search
和
select
,分别对应前置中的
第一点
和
第二点
。
def search() 函数
◦
单独给每个在 queries 列表中的 query 开一个线程,并且调用对应的
searcher.serach()
函数。
代码块
Python
@tool_api
def search(self, query: Union[str, List[str]]) -> dict:
"""BING search API
Args:
query (List[str]): list of search query strings
"""
queries = query if isinstance(query, list) else [query]
search_results = {}
with ThreadPoolExecutor() as executor:
future_to_query = {
executor.submit(self.searcher.search, q): q
for q in queries
}