ChatGPT Plugin开源方案(ChatGLM + langchain)

OpenAI发布的ChatGPT Plugin刚刚杀死了一个创业公司LangChain(刚获得1000万美金种子轮融资)

大模型存在的问题

由于语言模型的输出是通过自回归+采样[可选]完成的,在高精度场景下,即使是超大语言模型,发生错误概率也是指数级的。同时,采样也很容易引入错误。比如地址中的数字门牌号,模型在面对0-9这样token的概率会比较接近。

大模型在推理阶段,参数是固定的,无法获取最新的数据与信息,如果问题需要实时数据的场景,没有额外输入的情况下,会无法生成有效的输出。

解决方案:通过拆解任务(Chain of Thought)实现多轮回话的方式,与真实世界的数据API与运行环境(代码解释器)进行数据交互,输出真实的结果。

开发框架:1) OpenAI 的 ChatGPT Plugin, 2) langchain(初期,并不完善)

Quick Start

**语言模型:**开源的ChatGLM-6B,链接:git@github.com:THUDM/ChatGLM-6B.git。

语言模型直接采用清华的开源版本,通过huggingface 的transformer 库调用,开箱即用(需要显卡)。

插件/Chain 开发框架:langchain,链接:git@github.com:hwchase17/langchain.git

Demo演示

下面演示了两种情形:

1)直接调用chatglm,提问“3.1的3次方是多少?”,直接调用的返回可以看出,模型在训练阶段使用Chain of Thought,模型输出了任务的正确步骤,但是由于模型无法真正运行计算逻辑,输出了错误的结果。

>>> question = "3.1的3次方是多少?"

# 直接调用语言模型chatglm
>>> llm(question)
3.1的3次方是多少?
'3.1的3次方可以通过连续乘以3.1,使用计算器或手动计算得出,为:\n\n3.1^3 = 31\n\n因此,3.1的3次方等于31。'

2) 调用带有计算插件的chatglm版本,首先会重新构建一个prompt,然后,从模型返回的结构中抽取可执行代码,然后运算得到正确结果。(浮点数的误差先忽略)

>>> question = "3.1的3次方是多少?"

# 调用带算数插件的chatglm
>>> llm_math.run(question)


> Entering new LLMMathChain chain...
3.1的3次方是多少?Translate a math problem into Python code that can be executed in Python 3 REPL. Use the output of running this code to answer the question.

Question: ${Question with math problem.}
```python
${Code that solves the problem and prints the solution}
${Output of running the code}

Answer: ${Answer}

Begin.

Question: What is 37593 * 67?

print(37593 * 67)
2518731

Answer: 2518731

Question: 3.1的3次方是多少?

print(3.1**3)

Answer: 29.791000000000004

> Finished chain.
'Answer: 29.791000000000004\n'

LLMMathChain步骤:

  1. 任务规划设定:通过构造一个新的prompt,结合输入,利用语言模型理解问题,同时给出解决问题的方案的可执行代码。
  2. 问题解决方案代码执行,返回执行结果
  3. 返回最终结果,可以通过语言模型组织语言,返回结果(可选,这里是模版直接返回)