langchain 入门指南 - In-context Learning

In-context Learning 是一种上下文学习,在 LLM 出现之后,这种学习方式变得更加实用。 因为 LLM 是训练好的模型,并不了解我们当前需要解决的问题背景是什么,但是 LLM 本身具有很强的分析推理能力, 在这种情况下,我们只需要将我们的问题和上下文传递给 LLM,它就可以帮我们进行分析推理,从而得到答案。

对于大语言模型而言,我们可以通过在输入的 Prompt 中给出关于解决问题方式的描述或者示例,而不需要利用大量数据对模型进行训练。

In-context Learning 包括了 Zero-shot LearningFew-shot Learning 两种方式。

Zero-shot Learning

一种机器学习方法,它允许模型在没有见过任何训练样本的情况下,对新类别的数据进行分类或识别。 这种方法通常依赖于模型在训练过程中学到的知识,以及对新类别的一些描述性信息,如属性或元数据。

意图识别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0.3,
api_key='your key',
base_url="https://api.openai-hk.com/v1"
)

def recognize_intent(text: str):
response = llm.invoke([
SystemMessage("""Recognize the intent from the user's input and format output as JSON string.
The output JSON string includes: "intention", "parameters" """),
HumanMessage(text)
])
return response.content

print(recognize_intent("订8月19日北京到上海的飞机"))

输出:

1
2
3
4
5
6
7
8
{
"intention": "flight_booking",
"parameters": {
"departure_date": "8月19日",
"departure_city": "北京",
"destination_city": "上海"
}
}

情感分类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0.3,
api_key='your key',
base_url="https://api.openai-hk.com/v1"
)

def classify_sentiment(text: str):
response = llm.invoke([
SystemMessage("""根据给定文字所表述的情感,将文字分为三类:正面,中立,负面。请将用户给定的文字进行分类,并输出分类。"""),
HumanMessage(text)
])
return response.content

print(classify_sentiment("通过前面的课程我对大模型的认识提高了很多。"))
print(classify_sentiment("今天是2024年7月17日"))
print(classify_sentiment("最近感觉很累"))

输出:

1
2
3
正面
中立
负面

Few-shot Learning

教导模型使用非常有限的训练数据来识别新的对象、类或任务。 在这里是通过在 Prompt 里加入少量示例,来实现模型学习。

示例的作用有时可以超过千言万语,Few-shot Learning 通常可以帮助我们描述更复杂的模式。

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
39
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0.3,
api_key='your key',
base_url="https://api.openai-hk.com/v1"
)

def book_flight(text: str):
messages = [
{"role": "system", "content": """
通过用户描述,提取航班信息并以 JSON 格式输出。
以下是一些示例:
示例1
输入:“订8月9日上海到北京的航班,上午出发
输出:"{"date":"0809","dispatch_time":"6-12","from":"上海","to":"北京"}"

示例2
输入:“订8月9日上海到北京的航班,下午出发
输出:"{"date":"0809","dispatch_time":"12-18","from":"上海","to":"北京"}"

示例3
输入:“订8月9日上海到北京的航班,晚上出发
输出:"{"date":"0809","dispatch_time":"21-18","from":"上海","to":"北京"}"

示例4
输入:“订8月9日上海到北京的航班
输出:"{"date":"0809","dispatch_time":"unknown","from":"上海","to":"北京"}"
”"""},
{"role": "user", "content": text}
]
response = llm.invoke(messages)
return response.content

print(book_flight("预定9月1日广州到北京的航班,下午出发。"))
print(book_flight("预定9月1日广州到北京的航班"))
print(book_flight("预定9月1日夜里广州到北京的航班"))
print(book_flight("预定广州到北京的航班"))

输出:

1
2
3
4
{"date":"0901","dispatch_time":"12-18","from":"广州","to":"北京"}
{"date":"0901","dispatch_time":"unknown","from":"广州","to":"北京"}
{"date":"0901","dispatch_time":"21-6","from":"广州","to":"北京"}
{"date":"unknown","dispatch_time":"unknown","from":"广州","to":"北京"}

总结

  1. 应用大语言模型要从传统机器学习思维切换为上下文学习的思路。
  2. 上下文学习包括 Zero-shot LearningFew-shot Learning,两者并无明显界限,可以根据实际需要灵活运用。