分享
如何在MindSearch中集成新的搜索API,全面提升智能搜索能力!
输入“/”快速插入内容
如何在MindSearch中集成新的搜索API,全面提升智能搜索能力!
用户1672
用户76
用户1423
2024年11月28日修改
📌
请注意,本文中展示的代码片段是精心挑选的重要部分,旨在简明扼要地阐述关键逻辑或功能。由于篇幅限制,这些代码并不构成完整的实现。为了全面理解和应用这些概念,强烈建议您参考相应的完整源代码
https://github.com/InternLM/lagent/blob/main/lagent/actions/bing_browser.py#L264
。
在这个信息爆炸的时代,如何高效地从海量数据中提取有价值的信息成为了一项挑战。智能搜索技术的出现,为我们提供了一把解锁知识宝库的钥匙。今天,我们将深入探讨一个前沿的智能搜索系统——MindSearch,并详细介绍如何在 MindSearch 中集成新的
搜索
API
,以扩展其功能和提升用户体验。
MindSearch 开源链接
开源代码:
https://github.com/InternLM/mindsearch
请注意,本文中展示的代码片段是精心挑选的重要部分,旨在简明扼要地阐述关键逻辑或功能。由于篇幅限制,这些代码并不构成完整的实现。为了全面理解和应用这些概念,强烈建议您参考相应的完整源代码
https://github.com/InternLM/lagent/blob/main/lagent/actions/bing_browser.py#L264
。
在深入探讨之前,让我们先明确本文中几个关键术语的定义:
•
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(BaseAction)
这个类。
1.
前置
内容
MindSearch
是一个集成了先进人工智能技术的搜索系统,它通过两大智能体——
PlannerAgent
和
SearcherAgent
——协同工作,实现高效的信息检索。
SearcherAgent
负责生成多个查询
(查询重写)
,利用第三方
搜索
API
进行内容检索。为了更好地理解这一过程,我们需要详细了解
SearcherAgent
的工作机制及其与
搜索
API
的交互
,主要包括以下三点。
•
根据 MindSearch 里的
SearcherAgent
提示词中的
few shot 例子
,对于每个节点(由
PlannerAgent
生成的子问题),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": "..."},]
为了在 MindSearch 中支持新的搜索 API,我们可以采用两种方法:一是在
lagent/actions/
文件夹下新建文件从零开始实现,二是直接在现有的
bing_browser.py
中进行功能扩展。
本文将着重介绍第二种方法,即在现有代码基础上引入新的搜索
API,这样不仅避免了重复开发,还能确保代码的一致性和可维护性。鉴于
bing_browser.py
已内置了
search
函数和
select
函数等功能,并已妥善处理了前文提到的关键注意事项,我们将聚焦于通过这种方法来扩展现有功能。接下来,我们将详细解析
bing_browser.py
文件的内容
。
2.
浅析
bing_broswer.py
•
SearcherAgent 调用 BingBrowser 类的代码流程如下:
def search()
->
self.searcher.search()
->
self.searcher._call_serper_api()
->
self.searcher._parse_response()
->
self.searcher._filter_results()
->
def select()
->
self.fetcher.fetch()
•
在上述流程中,标记为黄色以及蓝色的函数是 SearcherAgent 触发
search()
函数时会执行到的关键函数。其中标记为蓝色的函数则是我们在支持新的
搜索
API
时,需要在新的 searcher 类中实现的函数。而标记为绿色的函数,则是在 SearcherAgent 触发
select()
函数时会执行到的函数。
•
在
bing_browser.py
文件中,定义了三个关键的类,它们分别是:
1.
class BingBrowser(BaseAction) 类
•
此类是被设计为
SearcherAgent
中的
Action
组件,负责处理搜索相关的核心逻辑。此类含有两个重要的函数,分别是
search()
和
select()
,分别对应前置
内容
中的
第一点
和
第二点
。
def search() 函数
◦
当接收到 SearcherAgent 生成的多个 query(以列表形式表示)后,单独给每个在 queries 列表中的 query 开启一个线程,并且调用对应的
searcher.serach()
函数来执行相应的
搜索
API
调用。
代码块
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
}