TL;DR

本文介绍了一种方法,让LLM拥有了上网的能力。

结果展示

如下图,问了它两个股票的价格现价,都能够正确的给出答案。

如何实现

在没有大模型之前,这个问题如何实现?

其实也简单,一点点NLP技能就可以解决。

NLP伪代码:

  • 抽取问题里的词槽,上述示例中词槽便是 stock_name: 科大讯飞
  • 执行对应的action,也就是调用方法get_current_price(stockname=“科大讯飞”)
  • 格式化输出

那这里的问题是,在抽取阶段,你需要写很多的规则,或者自己训练一个信息抽取模型。

如今,交给LLMs就行了。

来看看LangChain是如何简化这件事情的。这里就需要用到开篇里介绍的Agents组件了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

from sina import Sina
from pydantic import BaseModel, Field

from langchain.chat_models import ChatOpenAI
from langchain.agents import AgentType, initialize_agent
from langchain.tools import BaseTool
from typing import Type, Optional
from langchain.callbacks.manager import CallbackManagerForToolRun, AsyncCallbackManagerForToolRun


class StockQueryInput(BaseModel):
stock_name: str = Field()


class StockPriceQueryTool(BaseTool):
name = "StockPriceQuery"
description = "useful for when you need to answer questions about the price of a stock code"
args_schema: Type[BaseModel] = StockQueryInput

def _run(self, stock_name: str, run_manager: Optional[CallbackManagerForToolRun] = None) -> str:

stock_code = StockCodeMapping.get(stock_name)
sina = Sina(stock_code)
res = sina.get_current_price()

return f"当前时间{res['date']} {res['time']}{res['name']}的价格是{res['new']}"

async def _arun(self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None) -> str:
raise NotImplementedError("StockPriceQueryTool does not support async")


llm = ChatOpenAI(temperature=0)

tools = [StockPriceQueryTool(), ]
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("科大讯飞现在的股价是多少,什么时间的数据?")

代码非常简单,核心就是继承BaseTool这个父类,以实现自定义。

打开调试模式,我们看看LangChain都干了些什么,见下图:

LangChain大概的心理活动可能是:

  • 哦,任务来了,我需要提供科大讯飞的当前股价
  • 我该找谁问呢?哦,股票的事情要问StockPriceQueryTool
  • StockPriceQueryTool.run(“科大讯飞”)
  • 哦,答案来了,“当前时间2023-05-12 14:30:48,科大讯飞的价格是63.930”
  • 这个答案完美,我组织一下语言

是不是很酷?

尾声

其实笔者在LLM爆发前夜,实现了一个小型的ChatBot,利用的是NLP组合技,感兴趣的朋友看这里

LangChain到这里就介绍完了。会不会不重要,重要的是它背后的思想。

猴子变成人,是因为学会了使用工具。既然新的工具出现了,要不要变一下?

Peace out。