赞
踩
在前面的图文当ChatGLM3能用搜索引擎时中,我们让ChatGLM3在搜索引擎上进行的简单的搜索,但是仅仅只能搜索一些简单的内容,比如,时间。但是实际搜索中,往往不能满足要求,因为使用的是selenium进行的一个简单google搜索,所以针对复杂的搜索需求,现在对这个功能进行升级。之前我们用的是google搜索,现在我们使用ddgs---duckduckgo search。
DuckDuckGo是一款网际网路搜寻引擎,其注重用户私隐,及避免个性化检索所致的过滤气泡。它与其他搜寻引擎不同的地方在于其不会分析自己的用户、对所有使用同一组关键词的用户显示同样的结果。它也强调返回最佳结果,而不是最多网站连接之结果。它会在搜寻结果中引入其他独立来源的内容,总数多于400个,其中包括像维基百科般的众包网站、其他搜寻引擎(如Bing、Yandex、Yahoo! Search)。在2021年3月,它平均每日处理的搜寻量达98,629,221宗。
重要的是DuckDuckGo提供免费的API使用,只需要简单的pip安装,既可以使用python脚本或者cli进行调用搜索。
所以我们对之前的搜索方式进行升级,首先我们安装DuckDuckGo
pip install -U duckduckgo_search
然后修改原来的注册脚本
- def google_results(query):
- content = ""
-
- with DDGS() as ddgs:
- for r in ddgs.text(query, max_results=5):
- content = content + r['title'] + "\n" + r['href'] + "\n" + r['body'] + "\n" + "\n\n"
- print(content)
- if content == "":
- return("没有找到结果")
- else:
- return content
其他的内容和原来的一样,下面让我们来详细体验下:
当然DuckDuckGo还支持视频、图片、翻译等搜索功能,有兴趣的小伙伴可以进行尝试哦
当然还可以在text-generation-webui中使用相同的功能,具体的text-generation-webui部署可以参考如何优雅的使用各类LLM,同样的,我们在项目文件夹中添加如下脚本script.py
- from copy import deepcopy
- import inspect
- from pprint import pformat
- import traceback
- from types import GenericAlias
- from typing import get_origin, Annotated
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from selenium.webdriver.chrome.service import Service
- import urllib
-
-
- import requests
- from duckduckgo_search import DDGS
-
-
- _TOOL_HOOKS = {}
- _TOOL_DESCRIPTIONS = {}
-
-
-
-
- def google_results(query):
- content = ""
-
- with DDGS() as ddgs:
- for r in ddgs.text(query, max_results=5):
- content = content + r['title'] + "\n" + r['href'] + "\n" + r['body'] + "\n" + "\n\n"
- print(content)
- if content == "":
- return("没有找到结果")
- else:
- return content
-
-
-
-
-
-
- def register_tool(func: callable):
- tool_name = func.__name__
- tool_description = inspect.getdoc(func).strip()
- python_params = inspect.signature(func).parameters
- tool_params = []
- for name, param in python_params.items():
- annotation = param.annotation
- if annotation is inspect.Parameter.empty:
- raise TypeError(f"Parameter `{name}` missing type annotation")
- if get_origin(annotation) != Annotated:
- raise TypeError(f"Annotation type for `{name}` must be typing.Annotated")
-
- typ, (description, required) = annotation.__origin__, annotation.__metadata__
- typ: str = str(typ) if isinstance(typ, GenericAlias) else typ.__name__
- if not isinstance(description, str):
- raise TypeError(f"Description for `{name}` must be a string")
- if not isinstance(required, bool):
- raise TypeError(f"Required for `{name}` must be a bool")
-
-
- tool_params.append({
- "name": name,
- "description": description,
- "type": typ,
- "required": required
- })
- tool_def = {
- "name": tool_name,
- "description": tool_description,
- "params": tool_params
- }
-
-
- print("[registered tool] " + pformat(tool_def))
- _TOOL_HOOKS[tool_name] = func
- _TOOL_DESCRIPTIONS[tool_name] = tool_def
-
-
- return func
-
-
- def dispatch_tool(tool_name: str, tool_params: dict) -> str:
- if tool_name not in _TOOL_HOOKS:
- return f"Tool `{tool_name}` not found. Please use a provided tool."
- tool_call = _TOOL_HOOKS[tool_name]
- try:
- ret = tool_call(**tool_params)
- except:
- ret = traceback.format_exc()
- return str(ret)
-
-
- def get_tools() -> dict:
- return deepcopy(_TOOL_DESCRIPTIONS)
-
-
- # Tool Definitions
-
-
- @register_tool
- def search_google(
- user_input: Annotated[str, 'the content of the user input', True]
- ) -> str:
- """
- Search the 'user input' on google
- """
-
-
- search_data = google_results(user_input)
-
-
- return search_data
-
-
- if __name__ == "__main__":
- #print(dispatch_tool("get_weather", {"city_name": "beijing"}, "search_google"))
- print("search_google")
- print(get_tools())
然后启动python server.py --trust-remote-code,在session界面中配置web_search,将这个选项勾上,然后apply即可
然后导入模型,这里我们还是选用ChatGLM3-6B,然后点击load
然后我们进入chat页面,即可体验
大家可以尽情进行尝试,希望大家一键三连,给个星标哦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。