前言
在上一章,我们主要了解了什么是LangChain以及基本的部署方式,本章将结合LangChain框架,了解大模型的应用方式:即Prompt。
大模型的应用方式
大模型的应用,一般有两种方式:
方式一:作为工具使用
说明:
- 使用方式:
- 访问对应的大模型产品网址,
- 在输入框中输入关键字/文字进行提问,然后得到结果。
- 代表产品:豆包、文心一言等等。
更多此类产品可以查看网站中的AI导航,这里我梳理了国内外各类大模型产品。
方式二:大模型的二次开发
说明:
- 使用方式:
- 基于自研的或者第三方的大模型
- 使用LangChain框架进行Prompt的构建
- 调用大模型的API接口进行二次开发
- 代表产品:阿里云百炼、百度云千帆等等。
大模型应用的本质
本章,我们将重点了解第二种大模型的应用方式,首先我们需要简单回顾下大模型的训练方式以便了解Prompt。
大模型训练的回顾
在【课程总结】day24(上):大模型三阶段训练方法(LLaMa Factory)中,我们了解到:
- 大模型的训练有三个阶段:
预训练(PT)
、监督微调(SFT)
、偏好纠正(RLHF)
。 预训练
是大模型修炼内功的过程;监督微调
是大模型修炼招式的过程,大量的问题解决能力是在这个阶段训练得到的。监督微调
训练时是通过下面格式的数据进行训练:
[
{
"instruction": "human instruction (required)",
"input": "human input (optional)",
"output": "model response (required)",
"system": "system prompt (optional)",
"history": [
["human instruction in the first round (optional)", "model response in the first round (optional)"],
["human instruction in the second round (optional)", "model response in the second round (optional)"]
]
}
]
其中:
system:系统的指令
user:用户指令和用户输入
由此,大模型的训练和应用的本质是:
- 训练:通过
system
、user
、tool
(一种工具描述)不同的指令组合和海量数据,让大模型学习知识,由此形成泛化能力,进而能力涌现可以做更多的事情。 - 应用:通过Prompt(不同的提问方法(指令)),引出大模型不同的能力,让大模型做不同的事情。
具体应用方式
大模型的二次开发具体方式有两个方式:一种是使用大模型最为基础的底层API方式调用,另外一种是使用LangChain框架进行Prompt的构建调用。
使用底层API方式应用
# 导入依赖组件
from modelscope import AutoModelForCausalLM
from modelscope import AutoTokenizer
# 判断设备
device = "cuda" # the device to load the model onto
# 模型ID,对应git clone的模型文件夹名称
model_id = "qwen2-7b-instruct"
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype="auto",
device_map="auto"
)
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_id)
# 准备提示词
messages = [
{
"role": "system", "content": """
你是一个创意文案生成专家。
"""},
{
"role": "user", "content": """
用户将输入几个产品的关键字,请根据关键词生成一段适合老年市场的文案,要求:成熟,稳重,符合老年市场的风格。
用户输入为:助听器,清晰,方便,便宜,聆听世界。
营销文案为:
"""}
]
# 应用聊天模板
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
# 输入内容转ID
model_inputs = tokenizer([text], return_tensors="pt").to(device)
# 模型预测
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)