通过 Google 搜索并返回答案

接下来,我们就来搞点有意思的。我们来让我们的 OpenAI api 联网搜索,并返回答案给我们。

这里我们需要借助 Serpapi 来进行实现,Serpapi 提供了 google 搜索的 api 接口。

首先需要我们到 Serpapi 官网上注册一个用户,https://serpapi.com/ 并复制他给我们生成 api key。

然后我们需要像上面的 openai api key 一样设置到环境变量里面去。

  1. import os
  2. os.environ["OPENAI_API_KEY"] = '你的api key'
  3. os.environ["SERPAPI_API_KEY"] = '你的api key'

然后,开始编写我的代码

  1. from langchain.agents import load_tools
  2. from langchain.agents import initialize_agent
  3. from langchain.llms import OpenAI
  4. from langchain.agents import AgentType
  5. # 加载 OpenAI 模型
  6. llm = OpenAI(temperature=0,max_tokens=2048)
  7. # 加载 serpapi 工具
  8. tools = load_tools(["serpapi"])
  9. # 如果搜索完想再计算一下可以这么写
  10. # tools = load_tools(['serpapi', 'llm-math'], llm=llm)
  11. # 如果搜索完想再让他再用python的print做点简单的计算,可以这样写
  12. # tools=load_tools(["serpapi","python_repl"])
  13. # 工具加载后都需要初始化,verbose 参数为 True,会打印全部的执行详情
  14. agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
  15. # 运行 agent
  16. agent.run("What's the date today? What great events have taken place today in history?")

image-20230404234236982

我们可以看到,他正确的返回了日期(有时差),并且返回了历史上的今天。

在 chain 和 agent 对象上都会有 verbose 这个参数,这个是个非常有用的参数,开启他后我们可以看到完整的 chain 执行过程。

可以在上面返回的结果看到,他将我们的问题拆分成了几个步骤,然后一步一步得到最终的答案。

关于agent type 几个选项的含义(理解不了也不会影响下面的学习,用多了自然理解了):

  • zero-shot-react-description: 根据工具的描述和请求内容的来决定使用哪个工具(最常用)
  • react-docstore: 使用 ReAct 框架和 docstore 交互, 使用SearchLookup 工具, 前者用来搜, 后者寻找term, 举例: Wipipedia 工具
  • self-ask-with-search 此代理只使用一个工具: Intermediate Answer, 它会为问题寻找事实答案(指的非 gpt 生成的答案, 而是在网络中,文本中已存在的), 如 Google search API 工具
  • conversational-react-description: 为会话设置而设计的代理, 它的prompt会被设计的具有会话性, 且还是会使用 ReAct 框架来决定使用来个工具, 并且将过往的会话交互存入内存

reAct 介绍可以看这个:https://arxiv.org/pdf/2210.03629.pdf

LLM 的 ReAct 模式的 Python 实现: https://til.simonwillison.net/llms/python-react-pattern

agent type 官方解释:

https://python.langchain.com/en/latest/modules/agents/agents/agent_types.html?highlight=zero-shot-react-description

有一点要说明的是,这个 serpapi 貌似对中文不是很友好,所以提问的 prompt 建议使用英文。

当然,官方已经写好了 ChatGPT Plugins 的 agent,未来 chatgpt 能用啥插件,我们在 api 里面也能用插件,想想都美滋滋。

不过目前只能使用不用授权的插件,期待未来官方解决这个。

感兴趣的可以看这个文档:https://python.langchain.com/en/latest/modules/agents/tools/examples/chatgpt_plugins.html

Chatgpt 只能给官方赚钱,而 Openai API 能给我赚钱