LangChain+LLM:被低估的few-shot
如果想使得ChatGPT更聪明,我们需要先为它打个样。
GPT-base的LLM,相对与前LLM时代,比如bert,RNN时代,最典型的能力是跨领域泛化,在全新的未知领域会收获比后两者更强的能力。但是,回归到算法任务本身,是小样本任务能力的体现。换句话说:虽然LLM已经学到了很多知识,但是我们如果使用足够聪明的shot 作为当前任务的上文,可以极大地发挥LLM的能力。
Fine-tune监督微调 | Few-shot学习 | One-shot学习 | Zero-shot学习 | |
---|---|---|---|---|
训练样本数量 | 大量 | 0 | 0 | 0 |
训练方式 | 调整预训练模型权重 | 不需训练 | 不需训练 | 不需训练 |
使用方式 | 与训练数据同结构的输入输出 | 上文(少量数据:输入-输出对)+ 当前待推理文本 |
上文(一个输入-输出对)+ 当前待推理文本 |
待推理文本 |
上文prompt数量 | 0 | <10条 | 1条 | 0条(仅指定任务类别) |
文本情感分类,输入案例 | 小哥哥,来跟我一起玩呀 | 情绪分类: 小哥哥我今天不开心->消极 小哥哥真好->积极 小哥哥你吃饭了吗?->中性 啊啊啊小哥哥我摔到了->消极 小哥哥,天气不错呢->积极 小哥哥,来跟我一起玩呀-> |
情绪分类: 啊啊啊小哥哥我摔到了->消极 小哥哥,来跟我一起玩呀-> |
情绪分类: 小哥哥,来跟我一起玩呀 |
fine-tune(监督模型微调)输入输出,如果不是同领域的模型,则不存在适应的可能性。
情感分类模型:标签空间(积极/消极/中性)
输入:小哥哥,来跟我一起玩呀
输出:积极
有毒评论分类模型:标签空间(有毒/无毒)
输入:小哥哥,来跟我一起玩呀
输出:无毒
而针对小样本的效果,则可以通过增加上文(prompt),在推理阶段自定义跨领域的任务
few-shot 输入(注意观察,只有最后一句是我们要预测的内容,上面的6行都是prompt,其中第一行prompt指定了任务类别)
情绪分类:
小哥哥我今天不开心->消极
小哥哥真好->积极
小哥哥你吃饭了吗?->中性
啊啊啊小哥哥我摔到了->消极
小哥哥,天气不错呢->积极
小哥哥,来跟我一起玩呀->
chatgpt 输出:
积极
one-shot 输入:
情绪分类:
啊啊啊小哥哥我摔到了->消极
小哥哥,来跟我一起玩呀->
chatgpt 输出:
积极
zero-shot 输入:
情绪分类:
小哥哥,来跟我一起玩呀
chatgpt 输出:
情绪分类: 开心/友善
充足的prompt,会让输出限制在我们需要的值域(积极/消极/中性),上面的案例中,哪怕只有一个样例,也会胜于没有,实际使用中,可以通过这种方式构造更多的样例来提升ChatGPT的精度。
同时,如果采用Bloom,LLAMA,ChatGLM之类的模型,可以参考预训练阶段的数据组成结构,四两拨千斤。
如果需要背景知识来打样,可以选择LangChain
我们可以看一下文档中的可以外挂的列表
名称 | 描述 |
---|---|
Apify | 一个网络爬虫和自动化工具的平台 |
Arxiv API | arXiv预印本数据库的API |
Bash | 一种Linux和Unix操作系统的命令行语言 |
Bing Search | 微软的搜索引擎 |
ChatGPT Plugins | ChatGPT模型的插件,提供额外的功能和定制化选项 |
DuckDuckGo Search | 一个隐私保护的搜索引擎 |
Google Places | Google提供的本地商家信息的服务 |
Google Search | Google的搜索引擎 |
Google Serper API | Google搜索结果的API |
Gradio Tools | 一个用于构建和部署自定义机器学习应用程序的开源工具 |
Human as a tool | 将人的智力作为工具来解决问题 |
IFTTT WebHooks | 一个可以将应用程序和设备连接起来的自动化服务 |
OpenWeatherMap API | 提供全球天气预报和历史数据的API |
Python REPL | Python的交互式解释器 |
Requests | 一个Python库,用于向Web服务器发出HTTP请求并获取响应 |
Search Tools | 用于在互联网上搜索信息的工具 |
SearxNG Search API | 一个元搜索引擎的API,可以从多个搜索引擎收集结果 |
SerpAPI | 提供各种搜索引擎的搜索结果的API |
Wikipedia API | 提供维基百科内容的API |
Wolfram Alpha | 一个基于自然语言理解的计算知识引擎,可回答各种问题和计算结果 |
Zapier Natural Language Actixin | 可以访问Zapier平台上的5,000多个应用程序和20,000多个操作 |
结合官方案例,简单用Google Serper 做一下演示:
安装
!pip install langchain
!pip install openai
!pip install google-search-results
运行
import os
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
os.environ["OPENAI_API_KEY"] = "xxxx" # 隐藏
os.environ["SERPAPI_API_KEY"] = "xxx"
# First, let's load the language model we're going to use to control the agent.
llm = OpenAI(temperature=0)
# Next, let's load some tools to use. Note that the `llm-math` tool uses an LLM, so we need to pass that in.
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# Finally, let's initialize an agent with the tools, the language model, and the type of agent we want to use.
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# Now let's test it out!
agent.run("现在深圳的气温是多少摄氏度?")
输出:
> Entering new AgentExecutor chain...
I need to find out the current temperature in Shenzhen.
Action: Search
Action Input: "Current temperature in Shenzhen"TodayHourly14 DaysPastClimate. Currently: 75 °F. Passing clouds. (Weather station: Shenzhen Airport, China). See more current weather. I now know the final answer
Final Answer: 75 °F
> Finished chain.
75 °F
这样就完成了一个实时的天气播报助手,当然,你也可以问比特币的实时价格。
我们分析一下整个流程:
中文输入:现在深圳的气温是多少摄氏度?
英文翻译:I need to find out the current temperature in Shenzhen.
Google Serper API 输入:I need to find out the current temperature in Shenzhen.
搜索结果(Google Serper ,不是google-search)

经过模型的翻译和搜索引擎的补充,生成完整输入(包含prompt):
I need to find out the current temperature in Shenzhen.
Action: Search
Action Input: "Current temperature in Shenzhen"TodayHourly14 DaysPastClimate. Currently: 75 °F. Passing clouds. (Weather station: Shenzhen Airport, China). See more current weather. I now know the final answer
Final Answer:
LLM输出:
75 °F